mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 03:29:51 +02:00
feat: next safe generalization
This commit is contained in:
1 parent
eb87463f08
commit
dae902fe03
19 files changed
+163
-155
No files matched your search
+11
-58
@@ -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,
|
||||
});
|
||||
Reference in new issue
Block a user