diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2025-08-26 10:33:43 +0000 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2025-08-26 10:33:43 +0000 |
| commit | 0862e3a45411e5033b768ca43a56c8f27dee3b9b (patch) | |
| tree | 11d0d0a4b808bf938dfcc7e8c2d8fef21d052a9f /src-migrate/modules/product-detail/components/Breadcrumb.tsx | |
| parent | ae2827dbaf8b02480d997b7fd323159a57143af5 (diff) | |
| parent | 37bda78dec58cb8c218849a77620d95682b201b9 (diff) | |
Merged in cr/prod-detail (pull request #449)
Cr/prod detail
Diffstat (limited to 'src-migrate/modules/product-detail/components/Breadcrumb.tsx')
| -rw-r--r-- | src-migrate/modules/product-detail/components/Breadcrumb.tsx | 136 |
1 files changed, 117 insertions, 19 deletions
diff --git a/src-migrate/modules/product-detail/components/Breadcrumb.tsx b/src-migrate/modules/product-detail/components/Breadcrumb.tsx index f41859a9..0e263fe9 100644 --- a/src-migrate/modules/product-detail/components/Breadcrumb.tsx +++ b/src-migrate/modules/product-detail/components/Breadcrumb.tsx @@ -1,31 +1,129 @@ -import React, { Fragment } from 'react' -import { useQuery } from 'react-query' -import { getProductCategoryBreadcrumb } from '~/services/product' -import Link from 'next/link' -import { createSlug } from '~/libs/slug' +import React, { Fragment } from 'react'; +import { useQuery } from 'react-query'; +import Link from 'next/link'; +import { getProductCategoryBreadcrumb } from '~/services/product'; +import { createSlug } from '~/libs/slug'; +import useDevice from '@/core/hooks/useDevice'; -type Props = { - id: number, - name: string -} +type Props = { id: number; name: string }; const Breadcrumb = ({ id, name }: Props) => { - const query = useQuery({ - queryKey: ['product-category-breadcrumb'], + const { isDesktop, isMobile } = useDevice(); + + const { data: breadcrumbs = [] } = useQuery({ + queryKey: ['product-category-breadcrumb', id], queryFn: () => getProductCategoryBreadcrumb(id), - refetchOnWindowFocus: false - }) + refetchOnWindowFocus: false, + }); + + const total = breadcrumbs.length; + const lastCat = total ? breadcrumbs[total - 1] : null; + const hasHidden = total > 1; + const hiddenText = hasHidden + ? breadcrumbs + .slice(0, total - 1) + .map((c) => c.name) + .join(' / ') + : ''; + + if (isMobile) { + const crumbsMobile: React.ReactNode[] = []; + + crumbsMobile.push( + <Link href='/' className='text-danger-500 shrink-0' key='home'> + Home + </Link> + ); + + if (hasHidden) { + crumbsMobile.push( + <span + className='text-danger-500 shrink-0' + title={hiddenText} + aria-label='Kategori tersembunyi' + key='hidden' + > + .. + </span> + ); + } + + // Kategori terakhir + if (lastCat) { + crumbsMobile.push( + <Link + key={`cat-${lastCat.id}`} + href={createSlug('/shop/category/', lastCat.name, String(lastCat.id))} + className='text-danger-500 shrink-0' + > + {lastCat.name} + </Link> + ); + } + + // Nama produk (dipotong kalau gk muat) + crumbsMobile.push( + <span className='truncate min-w-0 flex-1' title={name} key='product'> + {name} + </span> + ); + + return ( + <div className='flex items-center whitespace-nowrap overflow-hidden text-caption-1 leading-7'> + {crumbsMobile.map((node, i) => ( + <Fragment key={i}> + {node} + {i < crumbsMobile.length - 1 && ( + <span className='mx-2 shrink-0'>/</span> + )} + </Fragment> + ))} + </div> + ); + } - const breadcrumbs = query.data || [] + // ===== DESKTOP ===== + if (isDesktop) { + return ( + <div className='line-clamp-2 md:line-clamp-1 leading-7 text-caption-1'> + <Link href='/' className='text-danger-500'> + Home + </Link> + <span className='mx-2'>/</span> + {breadcrumbs.map((category, index) => ( + <Fragment key={index}> + <Link + href={createSlug( + '/shop/category/', + category.name, + category.id.toString() + )} + className='text-danger-500' + > + {category.name} + </Link> + <span className='mx-2'>/</span> + </Fragment> + ))} + <span>{name}</span> + </div> + ); + } return ( <div className='line-clamp-2 md:line-clamp-1 leading-7 text-caption-1'> - <Link href='/' className='text-danger-500'>Home</Link> + <Link href='/' className='text-danger-500'> + Home + </Link> <span className='mx-2'>/</span> {breadcrumbs.map((category, index) => ( <Fragment key={index}> <Link - href={createSlug('/shop/category/', category.name, category.id.toString())} + href={createSlug( + '/shop/category/', + category.name, + category.id.toString() + )} className='text-danger-500' > {category.name} @@ -35,7 +133,7 @@ const Breadcrumb = ({ id, name }: Props) => { ))} <span>{name}</span> </div> - ) -} + ); +}; -export default Breadcrumb
\ No newline at end of file +export default Breadcrumb; |
