From fdf788bd65061e7003cbdef1f934a72f4382f346 Mon Sep 17 00:00:00 2001 From: Miqdad Date: Wed, 8 Oct 2025 11:56:00 +0700 Subject: Fix breadcrumb --- src/lib/category/components/Breadcrumb.jsx | 221 +++++++++++++++++++++-------- 1 file changed, 161 insertions(+), 60 deletions(-) diff --git a/src/lib/category/components/Breadcrumb.jsx b/src/lib/category/components/Breadcrumb.jsx index e691e379..50557c3e 100644 --- a/src/lib/category/components/Breadcrumb.jsx +++ b/src/lib/category/components/Breadcrumb.jsx @@ -9,6 +9,7 @@ import { import Link from 'next/link'; import React from 'react'; import { useQuery } from 'react-query'; +import useDevice from '@/core/hooks/useDevice'; const Breadcrumb = ({ categoryId }) => { const breadcrumbs = useQuery( @@ -16,72 +17,172 @@ const Breadcrumb = ({ categoryId }) => { async () => await odooApi('GET', `/api/v1/category/${categoryId}/category-breadcrumb`) ); + const { isDesktop, isMobile } = useDevice(); const items = breadcrumbs.data ?? []; const lastIdx = items.length - 1; - return ( -
- - - {/* Home */} - - - Home - - + if (isDesktop) { + return ( +
+ + + {/* Home */} + + + Home + + - {/* Categories */} - {items.map((category, index) => { - const isLast = index === lastIdx; - return ( - - {isLast ? ( - // HANYA yang terakhir boleh turun/wrap di mobile - - {category.name} - - ) : ( - - {category.name} - - )} + {/* Categories */} + {items.map((category, index) => { + const isLast = index === lastIdx; + return ( + + {isLast ? ( + + {category.name} + + ) : ( + + {category.name} + + )} + + ); + })} + + +
+ ); + } + + if (isMobile) { + const items = breadcrumbs.data ?? []; + const n = items.length; + const lastCat = n >= 1 ? items[n - 1] : null; // terakhir (current) + const secondLast = n >= 2 ? items[n - 2] : null; // sebelum current + const beforeSecond = n >= 3 ? items[n - 3] : null; // sebelum secondLast + const hiddenText = + n >= 3 + ? items + .slice(0, n - 2) + .map((c) => c.name) + .join(' / ') + : ''; + + return ( +
+ + /} // lebih rapat + spacing='4px' + sx={{ + '& ol': { + display: 'flex', + alignItems: 'center', + overflow: 'hidden', // untuk ellipsis + whiteSpace: 'nowrap', // untuk ellipsis + gap: '0', // no extra gap + }, + '& li': { display: 'inline-flex', alignItems: 'center' }, + '& li:not(:last-of-type)': { + flex: '0 0 auto', + whiteSpace: 'nowrap', + }, + '& li:last-of-type': { + flex: '0 1 auto', // jangan ambil full space biar gak keliatan “space kosong” + minWidth: 0, + }, + }} + className='text-caption-2 p-0' + > + {/* Home */} + + + Home + + + + {/* Jika ada kategori sebelum secondLast, tampilkan '..' (link ke beforeSecond) */} + {beforeSecond && ( + + + .. + - ); - })} - - -
- ); + )} + + {/* secondLast sebagai link (kalau ada) */} + {secondLast && ( + + + {secondLast.name} + + + )} + + {/* lastCat (current) dengan truncate & lebar dibatasi */} + {lastCat && ( + + + {lastCat.name} + + + )} +
+
+
+ ); + } }; export default Breadcrumb; -- cgit v1.2.3