import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useAppContext } from '../context/AppContext'; import { useUI } from '../context/UIContext'; const Memory: React.FC = () => { const { t } = useTranslation(); const ui = useUI(); const { q } = useAppContext(); const [files, setFiles] = useState([]); const [active, setActive] = useState(''); const [content, setContent] = useState(''); async function loadFiles() { const r = await fetch(`/webui/api/memory${q}`); const j = await r.json(); setFiles(Array.isArray(j.files) ? j.files : []); } const qp = (k: string, v: string) => `${q}${q ? '&' : '?'}${k}=${encodeURIComponent(v)}`; async function openFile(path: string) { const r = await fetch(`/webui/api/memory${qp('path', path)}`); const j = await r.json(); setActive(path); setContent(j.content || ''); } async function saveFile() { if (!active) return; await fetch(`/webui/api/memory${q}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ path: active, content }), }); await loadFiles(); } async function removeFile(path: string) { const ok = await ui.confirmDialog({ title: t('memoryDeleteConfirmTitle'), message: t('memoryDeleteConfirmMessage', { path }), danger: true, confirmText: t('delete'), }); if (!ok) return; await fetch(`/webui/api/memory${qp('path', path)}`, { method: 'DELETE' }); if (active === path) { setActive(''); setContent(''); } await loadFiles(); } async function createFile() { const name = prompt(t('memoryFileNamePrompt'), `note-${Date.now()}.md`); if (!name) return; await fetch(`/webui/api/memory${q}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ path: name, content: '' }), }); await loadFiles(); await openFile(name); } useEffect(() => { loadFiles().catch(() => {}); }, [q]); return (

{active || t('noFileSelected')}