diff options
| author | Rafi Zadanly <zadanlyr@gmail.com> | 2023-04-18 17:05:25 +0700 |
|---|---|---|
| committer | Rafi Zadanly <zadanlyr@gmail.com> | 2023-04-18 17:05:25 +0700 |
| commit | 42fed2490fe537b46a717eafaf1b1e4a5e0a08c8 (patch) | |
| tree | f586d4b09632b6fb50d1e3c038d8f36acb668600 | |
| parent | 5ec1ebdc1b5a44a9bb615eba08faf60113c0697f (diff) | |
price tier
| -rw-r--r-- | src/pages/_document.jsx | 18 | ||||
| -rw-r--r-- | src/pages/api/shop/search.js | 24 | ||||
| -rw-r--r-- | src/pages/shop/product/[slug].jsx | 53 |
3 files changed, 71 insertions, 24 deletions
diff --git a/src/pages/_document.jsx b/src/pages/_document.jsx index ff205a38..ed7e81de 100644 --- a/src/pages/_document.jsx +++ b/src/pages/_document.jsx @@ -57,6 +57,24 @@ export default function MyDocument() { }} /> + <Script + id='tawk-script-tag' + strategy='afterInteractive' + dangerouslySetInnerHTML={{ + __html: ` + var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date(); + (function(){ + var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0]; + s1.async=true; + s1.src='https://embed.tawk.to/643e00614247f20fefec36c5/1gu932vhh'; + s1.charset='UTF-8'; + s1.setAttribute('crossorigin','*'); + s0.parentNode.insertBefore(s1,s0); + })(); + ` + }} + /> + <meta name='google-site-verification' content='uHuW_mZhjv_fUg3do-lV8Mo7R2vVjF4MPQhTXFP3jH4' diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index 19b9655a..4a237d47 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -57,7 +57,12 @@ export default async function handler(req, res) { let result = await axios(process.env.SOLR_HOST + '/solr/product/select?' + parameter.join('&')) try { - result.data.response.products = productResponseMap(result.data.response.docs) + let { auth } = req.cookies + if (auth) auth = JSON.parse(auth) + result.data.response.products = productResponseMap( + result.data.response.docs, + auth?.pricelist || false + ) result.data.responseHeader.params.start = parseInt(result.data.responseHeader.params.start) result.data.responseHeader.params.rows = parseInt(result.data.responseHeader.params.rows) delete result.data.response.docs @@ -83,8 +88,19 @@ const escapeSolrQuery = (query) => { return escapedWords.join(' ') } -const productResponseMap = (products) => { +const productResponseMap = (products, pricelist) => { return products.map((product) => { + let priceDiscount = product.price_discount_f || 0 + let discount = product.discount_f || 0 + + if (pricelist) { + const pricelistDiscount = product?.[`price_${pricelist}_f`] || false + const pricelistDiscountPerc = product?.[`discount_${pricelist}_f`] || false + + if (pricelistDiscount && pricelistDiscount > 0) priceDiscount = pricelistDiscount + if (pricelistDiscountPerc && pricelistDiscountPerc > 0) discount = pricelistDiscountPerc + } + let productMapped = { id: product.product_id_i || '', image: product.image_s || '', @@ -92,8 +108,8 @@ const productResponseMap = (products) => { name: product.name_s || '', lowestPrice: { price: product.price_f || 0, - priceDiscount: product.price_discount_f || 0, - discountPercentage: product.discount_f || 0 + priceDiscount: priceDiscount, + discountPercentage: discount }, variantTotal: product.variant_total_i || 0, stockTotal: product.stock_total_f || 0, diff --git a/src/pages/shop/product/[slug].jsx b/src/pages/shop/product/[slug].jsx index 84b848f0..230d1f87 100644 --- a/src/pages/shop/product/[slug].jsx +++ b/src/pages/shop/product/[slug].jsx @@ -1,48 +1,61 @@ import Seo from '@/core/components/Seo' +import LogoSpinner from '@/core/components/elements/Spinner/LogoSpinner' import { getIdFromSlug } from '@/core/utils/slug' import productApi from '@/lib/product/api/productApi' import dynamic from 'next/dynamic' import { useRouter } from 'next/router' +import { useEffect, useState } from 'react' const BasicLayout = dynamic(() => import('@/core/components/layouts/BasicLayout')) const Product = dynamic(() => import('@/lib/product/components/Product/Product')) -export async function getServerSideProps(context) { - const { slug } = context.query - let product = await productApi({ id: getIdFromSlug(slug) }) - if (product?.length == 1) { - product = product[0] - const regexHtmlTags = /(<([^>]+)>)/gi - const regexHtmlTagsExceptP = /<\/?(?!p\b)[^>]*>/g - if (product.description.replace(regexHtmlTags, ' ').trim() == '') { - product.description = '' +export default function ProductDetail() { + const router = useRouter() + const [product, setProduct] = useState(null) + + useEffect(() => { + const { slug } = router.query + + const loadProduct = async () => { + let product = await productApi({ id: getIdFromSlug(slug) }) + if (product?.length == 1) { + product = product[0] + const regexHtmlTags = /(<([^>]+)>)/gi + const regexHtmlTagsExceptP = /<\/?(?!p\b)[^>]*>/g + if (product.description.replace(regexHtmlTags, ' ').trim() == '') { + product.description = '' + } + product.description = product.description.replace(regexHtmlTagsExceptP, ' ') + product.description = product.description.trim() + } + setProduct(product) } - product.description = product.description.replace(regexHtmlTagsExceptP, ' ') - product.description = product.description.trim() - } - return { props: { product } } -} + if (slug) loadProduct() + }, [router]) -export default function ProductDetail({ product }) { - const router = useRouter() return ( <BasicLayout> <Seo - title={product?.name + ' - Indoteknik.com' || ''} + title={product?.name || '' + ' - Indoteknik.com' || ''} description='Temukan pilihan produk B2B Industri & Alat Teknik untuk Perusahaan, UMKM & Pemerintah dengan lengkap, mudah dan transparan.' openGraph={{ url: process.env.NEXT_PUBLIC_SELF_HOST + router.asPath, - image: product.image, + image: product?.image, type: 'product' }} additionalMetaTags={[ { name: 'keywords', - content: `${product.name}, Harga ${product.name}, Beli ${product.name}, Spesifikasi ${product.name}` + content: `${product?.name}, Harga ${product?.name}, Beli ${product?.name}, Spesifikasi ${product?.name}` } ]} /> - <Product product={product} /> + {!product && ( + <div className="container mx-auto flex justify-center pt-10"> + <LogoSpinner width={36} height={36} /> + </div> + )} + {product && <Product product={product} />} </BasicLayout> ) } |
