From dae902fe032af9895bd249a8d78a12cc4c973480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:36:28 -0500 Subject: [PATCH] feat: next safe generalization --- bun.lockb | Bin 399948 -> 407860 bytes package.json | 80 +++++++++--------- .../tank-performance/components/Info.tsx | 2 +- .../tank-performance/components/TankRow.tsx | 4 +- .../tank-performance/components/Tanks.tsx | 8 +- .../components/TierBreakdown.tsx | 3 +- .../tank-performance/components/Total.tsx | 2 +- src/app/tools/tank-performance/page.tsx | 6 +- .../tankopedia/components/FilterControl.tsx | 17 ++-- .../tools/tankopedia/components/NoResults.tsx | 9 +- .../tools/tankopedia/components/QuickLink.tsx | 6 +- .../tools/tankopedia/components/SearchBar.tsx | 17 ++-- .../components/TankSearch/index.tsx | 4 +- .../tankopedia/components/TierFilter.tsx | 11 +-- src/app/tools/tankopedia/page.tsx | 6 +- src/core/blitzkit/filterTank.ts | 1 - src/core/zustand/createNextSafeStore.tsx | 71 ++++++++++++++++ src/hooks/useAveragesExclusionRatio.ts | 2 +- src/stores/tankFilters.tsx | 69 +++------------ 19 files changed, 163 insertions(+), 155 deletions(-) create mode 100644 src/core/zustand/createNextSafeStore.tsx diff --git a/bun.lockb b/bun.lockb index 374b1c460fd7df43fe4e7f5d8e9b84391c3522c0..2e7334ffa5fe34e50f2eae5e9d1ff138f2f7823c 100644 GIT binary patch delta 82582 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𝔭^qOu%>cppp< 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 delta 79277 zcmeFad3=rM{`b4qVv!rEsVbqSs<}ZFS(z3wCWxULVn|6MWRXb*Bt*oR)KGd?uf$M7 z5km|$hmv-jz5pZ&bfbIw1&u2WdFhMKD;bW-6cOV{PMd_El%(YFxN)Y$sPM>SgdIYJ8Ya`M`jt&44eE%EjYoeV`y{e^UzArrqCN`75On}bLd*=bI?p^6KDiA14b_xjMzd2XiygP6Dou* znsp6oba7HdiX=>}@U9ykw0(5!c%NHS}i;yKEnr^1sIAES5>ls(f0n!$vPVX$jl zRKP=&&Wx`?8GaVZ0uL#F1C$xO4rRP_C>lM>p~8o%@NUZYfHHkjv}2M3z1Bb(qzJD&%#{v7#9`mcpc%KBdc1;@)tolHKu@bN@TW{`a6{MOB_Eg64{!5 zhR-Q*yp7D?k>oKoIy~8Q6PzP_QTMFeD&r*=S(~aa$Wnf7Cv)=$XDgaRS-S+atZI75 z((gh!G2geyQf9T6`UyDWhjf(V@6kc#(-l6)`5XA0Cq1C(HOzPztah9Pv)mAo;X|m=6@y@~=~pF~<*ED+p-fN@`Yg26SFXVl zDEss{locv~vP+VpVyAF(SO=dY9T^`J57*SXw`|}{C>!<(l;O$HYFzvcVQ}!0!jt0@ zF*l?7N`DBH73cx235|}L=8-rd!sHE~Q|!G!nQ_e^sR`ke;!&Qd5S-!d5sw8mS6U0o zrLwf29J9#q*r=EcM_QBx0j$}bKC(q6P!?QcfNc5r@iF1t0KdYl;}F#fmK8b+pB3Ax z{1EsocsG;W68s>u{SQh!dfw|!-_tmee2No=;sHB6?PI5phx zkE-ywVfw3Dqk7AXA5}&vaS0AwR!mXS+P;c(edMw zOyQA{Q3=UOCOuIvuiiMrc}hBuPv>drJPnO4K2 zr>66GSI2n9Ea$Q8Ja(P;0Oz^yJm;Oqwe#2=7mqnQ#boNQwu16BxuUm2IpQ~ze;&#y zbVO;w3|UdRzEdm_!fLlm060nnJIVYr=i?3oEcYv CWH_j31 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 diff --git a/src/app/tools/tank-performance/components/TankRow.tsx b/src/app/tools/tank-performance/components/TankRow.tsx index 52cb2e10b..0a6255854 100644 --- a/src/app/tools/tank-performance/components/TankRow.tsx +++ b/src/app/tools/tank-performance/components/TankRow.tsx @@ -24,11 +24,11 @@ export const TankRow = memo( {((averages.mu.wins / averages.mu.battles) * 100).toFixed(1)}% - {numberFormat.format(Math.round(ratio * averages.samples))} + {numberFormat.format(Math.round(ratio * averages.samples.d_30))} {numberFormat.format( - Math.round(ratio * averages.mu.battles * averages.samples), + Math.round(ratio * averages.mu.battles * averages.samples.total), )} diff --git a/src/app/tools/tank-performance/components/Tanks.tsx b/src/app/tools/tank-performance/components/Tanks.tsx index 15c08f094..25af192a6 100644 --- a/src/app/tools/tank-performance/components/Tanks.tsx +++ b/src/app/tools/tank-performance/components/Tanks.tsx @@ -6,7 +6,7 @@ import { Suspense, use, useEffect, useMemo, useState } from 'react'; import { averageDefinitionsArray } from '../../../../core/blitzkit/averageDefinitions'; import { filterTank } from '../../../../core/blitzkit/filterTank'; import { tankDefinitions } from '../../../../core/blitzkit/tankDefinitions'; -import { useTankFilters } from '../../../../stores/tankFilters'; +import * as TankFilters from '../../../../stores/tankFilters'; import { useTankPerformanceSort } from '../../../../stores/tankPerformanceSort'; import { RowLoader } from './RowLoader'; import { TankRow } from './TankRow'; @@ -18,7 +18,7 @@ const DEFAULT_LOADED_ROWS = 25; export function Tanks() { const awaitedTankDefinitions = use(tankDefinitions); const awaitedAverageDefinitionsArray = use(averageDefinitionsArray); - const filters = useTankFilters(); + const filters = TankFilters.use(); const sort = useTankPerformanceSort(); const tanksSorted = useMemo(() => { switch (sort.type) { @@ -31,7 +31,7 @@ export function Tanks() { return awaitedAverageDefinitionsArray.sort( (a, b) => sort.direction * - (a.samples * a.mu.battles - b.samples * b.mu.battles), + (a.samples.total * a.mu.battles - b.samples.total * b.mu.battles), ); case 'capturePoints': return awaitedAverageDefinitionsArray.sort( @@ -81,7 +81,7 @@ export function Tanks() { ); case 'players': return awaitedAverageDefinitionsArray.sort( - (a, b) => sort.direction * (a.samples - b.samples), + (a, b) => sort.direction * (a.samples.d_30 - b.samples.d_30), ); case 'spots': return awaitedAverageDefinitionsArray.sort( diff --git a/src/app/tools/tank-performance/components/TierBreakdown.tsx b/src/app/tools/tank-performance/components/TierBreakdown.tsx index 667a5d48d..ae851c26a 100644 --- a/src/app/tools/tank-performance/components/TierBreakdown.tsx +++ b/src/app/tools/tank-performance/components/TierBreakdown.tsx @@ -44,7 +44,8 @@ export function TierBreakdown() { tierTanks.forEach((stats) => { const tank = awaitedTankDefinitions[stats.id]; - populations[tank.class] += stats.mu.battles * stats.samples; + populations[tank.class] += + stats.mu.battles * stats.samples.d_30; }); TANK_CLASSES.forEach((tankClass) => { diff --git a/src/app/tools/tank-performance/components/Total.tsx b/src/app/tools/tank-performance/components/Total.tsx index e49d7bfc0..3ede675b3 100644 --- a/src/app/tools/tank-performance/components/Total.tsx +++ b/src/app/tools/tank-performance/components/Total.tsx @@ -18,7 +18,7 @@ export const Total = memo( const sum = useCallback( (slice: (tank: AverageDefinitionsAllStats) => number) => { return tanks.reduce( - (acc, tank) => acc + tank.samples * slice(tank.mu), + (acc, tank) => acc + tank.samples.total * slice(tank.mu), 0, ); }, diff --git a/src/app/tools/tank-performance/page.tsx b/src/app/tools/tank-performance/page.tsx index fc21cd5f5..1e4f6fdcc 100644 --- a/src/app/tools/tank-performance/page.tsx +++ b/src/app/tools/tank-performance/page.tsx @@ -1,5 +1,5 @@ import PageWrapper from '../../../components/PageWrapper'; -import { TankFiltersProvider } from '../../../stores/tankFilters'; +import * as TankFilters from '../../../stores/tankFilters'; import { FilterControl } from '../tankopedia/components/FilterControl'; import { Info } from './components/Info'; import { TankTable } from './components/Table'; @@ -7,13 +7,13 @@ import { TierBreakdown } from './components/TierBreakdown'; export default function Page() { return ( - + - + ); } diff --git a/src/app/tools/tankopedia/components/FilterControl.tsx b/src/app/tools/tankopedia/components/FilterControl.tsx index 67086750a..d2be97bf1 100644 --- a/src/app/tools/tankopedia/components/FilterControl.tsx +++ b/src/app/tools/tankopedia/components/FilterControl.tsx @@ -14,11 +14,7 @@ import { asset } from '../../../../core/blitzkit/asset'; import { gameDefinitions } from '../../../../core/blitzkit/gameDefinitions'; import { Tier } from '../../../../core/blitzkit/tankDefinitions'; import { TIER_ROMAN_NUMERALS } from '../../../../core/blitzkit/tankDefinitions/constants'; -import { - useTankFilters, - useTankFiltersContext, - useTankFiltersMutation, -} from '../../../../stores/tankFilters'; +import * as TankFilters from '../../../../stores/tankFilters'; interface FilterControlProps { compact?: boolean; @@ -26,9 +22,9 @@ interface FilterControlProps { export function FilterControl({ compact }: FilterControlProps) { const awaitedGameDefinitions = use(gameDefinitions); - const filters = useTankFilters(); - const mutateTankFilters = useTankFiltersMutation(); - const tankFiltersContext = useTankFiltersContext(); + const filters = TankFilters.use(); + const mutateTankFilters = TankFilters.useMutation(); + const tankFiltersStore = TankFilters.useStore(); return ( @@ -325,10 +321,7 @@ export function FilterControl({ compact }: FilterControlProps) { { - tankFiltersContext.setState( - tankFiltersContext.getInitialState(), - true, - ); + tankFiltersStore.setState(tankFiltersStore.getInitialState(), true); }} > diff --git a/src/app/tools/tankopedia/components/NoResults.tsx b/src/app/tools/tankopedia/components/NoResults.tsx index 5592c33a4..2082e60ac 100644 --- a/src/app/tools/tankopedia/components/NoResults.tsx +++ b/src/app/tools/tankopedia/components/NoResults.tsx @@ -1,12 +1,12 @@ import { Flex, Link, Text } from '@radix-ui/themes'; -import { useTankFiltersContext } from '../../../../stores/tankFilters'; +import * as TankFilters from '../../../../stores/tankFilters'; interface NoResultsProps { type?: 'filters' | 'search'; } export function NoResults({ type = 'filters' }: NoResultsProps) { - const tankFiltersContext = useTankFiltersContext(); + const tankFiltersStore = TankFilters.useStore(); return ( @@ -17,10 +17,7 @@ export function NoResults({ type = 'filters' }: NoResultsProps) { underline="always" color="red" onClick={() => - tankFiltersContext.setState( - tankFiltersContext.getInitialState(), - true, - ) + tankFiltersStore.setState(tankFiltersStore.getInitialState(), true) } > {type === 'filters' ? 'Try clearing filters' : 'Try searching again'} diff --git a/src/app/tools/tankopedia/components/QuickLink.tsx b/src/app/tools/tankopedia/components/QuickLink.tsx index d5471ba4f..694200d35 100644 --- a/src/app/tools/tankopedia/components/QuickLink.tsx +++ b/src/app/tools/tankopedia/components/QuickLink.tsx @@ -1,15 +1,15 @@ import { CaretRightIcon } from '@radix-ui/react-icons'; import { Button, Link, TextField } from '@radix-ui/themes'; import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions'; -import { useTankFilters } from '../../../../stores/tankFilters'; +import * as TankFilters from '../../../../stores/tankFilters'; interface QuickLinkProps { topResult?: TankDefinition; } export function QuickLink({ topResult }: QuickLinkProps) { - const search = useTankFilters((state) => state.search); - const searching = useTankFilters((state) => state.searching); + const search = TankFilters.use((state) => state.search); + const searching = TankFilters.use((state) => state.searching); if (!search || !topResult || searching) return null; diff --git a/src/app/tools/tankopedia/components/SearchBar.tsx b/src/app/tools/tankopedia/components/SearchBar.tsx index 54c9915d1..51f24611e 100644 --- a/src/app/tools/tankopedia/components/SearchBar.tsx +++ b/src/app/tools/tankopedia/components/SearchBar.tsx @@ -4,10 +4,7 @@ import { debounce } from 'lodash'; import { useRouter } from 'next/navigation'; import { KeyboardEventHandler, useCallback, useRef } from 'react'; import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions'; -import { - useTankFilters, - useTankFiltersContext, -} from '../../../../stores/tankFilters'; +import * as TankFilters from '../../../../stores/tankFilters'; import { QuickLink } from './QuickLink'; import { Sort } from './Sort'; @@ -17,27 +14,27 @@ interface SearchBarProps { } export function SearchBar({ topResult, onSelect }: SearchBarProps) { - const tankFiltersContext = useTankFiltersContext(); + const tankFiltersStore = TankFilters.useStore(); const router = useRouter(); const input = useRef(null); - const searching = useTankFilters((state) => state.searching); + const searching = TankFilters.use((state) => state.searching); const performSearch = useCallback( debounce(() => { - tankFiltersContext.setState({ searching: false }); + tankFiltersStore.setState({ searching: false }); if (!input.current) return; const sanitized = input.current.value.trim(); - tankFiltersContext.setState({ + tankFiltersStore.setState({ search: sanitized.length === 0 ? undefined : sanitized, }); }, 500), [], ); const handleChange = useCallback(() => { - if (!tankFiltersContext.getState().searching) { - tankFiltersContext.setState({ searching: true }); + if (!tankFiltersStore.getState().searching) { + tankFiltersStore.setState({ searching: true }); } performSearch(); diff --git a/src/app/tools/tankopedia/components/TankSearch/index.tsx b/src/app/tools/tankopedia/components/TankSearch/index.tsx index 9f631646a..1106f8f92 100644 --- a/src/app/tools/tankopedia/components/TankSearch/index.tsx +++ b/src/app/tools/tankopedia/components/TankSearch/index.tsx @@ -20,7 +20,7 @@ import { } from '../../../../../core/blitzkit/tankDefinitions'; import { unionBoundingBox } from '../../../../../core/blitzkit/unionBoundingBox'; import { useAdExempt } from '../../../../../hooks/useAdExempt'; -import { useTankFilters } from '../../../../../stores/tankFilters'; +import * as TankFilters from '../../../../../stores/tankFilters'; import { SORT_NAMES, SORT_UNITS } from '../../../../../stores/tankopedia'; import { useTankopediaSort } from '../../../../../stores/tankopediaSort'; import { FilterControl } from '../FilterControl'; @@ -45,7 +45,7 @@ export const TankSearch = memo( const awaitedTankDefinitions = use(tankDefinitions); const awaitedTanksDefinitionsArray = use(tanksDefinitionsArray); const awaitedTankNames = use(tankNames); - const filters = useTankFilters(); + const filters = TankFilters.use(); const sort = useTankopediaSort(); const tanks = useMemo(() => { if (filters.search === undefined) { diff --git a/src/app/tools/tankopedia/components/TierFilter.tsx b/src/app/tools/tankopedia/components/TierFilter.tsx index 074826494..9a9ff062a 100644 --- a/src/app/tools/tankopedia/components/TierFilter.tsx +++ b/src/app/tools/tankopedia/components/TierFilter.tsx @@ -3,17 +3,14 @@ import { times } from 'lodash'; import { memo } from 'react'; import { Tier } from '../../../../core/blitzkit/tankDefinitions'; import { TIER_ROMAN_NUMERALS } from '../../../../core/blitzkit/tankDefinitions/constants'; -import { - useTankFilters, - useTankFiltersMutation, -} from '../../../../stores/tankFilters'; +import * as TankFilters from '../../../../stores/tankFilters'; import { useTankopediaSort } from '../../../../stores/tankopediaSort'; export const TierFilter = memo(() => { - const tierFilter = useTankFilters((state) => state.tiers); + const tierFilter = TankFilters.use((state) => state.tiers); const sort = useTankopediaSort(); - const search = useTankFilters((state) => state.search); - const mutateTankFilters = useTankFiltersMutation(); + const search = TankFilters.use((state) => state.search); + const mutateTankFilters = TankFilters.useMutation(); if (sort.by !== 'meta.none' || search) return null; diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 5647d9edb..827fa169a 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -3,18 +3,18 @@ import { AdMidSectionResponsive } from '../../../components/AdMidSectionResponsive'; import PageWrapper from '../../../components/PageWrapper'; import { useAdExempt } from '../../../hooks/useAdExempt'; -import { TankFiltersProvider } from '../../../stores/tankFilters'; +import * as TankFilters from '../../../stores/tankFilters'; import { TankSearch } from './components/TankSearch'; export default function Page() { const exempt = useAdExempt(); return ( - + {!exempt && } - + ); } diff --git a/src/core/blitzkit/filterTank.ts b/src/core/blitzkit/filterTank.ts index e25e36fd1..5351b09ee 100644 --- a/src/core/blitzkit/filterTank.ts +++ b/src/core/blitzkit/filterTank.ts @@ -1,4 +1,3 @@ -import { TankFilters } from '../../stores/tankFilters'; import { TankDefinition } from './tankDefinitions'; export function filterTank(filters: TankFilters, tank: TankDefinition) { diff --git a/src/core/zustand/createNextSafeStore.tsx b/src/core/zustand/createNextSafeStore.tsx new file mode 100644 index 000000000..ec871f1d2 --- /dev/null +++ b/src/core/zustand/createNextSafeStore.tsx @@ -0,0 +1,71 @@ +import { Draft, produce } from 'immer'; +import { Context, createContext, ReactNode, useContext, useRef } from 'react'; +import { createStore, StoreApi, useStore as useStoreZustand } from 'zustand'; + +interface StoreProviderProps { + children: ReactNode; +} + +export function createStoreContext() { + return createContext | undefined>(undefined); +} + +export function createStoreProvider( + initialState: Type, + Context: Context | undefined>, +) { + return function Provider({ children }: StoreProviderProps) { + const storeRef = useRef>(); + if (!storeRef.current) { + storeRef.current = createStore()(() => ({ ...initialState })); + } + + return ( + {children} + ); + }; +} + +export function createNextSafeStore(initialState: Type) { + const Context = createContext | undefined>(undefined); + + function Provider({ children }: StoreProviderProps) { + const storeRef = useRef>(); + if (!storeRef.current) { + storeRef.current = createStore()(() => ({ ...initialState })); + } + + return ( + {children} + ); + } + + function useStore() { + const store = useContext(Context); + if (!store) { + throw new Error('useStoreContext must be used within Provider'); + } + return store; + } + + function use( + selector: (store: Type) => Slice = (state) => state as unknown as Slice, + ): Slice { + const store = useStore(); + return useStoreZustand(store, selector); + } + + function useMutation() { + const counterStoreContext = useStore(); + + return function (recipe: (draft: Draft) => void) { + counterStoreContext.setState( + produce((draft) => { + recipe(draft); + }), + ); + }; + } + + return { Provider, use, useMutation, useStore }; +} diff --git a/src/hooks/useAveragesExclusionRatio.ts b/src/hooks/useAveragesExclusionRatio.ts index 413c7b9df..46fa4a838 100644 --- a/src/hooks/useAveragesExclusionRatio.ts +++ b/src/hooks/useAveragesExclusionRatio.ts @@ -8,6 +8,6 @@ export function useAveragesExclusionRatio() { return ( awaitedDiscoveredIdsDefinitions.count / - awaitedAverageDefinitions.scanned_players + awaitedAverageDefinitions.samples.total ); } diff --git a/src/stores/tankFilters.tsx b/src/stores/tankFilters.tsx index c368391d7..6d87247b5 100644 --- a/src/stores/tankFilters.tsx +++ b/src/stores/tankFilters.tsx @@ -1,10 +1,8 @@ 'use client'; -import { produce } from 'immer'; -import { createContext, ReactNode, useContext, useRef } from 'react'; -import { createStore, StoreApi, useStore } from 'zustand'; import { TankClass, TreeType } from '../components/Tanks'; import { Tier } from '../core/blitzkit/tankDefinitions'; +import { createNextSafeStore } from '../core/zustand/createNextSafeStore'; export interface TankFilters { tiers: Tier[]; @@ -16,58 +14,13 @@ export interface TankFilters { searching: boolean; } -export const tankFiltersInitialState: TankFilters = { - testing: 'include', - searching: false, - classes: [], - nations: [], - tiers: [], - types: [], -}; - -const createTankFiltersStore = ( - initialState: TankFilters = tankFiltersInitialState, -) => createStore()(() => ({ ...initialState })); - -const TankFiltersContext = createContext | undefined>( - undefined, -); - -interface TankFiltersProviderProps { - children: ReactNode; -} - -export function TankFiltersProvider({ children }: TankFiltersProviderProps) { - const storeRef = useRef>(); - if (!storeRef.current) storeRef.current = createTankFiltersStore(); - - return ( - - {children} - - ); -} - -export function useTankFiltersContext() { - const context = useContext(TankFiltersContext); - if (!context) { - throw new Error('useTankFilters must be used within TankFiltersContext'); - } - return context; -} - -export function useTankFilters( - selector: (store: TankFilters) => Type = (store) => store as Type, -): Type { - const counterStoreContext = useTankFiltersContext(); - - return useStore(counterStoreContext, selector); -} - -export function useTankFiltersMutation() { - const counterStoreContext = useTankFiltersContext(); - - return function (recipe: (draft: TankFilters) => void) { - counterStoreContext.setState(produce(recipe)); - }; -} +export const { Provider, use, useMutation, useStore } = + createNextSafeStore({ + tiers: [], + nations: [], + classes: [], + types: [], + testing: 'include', + search: undefined, + searching: false, + });