import { useEffect, useMemo, useState } from 'react' import type { OpencodeLocalSessionSummary } from '@/types/api' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { SelectControl } from '@/components/ui/select-control' import { useTranslation } from '@/lib/use-translation' const ALL_DIRECTORIES = '__all__' export function OpencodeSessionImportDialog(props: { isOpen: boolean onClose: () => void sessions: OpencodeLocalSessionSummary[] currentSessionId: string | null currentWorkDirectory?: string | null onConfirm: (sessionIds: string[]) => Promise isPending: boolean isLoading: boolean }) { const { t } = useTranslation() const [selectedIds, setSelectedIds] = useState([]) const [directory, setDirectory] = useState(ALL_DIRECTORIES) const [query, setQuery] = useState('') const directories = useMemo(() => Array.from(new Set(props.sessions .map((session) => session.cwd?.trim()) .filter((value): value is string => Boolean(value)))).sort(), [props.sessions]) const filtered = useMemo(() => { const normalized = query.trim().toLowerCase() return props.sessions.filter((session) => { if (directory !== ALL_DIRECTORIES && session.cwd !== directory) return false if (!normalized) return true return [session.title, session.lastUserMessage, session.cwd, session.id] .filter((value): value is string => typeof value === 'string') .some((value) => value.toLowerCase().includes(normalized)) }) }, [directory, props.sessions, query]) useEffect(() => { if (!props.isOpen) return setSelectedIds(props.currentSessionId ? [props.currentSessionId] : []) const cwd = props.currentWorkDirectory?.trim() setDirectory(cwd && directories.includes(cwd) ? cwd : ALL_DIRECTORIES) setQuery('') }, [directories, props.currentSessionId, props.currentWorkDirectory, props.isOpen]) const toggle = (id: string) => { if (props.isPending || props.isLoading) return setSelectedIds((current) => current.includes(id) ? current.filter((value) => value !== id) : [...current, id]) } return ( !open && props.onClose()}> {t('opencodeSync.dialog.title')} {t('opencodeSync.dialog.description')}
{t('opencodeSync.dialog.concurrentWarning')}
{t('opencodeSync.selectedCount', { n: selectedIds.length })}
{props.sessions.length > 0 ? (
setDirectory(event.target.value)}> {directories.map((value) => )} setQuery(event.target.value)} />
) : null}
{props.isLoading ? (
{t('opencodeSync.loading')}
) : filtered.length === 0 ? (
{t('opencodeSync.empty')}
) : (
{filtered.map((session) => { const checked = selectedIds.includes(session.id) return ( ) })}
)}
) }