Files
service_manager/frontend-client/src/lib/stores/app.ts
2026-02-12 14:00:04 -07:00

80 lines
1.8 KiB
TypeScript

import { writable } from 'svelte/store';
import { auth } from './auth.js';
import { get } from 'svelte/store';
import type { Writable } from 'svelte/store';
// Types
export interface Category {
id: string;
name: string;
description: string;
is_active: boolean;
tenant_id: string;
created_at: string;
}
export interface AppState {
categories: Category[];
isLoading: boolean;
error: string | null;
}
// Initial state
const initialState: AppState = {
categories: [],
isLoading: false,
error: null
};
// API helper function
async function apiCall(endpoint: string, options: RequestInit = {}) {
const authState = get(auth);
const response = await fetch(`/api/v1${endpoint}`, {
...options,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${authState.token}`,
...options.headers
}
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.detail || 'Request failed');
}
return response.json();
}
// Create app store
function createAppStore() {
const { subscribe, set, update }: Writable<AppState> = writable(initialState);
return {
subscribe,
// Load categories
loadCategories: async () => {
update(state => ({ ...state, isLoading: true, error: null }));
try {
const categories = await apiCall('/categories/');
update(state => ({ ...state, categories, isLoading: false }));
} catch (error) {
update(state => ({
...state,
isLoading: false,
error: error instanceof Error ? error.message : 'Failed to load categories'
}));
}
},
// Clear error
clearError: () => {
update(state => ({ ...state, error: null }));
}
};
}
export const app = createAppStore();