index.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { useEffect } from 'react';
  2. import { useCurrentPageYjsDataActions } from '~/features/collaborative-editor/states';
  3. import { SocketEventName } from '~/interfaces/websocket';
  4. import { useIsGuestUser } from '~/states/context';
  5. import {
  6. useCurrentPageData,
  7. useCurrentPageId,
  8. usePageNotFound,
  9. } from '~/states/page';
  10. import { useGlobalSocket } from '~/states/socket-io';
  11. export const useCurrentPageYjsDataAutoLoadEffect = (): void => {
  12. const { fetchCurrentPageYjsData } = useCurrentPageYjsDataActions();
  13. const pageId = useCurrentPageId();
  14. const currentPage = useCurrentPageData();
  15. const isGuestUser = useIsGuestUser();
  16. const isNotFound = usePageNotFound(false);
  17. // Optimized effects with minimal dependencies
  18. useEffect(() => {
  19. // Load YJS data only when revision changes and page exists
  20. if (
  21. !isGuestUser &&
  22. pageId != null &&
  23. currentPage?.revision?._id != null &&
  24. !isNotFound
  25. ) {
  26. fetchCurrentPageYjsData();
  27. }
  28. }, [
  29. isGuestUser,
  30. currentPage?.revision?._id,
  31. fetchCurrentPageYjsData,
  32. isNotFound,
  33. pageId,
  34. ]);
  35. };
  36. export const useNewlyYjsDataSyncingEffect = (): void => {
  37. const socket = useGlobalSocket();
  38. const { updateHasYdocsNewerThanLatestRevision } =
  39. useCurrentPageYjsDataActions();
  40. useEffect(() => {
  41. if (socket == null) {
  42. // socket must be null if the user is a guest
  43. return;
  44. }
  45. socket.on(
  46. SocketEventName.YjsHasYdocsNewerThanLatestRevisionUpdated,
  47. updateHasYdocsNewerThanLatestRevision,
  48. );
  49. return () => {
  50. socket.off(
  51. SocketEventName.YjsHasYdocsNewerThanLatestRevisionUpdated,
  52. updateHasYdocsNewerThanLatestRevision,
  53. );
  54. };
  55. }, [socket, updateHasYdocsNewerThanLatestRevision]);
  56. };
  57. export const useAwarenessSyncingEffect = (): void => {
  58. const socket = useGlobalSocket();
  59. const { updateAwarenessStateSize } = useCurrentPageYjsDataActions();
  60. useEffect(() => {
  61. if (socket == null) {
  62. // socket must be null if the user is a guest
  63. return;
  64. }
  65. socket.on(
  66. SocketEventName.YjsAwarenessStateSizeUpdated,
  67. updateAwarenessStateSize,
  68. );
  69. return () => {
  70. socket.off(
  71. SocketEventName.YjsAwarenessStateSizeUpdated,
  72. updateAwarenessStateSize,
  73. );
  74. };
  75. }, [socket, updateAwarenessStateSize]);
  76. };