Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 75 additions & 61 deletions src/pages/Chat.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import { useEffect, useRef, useState, ChangeEvent, KeyboardEvent } from "react";
import {
useEffect,
useRef,
useState,
useCallback,
ChangeEvent,
KeyboardEvent
} from "react";
import { useLocation, useNavigate } from "react-router-dom";
import { Helmet } from "react-helmet";
import { authInstance } from "@/api/axios";
Expand Down Expand Up @@ -67,6 +74,65 @@ const Chat = () => {

const isTopicChat = mode === "topicChat";

const handleWebSocketMessage = useCallback(
(wsMessage: WebSocketMessage) => {
if (wsMessage.type === "ERROR") {
// 에러 메시지 처리
const errorMessage: Message = {
role: "assistant",
content: wsMessage.message,
messageType: "system"
};

// 중복 시스템 메시지 방지
setMessages((prev) => {
const lastMessage = prev[prev.length - 1];
if (
lastMessage?.messageType === "system" &&
lastMessage.content === wsMessage.message
) {
return prev;
}
return [...prev, errorMessage];
});
} else if (wsMessage.type === "NOTICE") {
// 시스템 알림 메시지 처리 (입장/퇴장)
const systemMessage: Message = {
role: "assistant",
content: wsMessage.message,
messageType: "system"
};

// 중복 시스템 메시지 방지
setMessages((prev) => {
const lastMessage = prev[prev.length - 1];
if (
lastMessage?.messageType === "system" &&
lastMessage.content === wsMessage.message
) {
return prev;
}
return [...prev, systemMessage];
});
} else if (
wsMessage.type === null &&
wsMessage.nickname &&
wsMessage.message
) {
// 일반 채팅 메시지 처리
const newMessage: Message = {
role: wsMessage.nickname === nickname ? "user" : "assistant",
content: wsMessage.message,
nickname: wsMessage.nickname,
mbti: wsMessage.mbti || undefined,
messageType: "text"
};
setMessages((prev) => [...prev, newMessage]);
}
},
[nickname]
);

useEffect(() => {
if (!isTopicChat) {
return;
Expand Down Expand Up @@ -111,9 +177,6 @@ const Chat = () => {
}

// WebSocket 연결 시도
const wsUrl =
import.meta.env.VITE_WEBSOCKET_URL || "ws://localhost:8080";

try {
const connected = await websocketService.connect({
nickname,
Expand Down Expand Up @@ -166,7 +229,14 @@ const Chat = () => {
websocketService.disconnect();
}
};
}, [isTopicChat, openChatId, nickname, mbti, navigate]);
}, [
isTopicChat,
openChatId,
nickname,
mbti,
navigate,
handleWebSocketMessage
]);

useEffect(() => {
const fetchMessages = async () => {
Expand Down Expand Up @@ -217,62 +287,6 @@ const Chat = () => {
setIsOpen(nextState);
};

const handleWebSocketMessage = (wsMessage: WebSocketMessage) => {
if (wsMessage.type === "ERROR") {
// 에러 메시지 처리
const errorMessage: Message = {
role: "assistant",
content: wsMessage.message,
messageType: "system"
};

// 중복 시스템 메시지 방지
setMessages((prev) => {
const lastMessage = prev[prev.length - 1];
if (
lastMessage?.messageType === "system" &&
lastMessage.content === wsMessage.message
) {
return prev;
}
return [...prev, errorMessage];
});
} else if (wsMessage.type === "NOTICE") {
// 시스템 알림 메시지 처리 (입장/퇴장)
const systemMessage: Message = {
role: "assistant",
content: wsMessage.message,
messageType: "system"
};

// 중복 시스템 메시지 방지
setMessages((prev) => {
const lastMessage = prev[prev.length - 1];
if (
lastMessage?.messageType === "system" &&
lastMessage.content === wsMessage.message
) {
return prev;
}
return [...prev, systemMessage];
});
} else if (
wsMessage.type === null &&
wsMessage.nickname &&
wsMessage.message
) {
// 일반 채팅 메시지 처리
const newMessage: Message = {
role: wsMessage.nickname === nickname ? "user" : "assistant",
content: wsMessage.message,
nickname: wsMessage.nickname,
mbti: wsMessage.mbti || undefined,
messageType: "text"
};
setMessages((prev) => [...prev, newMessage]);
}
};

const handleSend = async (messageToSend: string) => {
if (!messageToSend.trim()) return;

Expand Down
2 changes: 1 addition & 1 deletion src/pages/SelectInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ const SelectInfo = () => {
/>
</Helmet>

<div className="flex min-h-screen w-[360px] flex-col bg-white md:w-[375px] lg:w-[500px]">
<div className="mx-auto flex min-h-screen w-[360px] flex-col bg-white md:w-[375px] lg:w-[500px]">
<Header title={headerTitle} showShareIcon={false} />

<div className="mx-auto w-[320px]">
Expand Down