From 84e2925d81da39e0d304e6c71efeb23e1b013df0 Mon Sep 17 00:00:00 2001 From: Nezumi-2711 Date: Thu, 1 May 2025 10:14:28 +0700 Subject: [PATCH] feat: implement the search filter --- package.json | 3 +- src/app/(app)/(home)/layout.tsx | 30 +++++++- src/app/(app)/(home)/page.tsx | 13 +--- .../(home)/search-filters/categories.tsx | 26 +++++++ .../search-filters/category-dropdown.tsx | 71 +++++++++++++++++++ src/app/(app)/(home)/search-filters/index.tsx | 18 +++++ .../(home)/search-filters/search-input.tsx | 22 ++++++ .../search-filters/subcategory-menu.tsx | 58 +++++++++++++++ .../search-filters/use-dropdown-position.ts | 34 +++++++++ src/collections/Categories.ts | 24 +++++++ src/payload-types.ts | 18 ++++- 11 files changed, 303 insertions(+), 14 deletions(-) create mode 100644 src/app/(app)/(home)/search-filters/categories.tsx create mode 100644 src/app/(app)/(home)/search-filters/category-dropdown.tsx create mode 100644 src/app/(app)/(home)/search-filters/index.tsx create mode 100644 src/app/(app)/(home)/search-filters/search-input.tsx create mode 100644 src/app/(app)/(home)/search-filters/subcategory-menu.tsx create mode 100644 src/app/(app)/(home)/search-filters/use-dropdown-position.ts diff --git a/package.json b/package.json index c360508..2a266d0 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "build": "next build", "start": "next start", "lint": "next lint", - "generate:types": "payload generate:types" + "generate:types": "payload generate:types", + "db:fresh": "payload migrate:fresh" }, "dependencies": { "@hookform/resolvers": "^5.0.1", diff --git a/src/app/(app)/(home)/layout.tsx b/src/app/(app)/(home)/layout.tsx index 6fa6f14..f815a20 100644 --- a/src/app/(app)/(home)/layout.tsx +++ b/src/app/(app)/(home)/layout.tsx @@ -1,17 +1,45 @@ import { ReactNode } from 'react'; +import configPromise from '@payload-config'; +import { getPayload } from 'payload'; import Navbar from './navbar'; import Footer from './footer'; +import SearchFilters from './search-filters'; +import { Category } from '@/payload-types'; interface LayoutProps { children: ReactNode; } -const Layout = ({ children }: LayoutProps) => { +const Layout = async ({ children }: LayoutProps) => { + const payload = await getPayload({ + config: configPromise, + }); + + const data = await payload.find({ + collection: 'categories', + depth: 1, + where: { + parent: { + exists: false, + }, + }, + }); + + const formattedData = data.docs.map((category) => ({ + ...category, + subcategories: (category.subcategories?.docs ?? []).map((doc) => ({ + ...(doc as Category), + subcategories: undefined, + })), + })); + return (
+ +
{children}