page-updated.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { useCallback, useEffect } from 'react';
  2. import { useGlobalSocket } from '@growi/core/dist/swr';
  3. import { SocketEventName } from '~/interfaces/websocket';
  4. import { useCurrentPageId } from '~/stores/page';
  5. import { useSetRemoteLatestPageData, type RemoteRevisionData } from '~/stores/remote-latest-page';
  6. export const usePageUpdatedEffect = (): void => {
  7. const { setRemoteLatestPageData } = useSetRemoteLatestPageData();
  8. const { data: socket } = useGlobalSocket();
  9. const { data: currentPageId } = useCurrentPageId();
  10. const setLatestRemotePageData = useCallback((data) => {
  11. const { s2cMessagePageUpdated } = data;
  12. const remoteData: RemoteRevisionData = {
  13. remoteRevisionId: s2cMessagePageUpdated.revisionId,
  14. remoteRevisionBody: s2cMessagePageUpdated.revisionBody,
  15. remoteRevisionLastUpdateUser: s2cMessagePageUpdated.remoteLastUpdateUser,
  16. remoteRevisionLastUpdatedAt: s2cMessagePageUpdated.revisionUpdateAt,
  17. };
  18. if (currentPageId != null && currentPageId === s2cMessagePageUpdated.pageId) {
  19. setRemoteLatestPageData(remoteData);
  20. }
  21. }, [currentPageId, setRemoteLatestPageData]);
  22. // listen socket for someone updating this page
  23. useEffect(() => {
  24. if (socket == null) { return }
  25. socket.on(SocketEventName.PageUpdated, setLatestRemotePageData);
  26. return () => {
  27. socket.off(SocketEventName.PageUpdated, setLatestRemotePageData);
  28. };
  29. }, [setLatestRemotePageData, socket]);
  30. };