Spaces:
Sleeping
Sleeping
| "use client"; | |
| import { create } from "zustand"; | |
| import { CLIENT_STORE_TTL_MS } from "@/shared/constants/config"; | |
| const useSettingsStore = create((set, get) => ({ | |
| settings: null, | |
| loading: false, | |
| error: null, | |
| lastFetched: 0, | |
| invalidate: () => set({ lastFetched: 0 }), | |
| // Skips network when cache is fresh; pass {force:true} to override | |
| fetchSettings: async ({ force = false } = {}) => { | |
| const { lastFetched, settings } = get(); | |
| if (!force && settings && Date.now() - lastFetched < CLIENT_STORE_TTL_MS) return settings; | |
| set({ loading: true, error: null }); | |
| try { | |
| const res = await fetch("/api/settings"); | |
| const data = await res.json(); | |
| if (res.ok) { | |
| set({ settings: data, loading: false, lastFetched: Date.now() }); | |
| return data; | |
| } | |
| set({ error: data.error, loading: false }); | |
| } catch (e) { | |
| set({ error: "Failed to fetch settings", loading: false }); | |
| } | |
| return null; | |
| }, | |
| // PATCH server + merge into local cache (no extra fetch needed) | |
| patchSettings: async (patch) => { | |
| try { | |
| const res = await fetch("/api/settings", { | |
| method: "PATCH", | |
| headers: { "Content-Type": "application/json" }, | |
| body: JSON.stringify(patch), | |
| }); | |
| if (!res.ok) return null; | |
| const updated = await res.json(); | |
| set({ settings: updated, lastFetched: Date.now() }); | |
| return updated; | |
| } catch { | |
| return null; | |
| } | |
| }, | |
| })); | |
| export default useSettingsStore; | |