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 };
}