feat: next safe generalization

This commit is contained in:
TrèsAbhi committed 2024-07-08 19:36:28 -05:00
1 parent eb87463f08
commit dae902fe03
19 files changed
+163 -155

No files matched your search

+11 -58
View File
@@ -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<TankFilters>()(() => ({ ...initialState }));
const TankFiltersContext = createContext<StoreApi<TankFilters> | undefined>(
undefined,
);
interface TankFiltersProviderProps {
children: ReactNode;
}
export function TankFiltersProvider({ children }: TankFiltersProviderProps) {
const storeRef = useRef<StoreApi<TankFilters>>();
if (!storeRef.current) storeRef.current = createTankFiltersStore();
return (
<TankFiltersContext.Provider value={storeRef.current}>
{children}
</TankFiltersContext.Provider>
);
}
export function useTankFiltersContext() {
const context = useContext(TankFiltersContext);
if (!context) {
throw new Error('useTankFilters must be used within TankFiltersContext');
}
return context;
}
export function useTankFilters<Type = TankFilters>(
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<TankFilters>({
tiers: [],
nations: [],
classes: [],
types: [],
testing: 'include',
search: undefined,
searching: false,
});