Skip to content

Commit 62699ae

Browse files
authored
Merge pull request #137 from ezcode-my/fix/chat
[Fix] 채팅방 구독 해지 로직 개선
2 parents 2f6b72b + 660c955 commit 62699ae

File tree

10 files changed

+32
-68
lines changed

10 files changed

+32
-68
lines changed

src/app/(auth)/(navigationsBarLayout)/@chatDialog/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default function ChatDialog({}) {
1919
open={!!roomId}
2020
onOpenChange={(open) => {
2121
if (!open) {
22-
closeChatDialog();
22+
closeChatDialog(Number(roomId));
2323
}
2424
}}
2525
>

src/features/chat/hooks/socket/useConnectChatWebSocket.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import SockJS from 'sockjs-client';
33
import { Client } from '@stomp/stompjs';
44
import { BASE_URL } from '@/constants/env';
55
import { useEffect } from 'react';
6-
import useAccessToken from '@/shared/hooks/useAuthToken';
76
import { sharedStompRef } from '@/shared/lib/stomp/sharedStompRef';
87
import { useChatWebSocketActions } from '../../model/useChatWebSocketStore';
8+
import cookies from 'js-cookie';
99

1010
export default function useConnectChatWebSocket() {
11-
const accessToken = useAccessToken();
11+
const accessToken = cookies.get('accessToken');
1212
const chatStompRef = sharedStompRef;
1313
const { setIsConnected } = useChatWebSocketActions();
1414

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
'use client';
2-
import { RefObject, useEffect } from 'react';
3-
import { ChatRoomId } from '../../types';
2+
import { useEffect } from 'react';
43
import useChatWebSocketStore, { useChatWebSocketActions } from '../../model/useChatWebSocketStore';
5-
import { Client } from '@stomp/stompjs';
4+
import { useConnectWebSocket } from '../..';
65

7-
export default function useLeaveChatRoom(
8-
chatStompRef: RefObject<Client | null>,
9-
chatroomId: ChatRoomId
10-
) {
11-
const { isLeaveRoom } = useChatWebSocketStore();
6+
export default function useLeaveChatRoom() {
7+
// chatStompRef: RefObject<Client | null>,
8+
const { chatStompRef } = useConnectWebSocket();
9+
10+
const { leavedRoom } = useChatWebSocketStore();
1211
const { clearMessages } = useChatWebSocketActions();
1312

1413
useEffect(() => {
15-
if (chatroomId === 0 || !chatStompRef?.current || !isLeaveRoom) return;
16-
console.log('퇴장 훅 실행');
14+
if (leavedRoom === 0 || !chatStompRef?.current) return;
1715
if (chatStompRef.current?.connected) {
1816
try {
1917
chatStompRef.current.publish({
20-
destination: `/chat/rooms/${chatroomId}/leave`,
21-
body: String(chatroomId),
18+
destination: `/chat/rooms/${leavedRoom}/left`,
19+
body: String(leavedRoom),
2220
});
2321
} catch (err) {
2422
console.error('퇴장 메시지 전송 오류', err);
@@ -28,5 +26,5 @@ export default function useLeaveChatRoom(
2826
}
2927

3028
// eslint-disable-next-line react-hooks/exhaustive-deps
31-
}, [chatStompRef, chatroomId, isLeaveRoom]);
29+
}, [chatStompRef, leavedRoom]);
3230
}

src/features/chat/hooks/useChatDialogTrigger.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { PATHS } from '@/constants/paths';
22
import { useRouter, useSearchParams } from 'next/navigation';
3+
import { useChatWebSocketActions } from '../model/useChatWebSocketStore';
34

45
export default function useChatDialogTrigger() {
56
const searchParams = useSearchParams();
67
const router = useRouter();
78
const params = new URLSearchParams(searchParams.toString());
8-
// const { setIsLeaved } = useChatWebSocketActions();
9+
const { setLeavedRoom } = useChatWebSocketActions();
910

1011
const openChatDialog = () => {
1112
params.set(PATHS.CHAT.SEARCHPARAMS_ID, 'NaN');
@@ -17,17 +18,15 @@ export default function useChatDialogTrigger() {
1718
const handleSwitchRoom = (roomId: number, title: string) => {
1819
const params = new URLSearchParams(searchParams.toString());
1920
const prevRoomId = params.get(PATHS.CHAT.SEARCHPARAMS_ID);
20-
if (prevRoomId && Number(prevRoomId) !== roomId) {
21-
// setIsLeaved(true);
22-
params.set(PATHS.CHAT.SEARCHPARAMS_ID, String(roomId));
23-
params.set(PATHS.CHAT.SEARCHPARAMS_TITLE, title);
24-
25-
router.push(`?${params.toString()}`);
26-
}
21+
if (prevRoomId === String(roomId)) return;
22+
setLeavedRoom(Number(prevRoomId));
23+
params.set(PATHS.CHAT.SEARCHPARAMS_ID, String(roomId));
24+
params.set(PATHS.CHAT.SEARCHPARAMS_TITLE, title);
25+
router.push(`?${params.toString()}`);
2726
};
2827

29-
const closeChatDialog = () => {
30-
// setIsLeaved(true);
28+
const closeChatDialog = (currentRoomId: number) => {
29+
setLeavedRoom(currentRoomId);
3130
params.delete(PATHS.CHAT.SEARCHPARAMS_ID);
3231
params.delete(PATHS.CHAT.SEARCHPARAMS_TITLE);
3332

src/features/chat/model/useChatWebSocketStore.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ const useChatWebSocketStore = create<IChatWebSocketStore>()(
1313
isConnected: status,
1414
});
1515
},
16-
setIsLeaved: (status) => {
16+
setLeavedRoom: (status) => {
1717
set({
18-
isLeaveRoom: status,
18+
leavedRoom: status,
1919
});
2020
},
2121

@@ -90,7 +90,7 @@ export function useChatWebSocketActions() {
9090
return useChatWebSocketStore(
9191
useShallow((state) => ({
9292
setIsConnected: state.actions.setIsConnected,
93-
setIsLeaved: state.actions.setIsLeaved,
93+
setLeavedRoom: state.actions.setLeavedRoom,
9494

9595
setInitRooms: state.actions.setInitRooms,
9696
setRooms: state.actions.setRooms,

src/features/chat/model/useChatWebSocketStore.types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export interface IChatMessage {
1919
/** store state 인터페이스 */
2020
export interface IInitialState {
2121
isConnected: boolean;
22-
isLeaveRoom: boolean;
22+
leavedRoom: number;
2323
rooms: IChatRoom[] | [];
2424
initMessages: IChatMessage[] | [];
2525
realTimeMessages: IChatMessage[] | [];
@@ -28,7 +28,7 @@ export interface IInitialState {
2828
/**store 초기 상태*/
2929
export const INITIAL_STATE: IInitialState = {
3030
isConnected: false,
31-
isLeaveRoom: false,
31+
leavedRoom: 0,
3232
rooms: [],
3333
initMessages: [],
3434
realTimeMessages: [],
@@ -38,7 +38,7 @@ export const INITIAL_STATE: IInitialState = {
3838
interface IChatWebSocketStoreActions {
3939
actions: {
4040
setIsConnected: (status: boolean) => void;
41-
setIsLeaved: (status: boolean) => void;
41+
setLeavedRoom: (status: number) => void;
4242
setInitRooms: (rooms: IChatRoom[] | []) => void;
4343
setRooms: (response: IChatRoom) => void;
4444
setInitMessages: (message: IChatMessage[]) => void;

src/features/chat/ui/chatRoom/index.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import ChatMessage from '../chatMessage/ChatMessage';
77
import ChatRoomHeader from './ChatRoomHeader';
88
import { useMyInfoQuery } from '@/entities/mypage/model/query';
99
import { useEffect, useRef } from 'react';
10+
import useLeaveChatRoom from '../../hooks/socket/useLeaveChatRoom';
1011

1112
interface ChatProps {
1213
roomId: number;
@@ -15,15 +16,11 @@ interface ChatProps {
1516

1617
export default function ChatRoom({ roomId, roomTitle }: ChatProps) {
1718
useJoinChatRoom(roomId);
19+
useLeaveChatRoom();
1820
const { data } = useMyInfoQuery();
1921
const endRef = useRef<HTMLDivElement>(null);
2022
const nickname = data?.data.result.nickname;
2123
const { initMessages, realTimeMessages } = useChatWebSocketStore();
22-
// const { setIsLeaved } = useChatWebSocketActions();
23-
24-
// useEffect(() => {
25-
// setIsLeaved(false);
26-
// }, [roomId]);
2724

2825
useEffect(() => {
2926
if (endRef.current) {

src/features/chat/ui/chatRoomList/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export default function ChatRoomList({ selectedRoomId }: IChatRoomListProps) {
4545
})}
4646
</ul>
4747
) : (
48-
<div className="h-full absolute top-0 left-0 w-full h-full flex items-center justify-center">
48+
<div className="absolute top-0 left-0 w-full h-full flex items-center justify-center">
4949
생성된 채팅방이 없습니다.
5050
</div>
5151
)}

src/shared/hooks/useAuthToken.ts

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/shared/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,3 @@ export type { ProblemId } from './types/problem.type.ts';
1717
//lib
1818

1919
//hooks
20-
export { default as useAccessToken } from './hooks/useAuthToken';

0 commit comments

Comments
 (0)