diff --git a/components/shared/nav-bar.tsx b/components/shared/nav-bar.tsx index d56cf99..d6dba25 100644 --- a/components/shared/nav-bar.tsx +++ b/components/shared/nav-bar.tsx @@ -17,6 +17,7 @@ import { import { AppIcon } from '@/components/shared/app-icon' import { UserMenu } from '@/components/shared/user-menu' import { NotificationsBell } from '@/components/shared/notifications-bell' +import { SoloNavStatusIndicators } from '@/components/solo/nav-status-indicators' import { cn } from '@/lib/utils' import { setActiveProductAction } from '@/actions/active-product' @@ -180,8 +181,9 @@ export function NavBar({ )} - {/* Rechts: notifications + account-menu */} + {/* Rechts: solo-status + notifications + account-menu */}
+
diff --git a/components/solo/nav-status-indicators.tsx b/components/solo/nav-status-indicators.tsx new file mode 100644 index 0000000..7ee614e --- /dev/null +++ b/components/solo/nav-status-indicators.tsx @@ -0,0 +1,69 @@ +'use client' + +import { usePathname } from 'next/navigation' +import { useSoloStore } from '@/stores/solo-store' +import type { RealtimeStatus } from '@/stores/solo-store' +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' +import { cn } from '@/lib/utils' + +const SOLO_PATH_RE = /^\/products\/[^/]+\/solo$/ + +function RealtimeIndicator({ + status, + showConnectingIndicator, +}: { + status: RealtimeStatus + showConnectingIndicator: boolean +}) { + let color = 'bg-status-done' + let label = 'Live' + if (showConnectingIndicator) { + if (status === 'disconnected') { + color = 'bg-priority-critical' + label = 'Verbroken — opnieuw proberen…' + } else { + color = 'bg-muted-foreground' + label = 'Verbinden…' + } + } + return ( + + + + } + /> + {label} + + + ) +} + +export function SoloNavStatusIndicators() { + const pathname = usePathname() + const realtimeStatus = useSoloStore((s) => s.realtimeStatus) + const showConnectingIndicator = useSoloStore((s) => s.showConnectingIndicator) + const connectedWorkers = useSoloStore((s) => s.connectedWorkers) + + if (!pathname || !SOLO_PATH_RE.test(pathname)) return null + + return ( +
+ +
+ 0 ? 'bg-status-done' : 'bg-muted-foreground/40' + )} /> + {connectedWorkers > 0 ? 'Agent verbonden' : 'Geen agent'} +
+
+ ) +} diff --git a/components/solo/solo-board.tsx b/components/solo/solo-board.tsx index c332d92..6e7e08d 100644 --- a/components/solo/solo-board.tsx +++ b/components/solo/solo-board.tsx @@ -7,55 +7,13 @@ import { } from '@dnd-kit/core' import { toast } from 'sonner' import { useSoloStore } from '@/stores/solo-store' -import type { RealtimeStatus } from '@/stores/solo-store' import { taskStatusToApi } from '@/lib/task-status' -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' -import { cn } from '@/lib/utils' import { SplitPane } from '@/components/split-pane/split-pane' import { SoloColumn, type ColumnStatus } from './solo-column' import { SoloTaskCardOverlay } from './solo-task-card' import { TaskDetailDialog } from './task-detail-dialog' import { UnassignedStoriesSheet, type UnassignedStory } from './unassigned-stories-sheet' -// ST-805: kleine status-dot in de header — groen wanneer SSE-stream open -// is, grijs/rood pas zichtbaar als de connectie >4s niet open is (animatie B -// zit in useSoloRealtime). Default groen tijdens de eerste 4s zodat micro- -// disconnects geen flikker geven. -function RealtimeIndicator({ - status, - showConnectingIndicator, -}: { - status: RealtimeStatus - showConnectingIndicator: boolean -}) { - let color = 'bg-status-done' - let label = 'Live' - if (showConnectingIndicator) { - if (status === 'disconnected') { - color = 'bg-priority-critical' - label = 'Verbroken — opnieuw proberen…' - } else { - color = 'bg-muted-foreground' - label = 'Verbinden…' - } - } - return ( - - - - } - /> - {label} - - - ) -} - export interface SoloTask { id: string title: string @@ -91,9 +49,6 @@ export function SoloBoard({ productId, productName, sprintGoal, tasks: initialTasks, unassignedStories: initialUnassigned, isDemo, }: SoloBoardProps) { const { tasks, initTasks, optimisticMove, rollback, markPending, clearPending } = useSoloStore() - const realtimeStatus = useSoloStore((s) => s.realtimeStatus) - const showConnectingIndicator = useSoloStore((s) => s.showConnectingIndicator) - const connectedWorkers = useSoloStore((s) => s.connectedWorkers) const [activeDragId, setActiveDragId] = useState(null) const [selectedTask, setSelectedTask] = useState(null) const [sheetOpen, setSheetOpen] = useState(false) @@ -174,20 +129,7 @@ export function SoloBoard({
-
-

{productName}

- -
- 0 ? 'bg-status-done' : 'bg-muted-foreground/40' - )} /> - {connectedWorkers > 0 ? 'Agent verbonden' : 'Geen agent'} -
-
+

{productName}

{sprintGoal && (

{sprintGoal}

)}