Kairo-Jinkendo/frontend/src/pages/modes/WorkLayout.jsx

96 lines
2.7 KiB
React
Raw Normal View History

import { Navigate, Outlet } from 'react-router-dom'
import { useEffect, useState } from 'react'
import { ModeAreaShell } from '../../components/ModeAreaShell.jsx'
import { ModeAreaNav } from '../../components/ModeAreaNav.jsx'
import { ModeShell } from '../../components/ModeShell.jsx'
import { WORK_NAV_ITEMS, resolveWorkNavActiveKey } from '../../config/workNav.js'
import { resolveWorkNavItems } from '../../config/methodUiDefaults.js'
import { useProgramScope } from '../../context/ProgramScopeContext.jsx'
import { getInitiative } from '../../api/initiatives.js'
import { getActiveWorkCycle } from '../../api/workCycles.js'
import { resolveMethodUiDefaults } from '../../config/methodUiDefaults.js'
function WorkAreaNav() {
const { initiativeId } = useProgramScope()
const [navItems, setNavItems] = useState(WORK_NAV_ITEMS)
useEffect(() => {
if (!initiativeId) {
setNavItems(WORK_NAV_ITEMS)
return undefined
}
let cancelled = false
Promise.all([
getInitiative(initiativeId),
getActiveWorkCycle(initiativeId).catch(() => null),
])
.then(([initiative, activeCycle]) => {
if (cancelled) return
setNavItems(
resolveWorkNavItems({
archetypeKey: initiative?.archetype_key,
hasActiveSprint: Boolean(activeCycle?.id),
}),
)
})
.catch(() => {
if (!cancelled) setNavItems(WORK_NAV_ITEMS)
})
return () => {
cancelled = true
}
}, [initiativeId])
return (
<ModeAreaNav
modeLabel="Ausführen"
items={navItems}
resolveActiveKey={resolveWorkNavActiveKey}
/>
)
}
export function WorkLayout() {
return (
<div className="app-page">
<ModeShell modeKey="work" />
<ModeAreaShell nav={<WorkAreaNav />}>
<Outlet />
</ModeAreaShell>
</div>
)
}
export function WorkIndexRedirect() {
const { initiativeId, hrefWithScope } = useProgramScope()
const [target, setTarget] = useState('/work/today')
useEffect(() => {
if (!initiativeId) {
setTarget('/work/today')
return undefined
}
let cancelled = false
Promise.all([
getInitiative(initiativeId),
getActiveWorkCycle(initiativeId).catch(() => null),
])
.then(([initiative, activeCycle]) => {
if (cancelled) return
const defaults = resolveMethodUiDefaults({
archetypeKey: initiative?.archetype_key,
hasActiveSprint: Boolean(activeCycle?.id),
})
setTarget(hrefWithScope(defaults.workDefaultRoute))
})
.catch(() => {
if (!cancelled) setTarget(hrefWithScope('/work/today'))
})
return () => {
cancelled = true
}
}, [initiativeId, hrefWithScope])
return <Navigate to={target} replace />
}