diff --git a/src/domains/freetalk/components/ChatRoomModal.jsx b/src/domains/freetalk/components/ChatRoomModal.jsx index 653be25..d3d0901 100644 --- a/src/domains/freetalk/components/ChatRoomModal.jsx +++ b/src/domains/freetalk/components/ChatRoomModal.jsx @@ -466,6 +466,39 @@ const ChatRoomModal = ({ open, onClose, room, onLeave }) => { ) } + // 투표 관련 메시지 (POLL_CREATE, POLL_VOTE, POLL_END) + if (message.messageType === 'POLL_CREATE' || message.messageType === 'poll_create' || + message.messageType === 'POLL_VOTE' || message.messageType === 'poll_vote' || + message.messageType === 'POLL_END' || message.messageType === 'poll_end') { + return ( + + + + {message.content} + + + + ) + } + return ( [...prev, pollMessage]) @@ -107,8 +108,8 @@ export function useChatWebSocket(roomId, userId) { onPollVote: (data) => { console.log('[useChatWebSocket] Poll vote:', data) const voteData = data.data || data - setMessages((prev) => - prev.map((msg) => { + setMessages((prev) => { + const updated = prev.map((msg) => { if (msg.id === `poll-${voteData.pollId}` && msg.data) { return { ...msg, @@ -120,14 +121,26 @@ export function useChatWebSocket(roomId, userId) { } return msg }) - ) + if (data.content) { + updated.push({ + id: `poll-vote-${Date.now()}`, + messageType: 'POLL_VOTE', + userId: voteData.voterId || voteData.userId, + content: data.content, + createdAt: data.createdAt || new Date().toISOString(), + data: voteData, + }) + } + return updated + }) }, onPollEnd: (data) => { console.log('[useChatWebSocket] Poll ended:', data) + console.log('[useChatWebSocket] Poll end content:', data.content) const endData = data.data || data - setMessages((prev) => - prev.map((msg) => { + setMessages((prev) => { + const updated = prev.map((msg) => { if (msg.id === `poll-${endData.pollId}` && msg.data) { return { ...msg, @@ -140,7 +153,21 @@ export function useChatWebSocket(roomId, userId) { } return msg }) - ) + console.log('[useChatWebSocket] Adding poll end message, content exists:', !!data.content) + if (data.content) { + const pollEndMsg = { + id: `poll-end-${endData.pollId}`, + messageType: 'POLL_END', + userId: endData.endedBy, + content: data.content, + createdAt: data.createdAt || new Date().toISOString(), + data: endData, + } + console.log('[useChatWebSocket] Poll end message:', pollEndMsg) + updated.push(pollEndMsg) + } + return updated + }) }, onClearChat: (data) => { @@ -166,16 +193,20 @@ export function useChatWebSocket(roomId, userId) { }, onSystemCommand: (data) => { + console.log('[useChatWebSocket] System command received:', data) const commandData = data.data || {} + const displayText = data.content || data.message || commandData.content || commandData.message || commandData.displayText || '' + console.log('[useChatWebSocket] System command displayText:', displayText) const commandMessage = { id: `syscmd-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, messageType: 'SYSTEM_COMMAND', userId: commandData.userId || commandData.nickname || data.userId, + content: displayText, createdAt: data.createdAt || new Date().toISOString(), data: { commandType: commandData.type || 'help', userId: commandData.userId || commandData.nickname, - displayText: data.content || data.message || '', + displayText: displayText, result: typeof commandData.result === 'object' ? commandData.result : { value: commandData.result }, diff --git a/src/domains/freetalk/services/chatWebSocketService.js b/src/domains/freetalk/services/chatWebSocketService.js index f8fbe75..81f78e4 100644 --- a/src/domains/freetalk/services/chatWebSocketService.js +++ b/src/domains/freetalk/services/chatWebSocketService.js @@ -178,6 +178,8 @@ class ChatWebSocketConnection { case 'system_command': case 'SYSTEM_COMMAND': // 시스템 명령어 응답 (예: /dice, /coin, /random, /members, /help 등) + console.log('[ChatWebSocket] System command received:', data) + console.log('[ChatWebSocket] onSystemCommand callback exists:', !!this.callbacks.onSystemCommand) this.callbacks.onSystemCommand?.(data) break case 'poll_create': diff --git a/src/domains/games/components/WaitingChat.jsx b/src/domains/games/components/WaitingChat.jsx index 7eeaf27..1c48981 100644 --- a/src/domains/games/components/WaitingChat.jsx +++ b/src/domains/games/components/WaitingChat.jsx @@ -3,6 +3,8 @@ import {Avatar, Box, IconButton, Paper, TextField, Typography} from '@mui/materi import {Send as SendIcon} from '@mui/icons-material' import {GAME_COLORS} from '../theme/gameTheme' import {useThemeMode} from '../../../contexts/ThemeContext' +import SystemCommandMessage from '../../freetalk/components/SystemCommandMessage' +import {MessageType} from '../../freetalk/types/chatCommandTypes' const WaitingChat = ({ messages, onSendMessage, currentUserId, disabled }) => { const {mode} = useThemeMode() @@ -62,6 +64,45 @@ const WaitingChat = ({ messages, onSendMessage, currentUserId, disabled }) => { const isOwn = message.userId === currentUserId const isSystem = message.isSystem + // 시스템 명령어 메시지 (SYSTEM_COMMAND) - /dice, /coin 등 + if (message.messageType === MessageType.SYSTEM_COMMAND || message.messageType === 'SYSTEM_COMMAND') { + return ( + + ) + } + + // 투표 관련 메시지 (POLL_CREATE, POLL_VOTE, POLL_END) + if (message.messageType === 'POLL_CREATE' || message.messageType === 'poll_create' || + message.messageType === 'POLL_VOTE' || message.messageType === 'poll_vote' || + message.messageType === 'POLL_END' || message.messageType === 'poll_end') { + return ( + + + + {message.content} + + + + ) + } + if (isSystem) { return (