import { DeleteOutlined, EditOutlined, PlusOutlined, SaveOutlined, UnorderedListOutlined } from '@ant-design/icons'; import { Alert, Button, Card, Empty, Form, Input, List, Modal, Space, Switch, Typography } from 'antd'; import { useEffect, useMemo, useRef, useState } from 'react'; import { MarkdownPreviewContent } from '../../components/markdownPreview'; import { deleteAutomationContext, type AutomationContextRecord, upsertAutomationContext, useAutomationContextRegistry, } from './automationContextAccess'; import { confirmWithKeyboard } from './modalKeyboard'; import { useTokenAccess } from './tokenAccess'; import './AutomationContextManagementPage.css'; const { Text, Title } = Typography; type AutomationContextFormValue = { id?: string; title: string; content: string; enabled: boolean; defaultSelected: boolean; }; const EMPTY_FORM_VALUE: AutomationContextFormValue = { title: '', content: '', enabled: true, defaultSelected: true, }; function toFormValue(context: AutomationContextRecord | null): AutomationContextFormValue { if (!context) { return EMPTY_FORM_VALUE; } return { id: context.id, title: context.title, content: context.content, enabled: context.enabled, defaultSelected: context.defaultSelected, }; } export function AutomationContextManagementPage() { const { hasAccess } = useTokenAccess(); const { automationContexts, setAutomationContexts, isLoading, errorMessage } = useAutomationContextRegistry(); const [selectedAutomationContextId, setSelectedAutomationContextId] = useState(automationContexts[0]?.id ?? null); const [detailMode, setDetailMode] = useState<'list' | 'detail'>('list'); const [isCreating, setIsCreating] = useState(false); const [isSaving, setIsSaving] = useState(false); const [saveErrorMessage, setSaveErrorMessage] = useState(''); const [form] = Form.useForm(); const [modalApi, modalContextHolder] = Modal.useModal(); const lastHydratedFormKeyRef = useRef(''); const selectedAutomationContext = useMemo( () => automationContexts.find((item) => item.id === selectedAutomationContextId) ?? null, [automationContexts, selectedAutomationContextId], ); useEffect(() => { if (selectedAutomationContextId && automationContexts.some((item) => item.id === selectedAutomationContextId)) { return; } setSelectedAutomationContextId(automationContexts[0]?.id ?? null); }, [automationContexts, selectedAutomationContextId]); useEffect(() => { if (detailMode !== 'detail') { lastHydratedFormKeyRef.current = ''; return; } const nextFormKey = isCreating ? '__create__' : selectedAutomationContext?.id ?? '__empty__'; if (lastHydratedFormKeyRef.current === nextFormKey) { return; } lastHydratedFormKeyRef.current = nextFormKey; form.resetFields(); form.setFieldsValue(toFormValue(isCreating ? null : selectedAutomationContext)); }, [detailMode, form, isCreating, selectedAutomationContext?.id]); const openCreateForm = () => { setIsCreating(true); setSelectedAutomationContextId(null); setDetailMode('detail'); form.resetFields(); form.setFieldsValue(EMPTY_FORM_VALUE); }; const openDetail = (automationContextId: string) => { setIsCreating(false); setSelectedAutomationContextId(automationContextId); setDetailMode('detail'); }; const closeDetail = () => { setIsCreating(false); setDetailMode('list'); }; const handleDelete = async () => { if (!selectedAutomationContext) { return; } const confirmed = await confirmWithKeyboard(modalApi, { title: `"${selectedAutomationContext.title}" Context를 삭제할까요?`, okText: '삭제', cancelText: '취소', okButtonProps: { danger: true }, }); if (!confirmed) { return; } const nextAutomationContexts = deleteAutomationContext(automationContexts, selectedAutomationContext.id); setIsSaving(true); setSaveErrorMessage(''); try { const savedAutomationContexts = await setAutomationContexts(nextAutomationContexts); setSelectedAutomationContextId(savedAutomationContexts[0]?.id ?? null); setIsCreating(false); setDetailMode('list'); form.resetFields(); form.setFieldsValue(EMPTY_FORM_VALUE); } catch (error) { setSaveErrorMessage(error instanceof Error ? error.message : '자동화 Context 삭제에 실패했습니다.'); } finally { setIsSaving(false); } }; if (!hasAccess) { return ( <> {modalContextHolder} ); } return (
{modalContextHolder} {detailMode === 'list' ? ( } onClick={openCreateForm}> 신규 Context } >
{errorMessage ? : null} {saveErrorMessage ? : null}
등록 Context {isLoading ? '불러오는 중' : `${automationContexts.length}건`}
{automationContexts.length > 0 ? ( ( openDetail(item.id)} actions={[
) : (
); }