Skip to content

Commit fe2824f

Browse files
committed
TablePageにproblempointを表示
1 parent e9bd69b commit fe2824f

File tree

6 files changed

+73
-9
lines changed

6 files changed

+73
-9
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,31 @@ export const useContestToProblems = () => {
222222
);
223223
};
224224

225+
export const useContestToMergedProblems = () => {
226+
const url = STATIC_API_BASE_URL + "/contest-problem.json";
227+
const contestIdToProblemIdArray = useSWRData(url, (url) =>
228+
fetchTypedArray(
229+
url,
230+
(obj): obj is { contest_id: ContestId; problem_id: ProblemId } =>
231+
hasPropertyAsType(obj, "contest_id", isString) &&
232+
hasPropertyAsType(obj, "problem_id", isString)
233+
)
234+
);
235+
const { data: problemMap } = useMergedProblemMap();
236+
return contestIdToProblemIdArray.data?.reduce(
237+
(map, { contest_id, problem_id }) => {
238+
const problem = problemMap?.get(problem_id);
239+
if (problem) {
240+
const problems = map.get(contest_id) ?? [];
241+
problems.push(problem);
242+
map.set(contest_id, problems);
243+
}
244+
return map;
245+
},
246+
new Map<ContestId, MergedProblem[]>()
247+
);
248+
};
249+
225250
export const useContestMap = () => {
226251
const contests = useContests().data;
227252
return contests?.reduce((map, contest) => {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from "react";
2+
3+
interface Props {
4+
point: number;
5+
}
6+
7+
const formatPoint = (point: number): string => {
8+
const INF_POINT = 1e18;
9+
if (point >= INF_POINT) {
10+
return "";
11+
} else {
12+
return point.toString();
13+
}
14+
};
15+
16+
export const ProblemPoint: React.FC<Props> = (props) => {
17+
const { point } = props;
18+
return <div className="table-problem-point"> {formatPoint(point)} </div>;
19+
};

atcoder-problems-frontend/src/pages/TablePage/AtCoderRegularTable.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from "react";
33
import { BootstrapTable, TableHeaderColumn } from "react-bootstrap-table";
44
import { useProblemModelMap } from "../../api/APIClient";
55
import Contest from "../../interfaces/Contest";
6-
import Problem from "../../interfaces/Problem";
6+
import MergedProblem from "../../interfaces/MergedProblem";
77
import {
88
noneStatus,
99
ProblemId,
@@ -21,10 +21,11 @@ import { ContestLink } from "../../components/ContestLink";
2121
import ProblemModel from "../../interfaces/ProblemModel";
2222
import { SubmitTimespan } from "../../components/SubmitTimespan";
2323
import { RatingInfo } from "../../utils/RatingInfo";
24+
import { ProblemPoint } from "../../components/Problempoint";
2425

2526
interface Props {
2627
contests: Contest[];
27-
contestToProblems: Map<string, Problem[]>;
28+
contestToProblems: Map<string, MergedProblem[]>;
2829
hideCompletedContest: boolean;
2930
showDifficulty: boolean;
3031
colorMode: ColorMode;
@@ -35,7 +36,7 @@ interface Props {
3536
userRatingInfo: RatingInfo;
3637
}
3738

38-
const getProblemHeaderAlphabetFromTitle = (problem: Problem) => {
39+
const getProblemHeaderAlphabetFromTitle = (problem: MergedProblem) => {
3940
const list = problem.title.split(".");
4041
return list.length === 0 ? "" : list[0];
4142
};
@@ -49,7 +50,7 @@ const AtCoderRegularTableSFC: React.FC<Props> = (props) => {
4950
problemStatus: Map<
5051
string,
5152
{
52-
problem: Problem;
53+
problem: MergedProblem;
5354
status: ProblemStatus;
5455
model?: ProblemModel;
5556
cellColor: TableColor;
@@ -158,6 +159,8 @@ const AtCoderRegularTableSFC: React.FC<Props> = (props) => {
158159
const problem = problemStatus.get(c);
159160
const model = problem ? problem.model : undefined;
160161
if (problem) {
162+
const INF_POINT = 1e18;
163+
const point = problem.problem.point ?? INF_POINT;
161164
return (
162165
<>
163166
<ProblemLink
@@ -172,6 +175,9 @@ const AtCoderRegularTableSFC: React.FC<Props> = (props) => {
172175
problemModel={model}
173176
userRatingInfo={userRatingInfo}
174177
/>
178+
{props.colorMode === ColorMode.None && (
179+
<ProblemPoint point={point} />
180+
)}
175181
{props.colorMode === ColorMode.ContestResult && (
176182
<SubmitTimespan
177183
contest={contest}

atcoder-problems-frontend/src/pages/TablePage/ContestTable.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@ import { Row, Table } from "reactstrap";
22
import React from "react";
33
import { useProblemModelMap } from "../../api/APIClient";
44
import Contest from "../../interfaces/Contest";
5-
import Problem from "../../interfaces/Problem";
5+
import MergedProblem from "../../interfaces/MergedProblem";
66
import { ProblemId, ProblemStatus, StatusLabel } from "../../interfaces/Status";
77
import { ColorMode, statusToTableColor } from "../../utils/TableColor";
88
import { ProblemLink } from "../../components/ProblemLink";
99
import { ContestLink } from "../../components/ContestLink";
1010
import { SubmitTimespan } from "../../components/SubmitTimespan";
1111
import { RatingInfo } from "../../utils/RatingInfo";
1212
import { isRatedContest } from "../../utils/ContestClassifier";
13+
import { ProblemPoint } from "../../components/Problempoint";
1314

1415
interface Props {
1516
contests: Contest[];
16-
contestToProblems: Map<string, Problem[]>;
17+
contestToProblems: Map<string, MergedProblem[]>;
1718
hideCompletedContest: boolean;
1819
showDifficulty: boolean;
1920
colorMode: ColorMode;
@@ -101,6 +102,8 @@ export const ContestTable: React.FC<Props> = (props) => {
101102
selectedLanguages,
102103
})
103104
: "";
105+
const INF_POINT = 1e18;
106+
const point = problem.point ?? INF_POINT;
104107
return (
105108
<td
106109
key={problem.id}
@@ -120,6 +123,9 @@ export const ContestTable: React.FC<Props> = (props) => {
120123
problemModel={model}
121124
userRatingInfo={userRatingInfo}
122125
/>
126+
{props.colorMode === ColorMode.None && (
127+
<ProblemPoint point={point} />
128+
)}
123129
{props.colorMode === ColorMode.ContestResult && (
124130
<SubmitTimespan
125131
contest={contest}

atcoder-problems-frontend/src/pages/TablePage/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useState } from "react";
22
import { List } from "immutable";
33
import {
44
useContests,
5-
useContestToProblems,
5+
useContestToMergedProblems,
66
useRatingInfo,
77
useUserSubmission,
88
useMultipleUserSubmissions,
@@ -11,7 +11,7 @@ import {
1111
useLoginState,
1212
useProgressResetList,
1313
} from "../../api/InternalAPIClient";
14-
import Problem from "../../interfaces/Problem";
14+
import MergedProblem from "../../interfaces/MergedProblem";
1515
import { constructStatusLabelMap, ContestId } from "../../interfaces/Status";
1616
import { useLocalStorage } from "../../utils/LocalStorage";
1717
import { ColorMode } from "../../utils/TableColor";
@@ -55,7 +55,7 @@ export const TablePage: React.FC<OuterProps> = (props) => {
5555
const [selectedLanguages, setSelectedLanguages] = useState(new Set<string>());
5656
const userRatingInfo = useRatingInfo(props.userId);
5757
const contestToProblems =
58-
useContestToProblems() ?? new Map<ContestId, Problem[]>();
58+
useContestToMergedProblems() ?? new Map<ContestId, MergedProblem[]>();
5959
const { data: contests } = useContests();
6060
const selectableLanguages = new Set(
6161
useUserSubmission(props.userId)?.map((s) => s.language) ?? []

atcoder-problems-frontend/src/style/_custom.scss

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,14 @@ span.difficulty-circle {
205205
background-color: $success-before-contest-hover-bg-color;
206206
}
207207

208+
.table-problem-point {
209+
position: absolute;
210+
right: 0.1rem;
211+
bottom: 0;
212+
color: #888888;
213+
font-size: x-small;
214+
}
215+
208216
.table-problem-timespan {
209217
position: absolute;
210218
right: 0.1rem;

0 commit comments

Comments
 (0)