import { useEffect, useMemo, useState } from 'react' import { StudioPermissionModeModal } from './controls/StudioPermissionModeModal' import { StudioCommandPanel } from './components/StudioCommandPanel' import { useStudioSession } from './hooks/use-studio-session' import { PlotPreviewPanel } from './plot/PlotPreviewPanel' interface PlotStudioShellProps { onExit: () => void isExiting?: boolean } export function PlotStudioShell({ onExit, isExiting }: PlotStudioShellProps) { const studio = useStudioSession({ studioKind: 'plot', title: 'Plot Studio' }) const [selectedWorkId, setSelectedWorkId] = useState(null) const [orderedWorkIds, setOrderedWorkIds] = useState([]) useEffect(() => { const incomingIds = studio.workSummaries.map((entry) => entry.work.id) setOrderedWorkIds((current) => { const preserved = current.filter((id) => incomingIds.includes(id)) const appended = incomingIds.filter((id) => !preserved.includes(id)) return [...appended, ...preserved] }) }, [studio.workSummaries]) const orderedWorkSummaries = useMemo(() => { const byId = new Map(studio.workSummaries.map((entry) => [entry.work.id, entry])) return orderedWorkIds .map((id) => byId.get(id)) .filter((entry): entry is NonNullable => Boolean(entry)) }, [orderedWorkIds, studio.workSummaries]) useEffect(() => { const latestWorkId = orderedWorkSummaries[0]?.work.id ?? null if (latestWorkId) { setSelectedWorkId(latestWorkId) } }, [orderedWorkSummaries[0]?.work.id, orderedWorkSummaries[0]?.result?.id]) const effectiveSelectedWorkId = selectedWorkId && orderedWorkSummaries.some((entry) => entry.work.id === selectedWorkId) ? selectedWorkId : orderedWorkSummaries[0]?.work.id ?? null const selected = studio.selectWork(effectiveSelectedWorkId) const handleReorderWorks = (nextWorkIds: string[]) => { setOrderedWorkIds(nextWorkIds) } return ( <>
) }