websocket.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { useEffect } from 'react';
  2. import type { Socket } from 'socket.io-client';
  3. import { SWRResponse } from 'swr';
  4. import loggerFactory from '~/utils/logger';
  5. import { useStaticSWR } from './use-static-swr';
  6. const logger = loggerFactory('growi:stores:ui');
  7. export const GLOBAL_SOCKET_NS = '/';
  8. export const GLOBAL_SOCKET_KEY = 'globalSocket';
  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. export const useGlobalSocket = (): SWRResponse<Socket, Error> => {
  30. return useStaticSWR(GLOBAL_SOCKET_KEY);
  31. };
  32. // comment out for porduction build error: https://github.com/weseek/growi/pull/7131
  33. /*
  34. * Global Admin Socket
  35. */
  36. // export const useSetupGlobalAdminSocket = (shouldInit: boolean): SWRResponse<Socket, Error> => {
  37. // let socket: Socket | undefined;
  38. // if (shouldInit) {
  39. // socket = io(GLOBAL_ADMIN_SOCKET_NS, {
  40. // transports: ['websocket'],
  41. // });
  42. // socket.on('error', (err) => { logger.error(err) });
  43. // socket.on('connect_error', (err) => { logger.error('Failed to connect with websocket.', err) });
  44. // }
  45. // return useStaticSWR(shouldInit ? GLOBAL_ADMIN_SOCKET_KEY : null, socket);
  46. // };
  47. export const useGlobalAdminSocket = (): SWRResponse<Socket, Error> => {
  48. return useStaticSWR(GLOBAL_ADMIN_SOCKET_KEY);
  49. };
  50. export const useSetupGlobalSocketForPage = (pageId: string | undefined): void => {
  51. const { data: socket } = useGlobalSocket();
  52. useEffect(() => {
  53. if (socket == null || pageId == null) { return }
  54. socket.emit('join:page', { socketId: socket.id, pageId });
  55. }, [pageId, socket]);
  56. };