import { useEffect, useMemo, useState } from 'react'
import useProductSearch from '../hooks/useProductSearch'
import ProductCard from './ProductCard'
import Pagination from '@/core/components/elements/Pagination/Pagination'
import { toQuery } from 'lodash-contrib'
import _ from 'lodash'
import ProductSearchSkeleton from './Skeleton/ProductSearchSkeleton'
import ProductFilter from './ProductFilter'
import useActive from '@/core/hooks/useActive'
import MobileView from '@/core/components/views/MobileView'
import DesktopView from '@/core/components/views/DesktopView'
import NextImage from 'next/image'
import ProductFilterDesktop from './ProductFilterDesktop'
import { useRouter } from 'next/router'
import searchSpellApi from '@/core/api/searchSpellApi'
import Link from '@/core/components/elements/Link/Link'
import whatsappUrl from '@/core/utils/whatsappUrl'
import { HStack, Image, Tag, TagCloseButton, TagLabel } from '@chakra-ui/react'
import odooApi from '@/core/api/odooApi'
import { formatCurrency } from '@/core/utils/formatValue'
const ProductSearch = ({ query, prefixUrl, defaultBrand = null }) => {
const router = useRouter()
const { page = 1 } = query
const [q, setQ] = useState(query?.q || '*')
const [limit, setLimit] = useState(query?.limit || 30)
const [orderBy, setOrderBy] = useState(router.query?.orderBy || 'popular')
if (defaultBrand) query.brand = defaultBrand.toLowerCase()
const { productSearch } = useProductSearch({ query: { ...query, q, limit, orderBy } , operation : router?.pathname?.includes('brands') ? 'OR' : 'AND' })
const [products, setProducts] = useState(null)
const [spellings, setSpellings] = useState(null)
const [bannerPromotionHeader, setBannerPromotionHeader] = useState(null)
const [bannerPromotionFooter, setBannerPromotionFooter] = useState(null)
const popup = useActive()
const numRows = [30, 50, 80, 100]
const [brandValues, setBrand] = useState(
!router.pathname.includes('brands') ? query.brand ? query.brand.split(',') : [] : []
)
const [categoryValues, setCategory] = useState(query?.category?.split(',') || [])
const [priceFrom, setPriceFrom] = useState(query?.priceFrom || null)
const [priceTo, setPriceTo] = useState(query?.priceTo || null)
const pageCount = Math.ceil(productSearch.data?.response.numFound / limit)
const productStart = productSearch.data?.responseHeader.params.start
const productRows = limit
const productFound = productSearch.data?.response.numFound
useEffect(() => {
if (productFound == 0 && query.q && !spellings) {
searchSpellApi({ query: query.q }).then((response) => {
const oddIndexSuggestions = response.data.spellcheck.suggestions.filter(
(_, index) => index % 2 === 1
)
const oddIndexCollations = response.data.spellcheck.collations.filter(
(_, index) => index % 2 === 1
)
const dataSpellings = oddIndexSuggestions.reduce((acc, curr) => {
oddIndexCollations.forEach((collation) => {
acc.push(collation.collationQuery)
})
curr.suggestion.forEach((s) => {
if (!acc.includes(s.word)) acc.push(s.word)
})
return acc
}, [])
if (dataSpellings.length > 0) {
setQ(dataSpellings[0])
}
setSpellings(dataSpellings)
})
}
}, [productFound, query, spellings])
const brands = []
for (
let i = 0;
i < productSearch.data?.facetCounts?.facetFields?.manufactureNameS.length;
i += 2
) {
const brand = productSearch.data?.facetCounts?.facetFields?.manufactureNameS[i]
const qty = productSearch.data?.facetCounts?.facetFields?.manufactureNameS[i + 1]
if (qty > 0) {
brands.push({ brand, qty })
}
}
/*const brandsList = productSearch.data?.facetCounts?.facetFields?.manufactureName?.filter(
(value, index) => {
if (index % 2 === 0) {
const brand = value
const qty = index + 1
brands.push({ brand, qty })
}
}
)*/
const categories = []
for (let i = 0; i < productSearch.data?.facetCounts?.facetFields?.categoryName.length; i += 2) {
const name = productSearch.data?.facetCounts?.facetFields?.categoryName[i]
const qty = productSearch.data?.facetCounts?.facetFields?.categoryName[i + 1]
if (qty > 0) {
categories.push({ name, qty })
}
}
/*const categories = productSearch.data?.facetCounts?.facetFields?.categoryName?.filter(
(value, index) => {
if (index % 2 === 0) {
return true
}
}
)*/
const orderOptions = [
{ value: 'price-asc', label: 'Harga Terendah' },
{ value: 'price-desc', label: 'Harga Tertinggi' },
{ value: 'popular', label: 'Populer' },
{ value: 'stock', label: 'Ready Stock' }
]
const handleOrderBy = (e) => {
let params = {
...router.query,
orderBy: e.target.value
}
params = _.pickBy(params, _.identity)
params = toQuery(params)
router.push(`${prefixUrl}?${params}`)
}
const handleLimit = (e) => {
let params = {
...router.query,
limit: e.target.value
}
params = _.pickBy(params, _.identity)
params = toQuery(params)
router.push(`${prefixUrl}?${params}`)
}
const getBanner = async () => {
if (router.pathname.includes('search')) {
const getBannerHeader = await odooApi('GET', '/api/v1/banner?type=promotion-header')
const getBannerFooter = await odooApi('GET', '/api/v1/banner?type=promotion-footer')
var randomIndex = Math.floor(Math.random() * getBannerHeader.length)
var randomIndexFooter = Math.floor(Math.random() * getBannerFooter.length)
setBannerPromotionHeader(getBannerHeader[randomIndex])
setBannerPromotionFooter(getBannerFooter[randomIndexFooter])
}
}
useEffect(() => {
getBanner()
}, [])
useEffect(() => {
setProducts(productSearch.data?.response?.products)
}, [productSearch])
const SpellingComponent = useMemo(() => {
return (
<>
Mungkin yang anda cari{' '}
{spellings?.map((spelling, i) => (
{spelling}
{i + 1 < spellings.length ? ', ' : ''}
))}
>
)
}, [spellings])
const handleDeleteFilter = async (source, value) => {
let params = {
q: router.query.q,
orderBy: orderBy,
brand: brandValues.join(','),
category: categoryValues.join(','),
priceFrom,
priceTo
}
let brands = brandValues
let catagories = categoryValues
switch (source) {
case 'brands':
brands = brandValues.filter((item) => item !== value)
params.brand = brands.join(',')
await setBrand(brands)
break
case 'category':
catagories = categoryValues.filter((item) => item !== value)
params.category = catagories.join(',')
await setCategory(catagories)
break
case 'price':
params.priceFrom = null
params.priceTo = null
break
case 'delete':
params = {
q: router.query.q,
orderBy: orderBy
}
break
}
handleSubmitFilter(params)
}
const handleSubmitFilter = (params) => {
params = _.pickBy(params, _.identity)
params = toQuery(params)
router.push(`${prefixUrl}?${params}`)
}
return (
<>
Produk
Hasil Pencarian