import { graphql, useStaticQuery } from "gatsby" import { descend, sort, sortWith } from "ramda" import React, { FC, HTMLAttributes, memo, useState } from "react" import useBuildTree from "../../hooks/useBuildTree" import { useLockBodyScroll } from "../../hooks/useLockBodyScroll" import useSidebar from "../../hooks/useSidebar" import TriangleDown from "../../icons/triangle-down.svg" import { IAllResourcesQuery, IFileOrFolder, IFolder } from "../../types" import { getPath, humanize } from "../../utils" import { Sidebar } from "../Sidebar" import * as SC from "./styles" import useMatchingPath from "./useMatchingPath" const ALL_RESOURCES = graphql` query { allFile(filter: { sourceInstanceName: { eq: "resources" } }) { edges { node { relativePath childMarkdownRemark { frontmatter { authors title } } } } } } ` const childrenSort = sortWith([ descend(f => { if (f.title === "intro") { return 1 } if (f.type === "folder") { return 0 } return -1 }), ]) function Tree({ item, firstLevel, }: { item: IFileOrFolder index?: number firstLevel?: boolean }) { const { setOpenOnMobile } = useSidebar() const { unlock } = useLockBodyScroll() if (item.type === "file") { const path = getPath(item) return ( { setOpenOnMobile(false) unlock() }} > {humanize(item.title)} ) } if (firstLevel) { return } return } function Folder({ item }: { item: IFolder }) { const [collapsed, setCollapse] = useState(true) useMatchingPath(item.path, () => { setCollapse(false) }) function toggleCollapse() { setCollapse(prevState => !prevState) } const sortedChildren = childrenSort(item.children) return ( {humanize(item.title)} {sortedChildren.map(node => ( ))} ) } const FirstLevelFolder = memo(({ item }: { item: IFolder }) => { const { setCurrent } = useSidebar() useMatchingPath(item.path, () => { setCurrent(item.title) }) const sortedChildren = childrenSort(item.children) return ( {humanize(item.title)} {sortedChildren.map(node => ( ))} ) }) const AllLanguages: FC<{ items: IFileOrFolder[] expanded: boolean setExpanded: React.Dispatch> }> = ({ items, expanded, setExpanded }) => { const { current, setCurrent } = useSidebar() return ( setExpanded(prevState => !prevState)} > Expand languages {expanded ? : } {expanded && ( {items.map(item => ( { setCurrent(item.title) setExpanded(false) }} > {item.title} ))} )} ) } export const ResourcesSidebar: FC> = props => { const [expandedLanguages, setExpandedLanguages] = useState(false) const resources = useStaticQuery(ALL_RESOURCES) const languages = useBuildTree(resources, "/resources") const { current } = useSidebar() const sortedLanguages = sort( (a, b) => a.title.localeCompare(b.title), languages ) const currentLanguage = sortedLanguages.find(lang => lang.title === current) || sortedLanguages[0] return ( ) }