From 25e136ba72b07d7d2fd91fd712ba27bee54f9071 Mon Sep 17 00:00:00 2001 From: Ardeman Date: Sun, 2 Mar 2025 12:06:30 +0800 Subject: [PATCH] feat: implement category fetching and integrate into header menus --- app/apis/common/get-categories.ts | 25 ++++++++++++++++++++ app/layouts/news/header-menu-mobile.tsx | 16 ++++++++----- app/layouts/news/header-menu.tsx | 17 ++++++++------ app/layouts/news/menu.ts | 31 ------------------------- app/routes/_layout.tsx | 3 +++ 5 files changed, 48 insertions(+), 44 deletions(-) create mode 100644 app/apis/common/get-categories.ts diff --git a/app/apis/common/get-categories.ts b/app/apis/common/get-categories.ts new file mode 100644 index 0000000..e1cab30 --- /dev/null +++ b/app/apis/common/get-categories.ts @@ -0,0 +1,25 @@ +import { z } from 'zod' + +import { HttpServer, type THttpServer } from '~/libs/http-server' + +const categorySchema = z.object({ + data: z.array( + z.object({ + id: z.string(), + code: z.string(), + name: z.string(), + }), + ), +}) + +export type TCategorySchema = z.infer + +export const getCategories = async (parameters?: THttpServer) => { + try { + const { data } = await HttpServer(parameters).get(`/api/category`) + return categorySchema.parse(data) + } catch (error) { + // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject + return Promise.reject(error) + } +} diff --git a/app/layouts/news/header-menu-mobile.tsx b/app/layouts/news/header-menu-mobile.tsx index 1b9607e..5260584 100644 --- a/app/layouts/news/header-menu-mobile.tsx +++ b/app/layouts/news/header-menu-mobile.tsx @@ -1,14 +1,18 @@ import { useState } from 'react' import { Link } from 'react-router' +import type { TCategorySchema } from '~/apis/common/get-categories' import { CloseIcon } from '~/components/icons/close' import { MenuIcon } from '~/components/icons/menu' import { useNewsContext } from '~/contexts/news' import { HeaderSearch } from '~/layouts/news/header-search' -import { MENU } from './menu' +type THeaderMenuMobile = { + menu?: TCategorySchema['data'] +} -export default function HeaderMenuMobile() { +export default function HeaderMenuMobile(properties: THeaderMenuMobile) { + const { menu } = properties const [isMenuOpen, setIsMenuOpen] = useState(false) const { setIsLoginOpen } = useNewsContext() @@ -38,19 +42,19 @@ export default function HeaderMenuMobile() { {/* List Menu */}