Skip to content

Commit 1ece6b6

Browse files
committed
refactor: ContestUpdatePageをswr で置き換える
1 parent 14f7c35 commit 1ece6b6

File tree

2 files changed

+26
-26
lines changed

2 files changed

+26
-26
lines changed

atcoder-problems-frontend/src/api/InternalAPIClient.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
UserResponse,
55
VirtualContestDetails,
66
VirtualContestInfo,
7+
VirtualContestItem,
78
} from "../pages/Internal/types";
89
import { useSWRData } from "./index";
910

@@ -52,3 +53,9 @@ export const useRecentContests = () => {
5253
typeCastFetcher<VirtualContestInfo[]>(url)
5354
);
5455
};
56+
57+
export const useContestUpdate = () => {
58+
return useSWRData(`${BASE_URL}/contest/update/`, (url) =>
59+
typeCastFetcher<VirtualContestItem[]>(url)
60+
);
61+
};

atcoder-problems-frontend/src/pages/Internal/VirtualContest/ContestUpdatePage.tsx

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import React from "react";
22
import { List } from "immutable";
3-
import { connect, PromiseState } from "react-refetch";
43
import { Redirect } from "react-router-dom";
54
import { Alert, Spinner } from "reactstrap";
6-
import { useVirtualContest } from "../../../api/InternalAPIClient";
5+
import {
6+
useVirtualContest,
7+
useContestUpdate,
8+
} from "../../../api/InternalAPIClient";
79
import * as DateUtil from "../../../utils/DateUtil";
810
import { VirtualContestItem } from "../types";
911
import {
@@ -27,24 +29,30 @@ interface OuterProps {
2729
contestId: string;
2830
}
2931

30-
interface InnerProps extends OuterProps {
31-
updateResponse: PromiseState<unknown | null>;
32-
updateContest: (request: Request, problems: VirtualContestItem[]) => void;
33-
}
34-
35-
const InnerContestUpdatePage = (props: InnerProps) => {
36-
const { contestId, updateResponse } = props;
32+
export const ContestUpdatePage = (props: OuterProps) => {
33+
const { contestId } = props;
34+
const updateResponse = useContestUpdate();
3735
const contestResponse = useVirtualContest(contestId);
3836
if (!contestResponse.data && !contestResponse.error) {
3937
return <Spinner style={{ width: "3rem", height: "3rem" }} />;
4038
} else if (contestResponse.error || !contestResponse.data) {
4139
return <Alert color="danger">Failed to fetch contest info.</Alert>;
4240
}
4341

42+
const updateContest = (request: Request, problems: VirtualContestItem[]) => ({
43+
updateResponse: {
44+
comparison: null,
45+
value: () =>
46+
updateVirtualContestInfo(request).then(() =>
47+
updateVirtualContestItems(props.contestId, problems)
48+
),
49+
},
50+
});
51+
4452
const contestInfo = contestResponse.data.info;
4553
const contestProblems = contestResponse.data.problems;
4654

47-
if (updateResponse.fulfilled && updateResponse.value !== null) {
55+
if (!updateResponse.data && updateResponse.error) {
4856
return <Redirect to={`/contest/show/${contestId}`} />;
4957
}
5058

@@ -86,7 +94,7 @@ const InnerContestUpdatePage = (props: InnerProps) => {
8694
publicState,
8795
penaltySecond,
8896
}): void => {
89-
props.updateContest(
97+
updateContest(
9098
{
9199
id: contestId,
92100
title,
@@ -103,18 +111,3 @@ const InnerContestUpdatePage = (props: InnerProps) => {
103111
/>
104112
);
105113
};
106-
107-
export const ContestUpdatePage = connect<OuterProps, InnerProps>((props) => ({
108-
updateContest: (request: Request, problems: VirtualContestItem[]) => ({
109-
updateResponse: {
110-
comparison: null,
111-
value: () =>
112-
updateVirtualContestInfo(request).then(() =>
113-
updateVirtualContestItems(props.contestId, problems)
114-
),
115-
},
116-
}),
117-
updateResponse: {
118-
value: null,
119-
},
120-
}))(InnerContestUpdatePage);

0 commit comments

Comments
 (0)