import { NavLink, useLocation } from 'react-router-dom' import { useEffect, useState } from 'react' import { listInitiativeActions } from '../api/initiatives.js' import { listInitiativeBacklog } from '../api/backlog.js' import { useProgramScope } from '../context/ProgramScopeContext.jsx' import { PLAN_OUTLINE_NODES, resolvePlanOutlineActiveKey, } from '../plan/planOutlineNodes.js' export function PlanOutlineNav() { const location = useLocation() const { initiativeId, initiativeTitle, hrefWithScope } = useProgramScope() const activeKey = resolvePlanOutlineActiveKey(location.pathname) const [counts, setCounts] = useState({ inbox: null, work: null }) 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 ( ) }