@@ -2,47 +2,55 @@ import { createContext, useContext, useEffect, useState } from 'react';
22
33import { io , Socket } from 'socket.io-client' ;
44
5- const SocketContext = createContext < Socket | null > ( null ) ;
5+ type SocketMap = { [ endpoint : string ] : Socket } ;
6+
7+ const SocketContext = createContext < SocketMap | null > ( null ) ;
68
79export const SocketProvider : React . FC < { children : React . ReactNode } > = ( { children } ) => {
8- const [ socket , setSocket ] = useState < Socket | null > ( null ) ;
10+ const [ socketMap , setSocketMap ] = useState < SocketMap > ( { } ) ;
911
1012 useEffect ( ( ) => {
11- const newSocket = io ( `${ import . meta. env . VITE_NEW_API_URL } /socket/chatting` , {
12- transports : [ 'websocket' ] ,
13- } ) ;
14- setSocket ( newSocket ) ;
15-
16- newSocket . on ( 'connect' , ( ) => {
17- console . log ( 'connection is open' ) ;
13+ const endpoints = [ 'chatting' , 'matching' ] ; // 필요한 엔드포인트 추가
14+ const newSockets : SocketMap = { } ;
15+
16+ endpoints . forEach ( ( endpoint ) => {
17+ const socket = io ( `${ import . meta. env . VITE_NEW_API_URL } /socket/${ endpoint } ` , {
18+ transports : [ 'websocket' ] ,
19+ } ) ;
20+ newSockets [ endpoint ] = socket ;
21+
22+ socket . on ( 'connect' , ( ) => {
23+ console . log ( `${ endpoint } connection is open` ) ;
24+ } ) ;
25+
26+ socket . on ( 'disconnect' , ( reason ) => {
27+ console . log ( `${ endpoint } Disconnected from server:` , reason ) ;
28+ } ) ;
29+
30+ socket . on ( 'connect_error' , ( err ) => {
31+ console . log ( `${ endpoint } connect error:` , err . message ) ;
32+ } ) ;
1833 } ) ;
1934
20- newSocket . on ( 'disconnect' , ( reason ) => {
21- console . log ( 'Disconnected from server:' , reason ) ;
22- } ) ;
23-
24- newSocket . on ( 'connect_error' , ( err ) => {
25- console . log ( err . message ) ;
26- } ) ;
35+ setSocketMap ( newSockets ) ;
2736
2837 return ( ) => {
29- newSocket . disconnect ( ) ;
38+ Object . values ( newSockets ) . forEach ( ( socket ) => socket . disconnect ( ) ) ;
3039 } ;
3140 } , [ ] ) ;
3241
33- // 소켓 설정이 완료되지 않은 경우 렌더링 방지
34- // 채팅방에서 새로고침했을 때 오류 방지
35- if ( ! socket ) {
42+ if ( ! Object . keys ( socketMap ) . length ) {
3643 return null ;
3744 }
3845
39- return < SocketContext . Provider value = { socket } > { children } </ SocketContext . Provider > ;
46+ return < SocketContext . Provider value = { socketMap } > { children } </ SocketContext . Provider > ;
4047} ;
4148
42- export const useSocket = ( ) => {
43- const context = useContext ( SocketContext ) ;
44- if ( context === null ) {
45- throw new Error ( 'useSocket must be used within a SocketProvider' ) ;
49+ // 엔드포인트를 인자로 받아 해당 소켓을 반환하는 훅
50+ export const useSocket = ( endpoint = 'chatting' ) => {
51+ const socketMap = useContext ( SocketContext ) ;
52+ if ( ! socketMap || ! socketMap [ endpoint ] ) {
53+ throw new Error ( `useSocket must be used within a SocketProvider with a valid endpoint (${ endpoint } )` ) ;
4654 }
47- return context ;
55+ return socketMap [ endpoint ] ;
4856} ;
0 commit comments