try to do better

This commit is contained in:
arrelin
2026-01-29 15:17:54 +03:00
parent f00ddc7d10
commit 24f04a7e82
60 changed files with 5335 additions and 1254 deletions

View File

@@ -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(),
},
}),
}));