import { ArrowsAltOutlined, DeleteOutlined, EditOutlined, PlusOutlined, SaveOutlined, ShrinkOutlined, UnorderedListOutlined, } from '@ant-design/icons'; import { Alert, Button, Card, Empty, Form, Input, List, Segmented, Space, Switch, Tag, Typography } from 'antd'; import { useEffect, useMemo, useState } from 'react'; import { MarkdownPreviewContent } from '../../components/markdownPreview'; import { deleteChatDefaultContext, pruneChatRoomContextSettings, pruneChatTypeDefaultSelections, upsertChatDefaultContext, useChatContextSettingsRegistry, type ChatDefaultContextRecord, } from './chatContextSettingsAccess'; import { useTokenAccess } from './tokenAccess'; import './ChatTypeManagementPage.css'; const { Text, Title } = Typography; type ChatDefaultContextFormValue = { id?: string; title: string; content: string; enabled: boolean; }; const EMPTY_FORM_VALUE: ChatDefaultContextFormValue = { title: '', content: '', enabled: true, }; function toFormValue(record: ChatDefaultContextRecord | null): ChatDefaultContextFormValue { if (!record) { return EMPTY_FORM_VALUE; } return { id: record.id, title: record.title, content: record.content, enabled: record.enabled, }; } export function ChatDefaultContextManagementPage() { const { hasAccess } = useTokenAccess(); const { defaultContexts, chatTypeDefaults, roomContexts, errorMessage: contextSettingsErrorMessage, setStore, } = useChatContextSettingsRegistry(); const [selectedContextId, setSelectedContextId] = useState(defaultContexts[0]?.id ?? null); const [isMobileViewport, setIsMobileViewport] = useState(false); const [mobileView, setMobileView] = useState<'edit' | 'preview'>('edit'); const [detailMode, setDetailMode] = useState<'list' | 'detail'>('list'); const [maximizedPane, setMaximizedPane] = useState<'none' | 'edit' | 'preview'>('none'); const [isCreating, setIsCreating] = useState(false); const [saveErrorMessage, setSaveErrorMessage] = useState(''); const [form] = Form.useForm(); const selectedContext = useMemo( () => defaultContexts.find((item) => item.id === selectedContextId) ?? null, [defaultContexts, selectedContextId], ); useEffect(() => { if (selectedContextId && defaultContexts.some((item) => item.id === selectedContextId)) { return; } setSelectedContextId(defaultContexts[0]?.id ?? null); }, [defaultContexts, selectedContextId]); useEffect(() => { if (detailMode !== 'detail') { return; } form.resetFields(); form.setFieldsValue(toFormValue(isCreating ? null : selectedContext)); }, [detailMode, form, isCreating, selectedContext]); useEffect(() => { if (typeof window === 'undefined') { return; } const mediaQuery = window.matchMedia('(max-width: 960px)'); const update = () => { setIsMobileViewport(mediaQuery.matches); if (!mediaQuery.matches) { setMobileView('edit'); } }; update(); mediaQuery.addEventListener('change', update); return () => { mediaQuery.removeEventListener('change', update); }; }, []); const openCreateForm = () => { setIsCreating(true); setSelectedContextId(null); setDetailMode('detail'); setMaximizedPane('none'); form.resetFields(); form.setFieldsValue(EMPTY_FORM_VALUE); }; const openDetail = (contextId: string) => { setIsCreating(false); setSelectedContextId(contextId); setDetailMode('detail'); setMaximizedPane('none'); }; const closeDetail = () => { setIsCreating(false); setDetailMode('list'); setMaximizedPane('none'); }; const handleDelete = async () => { if (!selectedContext) { return; } if (!window.confirm(`"${selectedContext.title}" 기본 유형을 삭제할까요?`)) { return; } const nextDefaultContexts = deleteChatDefaultContext(defaultContexts, selectedContext.id); const nextChatTypeDefaults = pruneChatTypeDefaultSelections(chatTypeDefaults, selectedContext.id); const nextRoomContexts = pruneChatRoomContextSettings(roomContexts, selectedContext.id); await setStore({ defaultContexts: nextDefaultContexts, chatTypeDefaults: nextChatTypeDefaults, roomContexts: nextRoomContexts, }); setSelectedContextId(nextDefaultContexts[0]?.id ?? null); setIsCreating(false); setDetailMode('list'); form.resetFields(); form.setFieldsValue(EMPTY_FORM_VALUE); }; if (!hasAccess) { return ( ); } return (
{detailMode === 'list' ? ( } onClick={openCreateForm}> 신규 기본 유형 } >
{saveErrorMessage ? : null} {contextSettingsErrorMessage ? : null}
등록 기본 유형 {`${defaultContexts.length}건`}
{defaultContexts.length > 0 ? ( ( { openDetail(item.id); }} actions={[
) : ( )}
입력
미리보기
prev.content !== next.content}> {({ getFieldValue }) => { const content = String(getFieldValue('content') ?? '').trim(); return content ? ( ) : ( ); }}
)} ); }