Files
leocrm/frontend/src/api/userPreferences.ts
T

75 lines
1.7 KiB
TypeScript
Raw Normal View History

/**
* User Preferences API — per-user UI settings stored server-side.
* Matches backend endpoints from /api/v1/user/preferences.
*
* Backend: app/routes/user_preferences.py, app/models/user_preference.py
*/
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { apiGet, apiPut, apiDelete } from './client';
// ── Types ──
export interface PreferenceEntry {
key: string;
value: unknown;
updated_at?: string | null;
}
export interface PreferenceListResponse {
preferences: PreferenceEntry[];
}
// ── Hooks ──
export function useUserPreferences() {
return useQuery({
queryKey: ['userPreferences'],
queryFn: () =>
apiGet<PreferenceListResponse>('/user/preferences'),
});
}
export function useUserPreference(key: string) {
return useQuery({
queryKey: ['userPreferences', key],
queryFn: () =>
apiGet<PreferenceEntry>(`/user/preferences/${key}`),
enabled: !!key,
});
}
export function useUpsertUserPreference() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({
key,
value,
}: {
key: string;
value: unknown;
}) =>
apiPut<PreferenceEntry>(`/user/preferences/${key}`, {
value,
}),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ['userPreferences'],
});
},
});
}
export function useDeleteUserPreference() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (key: string) =>
apiDelete(`/user/preferences/${key}`),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ['userPreferences'],
});
},
});
}