Klik op een taak in het sprint-scherm opent de edit-dialog nu
client-side via setActiveTask op de sprint-workspace-store.
Geen URL-navigatie, geen volledige server re-render — alleen
GET /api/tasks/{id} voor het detail. SSE propageert server-saves
automatisch terug.
- TaskDialog: optionele onClose/onSaved callbacks (closePath
optional gemaakt — backwards compatible)
- SprintTaskDialogMount: nieuwe client-component die
selectActiveTask consumeert en TaskDialog rendert
- SprintUrlTaskSync: deeplink (?editTask=<id>) → store
- Sprint page: mounts toegevoegd, editTask searchParam +
EditTaskLoader-Suspense verwijderd
- TaskList.openEditDialog roept setActiveTask aan ipv router.push
- Vitest integratie-test voor SprintTaskDialogMount
Out-of-scope (follow-up PBIs): newTask-flow, mobile, product-backlog.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
29 lines
990 B
TypeScript
29 lines
990 B
TypeScript
'use client'
|
|
|
|
// PBI-75: URL-deeplink → store sync voor sprint task-edit.
|
|
//
|
|
// Patroon spiegelt components/backlog/url-task-sync.tsx: zodra de route
|
|
// `?editTask=<id>` draagt, schrijven we de taak-hint en roepen we
|
|
// setActiveTask aan op de sprint-workspace-store. De dialog wordt
|
|
// vervolgens client-side gemount door SprintTaskDialogMount.
|
|
|
|
import { useEffect } from 'react'
|
|
import { useSearchParams } from 'next/navigation'
|
|
import { useSprintWorkspaceStore } from '@/stores/sprint-workspace/store'
|
|
import { writeTaskHint } from '@/stores/sprint-workspace/restore'
|
|
|
|
export function SprintUrlTaskSync() {
|
|
const searchParams = useSearchParams()
|
|
const editTask = searchParams.get('editTask')
|
|
|
|
useEffect(() => {
|
|
if (!editTask) return
|
|
const sprintId = useSprintWorkspaceStore.getState().context.activeSprintId
|
|
if (sprintId) {
|
|
writeTaskHint(sprintId, editTask)
|
|
}
|
|
useSprintWorkspaceStore.getState().setActiveTask(editTask)
|
|
}, [editTask])
|
|
|
|
return null
|
|
}
|