import { useQueryClient } from '@tanstack/react-query'
import { workspaceKeys } from '@/client/api/workspace-keys'
import { LedLogo } from '@/client/components/shared/LedLogo'
import { SidebarLayout } from '@/client/app/shell/SidebarLayout'
import { useSelectedSession } from '@/client/features/chat/useSelectedSession'
import { useAppletCacheInvalidation } from '@/client/features/applets/useApplet'
import { Workspace } from '@/client/features/workspace/WorkspaceContext'
import {
WorkspaceLayoutProvider,
useWorkspaceLayoutCtx
} from '@/client/features/workspace/WorkspaceLayoutContext'
import { WorkspaceScreen } from '@/client/features/workspace/WorkspaceScreen'
import { useWorkspaceViews, useWorkspaceWidgets } from '@/client/features/workspace/api'
import { useViewBuilders } from '@/client/features/views/api'
import { useGridReconcile } from '@/client/features/widgets/useGridReconcile'
import { useWorkspaceEvent } from '@/client/runtime/useWorkspaceEvents'
type WorkspaceRouteProps = {
id: string
}
// The URL's tab segment is not threaded down — useWorkspaceNavigation reads it
// off the matched route with wouter's `useParams`.
export function WorkspaceRoute({ id }: WorkspaceRouteProps) {
return (
)
}
function WorkspaceLoader({ id }: WorkspaceRouteProps) {
const queryClient = useQueryClient()
const [selectedSessionId] = useSelectedSession()
const { layout, setLayout, isLoading: layoutLoading } = useWorkspaceLayoutCtx()
const widgets = useWorkspaceWidgets(id)
const views = useWorkspaceViews(id)
const builders = useViewBuilders(id)
useGridReconcile(id, widgets.data, layout, setLayout)
useAppletCacheInvalidation()
useWorkspaceEvent(event => {
if (event.type === 'theme:updated' || event.type === 'workspace:updated') {
queryClient.invalidateQueries({ queryKey: workspaceKeys.layout(id) })
} else if (event.type === 'widget-layout:updated' || event.type === 'widget:updated') {
// widget:updated too: a rebundle bumps the widget's content revision, and
// the thumbnail invalidation hook reads it off this query.
queryClient.invalidateQueries({ queryKey: workspaceKeys.widgets(id) })
} else if (event.type === 'view-layout:updated' || event.type === 'view:updated') {
// view:updated also bumps the built bundle revision used by thumbnail
// freshness checks.
queryClient.invalidateQueries({ queryKey: workspaceKeys.views(id) })
}
})
const fresh =
layoutLoading ||
selectedSessionId === undefined ||
widgets.isLoading ||
views.isLoading ||
builders.isLoading
return (
<>
{fresh ? (
) : (
)}
>
)
}