[RAPID-fix] 채팅방 스크롤 점프 제거: useEffect → useLayoutEffect (페인트 전 처리)

This commit is contained in:
2026-03-31 16:17:30 +09:00
parent a0d45cb1b5
commit 7b20edeacb

View File

@@ -1,6 +1,6 @@
"use client";
import React, { useEffect, useRef, useState } from "react";
import React, { useEffect, useLayoutEffect, useRef, useState } from "react";
import { MessageSquare, Pencil, Check, X, ChevronsDown } from "lucide-react";
import { useMessages, useMarkAsRead, useUpdateRoom } from "@/hooks/useMessenger";
import { useAuth } from "@/hooks/useAuth";
@@ -36,21 +36,18 @@ export function ChatPanel({ room }: ChatPanelProps) {
const lastMessageId = messages?.[messages.length - 1]?.id;
// Hide messages until scrolled to bottom (prevents visible jump on room open)
useEffect(() => {
// useLayoutEffect: fires before browser paint → hide + scroll synchronously
useLayoutEffect(() => {
const el = scrollRef.current;
if (!el) return;
setScrollReady(false);
}, [selectedRoomId]);
el.scrollTop = el.scrollHeight;
// Reveal after scroll is applied
requestAnimationFrame(() => setScrollReady(true));
}, [selectedRoomId, lastMessageId]);
// Scroll to bottom when messages load or room changes
// Two-pass: immediate rAF + 600ms delayed (for async image loads)
// Second pass: re-scroll after async images load
useEffect(() => {
requestAnimationFrame(() => {
const el = scrollRef.current;
if (el) {
el.scrollTop = el.scrollHeight;
setScrollReady(true);
}
});
const t = setTimeout(() => {
const el = scrollRef.current;
if (el) el.scrollTop = el.scrollHeight;