'use client'; import { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faXmark } from '@fortawesome/free-solid-svg-icons'; import type { ChatSettings } from '@/types/chat'; import { fetchChatSettings, updateChatSettings } from '@/lib/api/chatSettings'; type Props = { onClose: () => void; }; const TOGGLES: { key: keyof ChatSettings; label: string; desc: string }[] = [ { key: 'allowInvite', label: '초대 수신', desc: '다른 사용자의 대화 초대를 받습니다.' }, { key: 'allowWhisper', label: '귓속말 수신', desc: '다른 사용자의 귓속말을 받습니다.' }, { key: 'showFollowingOnline', label: '팔로잉 접속 표시', desc: '내가 팔로우한 사용자에게 접속 상태를 표시합니다.' } ]; // 수신설정 modal — 초대/귓속말/팔로잉 접속 표시 토글 (백엔드 회원설정 persist). 도크 overflow 회피 위해 portal. export default function ChatReceiveModal({ onClose }: Props) { const [settings, setSettings] = useState({ allowInvite: true, allowWhisper: true, showFollowingOnline: true }); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(''); // 진입 시 현재 설정 로드 useEffect(() => { let alive = true; fetchChatSettings().then((res) => { if (alive && res.data) { setSettings(res.data); } }).catch((err) => { if (alive) { setError(err instanceof Error ? err.message : '설정을 불러오지 못했습니다.'); } }).finally(() => { if (alive) { setLoading(false); } }); return () => { alive = false; }; }, []); // ESC 로 닫기 useEffect(() => { const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') { onClose(); } }; document.addEventListener('keydown', onKey); return () => { document.removeEventListener('keydown', onKey); }; }, [onClose]); const toggle = (key: keyof ChatSettings) => { setSettings((prev) => ({ ...prev, [key]: !prev[key] })); }; const handleSave = async () => { setSaving(true); setError(''); try { await updateChatSettings(settings); onClose(); } catch (err) { setError(err instanceof Error ? err.message : '저장에 실패했습니다.'); } finally { setSaving(false); } }; if (typeof document === 'undefined') { return null; } return createPortal(
e.stopPropagation()}>

수신 설정

{loading ? (
불러오는 중…
) : ( TOGGLES.map((t) => ( )) )} {error &&

{error}

}
, document.body ); }