feat: fetch menu items from cms

This commit is contained in:
Zotov Ivan Yuryevich
2026-04-16 22:41:30 +03:00
parent 173708addb
commit 3d985584fe
9 changed files with 82 additions and 62 deletions

View File

@@ -5,31 +5,27 @@ import { getCollection, type CollectionEntry } from 'astro:content'
import { Header } from '../sections/Header'
import { Footer } from '../sections/Footer'
import { Enum_Category_Group } from '../graphql/graphql'
import { categoriesListQuery } from '../graphql-documents/categories.gql.generated'
import { CategoryView } from '../views/CategoryView'
import type { CategoriesListQuery } from '../graphql/graphql'
import type { MenuItemsQuery } from '../graphql/graphql'
import type { SiteConfigContact } from '../lib/cms/contact/types'
import { siteConfigQuery } from '../graphql-documents/site-config.gql.generated'
import { menuItemsQuery } from '../graphql-documents/menu-items.gql.generated'
export async function getStaticPaths() {
const categories = await getCollection('categories')
const [siteResult, solutionCategoriesResult, serviceCategoriesResult] = await Promise.all([
siteConfigQuery.execute(),
categoriesListQuery.execute({ group: Enum_Category_Group.Solution }),
categoriesListQuery.execute({ group: Enum_Category_Group.Service }),
])
const [siteResult, menuItemsResult] = await Promise.all([siteConfigQuery.execute(), menuItemsQuery.execute()])
if (siteResult.errors?.length) {
throw new Error(siteResult.errors.map(e => e.message).join(', '))
}
if (solutionCategoriesResult.errors?.length) {
throw new Error(solutionCategoriesResult.errors.map(e => e.message).join(', '))
}
if (serviceCategoriesResult.errors?.length) {
throw new Error(serviceCategoriesResult.errors.map(e => e.message).join(', '))
}
const contacts = siteResult.data?.siteConfig?.contacts?.filter(c => c != null) ?? []
const solutionCategories = solutionCategoriesResult.data?.categories?.filter(c => c != null) ?? []
const serviceCategories = serviceCategoriesResult.data?.categories?.filter(c => c != null) ?? []
if (menuItemsResult.errors?.length) {
throw new Error(menuItemsResult.errors.map(e => e.message).join(', '))
}
const menuItems = (menuItemsResult.data?.categories?.filter(c => c != null) ?? []).sort(
(a, b) => a.sortOrder - b.sortOrder
)
const solutionCategories = menuItems.filter(c => c.group === Enum_Category_Group.Solution)
const serviceCategories = menuItems.filter(c => c.group === Enum_Category_Group.Service)
return categories.map((entry: CollectionEntry<'categories'>) => ({
params: { slug: entry.id },
@@ -53,8 +49,8 @@ interface Props {
products?: string[]
}[]
contacts: SiteConfigContact[]
solutionCategories: NonNullable<CategoriesListQuery['categories'][number]>[]
serviceCategories: NonNullable<CategoriesListQuery['categories'][number]>[]
solutionCategories: NonNullable<MenuItemsQuery['categories'][number]>[]
serviceCategories: NonNullable<MenuItemsQuery['categories'][number]>[]
}
const { title, description, vendors, contacts, solutionCategories, serviceCategories } = Astro.props as Props
@@ -62,12 +58,7 @@ const { title, description, vendors, contacts, solutionCategories, serviceCatego
<Layout>
<div class="min-h-screen bg-white w-full overflow-x-hidden">
<Header
client:load
contacts={contacts}
solutionCategories={solutionCategories}
serviceCategories={serviceCategories}
/>
<Header client:load contacts={contacts} solutions={solutionCategories} services={serviceCategories} />
<CategoryView client:load title={title} description={description} vendors={vendors} />
<Footer client:load contacts={contacts} solutionCategories={solutionCategories} />
</div>