websocket.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { useEffect } from 'react';
  2. import io, { 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 socket = io(GLOBAL_SOCKET_NS, {
  18. transports: ['websocket'],
  19. });
  20. socket.on('error', (err) => { logger.error(err) });
  21. socket.on('connect_error', (err) => { logger.error('Failed to connect with websocket.', err) });
  22. mutate(socket);
  23. }, [mutate]);
  24. };
  25. export const useGlobalSocket = (): SWRResponse<Socket, Error> => {
  26. return useStaticSWR(GLOBAL_SOCKET_KEY);
  27. };
  28. /*
  29. * Global Admin Socket
  30. */
  31. export const useSetupGlobalAdminSocket = (shouldInit: boolean): SWRResponse<Socket, Error> => {
  32. let socket: Socket | undefined;
  33. if (shouldInit) {
  34. socket = io(GLOBAL_ADMIN_SOCKET_NS, {
  35. transports: ['websocket'],
  36. });
  37. socket.on('error', (err) => { logger.error(err) });
  38. socket.on('connect_error', (err) => { logger.error('Failed to connect with websocket.', err) });
  39. }
  40. return useStaticSWR(shouldInit ? GLOBAL_ADMIN_SOCKET_KEY : null, socket);
  41. };
  42. export const useGlobalAdminSocket = (): SWRResponse<Socket, Error> => {
  43. return useStaticSWR(GLOBAL_ADMIN_SOCKET_KEY);
  44. };
  45. export const useSetupGlobalSocketForPage = (pageId: string | undefined): void => {
  46. const { data: socket } = useGlobalSocket();
  47. useEffect(() => {
  48. if (socket == null || pageId == null) { return }
  49. socket.emit('join:page', { socketId: socket.id, pageId });
  50. }, [pageId, socket]);
  51. };