import { useCallback, useEffect, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { getInitiative, listInitiativeActions, createInitiativeAction, } from '../api/initiatives.js' import { updateAction, setActionAssignments } from '../api/actions.js' import { ACTION_STATUS_LABELS } from '../constants/status.js' import { StatusBadge } from '../components/StatusBadge.jsx' import { PriorityBadge } from '../components/PriorityBadge.jsx' import { ActionForm } from '../components/ActionForm.jsx' import { EmptyState } from '../components/EmptyState.jsx' import { ErrorState } from '../components/ErrorState.jsx' import { LoadingState } from '../components/LoadingState.jsx' import { useCapabilities } from '../hooks/useCapabilities.js' import { useActors } from '../hooks/useActors.js' import { useSession } from '../context/SessionContext.jsx' export function InitiativeDetailPage() { const { id } = useParams() const { context } = useSession() const { hasCapability } = useCapabilities() const { actors, loading: actorsLoading, error: actorsError, usedFallback: actorsUsedFallback, reload: reloadActors, } = useActors() const [initiative, setInitiative] = useState(null) const [actions, setActions] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showActionForm, setShowActionForm] = useState(false) const [editingAction, setEditingAction] = useState(null) const [formBusy, setFormBusy] = useState(false) const [hideDone, setHideDone] = useState(true) const load = useCallback(async () => { setLoading(true) setError(null) try { const [initData, actionData] = await Promise.all([ getInitiative(id), listInitiativeActions(id), ]) setInitiative(initData) setActions(actionData) } catch (err) { setError(err.message) } finally { setLoading(false) } }, [id]) useEffect(() => { load() }, [load]) const visibleActions = hideDone ? actions.filter((a) => a.status !== 'done' && a.status !== 'discarded') : actions async function handleCreateAction(payload) { setFormBusy(true) try { const assigned = payload.assigned_actor_ids?.length > 0 ? payload.assigned_actor_ids : context?.actor?.id ? [context.actor.id] : [] await createInitiativeAction(id, { ...payload, assigned_actor_ids: assigned }) setShowActionForm(false) await load() } catch (err) { setError(err.message) } finally { setFormBusy(false) } } async function handleUpdateAction(actionId, payload) { setFormBusy(true) try { await updateAction(actionId, { title: payload.title, description: payload.description, status: payload.status, priority: payload.priority, }) if (hasCapability('kairo.action.manage')) { await setActionAssignments(actionId, payload.assigned_actor_ids || []) } setEditingAction(null) await load() } catch (err) { setError(err.message) } finally { setFormBusy(false) } } async function handleQuickStatus(action, status) { if (!hasCapability('kairo.action.manage')) return try { await updateAction(action.id, { status }) await load() } catch (err) { setError(err.message) } } if (loading) { return (
{initiative.goal}
}{error}
}{action.description}
)} {action.assigned_actor_ids?.length > 0 && (Zugewiesen: {action.assigned_actor_ids.length} Actor(s)
)}