import React, { useState, useEffect, useCallback } from 'react'; import { getEpisodes, deleteEpisode } from '../api/orchestration'; import ReactMarkdown from 'react-markdown'; const PAGE_SIZE = 20; export default function MemoryView({ onNavigate }) { const [episodes, setEpisodes] = useState([]); const [total, setTotal] = useState(0); const [offset, setOffset] = useState(0); const [search, setSearch] = useState(''); const [query, setQuery] = useState(''); // committed search term const [expanded, setExpanded] = useState(null); // episode id const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const load = useCallback(async () => { setLoading(true); setError(null); try { const data = await getEpisodes({ limit: PAGE_SIZE, offset, q: query || undefined }); setEpisodes(data.episodes); setTotal(data.total); } catch (err) { setError(err.message); } finally { setLoading(false); } }, [offset, query]); useEffect(() => { load(); }, [load]); function handleSearch(e) { e.preventDefault(); setOffset(0); // reset to page 1 on new search setQuery(search); } async function handleDelete(id) { if (!confirm('Delete this memory? This cannot be undone.')) return; await deleteEpisode(id); load(); } const totalPages = Math.ceil(total / PAGE_SIZE); const currentPage = Math.floor(offset / PAGE_SIZE) + 1; return (
Loading…
} {error &&{error}
} {!loading && episodes.length === 0 && (No memories found.
)} {episodes.map(ep => (Tokens: {episode.token_count}
)}{label}
{children}
, ul: ({children}) =>{children}
: {children},
strong: ({children}) => {children},
}}
>{content}