summaryrefslogtreecommitdiff
path: root/src/pages
diff options
context:
space:
mode:
authorRafi Zadanly <zadanlyr@gmail.com>2023-04-18 17:05:25 +0700
committerRafi Zadanly <zadanlyr@gmail.com>2023-04-18 17:05:25 +0700
commit42fed2490fe537b46a717eafaf1b1e4a5e0a08c8 (patch)
treef586d4b09632b6fb50d1e3c038d8f36acb668600 /src/pages
parent5ec1ebdc1b5a44a9bb615eba08faf60113c0697f (diff)
price tier
Diffstat (limited to 'src/pages')
-rw-r--r--src/pages/_document.jsx18
-rw-r--r--src/pages/api/shop/search.js24
-rw-r--r--src/pages/shop/product/[slug].jsx53
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 &amp; Alat Teknik untuk Perusahaan, UMKM &amp; 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>
)
}