45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
|
import type { SettingsData } from "../../../shared/api";
|
|
|
|
export function useSettings() {
|
|
const queryClient = useQueryClient();
|
|
|
|
const query = useQuery({
|
|
queryFn: fetchSettings,
|
|
queryKey: ["settings"],
|
|
staleTime: 60000,
|
|
});
|
|
|
|
const mutation = useMutation({
|
|
mutationFn: updateSettings,
|
|
onSuccess: (data) => {
|
|
queryClient.setQueryData(["settings"], data);
|
|
},
|
|
});
|
|
|
|
return {
|
|
data: query.data,
|
|
error: query.error,
|
|
isLoading: query.isLoading,
|
|
isUpdating: mutation.isPending,
|
|
updateSettings: mutation.mutate,
|
|
};
|
|
}
|
|
|
|
async function fetchSettings(): Promise<SettingsData> {
|
|
const response = await fetch("/api/settings");
|
|
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
|
return response.json() as Promise<SettingsData>;
|
|
}
|
|
|
|
async function updateSettings(data: Partial<SettingsData>): Promise<SettingsData> {
|
|
const response = await fetch("/api/settings", {
|
|
body: JSON.stringify(data),
|
|
headers: { "Content-Type": "application/json" },
|
|
method: "PUT",
|
|
});
|
|
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
|
return response.json() as Promise<SettingsData>;
|
|
}
|