feat: use deferred store

This commit is contained in:
TrèsAbhi committed 2024-08-19 20:40:50 -05:00
1 parent 2727b2babe
commit 59324f7438
6 files changed
+30 -11

No files matched your search

+1 -1
View File
@@ -5,7 +5,7 @@ import PageWrapper from '../../components/PageWrapper';
import * as App from '../../stores/app'; import * as App from '../../stores/app';
export default function Page() { export default function Page() {
const developerMode = App.use((state) => state.developerMode); const developerMode = App.useDeferred(false, (state) => state.developerMode);
const appStore = App.useStore(); const appStore = App.useStore();
return ( return (
@@ -8,7 +8,7 @@ import * as App from '../../../../../../stores/app';
import * as Duel from '../../../../../../stores/duel'; import * as Duel from '../../../../../../stores/duel';
export function MetaSection() { export function MetaSection() {
const developerMode = App.use((state) => state.developerMode); const developerMode = App.useDeferred(false, (state) => state.developerMode);
const tank = Duel.use((state) => state.protagonist.tank); const tank = Duel.use((state) => state.protagonist.tank);
const rawPrice = const rawPrice =
typeof tank.price === 'number' ? tank.price : tank.price.value; typeof tank.price === 'number' ? tank.price : tank.price.value;
@@ -70,12 +70,11 @@ export function Options({ thicknessRange }: OptionsProps) {
const environment = TankopediaPersistent.use( const environment = TankopediaPersistent.use(
(state) => state.model.visual.environment, (state) => state.model.visual.environment,
); );
const developerMode = App.use((state) => state.developerMode); const developerMode = App.useDeferred(false, (state) => state.developerMode);
const antagonistGun = Duel.use((state) => state.antagonist.gun); const antagonistGun = Duel.use((state) => state.antagonist.gun);
const antagonistShell = Duel.use((state) => state.antagonist.shell); const antagonistShell = Duel.use((state) => state.antagonist.shell);
const [antagonistSelectorOpen, setAntagonistSelectorOpen] = useState(false); const [antagonistSelectorOpen, setAntagonistSelectorOpen] = useState(false);
const antagonistTank = Duel.use((state) => state.antagonist.tank); const antagonistTank = Duel.use((state) => state.antagonist.tank);
const antagonistTurret = Duel.use((state) => state.antagonist.turret);
const hasCalibratedShells = useEquipment(103, true); const hasCalibratedShells = useEquipment(103, true);
const [tab, setTab] = useState('search'); const [tab, setTab] = useState('search');
const mutateDuel = Duel.useMutation(); const mutateDuel = Duel.useMutation();
@@ -22,8 +22,7 @@ export function ArmorPlateDisplay() {
(state) => state.highlightArmor, (state) => state.highlightArmor,
); );
const mutateTankopediaEphemeral = TankopediaEphemeral.useMutation(); const mutateTankopediaEphemeral = TankopediaEphemeral.useMutation();
const developerMode = App.use((state) => state.developerMode); const developerMode = App.useDeferred(false, (state) => state.developerMode);
const devThicknessInput = useRef<HTMLInputElement>(null);
const duelStore = Duel.useStore(); const duelStore = Duel.useStore();
const input = useRef<HTMLInputElement>(null); const input = useRef<HTMLInputElement>(null);
const tankopediaEphemeralStore = TankopediaEphemeral.useStore(); const tankopediaEphemeralStore = TankopediaEphemeral.useStore();
+23 -2
View File
@@ -1,5 +1,12 @@
import { Draft, produce } from 'immer'; import { Draft, produce } from 'immer';
import { createContext, ReactNode, useContext, useRef } from 'react'; import {
createContext,
ReactNode,
useContext,
useEffect,
useRef,
useState,
} from 'react';
import { StoreApi, useStore as useStoreZustand } from 'zustand'; import { StoreApi, useStore as useStoreZustand } from 'zustand';
type StoreProviderProps<InitData> = { type StoreProviderProps<InitData> = {
@@ -49,6 +56,20 @@ export function createNextSafeStore<Store extends StoreApi<unknown>, InitData>(
); );
} }
function useDeferred<Slice = Type>(
initial: Slice,
selector: (store: Type) => Slice = (state) => state as Slice,
) {
const [state, setState] = useState(initial);
const trueState = use(selector);
useEffect(() => {
setState(trueState);
}, [trueState]);
return state;
}
function useMutation() { function useMutation() {
const counterStoreContext = useStore(); const counterStoreContext = useStore();
@@ -61,5 +82,5 @@ export function createNextSafeStore<Store extends StoreApi<unknown>, InitData>(
}; };
} }
return { Provider, use, useMutation, useStore }; return { Provider, use, useMutation, useStore, useDeferred };
} }
+3 -3
View File
@@ -26,8 +26,8 @@ export interface App {
policiesAgreementIndex: number; policiesAgreementIndex: number;
} }
export const { Provider, use, useMutation, useStore } = createNextSafeStore( export const { Provider, use, useMutation, useStore, useDeferred } =
() => createNextSafeStore(() =>
create<App>()( create<App>()(
persist( persist(
(set) => ({ (set) => ({
@@ -38,4 +38,4 @@ export const { Provider, use, useMutation, useStore } = createNextSafeStore(
{ name: 'app', merge: (a, b) => merge(b, a) }, { name: 'app', merge: (a, b) => merge(b, a) },
), ),
), ),
); );