use-setup-settings.ts1.6 KBView on GitHub import { useCallback } from 'react';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useTRPC } from '@/providers/query-provider';
import { useSettings } from '@/modules/userSettings/hooks/use-settings';
type SettingsShape = Record<string, unknown>;
/**
* Read + patch the plain (non-inbox) user settings the setup flow touches.
*
* Writes land in the cache first so the preview turns over on the same frame as
* the click. `settings.save` merges server-side per top-level key, so patching
* one field here cannot clobber a concurrent write to another.
*/
export function useSetupSettings() {
const trpc = useTRPC();
const queryClient = useQueryClient();
const settingsQuery = useSettings();
const settingsKey=[redacted];
const { mutate } = useMutation(
trpc.settings.save.mutationOptions({
onSettled: () => queryClient.invalidateQueries({ queryKey=[redacted] }),
}),
);
const settings = (settingsQuery.data?.settings ?? {}) as SettingsShape;
// `settingsQuery.data` appears below only inside `typeof`, which is erased — listing it as a
// dependency would re-identify `patch` on every refetch for no runtime reason.
const patch = useCallback(
(next: SettingsShape) => {
queryClient.setQueryData(settingsKey, (old: typeof settingsQuery.data) =>
old ? { ...old, settings: { ...old.settings, ...next } } : old,
);
mutate(next as never);
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[queryClient, settingsKey, mutate],
);
return { settings, patch, isLoading: settingsQuery.isPending };
}