diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx index f523182..2cfcffa 100644 --- a/src/components/ui/sidebar.tsx +++ b/src/components/ui/sidebar.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { Slot } from '@radix-ui/react-slot' -import { VariantProps, cva } from 'class-variance-authority' +import { type VariantProps, cva } from 'class-variance-authority' import { PanelLeftIcon } from 'lucide-react' import { useIsMobile } from './use-mobile' diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx index 0626caf..6d46856 100644 --- a/src/components/ui/sonner.tsx +++ b/src/components/ui/sonner.tsx @@ -1,7 +1,7 @@ 'use client' import { useTheme } from 'next-themes' -import { Toaster as Sonner, ToasterProps } from 'sonner' +import { Toaster as Sonner, type ToasterProps } from 'sonner' const Toaster = ({ ...props }: ToasterProps) => { const { theme = 'system' } = useTheme() diff --git a/src/graphql-documents/menu-items.gql.generated.ts b/src/graphql-documents/menu-items.gql.generated.ts new file mode 100644 index 0000000..1c40db2 --- /dev/null +++ b/src/graphql-documents/menu-items.gql.generated.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +/* Generated by scripts/endpoint-generate.mjs — do not edit by hand */ +import type { ExecutionResult } from "graphql"; + +import { execute } from "../graphql/execute"; +import type { MenuItemsQuery, MenuItemsQueryVariables } from "../graphql/graphql"; +import { menuItemsDocument } from "./menu-items.gql"; + +export const menuItemsQuery = { + async execute(variables?: MenuItemsQueryVariables): Promise> { + return execute(menuItemsDocument, variables); + }, +}; diff --git a/src/graphql-documents/menu-items.gql.ts b/src/graphql-documents/menu-items.gql.ts new file mode 100644 index 0000000..56f5b3a --- /dev/null +++ b/src/graphql-documents/menu-items.gql.ts @@ -0,0 +1,12 @@ +import gql from 'graphql-tag' + +export const menuItemsDocument = gql` + query MenuItems { + categories(pagination: { pageSize: 200 }) { + slug + title + group + sortOrder + } + } +` diff --git a/src/graphql/graphql.ts b/src/graphql/graphql.ts index a6a9040..cc63411 100644 --- a/src/graphql/graphql.ts +++ b/src/graphql/graphql.ts @@ -1573,6 +1573,11 @@ export type HomePageQuery = { __typename?: 'Query', homePage?: { __typename?: 'H | { __typename: 'Error' } | null> | null } | null }; +export type MenuItemsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type MenuItemsQuery = { __typename?: 'Query', categories: Array<{ __typename?: 'Category', slug: string, title?: string | null, group: Enum_Category_Group, sortOrder: number } | null> }; + export type SiteConfigQueryVariables = Exact<{ [key: string]: never; }>; @@ -1704,6 +1709,16 @@ export const HomePageDocument = new TypedDocumentString(` } } `) as unknown as TypedDocumentString; +export const MenuItemsDocument = new TypedDocumentString(` + query MenuItems { + categories(pagination: {pageSize: 200}) { + slug + title + group + sortOrder + } +} + `) as unknown as TypedDocumentString; export const SiteConfigDocument = new TypedDocumentString(` query SiteConfig { siteConfig { diff --git a/src/pages/[slug].astro b/src/pages/[slug].astro index 337009a..48d740e 100644 --- a/src/pages/[slug].astro +++ b/src/pages/[slug].astro @@ -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[] - serviceCategories: NonNullable[] + solutionCategories: NonNullable[] + serviceCategories: NonNullable[] } const { title, description, vendors, contacts, solutionCategories, serviceCategories } = Astro.props as Props @@ -62,12 +58,7 @@ const { title, description, vendors, contacts, solutionCategories, serviceCatego
-
+
diff --git a/src/pages/index.astro b/src/pages/index.astro index d460bdc..503df65 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -5,15 +5,14 @@ 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 { menuItemsQuery } from '../graphql-documents/menu-items.gql.generated' import { homePageQuery } from '../graphql-documents/home-page.gql.generated' import { siteConfigQuery } from '../graphql-documents/site-config.gql.generated' -const [homeResult, siteResult, solutionCategoriesResult, serviceCategoriesResult] = await Promise.all([ +const [homeResult, siteResult, menuItemsResult] = await Promise.all([ homePageQuery.execute(), siteConfigQuery.execute(), - categoriesListQuery.execute({ group: Enum_Category_Group.Solution }), - categoriesListQuery.execute({ group: Enum_Category_Group.Service }), + menuItemsQuery.execute(), ]) if (homeResult.errors?.length) { @@ -22,27 +21,22 @@ 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(', ')) +if (menuItemsResult.errors?.length) { + throw new Error(menuItemsResult.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) ?? [] +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) ---
-
+
diff --git a/src/sections/Footer.tsx b/src/sections/Footer.tsx index 7bf4f01..2548cb0 100644 --- a/src/sections/Footer.tsx +++ b/src/sections/Footer.tsx @@ -1,12 +1,14 @@ import { Send, Video } from 'lucide-react' import { SiteContactItems } from '../components/SiteContactItems' -import type { CategoriesListQuery } from '../graphql/graphql' +import type { MenuItemsQuery } from '../graphql/graphql' import type { SiteConfigContact } from '../lib/cms/contact/types' +type CategoryNavItem = NonNullable + export interface FooterProps { contacts: readonly SiteConfigContact[] - solutionCategories: ReadonlyArray> + solutionCategories: CategoryNavItem[] } export function Footer({ contacts, solutionCategories }: FooterProps) { @@ -62,7 +64,7 @@ export function Footer({ contacts, solutionCategories }: FooterProps) {

Решения