import { NavLink, useLocation } from 'react-router-dom' import { useEffect, useState } from 'react' import { getInitiative, listInitiativeActions } from '../api/initiatives.js' import { listInitiativeBacklog } from '../api/backlog.js' import { useProgramScope } from '../context/ProgramScopeContext.jsx' import { useEntityArchetypes } from '../hooks/useEntityArchetypes.js' import { InitiativeSteeringMeta } from './InitiativeSteeringMeta.jsx' import { PLAN_OUTLINE_NODES, resolvePlanOutlineActiveKey, } from '../plan/planOutlineNodes.js' export function PlanOutlineNav() { const location = useLocation() const { initiativeId, initiativeTitle, hrefWithScope } = useProgramScope() const { initiativeArchetypes } = useEntityArchetypes() const activeKey = resolvePlanOutlineActiveKey(location.pathname) const [counts, setCounts] = useState({ inbox: null, work: null }) const [initiativeArchetypeKey, setInitiativeArchetypeKey] = useState('') useEffect(() => { if (!initiativeId) { setInitiativeArchetypeKey('') return undefined } let cancelled = false getInitiative(initiativeId) .then((data) => { if (!cancelled) setInitiativeArchetypeKey(data.archetype_key || '') }) .catch(() => { if (!cancelled) setInitiativeArchetypeKey('') }) return () => { cancelled = true } }, [initiativeId]) useEffect(() => { if (!initiativeId) { setCounts({ inbox: null, work: null }) return undefined } let cancelled = false Promise.all([ listInitiativeBacklog(initiativeId).catch(() => []), listInitiativeActions(initiativeId).catch(() => []), ]).then(([backlog, actions]) => { if (cancelled) return setCounts({ inbox: backlog.filter((item) => item.status !== 'converted').length, work: actions.filter( (action) => action.status !== 'done' && action.status !== 'discarded', ).length, }) }) return () => { cancelled = true } }, [initiativeId, location.pathname]) function nodeLabel(node) { if (node.key === 'inbox' && counts.inbox != null) { return `${node.label} (${counts.inbox})` } if (node.key === 'work' && counts.work != null) { return `${node.label} (${counts.work})` } return node.label } return ( ) }