Scrum4Me/components/solo/nav-status-indicators.tsx
Scrum4Me Agent 661601e833 feat(ST-qfpqpxzy): SSE + NavBar stand-by badge voor worker quota-gate
- SSE route: WorkerHeartbeatPayload type + shouldEmit handler voor worker_heartbeat
- solo-store: lowQuotaTokenIds Set<string> + setWorkerLowQuota action
- use-solo-realtime: worker_heartbeat event → setWorkerLowQuota; worker_disconnected verwijdert uit set
- nav-status-indicators: stand-by badge (bg-warning) als alle workers low quota
- docs/runbooks/mcp-integration.md: get_worker_settings + worker_heartbeat tools + pre-flight quota-check sectie

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-06 03:53:12 +02:00

85 lines
2.5 KiB
TypeScript

'use client'
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'
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 (
<TooltipProvider>
<Tooltip>
<TooltipTrigger
render={
<span
aria-label={label}
className={cn('inline-block h-2 w-2 rounded-full shrink-0 transition-colors', color)}
/>
}
/>
<TooltipContent>{label}</TooltipContent>
</Tooltip>
</TooltipProvider>
)
}
export function SoloNavStatusIndicators({ hasActiveProduct }: { hasActiveProduct: boolean }) {
const realtimeStatus = useSoloStore((s) => s.realtimeStatus)
const showConnectingIndicator = useSoloStore((s) => s.showConnectingIndicator)
const connectedWorkers = useSoloStore((s) => s.connectedWorkers)
const lowQuotaTokenIds = useSoloStore((s) => s.lowQuotaTokenIds)
if (!hasActiveProduct) return null
const allStandby = connectedWorkers > 0 && lowQuotaTokenIds.size >= connectedWorkers
return (
<div className="flex items-center gap-3 px-2">
<RealtimeIndicator
status={realtimeStatus}
showConnectingIndicator={showConnectingIndicator}
/>
<TooltipProvider>
<Tooltip>
<TooltipTrigger render={
<div className="flex items-center gap-1 text-xs text-muted-foreground" />
}>
<span className={cn(
'size-2 rounded-full',
connectedWorkers === 0
? 'bg-muted-foreground/40'
: allStandby
? 'bg-warning'
: 'bg-status-done'
)} />
{connectedWorkers === 0
? 'Geen agent'
: allStandby
? 'Worker stand-by'
: 'Agent verbonden'}
</TooltipTrigger>
{allStandby && (
<TooltipContent>Worker wacht op quota-reset</TooltipContent>
)}
</Tooltip>
</TooltipProvider>
</div>
)
}