useStatus.ts 955 B

1234567891011121314151617181920212223242526272829303132333435
  1. import { useCallback, useEffect, useRef, useState } from 'react';
  2. import { HttpUtil } from '@/utils';
  3. import { Status } from '@/models/status';
  4. const POLL_INTERVAL_MS = 2000;
  5. export function useStatus() {
  6. const [status, setStatus] = useState<Status>(() => new Status());
  7. const [fetched, setFetched] = useState(false);
  8. const fetchedRef = useRef(false);
  9. const refresh = useCallback(async () => {
  10. try {
  11. const msg = await HttpUtil.get('/panel/api/server/status');
  12. if (msg?.success) {
  13. setStatus(new Status(msg.obj));
  14. if (!fetchedRef.current) {
  15. fetchedRef.current = true;
  16. setFetched(true);
  17. }
  18. }
  19. } catch (e) {
  20. console.error('Failed to get status:', e);
  21. }
  22. }, []);
  23. useEffect(() => {
  24. refresh();
  25. const timer = window.setInterval(refresh, POLL_INTERVAL_MS);
  26. return () => window.clearInterval(timer);
  27. }, [refresh]);
  28. return { status, fetched, refresh };
  29. }