/** * 로그 상세 다이얼로그 */ import { motion, AnimatePresence } from 'framer-motion'; import { X, User, Bot } from 'lucide-react'; import { ACTION_STYLES, ACTION_LABELS, CATEGORY_LABELS, parseSummary, formatDateTime, hasDetails } from './constants'; // 행위자 뱃지 function ActorBadge({ actor }) { if (actor === 'admin') { return ( 관리자 ); } return ( {actor} ); } // summary 렌더링 function Summary({ summary }) { const { prefix, detail } = parseSummary(summary); return ( <> [{prefix}] {detail && {detail}} > ); } export { ActorBadge, Summary }; export default function LogDetailDialog({ log, onClose }) { return ( {log && ( {/* 헤더 */} {ACTION_LABELS[log.action] || log.action} {CATEGORY_LABELS[log.category] || log.category} {/* 본문 */} {/* 내용 */} 내용 {/* 행위자 + 시간 */} 행위자 시간 {formatDateTime(log.created_at)} {/* 대상 */} {(log.target_type || log.target_id) && ( 대상 {log.target_type && {log.target_type}} {log.target_id && #{log.target_id}} )} {/* 상세 정보 */} {hasDetails(log.details) && ( 상세 정보 {JSON.stringify(log.details, null, 2)} )} )} ); }
{JSON.stringify(log.details, null, 2)}