Set up web/ directory with complete frontend scaffolding: - Vue 3 + TypeScript + Vite with Tailwind CSS v4 - Vue Router with auth guard (redirects to /login when unauthenticated) - Pinia stores: auth, cookies, devices, settings - Axios HTTP client with token interceptor - Views: Login, Dashboard, Cookies, Devices, Settings - Vite dev server proxy to relay API on port 8100 - Headless UI and Heroicons dependencies Co-Authored-By: Paperclip <noreply@paperclip.ing>
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { defineStore } from "pinia";
|
|
import { ref } from "vue";
|
|
import api from "@/api/client";
|
|
|
|
export interface AppSettings {
|
|
syncIntervalMs: number;
|
|
maxDevices: number;
|
|
autoSync: boolean;
|
|
theme: "light" | "dark" | "system";
|
|
}
|
|
|
|
const DEFAULT_SETTINGS: AppSettings = {
|
|
syncIntervalMs: 30_000,
|
|
maxDevices: 10,
|
|
autoSync: true,
|
|
theme: "system",
|
|
};
|
|
|
|
export const useSettingsStore = defineStore("settings", () => {
|
|
const settings = ref<AppSettings>({ ...DEFAULT_SETTINGS });
|
|
const loading = ref(false);
|
|
|
|
async function fetchSettings(): Promise<void> {
|
|
loading.value = true;
|
|
try {
|
|
const { data } = await api.get("/settings");
|
|
settings.value = { ...DEFAULT_SETTINGS, ...data };
|
|
} catch {
|
|
// Use defaults if settings endpoint doesn't exist yet
|
|
} finally {
|
|
loading.value = false;
|
|
}
|
|
}
|
|
|
|
async function updateSettings(patch: Partial<AppSettings>): Promise<void> {
|
|
const { data } = await api.patch("/settings", patch);
|
|
settings.value = { ...settings.value, ...data };
|
|
}
|
|
|
|
return { settings, loading, fetchSettings, updateSettings };
|
|
});
|