65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import create from 'zustand';
|
|
import { persist } from 'zustand/middleware';
|
|
import locales from 'res/dayjs_locales';
|
|
|
|
export const useSettingsStore = create(persist(
|
|
set => ({
|
|
weekStart: 0,
|
|
timeFormat: '12h',
|
|
theme: 'System',
|
|
highlight: false,
|
|
|
|
setWeekStart: weekStart => set({ weekStart }),
|
|
setTimeFormat: timeFormat => set({ timeFormat }),
|
|
setTheme: theme => set({ theme }),
|
|
setHighlight: highlight => set({ highlight }),
|
|
}),
|
|
{ name: 'crabfit-settings' },
|
|
));
|
|
|
|
export const useRecentsStore = create(persist(
|
|
set => ({
|
|
recents: [],
|
|
|
|
addRecent: event => set(state => {
|
|
const recents = state.recents.filter(e => e.id !== event.id);
|
|
recents.unshift(event);
|
|
recents.length = Math.min(recents.length, 5);
|
|
return { recents };
|
|
}),
|
|
removeRecent: id => set(state => {
|
|
const recents = state.recents.filter(e => e.id !== id);
|
|
return { recents };
|
|
}),
|
|
clearRecents: () => set({ recents: [] }),
|
|
}),
|
|
{ name: 'crabfit-recent' },
|
|
));
|
|
|
|
export const useTWAStore = create(set => ({
|
|
TWA: undefined,
|
|
setTWA: TWA => set({ TWA }),
|
|
}));
|
|
|
|
export const useLocaleUpdateStore = create(set => ({
|
|
locale: 'en',
|
|
setLocale: locale => set({ locale }),
|
|
}));
|
|
|
|
export const useTranslateStore = create(persist(
|
|
set => ({
|
|
navigatorLang: navigator.language,
|
|
navigatorSupported: Object.keys(locales).includes(navigator.language.substring(0, 2)),
|
|
translateDialogDismissed: false,
|
|
|
|
setDialogDismissed: value => set({ translateDialogDismissed: value }),
|
|
}),
|
|
{
|
|
name: 'crabfit-translate',
|
|
blacklist: [
|
|
'navigatorLang',
|
|
'navigatorSupported',
|
|
],
|
|
},
|
|
));
|