websocket.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { useEffect } from 'react';
  2. import { useGlobalSocket, GLOBAL_SOCKET_KEY, GLOBAL_SOCKET_NS } from '@growi/core/dist/swr';
  3. import type { Socket } from 'socket.io-client';
  4. import type { SWRResponse } from 'swr';
  5. import { SocketEventName } from '~/interfaces/websocket';
  6. import loggerFactory from '~/utils/logger';
  7. import { useStaticSWR } from './use-static-swr';
  8. const logger = loggerFactory('growi:stores:ui');
  9. export const GLOBAL_ADMIN_SOCKET_NS = '/admin';
  10. export const GLOBAL_ADMIN_SOCKET_KEY = 'globalAdminSocket';
  11. /*
  12. * Global Socket
  13. */
  14. export const useSetupGlobalSocket = (): void => {
  15. const { mutate } = useStaticSWR(GLOBAL_SOCKET_KEY);
  16. useEffect(() => {
  17. const setUpSocket = async() => {
  18. const { io } = await import('socket.io-client');
  19. const socket = io(GLOBAL_SOCKET_NS, {
  20. transports: ['websocket'],
  21. });
  22. socket.on('error', (err) => { logger.error(err) });
  23. socket.on('connect_error', (err) => { logger.error('Failed to connect with websocket.', err) });
  24. mutate(socket);
  25. };
  26. setUpSocket();
  27. }, [mutate]);
  28. };
  29. // comment out for porduction build error: https://github.com/weseek/growi/pull/7131
  30. /*
  31. * Global Admin Socket
  32. */
  33. // export const useSetupGlobalAdminSocket = (shouldInit: boolean): SWRResponse<Socket, Error> => {
  34. // let socket: Socket | undefined;
  35. // if (shouldInit) {
  36. // socket = io(GLOBAL_ADMIN_SOCKET_NS, {
  37. // transports: ['websocket'],
  38. // });
  39. // socket.on('error', (err) => { logger.error(err) });
  40. // socket.on('connect_error', (err) => { logger.error('Failed to connect with websocket.', err) });
  41. // }
  42. // return useStaticSWR(shouldInit ? GLOBAL_ADMIN_SOCKET_KEY : null, socket);
  43. // };
  44. export const useGlobalAdminSocket = (): SWRResponse<Socket, Error> => {
  45. return useStaticSWR(GLOBAL_ADMIN_SOCKET_KEY);
  46. };
  47. export const useSetupGlobalSocketForPage = (pageId: string | undefined): void => {
  48. const { data: socket } = useGlobalSocket();
  49. useEffect(() => {
  50. if (socket == null || pageId == null) { return }
  51. socket.emit(SocketEventName.JoinPage, { pageId });
  52. return () => {
  53. socket.emit(SocketEventName.LeavePage, { pageId });
  54. };
  55. }, [pageId, socket]);
  56. };