From 2aa629baa17abd96bdd9f4f43583b32fdeb9629d Mon Sep 17 00:00:00 2001 From: Zotov Ivan Yuryevich Date: Tue, 14 Apr 2026 23:41:30 +0300 Subject: [PATCH] feat: fetch categories in menu --- src/pages/[slug].astro | 32 +++++- src/pages/index.astro | 23 +++- src/sections/Footer.tsx | 31 ++--- src/sections/Header.tsx | 243 +++++++++++++++++++--------------------- 4 files changed, 176 insertions(+), 153 deletions(-) diff --git a/src/pages/[slug].astro b/src/pages/[slug].astro index cc29682..337009a 100644 --- a/src/pages/[slug].astro +++ b/src/pages/[slug].astro @@ -4,17 +4,32 @@ import '../styles/globals.css' 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 { SiteConfigContact } from '../lib/cms/contact/types' import { siteConfigQuery } from '../graphql-documents/site-config.gql.generated' export async function getStaticPaths() { const categories = await getCollection('categories') - const siteResult = await siteConfigQuery.execute() + const [siteResult, solutionCategoriesResult, serviceCategoriesResult] = await Promise.all([ + siteConfigQuery.execute(), + categoriesListQuery.execute({ group: Enum_Category_Group.Solution }), + categoriesListQuery.execute({ group: Enum_Category_Group.Service }), + ]) 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) ?? [] return categories.map((entry: CollectionEntry<'categories'>) => ({ params: { slug: entry.id }, @@ -23,6 +38,8 @@ export async function getStaticPaths() { description: entry.data.description, vendors: entry.data.vendors, contacts, + solutionCategories, + serviceCategories, }, })) } @@ -36,15 +53,22 @@ interface Props { products?: string[] }[] contacts: SiteConfigContact[] + solutionCategories: NonNullable[] + serviceCategories: NonNullable[] } -const { title, description, vendors, contacts } = Astro.props as Props +const { title, description, vendors, contacts, solutionCategories, serviceCategories } = Astro.props as Props ---
-
+
-
+
diff --git a/src/pages/index.astro b/src/pages/index.astro index 429396c..d460bdc 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -4,12 +4,16 @@ import '../styles/globals.css' import { Header } from '../sections/Header' import { Footer } from '../sections/Footer' import { HomePage } from '../views/HomePage' +import { Enum_Category_Group } from '../graphql/graphql' +import { categoriesListQuery } from '../graphql-documents/categories.gql.generated' import { homePageQuery } from '../graphql-documents/home-page.gql.generated' import { siteConfigQuery } from '../graphql-documents/site-config.gql.generated' -const [homeResult, siteResult] = await Promise.all([ +const [homeResult, siteResult, solutionCategoriesResult, serviceCategoriesResult] = await Promise.all([ homePageQuery.execute(), siteConfigQuery.execute(), + categoriesListQuery.execute({ group: Enum_Category_Group.Solution }), + categoriesListQuery.execute({ group: Enum_Category_Group.Service }), ]) if (homeResult.errors?.length) { @@ -18,15 +22,28 @@ if (homeResult.errors?.length) { 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 homePage = homeResult.data?.homePage ?? null 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) ?? [] ---
-
+
-
+
diff --git a/src/sections/Footer.tsx b/src/sections/Footer.tsx index f1f0192..7bf4f01 100644 --- a/src/sections/Footer.tsx +++ b/src/sections/Footer.tsx @@ -1,13 +1,15 @@ import { Send, Video } from 'lucide-react' import { SiteContactItems } from '../components/SiteContactItems' +import type { CategoriesListQuery } from '../graphql/graphql' import type { SiteConfigContact } from '../lib/cms/contact/types' export interface FooterProps { contacts: readonly SiteConfigContact[] + solutionCategories: ReadonlyArray> } -export function Footer({ contacts }: FooterProps) { +export function Footer({ contacts, solutionCategories }: FooterProps) { return (