From 66eb06d5b8a76861a83443e4ef55a1429eb44794 Mon Sep 17 00:00:00 2001 From: Jamal Soueidan Date: Sun, 14 Jul 2024 23:55:24 +0200 Subject: [PATCH] Add collection count display to category titles in index and categories routes - Import `parseGid` and `useFilterCounts` hooks to fetch and display the count of subcollections in category titles. - Query `GET_COLLECTION_FILTERS` to obtain filter counts for root collections. - Display the count next to the category titles in `FeaturedCollections` components on both index and categories pages. --- app/routes/_index.tsx | 34 ++++++++++++++--- app/routes/categories.tsx | 37 +++++++++++++++--- app/routes/categories_.$handle.tsx | 60 +++++++++++++++--------------- 3 files changed, 92 insertions(+), 39 deletions(-) diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index 5195b65..3901803 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -24,11 +24,15 @@ import {H2} from '~/components/titles/H2'; import {ProfessionButton} from '~/components/ProfessionButton'; -import {getPaginationVariables} from '@shopify/hydrogen'; +import {getPaginationVariables, parseGid} from '@shopify/hydrogen'; import {useTranslation} from 'react-i18next'; import {Headless} from '~/components/blocks/Headless'; +import {useFilterCounts} from '~/hooks/useFilterCounts'; import {getTags} from '~/lib/tags'; -import {GET_CATEGORY_QUERY} from './categories_.$handle'; +import { + GET_CATEGORY_QUERY, + GET_COLLECTION_FILTERS, +} from './categories_.$handle'; import {PAGE_QUERY} from './pages.$handle'; import {UserCard, USERS_QUERY} from './users._index'; @@ -66,6 +70,18 @@ export async function loader({context, request}: LoaderFunctionArgs) { }, ); + // we are getting rootCollectionFilters to figure out the total count of the subcollections + const {collection: rootCollectionFilters} = await context.storefront.query( + GET_COLLECTION_FILTERS, + { + variables: { + handle: 'alle-behandlinger', + language: 'DA', + }, + cache: context.storefront.CacheLong(), + }, + ); + const paginationVariables = getPaginationVariables(request, { pageBy: 4, }); @@ -92,6 +108,7 @@ export async function loader({context, request}: LoaderFunctionArgs) { page, tags, rootCollection, + rootCollectionFilters: rootCollectionFilters?.products.filters, }); } @@ -163,7 +180,12 @@ function Header() { function FeaturedCollections() { const theme = useMantineTheme(); const {t} = useTranslation(['index']); - const {rootCollection} = useLoaderData(); + const {rootCollection, rootCollectionFilters} = + useLoaderData(); + const collectionCount = useFilterCounts( + rootCollectionFilters as any, + 'collectionid', + ); return ( - {col.title} + {col.title} ({collectionCount[parseGid(col.id).id] || 0} + ) @@ -203,7 +226,8 @@ function FeaturedCollections() { to={`/categories/${col.handle}?collection=${nesCol.handle}`} > - {nesCol.title} + {nesCol.title} ( + {collectionCount[parseGid(nesCol.id).id] || 0}) ))} diff --git a/app/routes/categories.tsx b/app/routes/categories.tsx index d699812..6eea81b 100644 --- a/app/routes/categories.tsx +++ b/app/routes/categories.tsx @@ -11,12 +11,17 @@ import { UnstyledButton, } from '@mantine/core'; import {Link, useLoaderData} from '@remix-run/react'; +import {parseGid} from '@shopify/hydrogen'; import {json, type LoaderFunctionArgs} from '@shopify/remix-oxygen'; import {IconArrowRight} from '@tabler/icons-react'; import {useTranslation} from 'react-i18next'; import {Headless} from '~/components/blocks/Headless'; import {VisualTeaser} from '~/components/blocks/VisualTeaser'; -import {GET_CATEGORY_QUERY} from './categories_.$handle'; +import {useFilterCounts} from '~/hooks/useFilterCounts'; +import { + GET_CATEGORY_QUERY, + GET_COLLECTION_FILTERS, +} from './categories_.$handle'; import {PAGE_QUERY} from './pages.$handle'; export const handle: Handle = { @@ -41,7 +46,23 @@ export async function loader({context, params, request}: LoaderFunctionArgs) { cache: context.storefront.CacheLong(), }); - return json({page, rootCollection}); + // we are getting rootCollectionFilters to figure out the total count of the subcollections + const {collection: rootCollectionFilters} = await context.storefront.query( + GET_COLLECTION_FILTERS, + { + variables: { + handle: 'alle-behandlinger', + language: 'DA', + }, + cache: context.storefront.CacheLong(), + }, + ); + + return json({ + page, + rootCollection, + rootCollectionFilters: rootCollectionFilters?.products.filters || [], + }); } export default function Collections() { @@ -58,7 +79,12 @@ export default function Collections() { function FeaturedCollections() { const {t} = useTranslation(['index']); - const {rootCollection} = useLoaderData(); + const {rootCollection, rootCollectionFilters} = + useLoaderData(); + const collectionCount = useFilterCounts( + rootCollectionFilters as any, + 'collectionid', + ); return ( @@ -73,7 +99,7 @@ function FeaturedCollections() { > - {col.title} + {col.title} ({collectionCount[parseGid(col.id).id] || 0}) @@ -89,7 +115,8 @@ function FeaturedCollections() { to={`/categories/${col.handle}?collection=${nesCol.handle}`} > - {nesCol.title} + {nesCol.title} ( + {collectionCount[parseGid(nesCol.id).id] || 0}) ))} diff --git a/app/routes/categories_.$handle.tsx b/app/routes/categories_.$handle.tsx index 0ddcf5d..d44eb7d 100644 --- a/app/routes/categories_.$handle.tsx +++ b/app/routes/categories_.$handle.tsx @@ -220,37 +220,39 @@ function Header() { align="center" gap="md" > - {!!rootCollection.children?.references?.nodes.length && ( - - setSearchParams({collection}, {preventScrollReset: true}) - } - > - - - {rootCollection.children?.references?.nodes.map((col) => ( + + {!!rootCollection.children?.references?.nodes.length && ( + + setSearchParams({collection}, {preventScrollReset: true}) + } + > + - ))} - - - )} - + {rootCollection.children?.references?.nodes.map((col) => ( + + ))} + + + )} + +