import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { type GlobalSettings, type GlobalSettingsUpdate, mergeSettings } from "@umt/contracts"; import { apiData } from "~/lib/api.ts"; import { qk } from "~/lib/query-keys.ts"; export function useSettings() { return useQuery({ queryKey: qk.settings, queryFn: ({ signal }) => apiData("/settings", { signal }), }); } /** PATCH /settings,乐观更新(失败回滚) */ export function useUpdateSettings() { const qc = useQueryClient(); return useMutation({ mutationFn: (patch: GlobalSettingsUpdate) => apiData("/settings", { method: "PATCH", body: patch }), onMutate: async (patch) => { await qc.cancelQueries({ queryKey: qk.settings }); const prev = qc.getQueryData(qk.settings); if (prev) qc.setQueryData(qk.settings, mergeSettings(prev, patch)); return { prev }; }, onError: (_e, _p, ctx) => { if (ctx?.prev) qc.setQueryData(qk.settings, ctx.prev); }, onSuccess: (data) => { qc.setQueryData(qk.settings, data); qc.invalidateQueries({ queryKey: qk.dashboard }); }, }); }