2021-12-24 18:17:02 +01:00
|
|
|
import get from 'lodash.get'
|
|
|
|
import orderBy from 'lodash.orderby'
|
|
|
|
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 baseClasses =
|
|
|
|
'text-base-content no-underline inline-block hover:text-secondary hover:underline'
|
|
|
|
const classes = [
|
|
|
|
`text-3xl font-bold py-2 ${baseClasses} list-disc`,
|
|
|
|
`text-2xl font-bold py-1 ${baseClasses}`,
|
|
|
|
`text-xl font-medium ${baseClasses}`,
|
|
|
|
`text-lg font-medium ${baseClasses}`,
|
|
|
|
]
|
|
|
|
|
|
|
|
const getClasses = (level) => classes[level] || `text-normal font-regular ${baseClasses}`
|
2021-12-24 18:17:02 +01:00
|
|
|
|
|
|
|
// Helper method to filter out the real children
|
2023-04-16 16:19:49 +02:00
|
|
|
const order = (obj) => orderBy(obj, ['o', 't'], ['asc', 'asc'])
|
2022-12-04 15:04:56 +01:00
|
|
|
const currentChildren = (current) =>
|
|
|
|
Object.values(order(current)).filter((entry) => typeof entry === 'object')
|
2021-12-24 18:17:02 +01:00
|
|
|
|
2023-05-21 09:41:20 +02:00
|
|
|
const getRoot = {
|
|
|
|
dev: (slug, nav) => {
|
|
|
|
if (!slug || slug === 'docs') return nav
|
|
|
|
if (slug.indexOf('/') === -1) return nav[slug]
|
|
|
|
return get(nav, slug.split('/'))
|
|
|
|
},
|
|
|
|
org: (slug, nav) => {
|
|
|
|
// Fixme: make this work for org
|
|
|
|
if (!slug || slug === 'docs') return nav
|
|
|
|
if (slug.indexOf('/') === -1) return nav[slug]
|
|
|
|
return get(nav, slug.split('/'))
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
export const ReadMore = ({
|
|
|
|
app,
|
|
|
|
recurse = 0,
|
|
|
|
root = false,
|
|
|
|
site = 'org',
|
|
|
|
level = 0,
|
|
|
|
pretty = false,
|
|
|
|
}) => {
|
2023-05-15 20:00:45 +02:00
|
|
|
const { nav, slug } = useContext(NavigationContext)
|
2023-05-21 09:41:20 +02:00
|
|
|
const { siteNav } = useNavigation()
|
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-21 09:41:20 +02:00
|
|
|
const tree = getRoot[site](root, siteNav)
|
2021-12-24 18:17:02 +01:00
|
|
|
const list = []
|
2023-05-21 09:41:20 +02:00
|
|
|
for (const page of currentChildren(tree)) {
|
2022-12-04 15:04:56 +01:00
|
|
|
list.push(
|
2023-04-16 16:19:49 +02:00
|
|
|
<li key={page.s}>
|
2023-05-21 09:41:20 +02:00
|
|
|
<Link href={`/${page.s}`}>
|
|
|
|
<span className={getClasses(level)}>{page.t}</span>
|
|
|
|
</Link>
|
|
|
|
{recurse ? <ReadMore root={page.s} recurse={recurse} level={level + 1} /> : null}
|
2022-12-04 15:04:56 +01:00
|
|
|
</li>
|
|
|
|
)
|
2021-12-24 18:17:02 +01:00
|
|
|
}
|
2023-05-15 20:00:45 +02:00
|
|
|
|
2021-12-24 18:17:02 +01:00
|
|
|
return <ul>{list}</ul>
|
|
|
|
}
|