feat(PBI-80): SprintSwitcher demo-fork (ST-1345)

Demo-sessies navigeren bij sprint-wissel direct via router.push, zonder
de geblokkeerde setActiveSprintAction aan te roepen. De server-action
behoudt zijn 403-guard als defense in depth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-05-12 19:28:37 +02:00
parent bf7162a5fc
commit 84b2c10c71
2 changed files with 131 additions and 0 deletions

View file

@ -14,6 +14,7 @@ import {
} from '@/components/ui/dropdown-menu'
import { cn } from '@/lib/utils'
import { setActiveSprintAction } from '@/actions/active-sprint'
import { useUserSettingsStore } from '@/stores/user-settings/store'
import type { SprintStatusApi } from '@/lib/task-status'
import { debugProps } from '@/lib/debug'
@ -44,6 +45,7 @@ export function SprintSwitcher({
const [isPending, startTransition] = useTransition()
const [showClosed, setShowClosed] = useState(false)
const buildingSet = new Set(buildingSprintIds)
const isDemo = useUserSettingsStore(s => s.context.isDemo)
const visibleSprints = sprints.filter(s => {
if (showClosed) return true
@ -53,6 +55,10 @@ export function SprintSwitcher({
function handleSwitchSprint(sprintId: string) {
if (sprintId === activeSprint?.id) return
if (isDemo) {
router.push(`/products/${productId}/sprint/${sprintId}`)
return
}
startTransition(async () => {
const result = await setActiveSprintAction(productId, sprintId)
if (result?.error) {