mirror of
https://github.com/Stone-Red-Code/website.git
synced 2026-09-04 09:15:58 +02:00
58 lines
1.4 KiB
TypeScript
58 lines
1.4 KiB
TypeScript
import { graphql, useStaticQuery } from "gatsby"
|
|
import sort from "ramda/es/sort"
|
|
import React, { FC, HTMLAttributes } from "react"
|
|
import useBuildTree from "../../hooks/useBuildTree"
|
|
import { useLockBodyScroll } from "../../hooks/useLockBodyScroll"
|
|
import useSidebar from "../../hooks/useSidebar"
|
|
import { IFileOrFolder } from "../../types"
|
|
import { humanize } from "../../utils"
|
|
import { Sidebar } from "../Sidebar"
|
|
import * as SC from "./styles"
|
|
|
|
const ALL_ARCHIVES = graphql`
|
|
query {
|
|
archives: allFile(
|
|
filter: { sourceInstanceName: { eq: "what-is-archive" } }
|
|
) {
|
|
edges {
|
|
node {
|
|
relativePath
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`
|
|
|
|
function Tree({ item }: { item: IFileOrFolder }) {
|
|
const { setOpenOnMobile } = useSidebar()
|
|
const { unlock } = useLockBodyScroll()
|
|
|
|
return (
|
|
<SC.PageLink
|
|
key={item.title}
|
|
to={item.path}
|
|
activeClassName="active"
|
|
onClick={() => {
|
|
setOpenOnMobile(false)
|
|
unlock()
|
|
}}
|
|
>
|
|
{humanize(item.title)}
|
|
</SC.PageLink>
|
|
)
|
|
}
|
|
|
|
export const ArchivesSidebar: FC<HTMLAttributes<HTMLDivElement>> = (props) => {
|
|
const { archives } = useStaticQuery(ALL_ARCHIVES)
|
|
const tree = useBuildTree(archives, "/archives")
|
|
const sortedTree = sort((a, b) => a.title.localeCompare(b.title), tree)
|
|
|
|
return (
|
|
<Sidebar {...props}>
|
|
{sortedTree.map((node) => (
|
|
<Tree item={node} key={node.path} />
|
|
))}
|
|
</Sidebar>
|
|
)
|
|
}
|