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