diff --git a/packages/website/src/components/Performance/Charts.tsx b/packages/website/src/components/Performance/Charts.tsx new file mode 100644 index 000000000..9d2091681 --- /dev/null +++ b/packages/website/src/components/Performance/Charts.tsx @@ -0,0 +1,3 @@ +export function Charts() { + return 'amogos'; +} diff --git a/packages/website/src/components/Performance/Controls.tsx b/packages/website/src/components/Performance/Controls.tsx deleted file mode 100644 index 5408229d2..000000000 --- a/packages/website/src/components/Performance/Controls.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { FilterControl } from '../TankSearch/components/FilterControl'; -import { PlayerCountControl } from './PlayerCountControl'; - -export function Controls() { - return ( - <> - - - - ); -} diff --git a/packages/website/src/components/Performance/ModeSwitcher.tsx b/packages/website/src/components/Performance/ModeSwitcher.tsx new file mode 100644 index 000000000..ede901745 --- /dev/null +++ b/packages/website/src/components/Performance/ModeSwitcher.tsx @@ -0,0 +1,31 @@ +import { Tabs } from '@radix-ui/themes'; +import { + TankPerformanceEphemeral, + TankPerformanceMode, +} from '../../stores/tankPerformanceEphemeral'; + +export function ModeSwitcher() { + const mode = TankPerformanceEphemeral.use((state) => state.mode); + const mutateTankPerformanceMode = TankPerformanceEphemeral.useMutation(); + + return ( + { + mutateTankPerformanceMode((draft) => { + draft.mode = Number(value) as TankPerformanceMode; + }); + }} + mb="5" + > + + + Table + + + Charts + + + + ); +} diff --git a/packages/website/src/components/Performance/PlayerCountControl.tsx b/packages/website/src/components/Performance/PlayerCountControl.tsx index 6a3d1e810..b0d9928cb 100644 --- a/packages/website/src/components/Performance/PlayerCountControl.tsx +++ b/packages/website/src/components/Performance/PlayerCountControl.tsx @@ -1,12 +1,14 @@ import { Flex, Select, Text } from '@radix-ui/themes'; -import { TankPerformancePersistent } from '../../stores/tankPerformancePersistent'; -import { PlayerCountPeriod } from '../../stores/tankPerformancePersistent/constants'; +import { + PlayerCountPeriod, + TankPerformanceEphemeral, +} from '../../stores/tankPerformanceEphemeral'; export function PlayerCountControl() { - const playerCountPeriod = TankPerformancePersistent.use( + const playerCountPeriod = TankPerformanceEphemeral.use( (state) => state.playerCountPeriod, ); - const mutateTankPerformanceSort = TankPerformancePersistent.useMutation(); + const mutateTankPerformanceSort = TankPerformanceEphemeral.useMutation(); return ( diff --git a/packages/website/src/components/Performance/TankRow.tsx b/packages/website/src/components/Performance/TankRow.tsx index 278bbcdfa..634bfd6b9 100644 --- a/packages/website/src/components/Performance/TankRow.tsx +++ b/packages/website/src/components/Performance/TankRow.tsx @@ -6,7 +6,7 @@ import { import { Table } from '@radix-ui/themes'; import { memo } from 'react'; import { useAveragesExclusionRatio } from '../../hooks/useAveragesExclusionRatio'; -import { TankPerformancePersistent } from '../../stores/tankPerformancePersistent'; +import { TankPerformanceEphemeral } from '../../stores/tankPerformanceEphemeral'; import { TankRowHeaderCell } from '../TankRowHeaderCell'; interface TankRowProps { @@ -19,7 +19,7 @@ export const TankRow = memo( ({ tank }) => { const averages = averageDefinitions.averages[tank.id]; const ratio = useAveragesExclusionRatio(); - const playerCountPeriod = TankPerformancePersistent.use( + const playerCountPeriod = TankPerformanceEphemeral.use( (state) => state.playerCountPeriod, ); diff --git a/packages/website/src/components/Performance/Tanks.tsx b/packages/website/src/components/Performance/Tanks.tsx index 40b14b133..ced47009d 100644 --- a/packages/website/src/components/Performance/Tanks.tsx +++ b/packages/website/src/components/Performance/Tanks.tsx @@ -5,7 +5,7 @@ import { times } from 'lodash-es'; import { Fragment, Suspense, useEffect, useMemo, useState } from 'react'; import { filterTank } from '../../core/blitzkit/filterTank'; import { $tankFilters } from '../../stores/tankFilters'; -import { TankPerformancePersistent } from '../../stores/tankPerformancePersistent'; +import { TankPerformanceEphemeral } from '../../stores/tankPerformanceEphemeral'; import { TankPerformanceSort } from '../../stores/tankPerformanceSort'; import type { MaybeSkeletonComponentProps } from '../../types/maybeSkeletonComponentProps'; import { RowLoader } from './RowLoader'; @@ -36,7 +36,7 @@ export function Tanks({ skeleton }: MaybeSkeletonComponentProps) { } const sort = TankPerformanceSort.use(); - const tankPerformancePersistentStore = TankPerformancePersistent.useStore(); + const tankPerformancePersistentStore = TankPerformanceEphemeral.useStore(); const filters = useStore($tankFilters); const tanksSorted = useMemo(() => { const { playerCountPeriod } = tankPerformancePersistentStore.getState(); diff --git a/packages/website/src/components/Performance/Total.tsx b/packages/website/src/components/Performance/Total.tsx index 1919ba64a..cad080ea8 100644 --- a/packages/website/src/components/Performance/Total.tsx +++ b/packages/website/src/components/Performance/Total.tsx @@ -7,7 +7,7 @@ import { import { Table } from '@radix-ui/themes'; import { memo, useCallback } from 'react'; import { useAveragesExclusionRatio } from '../../hooks/useAveragesExclusionRatio'; -import { TankPerformancePersistent } from '../../stores/tankPerformancePersistent'; +import { TankPerformanceEphemeral } from '../../stores/tankPerformanceEphemeral'; import { StickyRowHeaderCell } from '../StickyRowHeaderCell'; interface AverageDefinitionsEntryWithId extends AverageDefinitionsEntry { @@ -22,7 +22,7 @@ const averageDefinitions = await fetchAverageDefinitions(); export const Total = memo( ({ tanks }) => { - const playerCountPeriod = TankPerformancePersistent.use( + const playerCountPeriod = TankPerformanceEphemeral.use( (state) => state.playerCountPeriod, ); const ratio = useAveragesExclusionRatio(); diff --git a/packages/website/src/pages/tools/performance/_index.tsx b/packages/website/src/pages/tools/performance/_index.tsx index 958147bd3..a8555f2c8 100644 --- a/packages/website/src/pages/tools/performance/_index.tsx +++ b/packages/website/src/pages/tools/performance/_index.tsx @@ -1,27 +1,45 @@ import { PageWrapper } from '../../../components/PageWrapper'; -import { Controls } from '../../../components/Performance/Controls'; +import { Charts } from '../../../components/Performance/Charts'; +import { ModeSwitcher } from '../../../components/Performance/ModeSwitcher'; import { PerformanceInfo } from '../../../components/Performance/PerformanceInfo'; +import { PlayerCountControl } from '../../../components/Performance/PlayerCountControl'; import { TankTable } from '../../../components/Performance/Table'; -import { TankPerformancePersistent } from '../../../stores/tankPerformancePersistent'; +import { FilterControl } from '../../../components/TankSearch/components/FilterControl'; +import { + TankPerformanceEphemeral, + TankPerformanceMode, +} from '../../../stores/tankPerformanceEphemeral'; import { TankPerformanceSort } from '../../../stores/tankPerformanceSort'; import type { MaybeSkeletonComponentProps } from '../../../types/maybeSkeletonComponentProps'; export function Page({ skeleton }: MaybeSkeletonComponentProps) { return ( - + - + ); } function Content({ skeleton }: MaybeSkeletonComponentProps) { + const mode = TankPerformanceEphemeral.use((state) => state.mode); + return ( + + - - + + + {mode === TankPerformanceMode.Table && ( + <> + + + + )} + + {mode === TankPerformanceMode.Charts && } ); } diff --git a/packages/website/src/stores/tankPerformanceEphemeral.ts b/packages/website/src/stores/tankPerformanceEphemeral.ts new file mode 100644 index 000000000..5b54031d6 --- /dev/null +++ b/packages/website/src/stores/tankPerformanceEphemeral.ts @@ -0,0 +1,28 @@ +import { create } from 'zustand'; +import { createContextualStore } from '../core/zustand/createContextualStore'; + +export interface TankPerformanceEphemeral { + playerCountPeriod: PlayerCountPeriod; + mode: TankPerformanceMode; +} + +export enum TankPerformanceMode { + Table, + Charts, +} + +export enum PlayerCountPeriod { + Past120Days = 'd_120', + Past90Days = 'd_90', + Past60Days = 'd_60', + ThisMonth = 'd_30', + ThisWeek = 'd_7', + Yesterday = 'd_1', +} + +export const TankPerformanceEphemeral = createContextualStore(() => + create()(() => ({ + playerCountPeriod: PlayerCountPeriod.ThisMonth, + mode: TankPerformanceMode.Table, + })), +); diff --git a/packages/website/src/stores/tankPerformancePersistent/constants.ts b/packages/website/src/stores/tankPerformancePersistent/constants.ts deleted file mode 100644 index 34d2c4e07..000000000 --- a/packages/website/src/stores/tankPerformancePersistent/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum PlayerCountPeriod { - Past120Days = 'd_120', - Past90Days = 'd_90', - Past60Days = 'd_60', - ThisMonth = 'd_30', - ThisWeek = 'd_7', - Yesterday = 'd_1', -} diff --git a/packages/website/src/stores/tankPerformancePersistent/index.ts b/packages/website/src/stores/tankPerformancePersistent/index.ts deleted file mode 100644 index e1b845c88..000000000 --- a/packages/website/src/stores/tankPerformancePersistent/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as lodash from 'lodash-es'; -import { create } from 'zustand'; -import { persist, subscribeWithSelector } from 'zustand/middleware'; -import { createContextualStore } from '../../core/zustand/createContextualStore'; -import { PlayerCountPeriod } from './constants'; - -export interface TankPerformancePersistent { - playerCountPeriod: PlayerCountPeriod; -} - -export const TankPerformancePersistent = createContextualStore(() => - create()( - persist( - subscribeWithSelector(() => ({ - playerCountPeriod: PlayerCountPeriod.ThisMonth, - })), - { name: 'tank-performance', merge: (a, b) => lodash.merge(b, a) }, - ), - ), -);