[RAPID-micro] 새 대화 모달 z-index 메신저 위로 상향 (10000/10001)

[RAPID-fix] 메신저 사용자 목록 회사 전환 시 캐시 격리

- useRooms/useCompanyUsers queryKey에 companyCode 포함
- 회사 전환 시 다른 회사 사용자가 캐시에서 노출되던 문제 수정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

[RAPID-fix] 메신저 버그 수정 (8건)

- 방 생성 후 자동 입장 + 커서 포커스
- DM 헤더 상대방 이름, 그룹 "이름1, 이름2 외 N명" 표시
- 채팅방 이름 인라인 수정 기능 추가
- Socket.IO join_rooms 누락 수정 → 실시간 메시지 수신 정상화
- new_message 이벤트 수신 시 React Query 캐시 무효화
- 토스트 알림 stale closure 수정 (ref 패턴 적용)
- 타이핑 이벤트명 백엔드 일치 (user_typing/user_stop_typing)
- 메시지 순서 역전 수정 (.reverse())
- unread queryKey 불일치 수정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

[RAPID-fix] REST API 메시지 전송 시 Socket.IO broadcast 추가

- socketManager.ts 모듈 생성 (io 전역 공유)
- sendMessage 컨트롤러에서 io.to(room).emit('new_message') broadcast
- 상대방 말풍선 너비 고정 수정 (items-start 추가)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-30 18:41:13 +09:00
parent c9d04f3018
commit 6b3e6cce5e
10 changed files with 166 additions and 40 deletions

View File

@@ -416,10 +416,12 @@ const server = app.listen(PORT, HOST, async () => {
try {
const { Server: SocketIOServer } = await import("socket.io");
const { initMessengerSocket } = await import("./socket/messengerSocket");
const { setIo } = await import("./socket/socketManager");
const io = new SocketIOServer(server, {
cors: { origin: "*", methods: ["GET", "POST"] },
path: "/socket.io",
});
setIo(io);
initMessengerSocket(io);
logger.info("💬 Socket.IO messenger initialized");
} catch (error) {

View File

@@ -1,6 +1,7 @@
import { Request, Response } from 'express';
import { messengerService } from '../services/messengerService';
import { AuthenticatedRequest } from '../types/auth';
import { getIo } from '../socket/socketManager';
import path from 'path';
class MessengerController {
@@ -69,6 +70,13 @@ class MessengerController {
}
const message = await messengerService.sendMessage(roomId, user.userId, user.companyCode!, content, messageType, parentId);
// Broadcast to all room participants via Socket.IO
const io = getIo();
if (io) {
io.to(`${user.companyCode}:${roomId}`).emit('new_message', message);
}
res.json({ success: true, data: message });
} catch (error) {
const err = error as Error;

View File

@@ -161,7 +161,8 @@ class MessengerService {
}
const result = await PostgreSQLService.query(query, params);
const messages: MessengerMessage[] = result.rows;
// Reverse so messages are in chronological order (query uses DESC for cursor pagination)
const messages: MessengerMessage[] = result.rows.reverse();
// Attach reactions and files
if (messages.length > 0) {

View File

@@ -0,0 +1,11 @@
import { Server } from 'socket.io';
let _io: Server | null = null;
export function setIo(io: Server) {
_io = io;
}
export function getIo(): Server | null {
return _io;
}