9router / src /store /settingsStore.js
2api
feat: configurable stream stall timeout + per-provider UI
88c4c60
Raw
History Blame Contribute Delete
1.49 kB
"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;