websocket.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { useEffect } from 'react';
  2. import {
  3. useGlobalSocket, GLOBAL_SOCKET_KEY, GLOBAL_SOCKET_NS, useSWRStatic,
  4. } from '@growi/core/dist/swr';
  5. import type { Socket } from 'socket.io-client';
  6. import type { SWRResponse } from 'swr';
  7. import { SocketEventName } from '~/interfaces/websocket';
  8. import loggerFactory from '~/utils/logger';
  9. const logger = loggerFactory('growi:stores:ui');
  10. export const GLOBAL_ADMIN_SOCKET_NS = '/admin';
  11. export const GLOBAL_ADMIN_SOCKET_KEY = 'globalAdminSocket';
  12. /*
  13. * Global Socket
  14. */
  15. export const useSetupGlobalSocket = (): void => {
  16. const { data, mutate } = useSWRStatic(GLOBAL_SOCKET_KEY);
  17. useEffect(() => {
  18. if (data != null) {
  19. return;
  20. }
  21. mutate(async() => {
  22. const { io } = await import('socket.io-client');
  23. const socket = io(GLOBAL_SOCKET_NS, {
  24. transports: ['websocket'],
  25. });
  26. socket.on('error', (err) => { logger.error(err) });
  27. socket.on('connect_error', (err) => { logger.error('Failed to connect with websocket.', err) });
  28. return socket;
  29. });
  30. }, [data, mutate]);
  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 useSWRStatic(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(SocketEventName.JoinPage, { pageId });
  55. return () => {
  56. socket.emit(SocketEventName.LeavePage, { pageId });
  57. };
  58. }, [pageId, socket]);
  59. };