useStatusQuery.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { useQuery } from '@tanstack/react-query';
  2. import { useMemo } from 'react';
  3. import { HttpUtil } from '@/utils';
  4. import { parseMsg } from '@/utils/zodValidate';
  5. import { Status } from '@/models/status';
  6. import { StatusSchema } from '@/schemas/status';
  7. import { keys } from '@/api/queryKeys';
  8. const POLL_INTERVAL_MS = 2000;
  9. async function fetchStatus(): Promise<Status> {
  10. const msg = await HttpUtil.get('/panel/api/server/status', undefined, { silent: true });
  11. if (!msg?.success) throw new Error(msg?.msg || 'Failed to fetch status');
  12. const validated = parseMsg(msg, StatusSchema, 'server/status');
  13. return new Status(validated.obj);
  14. }
  15. export function useStatusQuery() {
  16. const query = useQuery({
  17. queryKey: keys.server.status(),
  18. queryFn: fetchStatus,
  19. refetchInterval: POLL_INTERVAL_MS,
  20. refetchIntervalInBackground: false,
  21. staleTime: 0,
  22. });
  23. const status = useMemo(() => query.data ?? new Status(), [query.data]);
  24. const refresh = async () => { await query.refetch(); };
  25. return {
  26. status,
  27. fetched: query.data !== undefined,
  28. refresh,
  29. };
  30. }