try to do better
This commit is contained in:
@@ -7,6 +7,18 @@ const getStoredPreferences = () => {
|
||||
return { theme, locale };
|
||||
};
|
||||
|
||||
interface CacheEntry<T> {
|
||||
data: T;
|
||||
timestamp: number;
|
||||
}
|
||||
|
||||
interface CacheState {
|
||||
categories: Map<number, CacheEntry<Category[]>>;
|
||||
members: Map<number, CacheEntry<FamilyMember[]>>;
|
||||
}
|
||||
|
||||
const CACHE_TTL = 5 * 60 * 1000;
|
||||
|
||||
interface AppState {
|
||||
user: User | null;
|
||||
isAuthenticated: boolean;
|
||||
@@ -16,6 +28,7 @@ interface AppState {
|
||||
categories: Category[];
|
||||
familyMembers: FamilyMember[];
|
||||
preferences: { theme: Theme; locale: Locale };
|
||||
cache: CacheState;
|
||||
|
||||
setUser: (user: User | null) => void;
|
||||
setIsLoading: (loading: boolean) => void;
|
||||
@@ -25,9 +38,15 @@ interface AppState {
|
||||
setFamilyMembers: (members: FamilyMember[]) => void;
|
||||
setPreferences: (prefs: Partial<{ theme: Theme; locale: Locale }>) => void;
|
||||
logout: () => void;
|
||||
|
||||
getCachedCategories: (familyId: number) => Category[] | null;
|
||||
setCachedCategories: (familyId: number, categories: Category[]) => void;
|
||||
getCachedMembers: (familyId: number) => FamilyMember[] | null;
|
||||
setCachedMembers: (familyId: number, members: FamilyMember[]) => void;
|
||||
clearCache: () => void;
|
||||
}
|
||||
|
||||
export const useStore = create<AppState>((set) => ({
|
||||
export const useStore = create<AppState>((set, get) => ({
|
||||
user: null,
|
||||
isAuthenticated: false,
|
||||
isLoading: true,
|
||||
@@ -36,6 +55,10 @@ export const useStore = create<AppState>((set) => ({
|
||||
categories: [],
|
||||
familyMembers: [],
|
||||
preferences: getStoredPreferences(),
|
||||
cache: {
|
||||
categories: new Map(),
|
||||
members: new Map(),
|
||||
},
|
||||
|
||||
setUser: (user) => set({ user, isAuthenticated: !!user }),
|
||||
|
||||
@@ -56,6 +79,59 @@ export const useStore = create<AppState>((set) => ({
|
||||
return { preferences: newPrefs };
|
||||
}),
|
||||
|
||||
getCachedCategories: (familyId: number) => {
|
||||
const cached = get().cache.categories.get(familyId);
|
||||
if (!cached) return null;
|
||||
if (Date.now() - cached.timestamp > CACHE_TTL) {
|
||||
set((state) => {
|
||||
const newCache = { ...state.cache };
|
||||
newCache.categories.delete(familyId);
|
||||
return { cache: newCache };
|
||||
});
|
||||
return null;
|
||||
}
|
||||
return cached.data;
|
||||
},
|
||||
|
||||
setCachedCategories: (familyId: number, categories: Category[]) => {
|
||||
set((state) => {
|
||||
const newCache = { ...state.cache };
|
||||
newCache.categories.set(familyId, { data: categories, timestamp: Date.now() });
|
||||
return { cache: newCache };
|
||||
});
|
||||
},
|
||||
|
||||
getCachedMembers: (familyId: number) => {
|
||||
const cached = get().cache.members.get(familyId);
|
||||
if (!cached) return null;
|
||||
if (Date.now() - cached.timestamp > CACHE_TTL) {
|
||||
set((state) => {
|
||||
const newCache = { ...state.cache };
|
||||
newCache.members.delete(familyId);
|
||||
return { cache: newCache };
|
||||
});
|
||||
return null;
|
||||
}
|
||||
return cached.data;
|
||||
},
|
||||
|
||||
setCachedMembers: (familyId: number, members: FamilyMember[]) => {
|
||||
set((state) => {
|
||||
const newCache = { ...state.cache };
|
||||
newCache.members.set(familyId, { data: members, timestamp: Date.now() });
|
||||
return { cache: newCache };
|
||||
});
|
||||
},
|
||||
|
||||
clearCache: () => {
|
||||
set((state) => ({
|
||||
cache: {
|
||||
categories: new Map(),
|
||||
members: new Map(),
|
||||
},
|
||||
}));
|
||||
},
|
||||
|
||||
logout: () => set({
|
||||
user: null,
|
||||
isAuthenticated: false,
|
||||
@@ -63,5 +139,9 @@ export const useStore = create<AppState>((set) => ({
|
||||
families: [],
|
||||
categories: [],
|
||||
familyMembers: [],
|
||||
cache: {
|
||||
categories: new Map(),
|
||||
members: new Map(),
|
||||
},
|
||||
}),
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user