// Expliciete schermstaat voor de Product Backlog page. // // Consolideert de vandaag verspreide schermstaat-afleiding (page.tsx, // sprint-switcher.tsx, new-sprint-trigger.tsx, save-sprint-button.tsx) tot één // pure, testbare functie. Zie docs/architecture/product-backlog-workflow.md, // sectie "To-be: expliciete state machine". // // PRODUCT_NOT_ACTIVE en DEMO_MODE blijven bewust BUITEN ScreenState — het zijn // cross-cutting gates, geen knopen in de state machine. export type ScreenState = | { kind: 'NO_SPRINT' } | { kind: 'DRAFT' } | { kind: 'ACTIVE'; building: boolean } | { kind: 'EDITING'; building: boolean } export interface ScreenStateInput { activeSprintItem: { id: string } | null // SSR-prop uit page.tsx buildingSprintIds: string[] // SSR-prop uit page.tsx hasPendingDraft: boolean // user-settings store pendingAdds: string[] // product-workspace store: sprintMembership.pending.adds pendingRemoves: string[] // product-workspace store: sprintMembership.pending.removes } export function deriveScreenState(i: ScreenStateInput): ScreenState { if (i.hasPendingDraft) return { kind: 'DRAFT' } // draft wint van alles if (i.activeSprintItem) { const building = i.buildingSprintIds.includes(i.activeSprintItem.id) const dirty = i.pendingAdds.length > 0 || i.pendingRemoves.length > 0 return dirty ? { kind: 'EDITING', building } : { kind: 'ACTIVE', building } } return { kind: 'NO_SPRINT' } }