/** * @license * Copyright 2025 Qwen Team * SPDX-License-Identifier: Apache-2.0 */ import React, { useState, useEffect } from 'react'; import { useVSCode } from '../hooks/useVSCode.js'; import { RefreshIcon, SaveDocumentIcon, SearchIcon, PlayIcon, SwitchIcon, } from './icons/index.js'; interface Session { id: string; name: string; lastUpdated: string; messageCount: number; } interface SessionManagerProps { currentSessionId: string | null; onSwitchSession: (sessionId: string) => void; onSaveSession: () => void; onResumeSession: (sessionId: string) => void; } export const SessionManager: React.FC = ({ currentSessionId, onSwitchSession, onSaveSession, onResumeSession, }) => { const vscode = useVSCode(); const [sessions, setSessions] = useState([]); const [isLoading, setIsLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const loadSessions = React.useCallback(() => { setIsLoading(true); vscode.postMessage({ type: 'listSavedSessions', data: {}, }); }, [vscode]); // Load sessions when component mounts useEffect(() => { loadSessions(); }, [loadSessions]); // Listen for session list updates useEffect(() => { const handleMessage = (event: MessageEvent) => { const message = event.data; if (message.type === 'savedSessionsList') { setIsLoading(false); setSessions(message.data.sessions || []); } }; window.addEventListener('message', handleMessage); return () => window.removeEventListener('message', handleMessage); }, []); const filteredSessions = sessions.filter((session) => session.name.toLowerCase().includes(searchQuery.toLowerCase()), ); const handleSaveCurrent = () => { onSaveSession(); }; const handleResumeSession = (sessionId: string) => { onResumeSession(sessionId); }; const handleSwitchSession = (sessionId: string) => { onSwitchSession(sessionId); }; return (

Saved Conversations

setSearchQuery(e.target.value)} />
{isLoading ? (
Loading conversations...
) : filteredSessions.length === 0 ? (
{searchQuery ? 'No matching conversations' : 'No saved conversations yet'}
) : ( filteredSessions.map((session) => (
{session.name}
{new Date(session.lastUpdated).toLocaleDateString()} {session.messageCount}{' '} {session.messageCount === 1 ? 'message' : 'messages'}
)) )}
); };