// ======================================== // SessionDetailPage Component // ======================================== // Session detail page with tabs for tasks, context, and summary import * as React from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useIntl } from 'react-intl'; import { ArrowLeft, Calendar, ListChecks, Package, FileText, XCircle, } from 'lucide-react'; import { useSessionDetail } from '@/hooks/useSessionDetail'; import { TaskListTab } from './session-detail/TaskListTab'; import { ContextTab } from './session-detail/ContextTab'; import { SummaryTab } from './session-detail/SummaryTab'; import { TaskDrawer } from '@/components/shared/TaskDrawer'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/Tabs'; import type { TaskData } from '@/types/store'; type TabValue = 'tasks' | 'context' | 'summary'; /** * SessionDetailPage component - Main session detail page with tabs */ export function SessionDetailPage() { const { sessionId } = useParams<{ sessionId: string }>(); const navigate = useNavigate(); const { formatMessage } = useIntl(); const { sessionDetail, isLoading, error, refetch } = useSessionDetail(sessionId!); const [activeTab, setActiveTab] = React.useState('tasks'); const [selectedTask, setSelectedTask] = React.useState(null); const handleBack = () => { navigate('/sessions'); }; // Loading state if (isLoading) { return (
); } // Error state if (error) { return (

{formatMessage({ id: 'common.errors.loadFailed' })}

{error.message}

); } // Session not found if (!sessionDetail) { return (

{formatMessage({ id: 'sessionDetail.notFound.title' })}

{formatMessage({ id: 'sessionDetail.notFound.message' })}

); } const { session, context, summary } = sessionDetail; const tasks = session.tasks || []; const completedTasks = tasks.filter((t) => t.status === 'completed').length; return (
{/* Header */}

{session.title || session.session_id}

{session.title && session.title !== session.session_id && (

{session.session_id}

)}
{formatMessage({ id: `sessions.status.${session.status}` })}
{/* Info Bar */}
{formatMessage({ id: 'sessionDetail.info.created' })}:{' '} {new Date(session.created_at).toLocaleString()}
{session.updated_at && (
{formatMessage({ id: 'sessionDetail.info.updated' })}:{' '} {new Date(session.updated_at).toLocaleString()}
)}
{formatMessage({ id: 'sessionDetail.info.tasks' })}:{' '} {completedTasks}/{tasks.length}
{/* Tabs */} setActiveTab(v as TabValue)}> {formatMessage({ id: 'sessionDetail.tabs.tasks' })} {tasks.length} {formatMessage({ id: 'sessionDetail.tabs.context' })} {formatMessage({ id: 'sessionDetail.tabs.summary' })} {/* Description (if exists) */} {session.description && (

{formatMessage({ id: 'sessionDetail.info.description' })}

{session.description}

)} {/* TaskDrawer */} setSelectedTask(null)} />
); } export default SessionDetailPage;