1
0
Fork 0
freesewing/sites/shared/components/mdx/read-more.mjs

76 lines
2.2 KiB
JavaScript
Raw Normal View History

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'
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'])
const currentChildren = (current) =>
Object.values(order(current)).filter((entry) => typeof entry === 'object')
2021-12-24 18:17:02 +01:00
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:58:59 +02:00
org: (root, nav) => {
// Fixme: make this work for org
2023-05-21 09:58:59 +02:00
if (!root) return nav
2023-05-22 17:05:59 +02:00
if (root.indexOf('/') === -1) return get(nav, ['docs', root])
2023-05-21 09:58:59 +02:00
return get(nav, root.split('/'))
},
}
export const ReadMore = ({
recurse = 0,
root = false,
site = 'org',
level = 0,
pretty = false,
}) => {
2023-05-22 17:05:59 +02:00
const { slug } = useContext(NavigationContext)
const { siteNav } = useNavigation()
2023-04-16 16:19:49 +02:00
// Deal with recurse not being a number
if (recurse && recurse !== true) {
2023-04-16 16:19:49 +02:00
if (typeof recurse === 'number') recurse--
else recurse = 1
}
// Deal with root being passed as true
if (root === true) root = ''
2021-12-24 18:17:02 +01:00
const tree = root === false ? getRoot[site](slug, siteNav) : getRoot[site](root, siteNav)
2023-05-22 17:05:59 +02:00
2021-12-24 18:17:02 +01:00
const list = []
for (const page of currentChildren(tree)) {
2023-05-22 20:08:57 +02:00
if (page.t !== 'spacer')
list.push(
<li key={page.s} className="break-all">
<Link href={`/${page.s}`}>
<span className={pretty ? getClasses(level) : ''}>{page.t}</span>
</Link>
{recurse ? (
<ReadMore root={page.s} level={level + 1} {...{ recurse, site, pretty }} />
) : null}
</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>
}