Initial TicketTracker release

This commit is contained in:
2026-08-05 10:55:30 +02:00
commit 125b1d22ff
128 changed files with 26208 additions and 0 deletions
@@ -0,0 +1,63 @@
import { createStore } from "zustand/vanilla";
import { applyPreference } from "@/lib/preferences/preference-runtime";
import {
PREFERENCE_DEFAULTS,
PREFERENCE_KEYS,
type PreferenceKey,
type PreferenceValueMap,
} from "@/lib/preferences/preferences-config";
import { persistPreference } from "@/lib/preferences/preferences-storage";
import type { ResolvedThemeMode } from "@/lib/preferences/theme";
export type PreferencesState = {
values: PreferenceValueMap;
resolvedThemeMode: ResolvedThemeMode;
isSynced: boolean;
setPreference: <K extends PreferenceKey>(key: K, value: PreferenceValueMap[K]) => void;
resetPreferences: () => void;
};
export const createPreferencesStore = (initialValues: Partial<PreferenceValueMap> = {}) => {
const values: PreferenceValueMap = {
...PREFERENCE_DEFAULTS,
...initialValues,
};
return createStore<PreferencesState>()((set) => ({
values,
resolvedThemeMode: values.theme_mode === "dark" ? "dark" : "light",
isSynced: false,
setPreference: (key, value) => {
const resolvedThemeMode = applyPreference(key, value);
set((state) => ({
values: {
...state.values,
[key]: value,
} as PreferenceValueMap,
...(resolvedThemeMode ? { resolvedThemeMode } : {}),
}));
void persistPreference(key, value);
},
resetPreferences: () => {
let resolvedThemeMode: ResolvedThemeMode = "light";
for (const key of PREFERENCE_KEYS) {
const value = PREFERENCE_DEFAULTS[key];
const resolved = applyPreference(key, value);
if (resolved) resolvedThemeMode = resolved;
void persistPreference(key, value);
}
set({
values: { ...PREFERENCE_DEFAULTS },
resolvedThemeMode,
});
},
}));
};