useAllSettings.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { useCallback, useEffect, useMemo, useState } from 'react';
  2. import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
  3. import { HttpUtil } from '@/utils';
  4. import { AllSetting } from '@/models/setting';
  5. import { keys } from '@/api/queryKeys';
  6. interface ApiMsg<T = unknown> {
  7. success?: boolean;
  8. obj?: T;
  9. msg?: string;
  10. }
  11. async function fetchAllSetting(): Promise<unknown> {
  12. const msg = await HttpUtil.post('/panel/setting/all', undefined, { silent: true }) as ApiMsg;
  13. if (!msg?.success) throw new Error(msg?.msg || 'Failed to fetch settings');
  14. return msg.obj;
  15. }
  16. export function useAllSettings() {
  17. const queryClient = useQueryClient();
  18. const [draft, setDraft] = useState<AllSetting>(() => new AllSetting());
  19. const [extraSpinning, setExtraSpinning] = useState(false);
  20. const query = useQuery({
  21. queryKey: keys.settings.all(),
  22. queryFn: fetchAllSetting,
  23. staleTime: Infinity,
  24. });
  25. const server = useMemo(() => new AllSetting(query.data), [query.data]);
  26. useEffect(() => {
  27. if (query.data !== undefined) {
  28. setDraft(new AllSetting(query.data));
  29. }
  30. }, [query.data]);
  31. const updateSetting = useCallback((patch: Partial<AllSetting>) => {
  32. setDraft((prev) => {
  33. const next = new AllSetting(prev);
  34. Object.assign(next, patch);
  35. return next;
  36. });
  37. }, []);
  38. const saveMut = useMutation({
  39. mutationFn: async (next: AllSetting) =>
  40. HttpUtil.post('/panel/setting/update', next) as Promise<ApiMsg>,
  41. onSuccess: (msg) => {
  42. if (msg?.success) queryClient.invalidateQueries({ queryKey: keys.settings.all() });
  43. },
  44. });
  45. const saveAll = useCallback(() => saveMut.mutateAsync(draft), [saveMut, draft]);
  46. const saveDisabled = useMemo(() => server.equals(draft), [server, draft]);
  47. return {
  48. allSetting: draft,
  49. updateSetting,
  50. fetched: query.data !== undefined,
  51. spinning: extraSpinning || saveMut.isPending,
  52. setSpinning: setExtraSpinning,
  53. saveDisabled,
  54. saveAll,
  55. };
  56. }