'use client'; import { useState, useMemo, useCallback } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import { Memory } from '@/types/memory'; import { MemoryCard } from './MemoryCard'; const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001'; type SortKey = 'salience' | 'createdAt' | 'lastAccessed' | 'decayedScore'; type ViewStyle = 'grid' | 'list'; interface MemoriesViewProps { memories: Memory[]; selectedMemory: Memory | null; onSelectMemory: (m: Memory | null) => void; } export function MemoriesView({ memories, selectedMemory, onSelectMemory }: MemoriesViewProps) { const [sortKey, setSortKey] = useState('salience'); const [viewStyle, setViewStyle] = useState('grid'); const [bulkMode, setBulkMode] = useState(false); const [checked, setChecked] = useState>(new Set()); const [deleting, setDeleting] = useState(false); const queryClient = useQueryClient(); const sorted = useMemo(() => { const arr = [...memories]; arr.sort((a, b) => { switch (sortKey) { case 'salience': return b.salience - a.salience; case 'createdAt': return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(); case 'lastAccessed': return new Date(b.lastAccessed).getTime() - new Date(a.lastAccessed).getTime(); case 'decayedScore': return (b.decayedScore ?? b.salience) - (a.decayedScore ?? a.salience); default: return 0; } }); return arr; }, [memories, sortKey]); const handleCheck = useCallback((id: number, val: boolean) => { setChecked((prev) => { const next = new Set(prev); if (val) next.add(id); else next.delete(id); return next; }); }, []); const selectAll = () => setChecked(new Set(sorted.map((m) => m.id))); const _deselectAll = () => setChecked(new Set()); const deleteSelected = async () => { if (checked.size === 0) return; setDeleting(true); try { await Promise.all( Array.from(checked).map((id) => fetch(`${API_BASE}/api/memories/${id}`, { method: 'DELETE' }) ) ); setChecked(new Set()); queryClient.invalidateQueries({ queryKey: ['memories'] }); } finally { setDeleting(false); } }; return (
{/* Toolbar */}
{memories.length} memories
{bulkMode && ( <> )}
{/* Card grid */}
{sorted.map((memory) => ( ))}
); }