diff --git a/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortBarChart.tsx b/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortBarChart.tsx index 2540ec1e4..6a35f283f 100644 --- a/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortBarChart.tsx +++ b/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortBarChart.tsx @@ -13,6 +13,7 @@ import { formatMomentDate, parseSecond } from "../../../utils/DateUtil"; interface Props { dailyData: { dateSecond: number; count: number }[]; + xRange: (number | "dataMin" | "dataMax")[]; yRange: number | "auto"; } @@ -32,7 +33,8 @@ export const DailyEffortBarChart: React.FC = (props) => ( formatMomentDate(parseSecond(dateSecond)) } diff --git a/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortStackedBarChart.tsx b/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortStackedBarChart.tsx index c22b28309..48a42ab08 100644 --- a/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortStackedBarChart.tsx +++ b/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/DailyEffortStackedBarChart.tsx @@ -23,11 +23,12 @@ interface Props { dateSecond: number; countMap: Map; }[]; + xRange: (number | "dataMin" | "dataMax")[]; yRange: number | "auto"; } export const DailyEffortStackedBarChart: React.FC = (props) => { - const { dailyColorCount, yRange } = props; + const { dailyColorCount, xRange, yRange } = props; const dailyCount = dailyColorCount.map(({ dateSecond, countMap }) => { return { ...mapToObject(countMap), dateSecond }; @@ -49,7 +50,8 @@ export const DailyEffortStackedBarChart: React.FC = (props) => { formatMomentDate(parseSecond(dateSecond)) } diff --git a/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/index.tsx b/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/index.tsx index aa1c0308d..d87239282 100644 --- a/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/index.tsx +++ b/atcoder-problems-frontend/src/pages/UserPage/ProgressChartBlock/index.tsx @@ -64,6 +64,49 @@ const ChartTypeTabButtons: React.FC = (props) => { ); }; +type XRanges = (number | "dataMin")[]; +interface XRangeTabProps { + active: XRanges; + setActive: (next: XRanges) => void; +} +const XRangeTabButtons: React.FC = (props) => { + const { active, setActive } = props; + const yearToSeconds = 365 * 24 * 60 * 60; + const nowUnixTime = new Date().getTime() / 1000; + const RANGES: XRanges[] = [ + [nowUnixTime - 1 * yearToSeconds, nowUnixTime], + [nowUnixTime - 2 * yearToSeconds, nowUnixTime], + [nowUnixTime - 5 * yearToSeconds, nowUnixTime], + [nowUnixTime - 10 * yearToSeconds, nowUnixTime], + ["dataMin", nowUnixTime], + ]; + const RANGENAMES = [ + "in last 1 year", + "in last 2 years", + "in last 5 years", + "in last 10 years", + "all time", + ]; + return ( + + + {"X-Range"} + + {RANGES.map((range, idx) => ( + setActive(range)} + active={active === range} + > + {RANGENAMES[idx]} + + ))} + + + + ); +}; + type YRanges = number | "auto"; interface YRangeTabProps { active: YRanges; @@ -101,6 +144,11 @@ export const ProgressChartBlock: React.FC = (props) => { dailyEffortBarChartActiveTab, setDailyEffortBarChartActiveTab, ] = useLocalStorage("dailyEffortBarChartActiveTab", "Simple"); + const nowUnixTime = new Date().getTime() / 1000; + const [dailyEffortXRange, setDailyEffortXRange] = useLocalStorage( + "dailyEffortXRange", + ["dataMin", nowUnixTime] + ); const [dailyEffortYRange, setDailyEffortYRange] = useLocalStorage( "dailyEffortYRange", "auto" @@ -224,6 +272,10 @@ export const ProgressChartBlock: React.FC = (props) => { active={dailyEffortBarChartActiveTab} setActive={setDailyEffortBarChartActiveTab} /> + = (props) => { dateSecond: parseDateLabel(dateLabel).unix(), count, }))} + xRange={dailyEffortXRange} yRange={dailyEffortYRange} /> ) : ( )} diff --git a/atcoder-problems-frontend/src/utils/LocalStorage.tsx b/atcoder-problems-frontend/src/utils/LocalStorage.tsx index 7cfa14de2..c62f15d09 100644 --- a/atcoder-problems-frontend/src/utils/LocalStorage.tsx +++ b/atcoder-problems-frontend/src/utils/LocalStorage.tsx @@ -9,6 +9,7 @@ const LocalStorageKeys = [ "showPenalties", "hideCompletedContest", "dailyEffortBarChartActiveTab", + "dailyEffortXRange", "dailyEffortYRange", "climbingLineChartActiveTab", "climbingLineChartReverseColorOrder",