68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { create } from 'zustand';
|
|
import type { Family, Category, User, FamilyMember, Theme, Locale } from '../types';
|
|
|
|
const getStoredPreferences = () => {
|
|
const theme = (localStorage.getItem('theme') as Theme) || 'light';
|
|
const locale = (localStorage.getItem('locale') as Locale) || 'ru';
|
|
return { theme, locale };
|
|
};
|
|
|
|
interface AppState {
|
|
user: User | null;
|
|
isAuthenticated: boolean;
|
|
isLoading: boolean;
|
|
selectedFamily: Family | null;
|
|
families: Family[];
|
|
categories: Category[];
|
|
familyMembers: FamilyMember[];
|
|
preferences: { theme: Theme; locale: Locale };
|
|
|
|
setUser: (user: User | null) => void;
|
|
setIsLoading: (loading: boolean) => void;
|
|
setSelectedFamily: (family: Family | null) => void;
|
|
setFamilies: (families: Family[]) => void;
|
|
setCategories: (categories: Category[]) => void;
|
|
setFamilyMembers: (members: FamilyMember[]) => void;
|
|
setPreferences: (prefs: Partial<{ theme: Theme; locale: Locale }>) => void;
|
|
logout: () => void;
|
|
}
|
|
|
|
export const useStore = create<AppState>((set) => ({
|
|
user: null,
|
|
isAuthenticated: false,
|
|
isLoading: true,
|
|
selectedFamily: null,
|
|
families: [],
|
|
categories: [],
|
|
familyMembers: [],
|
|
preferences: getStoredPreferences(),
|
|
|
|
setUser: (user) => set({ user, isAuthenticated: !!user }),
|
|
|
|
setIsLoading: (isLoading) => set({ isLoading }),
|
|
|
|
setSelectedFamily: (family) => set({ selectedFamily: family }),
|
|
|
|
setFamilies: (families) => set({ families }),
|
|
|
|
setCategories: (categories) => set({ categories }),
|
|
|
|
setFamilyMembers: (familyMembers) => set({ familyMembers }),
|
|
|
|
setPreferences: (prefs) => set((state) => {
|
|
const newPrefs = { ...state.preferences, ...prefs };
|
|
if (prefs.theme) localStorage.setItem('theme', prefs.theme);
|
|
if (prefs.locale) localStorage.setItem('locale', prefs.locale);
|
|
return { preferences: newPrefs };
|
|
}),
|
|
|
|
logout: () => set({
|
|
user: null,
|
|
isAuthenticated: false,
|
|
selectedFamily: null,
|
|
families: [],
|
|
categories: [],
|
|
familyMembers: [],
|
|
}),
|
|
}));
|