summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2025-09-25 10:22:01 +0000
committerIT Fixcomart <it@fixcomart.co.id>2025-09-25 10:22:01 +0000
commit3aaadd0d946c303101b1fb2ef7657f48863cd548 (patch)
tree74a35ece01cf4d076882372f0cfa649cf90fa825 /src/lib
parent736e69b540654e05a512c960adf5f2becd3c2498 (diff)
parentf09422d942fad5de2a81c19a7d66a4f403b69ed4 (diff)
Merged in cr_cart_renca (pull request #465)
Cr cart renca
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/product/components/ProductSearch.jsx78
1 files changed, 51 insertions, 27 deletions
diff --git a/src/lib/product/components/ProductSearch.jsx b/src/lib/product/components/ProductSearch.jsx
index 2fb3138a..850d00cc 100644
--- a/src/lib/product/components/ProductSearch.jsx
+++ b/src/lib/product/components/ProductSearch.jsx
@@ -1,12 +1,12 @@
import NextImage from 'next/image';
import { useRouter } from 'next/router';
-import { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState, useRef } from 'react';
import { HStack, Image, Tag, TagCloseButton, TagLabel } from '@chakra-ui/react';
import axios from 'axios';
import _ from 'lodash';
import { toQuery } from 'lodash-contrib';
-
+import { FunnelIcon, AdjustmentsHorizontalIcon } from '@heroicons/react/24/outline';
import odooApi from '@/core/api/odooApi';
import searchSpellApi from '@/core/api/searchSpellApi';
import Link from '@/core/components/elements/Link/Link';
@@ -50,7 +50,33 @@ const ProductSearch = ({
const categoryId = getIdFromSlug(prefixUrl);
const [data, setData] = useState([]);
const [dataLob, setDataLob] = useState([]);
+ const appliedDefaultBrandOrder = useRef(false);
+
if (defaultBrand) query.brand = defaultBrand.toLowerCase();
+ useEffect(() => {
+ if (!router.isReady) return;
+
+ const onBrandsPage = router.pathname.includes('brands');
+ const hasOrder = typeof router.query?.orderBy === 'string' && router.query.orderBy !== '';
+
+ if (onBrandsPage && !hasOrder && !appliedDefaultBrandOrder.current) {
+ let params = {
+ ...router.query,
+ orderBy: 'popular',
+ };
+ params = _.pickBy(params, _.identity);
+ const qs = toQuery(params);
+
+ // ganti URL tanpa nambah history & tanpa full reload
+ router.replace(`${prefixUrl}?${qs}`, undefined, { shallow: true });
+
+ // sinkronkan state lokal
+ setOrderBy('popular');
+
+ appliedDefaultBrandOrder.current = true;
+ }
+ }, [router.isReady, router.pathname, router.query?.orderBy, prefixUrl]);
+
const dataIdCategories = [];
useEffect(() => {
if (prefixUrl.includes('category')) {
@@ -84,7 +110,7 @@ const ProductSearch = ({
if (router.asPath.includes('penawaran')) {
query = {
...query,
- fq:`flashsale_id_i:${router.query.penawaran} AND flashsale_price_f:[1 TO *]`,
+ fq: `flashsale_id_i:${router.query.penawaran} AND flashsale_price_f:[1 TO *]`,
orderBy: 'flashsale-discount-desc',
};
setFinalQuery(query);
@@ -404,9 +430,7 @@ const ProductSearch = ({
<div className='p-4 pt-0'>
{isNotReadyStockPage && isBrand && isBrand.logo && (
<div className='mb-3'>
- <h1 className='mb-2 font-semibold text-h-sm'>
- Brand Pencarian {q}
- </h1>
+ <h1 className='mb-2 font-semibold text-h-sm'>Brand Pencarian {q}</h1>
<Link
href={createSlug('/shop/brands/', isBrand.name, isBrand.id)}
className='inline'
@@ -419,7 +443,9 @@ const ProductSearch = ({
</Link>
</div>
)}
+
<h1 className='mb-2 font-semibold text-h-sm'>Produk</h1>
+
<FilterChoicesComponent
brandValues={brandValues}
categoryValues={categoryValues}
@@ -428,6 +454,7 @@ const ProductSearch = ({
handleDeleteFilter={handleDeleteFilter}
/>
+ {/* info jumlah hasil */}
<div className='mb-2 leading-6 text-gray_r-11'>
{!spellings ? (
<>
@@ -435,8 +462,7 @@ const ProductSearch = ({
{pageCount > 1 ? (
<>
{productStart + 1}-
- {parseInt(productStart) + parseInt(productRows) >
- productFound
+ {parseInt(productStart) + parseInt(productRows) > productFound
? productFound
: parseInt(productStart) + parseInt(productRows)}
&nbsp;dari&nbsp;
@@ -448,8 +474,7 @@ const ProductSearch = ({
&nbsp;produk{' '}
{query.q && (
<>
- untuk pencarian{' '}
- <span className='font-semibold'>{query.q}</span>
+ untuk pencarian <span className='font-semibold'>{query.q}</span>
</>
)}
</>
@@ -457,37 +482,37 @@ const ProductSearch = ({
SpellingComponent
)}
</div>
- <LobSectionCategory categories={dataLob} />
- <CategorySection categories={dataCategories} />
{productFound > 0 && (
- <div className='flex items-center gap-x-2 mb-5 justify-between'>
+ <div className='flex items-center gap-x-2 mt-2 mb-3 justify-end'>
<div>
<button
- className='btn-light py-2 px-5 h-[40px]'
+ aria-label='Filter'
+ title='Filter'
onClick={popup.activate}
+ className='btn-light w-fit flex items-center justify-center rounded-md'
>
- Filter
+ <AdjustmentsHorizontalIcon className='w-5 h-5' />
</button>
</div>
- <div className=''>
+ <div>
<select
name='limit'
- className='form-input w-24'
+ className='form-input w-20'
value={router.query?.limit || ''}
onChange={(e) => handleLimit(e)}
>
{numRows.map((option, index) => (
<option key={index} value={option}>
- {' '}
- {option}{' '}
+ {option}
</option>
))}
</select>
</div>
</div>
)}
-
+ {!!dataLob?.length && <LobSectionCategory categories={dataLob} />}
+ {!!dataCategories?.length && <CategorySection categories={dataCategories} />}
<div className='grid grid-cols-2 gap-3'>
{products &&
products.map((product) => (
@@ -499,7 +524,6 @@ const ProductSearch = ({
pageCount={pageCount}
currentPage={parseInt(page)}
url={`${prefixUrl}?${toQuery(_.omit(query, ['page', 'fq']))}`}
- // url={prefixUrl.includes('category') || prefixUrl.includes('lob')? `${prefixUrl}?${toQuery(_.omit(finalQuery, ['page']))}` : `${prefixUrl}?${toQuery(_.omit(query, ['page']))}`}
className='mt-6 mb-2'
/>
@@ -597,7 +621,7 @@ const ProductSearch = ({
<>
{productStart + 1}-
{parseInt(productStart) + parseInt(productRows) >
- productFound
+ productFound
? productFound
: parseInt(productStart) + parseInt(productRows)}
&nbsp;dari&nbsp;
@@ -673,8 +697,8 @@ const ProductSearch = ({
href={
query?.q
? whatsappUrl('productSearch', {
- name: query.q,
- })
+ name: query.q,
+ })
: whatsappUrl()
}
className='text-danger-500'
@@ -759,9 +783,9 @@ const FilterChoicesComponent = ({
</Tag>
)}
{brandValues?.length > 0 ||
- categoryValues?.length > 0 ||
- priceFrom ||
- priceTo ? (
+ categoryValues?.length > 0 ||
+ priceFrom ||
+ priceTo ? (
<span>
<button
className='btn-transparent py-2 px-5 h-[40px] text-red-700'