websocket.tsx 2.0 KB

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