import { useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import CopyButton from "@/components/common/CopyButton"; import MessagePreview from "./MessagePreview"; import { MOCK_MESSAGE_DETAILS } from "../types"; interface MessageSlidePanelProps { isOpen: boolean; onClose: () => void; messageId: string | null; } export default function MessageSlidePanel({ isOpen, onClose, messageId, }: MessageSlidePanelProps) { const detail = messageId ? MOCK_MESSAGE_DETAILS[messageId] : null; const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const bodyRef = useRef(null); // 패널 열릴 때 스크롤 최상단으로 리셋 useEffect(() => { if (isOpen) { bodyRef.current?.scrollTo(0, 0); } }, [isOpen, messageId]); // ESC 닫기 useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape" && isOpen) onClose(); }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [isOpen, onClose]); // 패널 열릴 때 body 스크롤 잠금 useEffect(() => { if (isOpen) { document.body.style.overflow = "hidden"; } else { document.body.style.overflow = ""; } return () => { document.body.style.overflow = ""; }; }, [isOpen]); return ( <> {/* 오버레이 */}
{/* 패널 */} {/* 삭제 확인 모달 */} {showDeleteConfirm && detail && (
setShowDeleteConfirm(false)} />
warning

메시지 삭제

{detail.messageId} 메시지를 삭제하시겠습니까?

info 삭제 후 복구가 불가능합니다.
)} ); }