import React, { useState } from 'react'; import { useMemories, useDeleteMemory, type Memory } from './hooks/useMemories'; import { formatRelativeTime } from '@/lib/date-utils'; import { Button } from './ui/button'; import { Badge } from './ui/badge'; import { Input } from './ui/input'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription, } from './ui/dialog'; import { ScrollArea } from './ui/scroll-area'; import { Brain, Plus, Trash2, Calendar, Tag, AlertTriangle, RefreshCw, Search } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Alert, AlertDescription } from './ui/alert'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './ui/tooltip'; import CreateMemoryModal from './CreateMemoryModal'; interface MemoryPanelProps { isOpen: boolean; onClose: () => void; variant?: 'inline' | 'modal'; } export default function MemoryPanel({ isOpen, onClose, variant = 'modal' }: MemoryPanelProps) { const [searchQuery, setSearchQuery] = useState(''); const [isCreateModalOpen, setCreateModalOpen] = useState(false); const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false); const [selectedMemoryForDelete, setSelectedMemoryForDelete] = useState(null); const { data: memories = [], isLoading: loading, error } = useMemories(isOpen); const deleteMemoryMutation = useDeleteMemory(); const handleDeleteMemory = async (memoryId: string) => { await deleteMemoryMutation.mutateAsync({ memoryId }); setDeleteDialogOpen(false); setSelectedMemoryForDelete(null); }; const truncateContent = (content: string, maxLength: number = 120) => { if (content.length <= maxLength) return content; return content.slice(0, maxLength) + '...'; }; // Filter memories based on search query const filteredMemories = memories.filter((memory) => { if (!searchQuery.trim()) return true; const query = searchQuery.toLowerCase(); return ( memory.content.toLowerCase().includes(query) || memory.tags?.some((tag) => tag.toLowerCase().includes(query)) ); }); const content = (
{/* Header */}

Memories

{memories.length}
{/* Search Bar with Create Button */}
setSearchQuery(e.target.value)} className="pl-8 h-8 text-sm" />
Create Memory
{/* Error Display */} {error && (
{error.message}
)} {/* Memories List */}
{loading ? (
) : filteredMemories.length === 0 ? (
{searchQuery.trim() ? ( <>

No memories found

Try a different search term

) : ( <>

No memories yet

Type # in chat or use the + button above

)}
) : ( filteredMemories.map((memory) => (
{/* Content */}

{truncateContent(memory.content)}

{/* Tags */} {memory.tags && memory.tags.length > 0 && (
{memory.tags.map((tag, idx) => ( {tag} ))}
)} {/* Metadata */}
{formatRelativeTime(memory.updatedAt)}
{memory.metadata?.source && ( {memory.metadata.source} )} {memory.metadata?.pinned && ( Pinned )}
{/* Actions */}
)) )}
{/* Create Memory Modal */} setCreateModalOpen(false)} /> {/* Delete Confirmation Dialog */} Delete Memory This will permanently delete this memory. This action cannot be undone. {selectedMemoryForDelete && ( {truncateContent(selectedMemoryForDelete.content, 100)} )}
); if (variant === 'inline') { return
{content}
; } return ( Memories {content} ); }