import { graphql, useStaticQuery } from "gatsby" import React, { FC, HTMLAttributes, memo } from "react" import "react-perfect-scrollbar/dist/css/styles.css" import { IAllResourcesQuery, IFileOrFolder, IFolder } from "../../types" import { getPath, humanize } from "../../utils" import * as SC from "./styles" import useBuildTree from "./useBuildTree" const ALL_RESOURCES = graphql` query { allFile(filter: { sourceInstanceName: { eq: "resources" } }) { edges { node { relativePath relativeDirectory childMarkdownRemark { frontmatter { authors title date } } } } } } ` function plantTree(item: IFileOrFolder, index?: number) { if (item.type === "file") { // remove the first elements, treat as hardcoded const [, , , ...cleanedUpPath] = item.path.split("/") const path = getPath(item) return ( {cleanedUpPath.map(node => ( // TODO: use helper to format path {humanize(node)} ))} ) } return } const Language = memo(({ item }: { item: IFolder; index: number }) => { return ( {humanize(item.title)} {item.children.map(node => plantTree(node))} ) }) interface IResourcesList extends HTMLAttributes { relativeDirectory?: string } export const ResourcesList: FC = props => { const resources = useStaticQuery(ALL_RESOURCES) const filteredResources = { ...resources, allFile: { ...resources.allFile, edges: resources.allFile.edges.filter(({ node }) => { if (!props.relativeDirectory) { return true } const [language] = node.relativeDirectory.split("/") return props.relativeDirectory === language }), }, } const tree = useBuildTree(filteredResources) const sortedTree = tree.sort((a, b) => a.title.localeCompare(b.title)) return ( {sortedTree.map((node, index) => plantTree(node, index))} ) }