AutoSaveSession.jsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import React from "react";
  2. import { useItems, useBoardConfig, useMessage } from "react-sync-board";
  3. import useTimeout from "../hooks/useTimeout";
  4. import useSession from "../hooks/useSession";
  5. const GRACE_DELAY = import.meta.env.VITE_CI === "1" ? 100 : 5000;
  6. export const AutoSaveSession = () => {
  7. const { saveSession, isMaster, availableItems, gameId } = useSession();
  8. const items = useItems();
  9. const [boardConfig] = useBoardConfig();
  10. const { messages } = useMessage();
  11. const timeoutRef = React.useRef(null);
  12. // Delay the first update to avoid too many session
  13. const readyRef = React.useRef(false);
  14. useTimeout(() => {
  15. readyRef.current = true;
  16. }, GRACE_DELAY);
  17. const autoSave = React.useCallback(() => {
  18. const currentSession = {
  19. items: items,
  20. board: boardConfig,
  21. availableItems: availableItems,
  22. messages: messages.slice(-50),
  23. timestamp: Date.now(),
  24. gameId: gameId,
  25. };
  26. saveSession(currentSession);
  27. }, [availableItems, boardConfig, gameId, items, messages, saveSession]);
  28. React.useEffect(() => {
  29. if (readyRef.current && isMaster) {
  30. clearTimeout(timeoutRef.current);
  31. timeoutRef.current = setTimeout(autoSave, GRACE_DELAY);
  32. }
  33. }, [autoSave, isMaster, items, messages, boardConfig]);
  34. return null;
  35. };
  36. export default AutoSaveSession;