75 lines
1.7 KiB
TypeScript
75 lines
1.7 KiB
TypeScript
|
|
/**
|
||
|
|
* 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'],
|
||
|
|
});
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|