2021-12-24 18:17:02 +01:00
|
|
|
import get from 'lodash.get'
|
|
|
|
import Link from 'next/link'
|
2023-05-15 20:00:45 +02:00
|
|
|
import { useContext } from 'react'
|
|
|
|
import { NavigationContext } from 'shared/context/navigation-context.mjs'
|
2023-05-21 09:41:20 +02:00
|
|
|
import { useNavigation } from 'site/hooks/use-navigation.mjs'
|
|
|
|
|
|
|
|
const getRoot = {
|
2023-05-21 09:58:59 +02:00
|
|
|
dev: (root, nav) => {
|
|
|
|
if (!root) return nav
|
|
|
|
if (root.indexOf('/') === -1) return nav[root]
|
|
|
|
return get(nav, root.split('/'))
|
2023-05-21 09:41:20 +02:00
|
|
|
},
|
2023-05-21 09:58:59 +02:00
|
|
|
org: (root, nav) => {
|
2023-05-21 09:41:20 +02:00
|
|
|
// Fixme: make this work for org
|
2023-05-21 09:58:59 +02:00
|
|
|
if (!root) return nav
|
2023-07-03 13:28:41 -05:00
|
|
|
if (root.indexOf('/') === -1) return get(nav, root)
|
2023-05-21 09:58:59 +02:00
|
|
|
return get(nav, root.split('/'))
|
2023-05-21 09:41:20 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2023-07-11 21:01:34 +02:00
|
|
|
/*
|
|
|
|
* This is a recursive function, so it needs to be lean
|
|
|
|
*/
|
2023-07-13 18:18:07 +02:00
|
|
|
const RenderTree = ({ tree, recurse, depth = 1, level = 0, lead = [] }) => (
|
2023-07-11 21:01:34 +02:00
|
|
|
<ul>
|
|
|
|
{Object.keys(tree)
|
|
|
|
.filter((key) => key.length > 1)
|
|
|
|
.map((key, i) => (
|
|
|
|
<li key={i}>
|
2023-07-13 18:18:07 +02:00
|
|
|
{lead}
|
2023-07-11 21:01:34 +02:00
|
|
|
<Link href={`/${tree[key].s}`}>{tree[key].t}</Link>
|
2023-07-13 18:18:07 +02:00
|
|
|
{recurse && (!depth || level < depth) && Object.keys(tree[key]).length > 1 && (
|
|
|
|
<RenderTree
|
|
|
|
tree={tree[key]}
|
|
|
|
{...{ recurse, depth }}
|
|
|
|
level={level + 1}
|
|
|
|
lead={[
|
|
|
|
...lead,
|
|
|
|
<span className="text-sm pr-2" key={key}>
|
|
|
|
{tree[key].t}
|
|
|
|
</span>,
|
|
|
|
<span className="text-sm pr-2" key={key + 's'}>
|
|
|
|
»
|
|
|
|
</span>,
|
|
|
|
]}
|
|
|
|
/>
|
2023-07-12 17:52:24 +02:00
|
|
|
)}
|
2023-07-11 21:01:34 +02:00
|
|
|
</li>
|
|
|
|
))}
|
|
|
|
</ul>
|
|
|
|
)
|
|
|
|
|
2023-07-13 18:18:07 +02:00
|
|
|
export const ReadMore = ({
|
|
|
|
recurse = 0,
|
|
|
|
root = false,
|
|
|
|
site = 'org',
|
|
|
|
depth = 99,
|
|
|
|
ignoreControl,
|
|
|
|
}) => {
|
2023-05-22 17:05:59 +02:00
|
|
|
const { slug } = useContext(NavigationContext)
|
2023-07-03 13:28:41 -05:00
|
|
|
const siteNav = useNavigation({ ignoreControl })
|
2023-04-16 16:19:49 +02:00
|
|
|
|
|
|
|
// Deal with recurse not being a number
|
2023-05-21 09:41:20 +02:00
|
|
|
if (recurse && recurse !== true) {
|
2023-04-16 16:19:49 +02:00
|
|
|
if (typeof recurse === 'number') recurse--
|
|
|
|
else recurse = 1
|
|
|
|
}
|
|
|
|
|
2023-05-21 09:41:20 +02:00
|
|
|
// Deal with root being passed as true
|
|
|
|
if (root === true) root = ''
|
2021-12-24 18:17:02 +01:00
|
|
|
|
2023-05-22 19:53:40 +02:00
|
|
|
const tree = root === false ? getRoot[site](slug, siteNav) : getRoot[site](root, siteNav)
|
2023-05-22 17:05:59 +02:00
|
|
|
|
2023-07-13 18:18:07 +02:00
|
|
|
console.log({ tree, recurse })
|
|
|
|
|
|
|
|
return <RenderTree {...{ tree, recurse, depth }} />
|
2021-12-24 18:17:02 +01:00
|
|
|
}
|