Skip to content

Commit fbf026d

Browse files
authored
Merge pull request #1241 from k-yamasaki-zakisan/feature#1194
Feature#1194 Merge like contest toggle
2 parents c2d4da5 + 9d9ec20 commit fbf026d

File tree

6 files changed

+96
-5
lines changed

6 files changed

+96
-5
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
} from "reactstrap";
1515
import { HelpBadgeTooltip } from "../../components/HelpBadgeTooltip";
1616
import { ColorMode } from "../../utils/TableColor";
17+
import { ContestCategory } from "../../utils/ContestClassifier";
1718

1819
interface Props {
1920
hideCompletedContest: boolean;
@@ -27,6 +28,9 @@ interface Props {
2728
selectableLanguages: Set<string>;
2829
selectedLanguages: Set<string>;
2930
toggleLanguage: (language: string) => void;
31+
active: ContestCategory;
32+
mergeLikeContest: boolean;
33+
setMergeLikeContest: (mergeLikeContest: boolean) => void;
3034
}
3135

3236
export const Options: React.FC<Props> = (props) => {
@@ -59,6 +63,19 @@ export const Options: React.FC<Props> = (props) => {
5963
Internal rating to have 50% Solve Probability
6064
</HelpBadgeTooltip>
6165
</FormGroup>
66+
<FormGroup check inline class="my-4">
67+
<Label check>
68+
<CustomInput
69+
type="switch"
70+
id="mergeLikeContest"
71+
label="Merge Like Contest"
72+
checked={props.mergeLikeContest}
73+
onChange={() => {
74+
props.setMergeLikeContest(!props.mergeLikeContest);
75+
}}
76+
/>
77+
</Label>
78+
</FormGroup>
6279
{props.colorMode === ColorMode.ContestResult && (
6380
<FormGroup check inline>
6481
<Label check>

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,30 @@ import {
44
ContestCategories,
55
ContestCategory,
66
} from "../../utils/ContestClassifier";
7+
import { LikeContestCategories } from "../../utils/LikeContestUtils";
78

89
interface Props {
910
active: ContestCategory;
1011
setActive: (next: ContestCategory) => void;
12+
mergeLikeContest: boolean;
1113
}
1214

1315
export const TableTabButtons: React.FC<Props> = (props) => {
14-
const { active, setActive } = props;
16+
const { active, setActive, mergeLikeContest } = props;
17+
18+
const filterCategories = (contestCategories: readonly ContestCategory[]) => {
19+
if (!mergeLikeContest) return contestCategories;
20+
21+
return contestCategories.filter(
22+
(category) => !LikeContestCategories.includes(category)
23+
);
24+
};
1525
return (
1626
<Row>
1727
<ButtonGroup className="table-tab">
18-
{ContestCategories.map((category, i) => (
28+
{filterCategories(ContestCategories).map((category, i) => (
1929
<Button
20-
key={i}
30+
key={String(i)}
2131
color="secondary"
2232
onClick={(): void => {
2333
setActive(category);

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
classifyContest,
2222
ContestCategory,
2323
} from "../../utils/ContestClassifier";
24+
import { getLikeContestCategory } from "../../utils/LikeContestUtils";
2425
import { TableTabButtons } from "./TableTab";
2526
import { Options } from "./Options";
2627
import { ContestTable } from "./ContestTable";
@@ -52,6 +53,10 @@ export const TablePage: React.FC<OuterProps> = (props) => {
5253
"showPenalties",
5354
false
5455
);
56+
const [mergeLikeContest, setMergeLikeContest] = useLocalStorage(
57+
"MergeLikeContest",
58+
false
59+
);
5560
const [selectedLanguages, setSelectedLanguages] = useState(new Set<string>());
5661
const userRatingInfo = useRatingInfo(props.userId);
5762
const contestToProblems =
@@ -76,8 +81,16 @@ export const TablePage: React.FC<OuterProps> = (props) => {
7681
filteredSubmissions,
7782
props.userId
7883
);
84+
85+
const selectedContestCategories = [activeTab];
86+
const likeContestCategory = getLikeContestCategory(activeTab);
87+
if (likeContestCategory && mergeLikeContest) {
88+
selectedContestCategories.push(likeContestCategory);
89+
}
7990
const filteredContests =
80-
contests?.filter((c) => classifyContest(c) === activeTab) ?? [];
91+
contests?.filter((c) =>
92+
selectedContestCategories.includes(classifyContest(c))
93+
) ?? [];
8194

8295
return (
8396
<div>
@@ -99,8 +112,15 @@ export const TablePage: React.FC<OuterProps> = (props) => {
99112
newSet.has(language) ? newSet.delete(language) : newSet.add(language);
100113
setSelectedLanguages(newSet);
101114
}}
115+
active={activeTab}
116+
mergeLikeContest={mergeLikeContest}
117+
setMergeLikeContest={setMergeLikeContest}
118+
/>
119+
<TableTabButtons
120+
active={activeTab}
121+
setActive={setActiveTab}
122+
mergeLikeContest={mergeLikeContest}
102123
/>
103-
<TableTabButtons active={activeTab} setActive={setActiveTab} />
104124
{[
105125
"ABC",
106126
"ARC",
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { getLikeContestCategory } from "./LikeContestUtils";
2+
import { ContestCategory } from "./ContestClassifier";
3+
4+
type GetLikeContestTestType = [ContestCategory, ContestCategory | undefined];
5+
test.each<GetLikeContestTestType>([
6+
["ABC", "ABC-Like"],
7+
["ARC", "ARC-Like"],
8+
["AGC", "AGC-Like"],
9+
["ABC-Like", undefined],
10+
["ARC-Like", undefined],
11+
["AGC-Like", undefined],
12+
["PAST", undefined],
13+
["JOI", undefined],
14+
["JAG", undefined],
15+
["AHC", undefined],
16+
["Marathon", undefined],
17+
["Other Sponsored", undefined],
18+
["Other Contests", undefined],
19+
])("Get Like Contest", (contest, result) => {
20+
expect(getLikeContestCategory(contest)).toBe(result);
21+
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ContestCategory } from "./ContestClassifier";
2+
3+
export const getLikeContestCategory = (
4+
contestCategory: ContestCategory
5+
): ContestCategory | undefined => {
6+
switch (contestCategory) {
7+
case "ABC":
8+
return "ABC-Like";
9+
case "ARC":
10+
return "ARC-Like";
11+
case "AGC":
12+
return "AGC-Like";
13+
default:
14+
break;
15+
}
16+
};
17+
18+
export const LikeContestCategories: readonly ContestCategory[] = [
19+
"ABC-Like",
20+
"ARC-Like",
21+
"AGC-Like",
22+
];

atcoder-problems-frontend/src/utils/LocalStorage.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const LocalStorageKeys = [
1717
"recommendOption",
1818
"recommendExperimental",
1919
"recoomendExcludeOption",
20+
"MergeLikeContest",
2021
] as const;
2122
type LocalStorageKey = typeof LocalStorageKeys[number];
2223

0 commit comments

Comments
 (0)