// src/renderer/components/meeting/AddDocumentDialog.tsx // Phase 14.5: 문서 생성 다이얼로그 — 템플릿 선택 + 커스텀 프롬프트 import { useState, useCallback } from 'react' import { Dialog, DialogTitle, DialogContent, DialogActions, Box, TextField, LinearProgress, } from '@mui/material' import { MetalCard } from '@d3ro/ui/components/ds' import { PhosphorText } from '@d3ro/ui/components/ds' import { PhysicalButton } from '@d3ro/ui/components/ds' import { d3roPalette, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme' import { useI18n } from '@d3ro/i18n' interface TemplateItem { id: string name: string description: string templateType: string isBuiltin: boolean } interface AddDocumentDialogProps { open: boolean onClose: () => void onGenerate: (templateId: string, customPrompt?: string, customTitle?: string) => void templates: TemplateItem[] generating: boolean } export function AddDocumentDialog({ open, onClose, onGenerate, templates, generating, }: AddDocumentDialogProps): React.ReactElement { const { t } = useI18n() const [selectedId, setSelectedId] = useState(null) const [customPrompt, setCustomPrompt] = useState('') const [customTitle, setCustomTitle] = useState('') const selectedTemplate = templates.find((tp) => tp.id === selectedId) const isCustom = selectedTemplate?.templateType === 'custom' const handleGenerate = useCallback(() => { if (!selectedId) return onGenerate( selectedId, isCustom && customPrompt.trim() ? customPrompt.trim() : undefined, isCustom && customTitle.trim() ? customTitle.trim() : undefined, ) }, [selectedId, isCustom, customPrompt, customTitle, onGenerate]) const handleClose = useCallback(() => { if (!generating) { setSelectedId(null) setCustomPrompt('') setCustomTitle('') onClose() } }, [generating, onClose]) return ( {t('meeting.selectTemplate')} {generating && ( {t('meeting.generating')} )} {/* 템플릿 목록 */} {templates.map((tp) => ( !generating && setSelectedId(tp.id)} sx={{ cursor: generating ? 'default' : 'pointer', opacity: generating ? 0.6 : 1, border: selectedId === tp.id ? `2px solid ${d3roPalette.accent.main}` : `2px solid transparent`, borderRadius: d3roRadius.inner, transition: 'border-color 0.15s', '&:hover': { borderColor: generating ? undefined : d3roPalette.accent.dim, }, }} > {tp.name} {tp.description} ))} {/* 커스텀 템플릿 추가 입력 */} {isCustom && ( setCustomTitle(e.target.value)} disabled={generating} sx={{ '& .MuiInputBase-root': { fontSize: d3roTypo.compact.size }, }} /> setCustomPrompt(e.target.value)} disabled={generating} placeholder={t('meeting.templatePrompt')} sx={{ '& .MuiInputBase-root': { fontSize: d3roTypo.compact.size }, }} /> )} {t('common.cancel')} {generating ? t('meeting.generating') : t('meeting.generate')} ) }