import { GridItem, Heading, Input, List, ListItem, SimpleGrid, Text, VStack, } from '@chakra-ui/react' import { ComponentOverviewItem } from 'components/component-overview-item' import MDXLayout from 'layouts/mdx' import type { GetStaticProps } from 'next' import { useState } from 'react' import type { FrontmatterHeading } from 'src/types/frontmatter' import { getGroupedComponents } from 'utils/contentlayer-utils' type Component = { title: string url: string id: string } type Category = { id: string title: string components: Component[] } type Props = { categories: Category[] headings: FrontmatterHeading[] } export const ComponentsOverview = ({ categories, headings }: Props) => { const { filteredCategories, filterComponentsByTitle } = useComponentFilter(categories) return ( Chakra UI provides prebuilt components to help you build your projects faster. Here is an overview of the component categories: filterComponentsByTitle(e.target.value)} /> {filteredCategories.map(({ title, components, id }) => ( {title} {components.map(({ title: componentTitle, url, id }) => ( ))} ))} ) } export const getStaticProps: GetStaticProps = async () => { const group = getGroupedComponents() const categories = Object.entries(group).reduce((acc, item) => { const [title, items] = item if (title === 'Layout') return acc const category: Category = { id: title.toLowerCase().replace(/ /g, '-'), title, components: items.map(({ title, slug, id }) => ({ id, title, url: slug, })), } return acc.concat(category) }, [] as Category[]) const headings = Object.entries(group).reduce((acc, item) => { const [title] = item if (title === 'Layout') return acc const heading: FrontmatterHeading = { id: title.toLowerCase().replace(/ /g, '-'), text: title, level: 2, } return acc.concat(heading) }, [] as FrontmatterHeading[]) return { props: { categories, headings, }, } } const useComponentFilter = (categories: Category[]) => { const [filteredCategories, setFilteredCategories] = useState(categories) const filterComponentsByTitle = (searchText: string) => { const filtered: Category[] = [] categories.forEach((category) => { const matchingComponents = category.components.filter((component) => component.title.toLowerCase().includes(searchText.toLowerCase()), ) if (matchingComponents.length > 0) { const filteredCategory = { ...category, components: matchingComponents } filtered.push(filteredCategory) } }) setFilteredCategories(filtered) } return { filteredCategories, filterComponentsByTitle, } } export default ComponentsOverview