From 039165b57fe20f24ba0ef406ded60edb35929fe9 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 25 Oct 2023 09:54:51 +0700 Subject: bugs fix - brand undifine ketika kilik call for inquery (redirect ke wa) di product card --- src/lib/product/components/ProductCard.jsx | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/lib/product/components/ProductCard.jsx b/src/lib/product/components/ProductCard.jsx index 9500a3fd..71466259 100644 --- a/src/lib/product/components/ProductCard.jsx +++ b/src/lib/product/components/ProductCard.jsx @@ -12,6 +12,7 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => { const callForPriceWhatsapp = whatsappUrl('product', { name: product.name, + manufacture: product.manufacture?.name, url: createSlug('/shop/product/', product.name, product.id, true) }) -- cgit v1.2.3 From 53c6be06b157761ce79ef4f0ce869d6f7c16682d Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Wed, 25 Oct 2023 10:01:49 +0700 Subject: set target blank --- src/lib/product/components/ProductCard.jsx | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/lib/product/components/ProductCard.jsx b/src/lib/product/components/ProductCard.jsx index 71466259..f7df29e2 100644 --- a/src/lib/product/components/ProductCard.jsx +++ b/src/lib/product/components/ProductCard.jsx @@ -103,7 +103,9 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => { {product?.lowestPrice.priceDiscount > 0 ? ( currencyFormat(product?.lowestPrice.priceDiscount) ) : ( - Call for Inquiry + + Call for Inquiry + )} @@ -118,7 +120,9 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => { ) : ( - Call for Inquiry + + Call for Inquiry + )} )} @@ -126,7 +130,11 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => {
{product?.stockTotal > 0 &&
Ready Stock
} {/*
{product?.stockTotal > 5 ? '> 5' : '< 5'}
*/} - {product?.qtySold > 0 &&
{sellingProductFormat(product?.qtySold) + ' Terjual'}
} + {product?.qtySold > 0 && ( +
+ {sellingProductFormat(product?.qtySold) + ' Terjual'} +
+ )}
@@ -206,7 +214,9 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => { {product?.lowestPrice?.priceDiscount > 0 ? ( currencyFormat(product?.lowestPrice?.priceDiscount) ) : ( - Call for Inquiry + + Call for Inquiry + )} @@ -221,7 +231,9 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => { ) : ( - Call for Inquiry + + Call for Inquiry + )} )} @@ -229,7 +241,11 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => {
{product?.stockTotal > 0 &&
Ready Stock
} {/*
{product?.stockTotal > 5 ? '> 5' : '< 5'}
*/} - {product?.qtySold > 0 &&
{sellingProductFormat(product?.qtySold) + ' Terjual'}
} + {product?.qtySold > 0 && ( +
+ {sellingProductFormat(product?.qtySold) + ' Terjual'} +
+ )}
-- cgit v1.2.3 From 4ea9fbdcdf1c6625204bbaea9c4b117febf0a212 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 13 Nov 2023 15:42:47 +0700 Subject: Fix showing pricelist price on product detail --- src/lib/product/components/Product/ProductDesktop.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/product/components/Product/ProductDesktop.jsx b/src/lib/product/components/Product/ProductDesktop.jsx index a8cca416..b3174483 100644 --- a/src/lib/product/components/Product/ProductDesktop.jsx +++ b/src/lib/product/components/Product/ProductDesktop.jsx @@ -441,7 +441,7 @@ const ProductDesktop = ({ products, wishlist, toggleWishlist }) => { {sellingProductFormat(product?.qtySold) + ' Terjual'} )} - {lowestPrice?.isFlashsale && lowestPrice?.price.discountPercentage > 0 ? ( + {product?.flashSale?.id && lowestPrice?.price.discountPercentage > 0 ? ( <>
-- cgit v1.2.3 From 6ebe202147269100cd63ef125e877e8f693a27a1 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Fri, 17 Nov 2023 10:13:21 +0700 Subject: hotfix/round down discount precentage --- src/lib/product/components/Product/ProductDesktop.jsx | 4 ++-- src/lib/product/components/Product/ProductMobile.jsx | 2 +- src/lib/product/components/ProductCard.jsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/lib/product/components/Product/ProductDesktop.jsx b/src/lib/product/components/Product/ProductDesktop.jsx index b3174483..5f034c09 100644 --- a/src/lib/product/components/Product/ProductDesktop.jsx +++ b/src/lib/product/components/Product/ProductDesktop.jsx @@ -445,7 +445,7 @@ const ProductDesktop = ({ products, wishlist, toggleWishlist }) => { <>
- {lowestPrice?.price?.discountPercentage}% + {Math.floor(lowestPrice?.price?.discountPercentage)}%
{currencyFormat(lowestPrice?.price?.price)} @@ -584,7 +584,7 @@ const ProductDesktop = ({ products, wishlist, toggleWishlist }) => { <>
- {variant?.price?.discountPercentage}% + {Math.floor(variant?.price?.discountPercentage)}%
{currencyFormat(variant?.price?.price)} diff --git a/src/lib/product/components/Product/ProductMobile.jsx b/src/lib/product/components/Product/ProductMobile.jsx index ef2c0002..e23e2fb9 100644 --- a/src/lib/product/components/Product/ProductMobile.jsx +++ b/src/lib/product/components/Product/ProductMobile.jsx @@ -260,7 +260,7 @@ const ProductMobile = ({ product, wishlist, toggleWishlist }) => { {activeVariant.isFlashsale && activeVariant?.price?.discountPercentage > 0 ? ( <>
-
{activeVariant?.price?.discountPercentage}%
+
{Math.floor(activeVariant?.price?.discountPercentage)}%
{currencyFormat(activeVariant?.price?.price)}
diff --git a/src/lib/product/components/ProductCard.jsx b/src/lib/product/components/ProductCard.jsx index f7df29e2..fa555bcf 100644 --- a/src/lib/product/components/ProductCard.jsx +++ b/src/lib/product/components/ProductCard.jsx @@ -42,7 +42,7 @@ const ProductCard = ({ product, simpleTitle, variant = 'vertical' }) => {
- {product?.lowestPrice.discountPercentage}% + {Math.floor(product?.lowestPrice.discountPercentage)}%
-- cgit v1.2.3 From 87a004c0fcf256e1e92653767a630c01ad21ad5a Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Sat, 18 Nov 2023 11:33:28 +0700 Subject: add brand link di page search --- src/lib/product/components/ProductSearch.jsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/lib/product/components/ProductSearch.jsx b/src/lib/product/components/ProductSearch.jsx index a4e9ecbb..29bb987e 100644 --- a/src/lib/product/components/ProductSearch.jsx +++ b/src/lib/product/components/ProductSearch.jsx @@ -20,6 +20,7 @@ import odooApi from '@/core/api/odooApi' import { formatCurrency } from '@/core/utils/formatValue' import axios from 'axios' import Skeleton from 'react-loading-skeleton' +import { createSlug } from '@/core/utils/slug' const ProductSearch = ({ query, prefixUrl, defaultBrand = null, brand = null }) => { const router = useRouter() @@ -87,13 +88,16 @@ const ProductSearch = ({ query, prefixUrl, defaultBrand = null, brand = null }) const brand = await axios( `${process.env.NEXT_PUBLIC_SELF_HOST}/api/shop/brands?params=search&q=${search}` ) + console.log('ini brand', brand) if (brand.data.length > 0) { setIsBrand(brand?.data[0]) } else { setIsBrand(null) } } - checkIfBrand() + if (router.pathname.includes('search')) { + checkIfBrand() + } }, [q]) const brands = [] @@ -362,11 +366,12 @@ const ProductSearch = ({ query, prefixUrl, defaultBrand = null, brand = null }) {isBrand && isBrand.logo && (

Brand Pencarian {q}

- + + +
)} -- cgit v1.2.3 From a5321d82f4b5e8404f575f1d62e92d0322d78db9 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Wed, 22 Nov 2023 11:33:52 +0700 Subject: Update socials icon on footer --- .../components/elements/Footer/BasicFooter.jsx | 280 ++++++++++++++++----- 1 file changed, 215 insertions(+), 65 deletions(-) (limited to 'src') diff --git a/src/core/components/elements/Footer/BasicFooter.jsx b/src/core/components/elements/Footer/BasicFooter.jsx index 23bca677..28a3764c 100644 --- a/src/core/components/elements/Footer/BasicFooter.jsx +++ b/src/core/components/elements/Footer/BasicFooter.jsx @@ -1,14 +1,14 @@ -import NextImage from 'next/image' -import IndoteknikLogo from '@/images/logo.png' +import NextImage from 'next/image'; +import IndoteknikLogo from '@/images/logo.png'; import { DevicePhoneMobileIcon, EnvelopeIcon, - PhoneArrowUpRightIcon -} from '@heroicons/react/24/outline' -import Link from '../Link/Link' -import MobileView from '../../views/MobileView' -import DesktopView from '../../views/DesktopView' -import whatsappUrl from '@/core/utils/whatsappUrl' + PhoneArrowUpRightIcon, +} from '@heroicons/react/24/outline'; +import Link from '../Link/Link'; +import MobileView from '../../views/MobileView'; +import DesktopView from '../../views/DesktopView'; +import whatsappUrl from '@/core/utils/whatsappUrl'; const BasicFooter = () => { return ( @@ -17,9 +17,16 @@ const BasicFooter = () => {
- + -
PT. Indoteknik Dotcom Gemilang
+
+ PT. Indoteknik Dotcom Gemilang +
@@ -37,7 +44,8 @@ const BasicFooter = () => {
- Copyright © 2007 - {new Date().getFullYear()}, PT. Indoteknik Dotcom Gemilang + Copyright © 2007 - {new Date().getFullYear()}, PT. Indoteknik Dotcom + Gemilang
@@ -46,8 +54,15 @@ const BasicFooter = () => {
- -
PT. Indoteknik Dotcom Gemilang
+ +
+ PT. Indoteknik Dotcom Gemilang +
@@ -64,7 +79,8 @@ const BasicFooter = () => {
- Copyright © 2007 - {new Date().getFullYear()}, PT. Indoteknik Dotcom Gemilang + Copyright © 2007 - {new Date().getFullYear()}, PT. Indoteknik + Dotcom Gemilang
@@ -74,39 +90,51 @@ const BasicFooter = () => {
- ) -} + ); +}; -const headerClassName = 'font-semibold mb-4' +const headerClassName = 'font-semibold mb-4'; const OfficeLocation = () => ( -) +); const WarehouseLocation = () => (
Gudang Indoteknik
- Jl. Bandengan Utara Komp. 85 A dan B, Penjaringan, Kec. Penjaringan, Jakarta Utara + Jl. Bandengan Utara Komp. 85 A dan B, Penjaringan, Kec. Penjaringan, + Jakarta Utara
-) +); const AboutUs = () => (
Tentang Kami
  • - Company Profile + + Company Profile +
  • - Pelanggan Kami + + Pelanggan Kami +
  • Hubungi Kami @@ -115,30 +143,42 @@ const AboutUs = () => ( Karir
  • - Syarat & Ketentuan + + Syarat & Ketentuan +
  • - Kebijakan Privasi + + Kebijakan Privasi +
-) +); const CustomerGuide = () => (
Bantuan & Panduan
  • - Metode Pembayaran + + Metode Pembayaran +
  • - Metode Pengiriman + + Metode Pengiriman +
  • - Panduan Belanja + + Panduan Belanja +
  • - Panduan Quotation + + Panduan Quotation +
  • @@ -146,40 +186,56 @@ const CustomerGuide = () => (
  • - Informasi Garansi + + Informasi Garansi +
  • - Panduan Pick Up Service + + Panduan Pick Up Service +
-) +); const Form = () => (
Formulir
  • - Request for Quotation + + Request for Quotation +
  • - Kunjungan Sales + + Kunjungan Sales +
  • - Kunjungan Service + + Kunjungan Service +
  • - Pembayaran Tempo + + Pembayaran Tempo +
  • - Surat Dukungan + + Surat Dukungan +
  • - Daftar Merchant + + Daftar Merchant +
-) +); const InformationCenter = () => (
@@ -187,11 +243,15 @@ const InformationCenter = () => (
-) +); const OpenHours = () => (
@@ -217,44 +277,124 @@ const OpenHours = () => (
-) +); const SocialMedias = () => (
Temukan Kami
- -) +); const Payments = () => (
Pembayaran
- - - - + + + + ( width={48} height={24} /> - +
-) +); const InternalItemLink = ({ href, children }) => ( - + {children} -) +); -export default BasicFooter +export default BasicFooter; -- cgit v1.2.3 From ddfdcfdc47e8c44fbf7abd0ee69acb959ab79387 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Wed, 29 Nov 2023 15:31:55 +0700 Subject: Update odooApi to logout when reach max conn attempt and redirect to login --- src/core/api/odooApi.js | 71 ++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/core/api/odooApi.js b/src/core/api/odooApi.js index fe9fcdd2..3349ff4b 100644 --- a/src/core/api/odooApi.js +++ b/src/core/api/odooApi.js @@ -1,22 +1,24 @@ -import axios from 'axios' -import camelcaseObjectDeep from 'camelcase-object-deep' -import { getCookie, setCookie } from 'cookies-next' -import { getAuth } from '../utils/auth' +import axios from 'axios'; +import camelcaseObjectDeep from 'camelcase-object-deep'; +import { getCookie, setCookie } from 'cookies-next'; +import { deleteAuth, getAuth } from '../utils/auth'; const renewToken = async () => { - let token = await axios.get(process.env.NEXT_PUBLIC_ODOO_API_HOST + '/api/token') - setCookie('token', token.data.result) - return token.data.result -} + let token = await axios.get( + process.env.NEXT_PUBLIC_ODOO_API_HOST + '/api/token' + ); + setCookie('token', token.data.result); + return token.data.result; +}; const getToken = async () => { - let token = getCookie('token') - if (token == undefined) token = await renewToken() - return token -} + let token = getCookie('token'); + if (token == undefined) token = await renewToken(); + return token; +}; -const maxConnectionAttempt = 15 -let connectionAttempt = 0 +const maxConnectionAttempt = 15; +let connectionAttempt = 0; /** * The `odooApi` function is used to make API requests to an Odoo backend with customizable parameters such as `method`, `url`, `data`, and `headers`. @@ -30,31 +32,40 @@ let connectionAttempt = 0 * @returns {Promise} - A Promise that resolves to the API response data or an empty array. */ const odooApi = async (method, url, data = {}, headers = {}) => { - connectionAttempt++ + connectionAttempt++; try { - let token = await getToken() - const auth = getAuth() + let token = await getToken(); + const auth = getAuth(); let axiosParameter = { method, url: process.env.NEXT_PUBLIC_ODOO_API_HOST + url, - headers: { Authorization: token, ...headers } - } - if (auth) axiosParameter.headers['Token'] = auth.token + headers: { Authorization: token, ...headers }, + }; + if (auth) axiosParameter.headers['Token'] = auth.token; if (method.toUpperCase() == 'POST') - axiosParameter.headers['Content-Type'] = 'application/x-www-form-urlencoded' + axiosParameter.headers['Content-Type'] = + 'application/x-www-form-urlencoded'; if (Object.keys(data).length > 0) - axiosParameter.data = new URLSearchParams(Object.entries(data)).toString() + axiosParameter.data = new URLSearchParams( + Object.entries(data) + ).toString(); - let res = await axios(axiosParameter) - if (res.data.status.code == 401 && connectionAttempt < maxConnectionAttempt) { - await renewToken() - return odooApi(method, url, data, headers) + let res = await axios(axiosParameter); + if (res.data.status.code == 401) { + if (connectionAttempt < maxConnectionAttempt) { + await renewToken(); + return odooApi(method, url, data, headers); + } else { + await deleteAuth(); + window.location.href = '/login'; + return false; + } } - return camelcaseObjectDeep(res.data.result) || [] + return camelcaseObjectDeep(res.data.result) || []; } catch (error) { - console.log(error) + console.log(error); } -} +}; -export default odooApi +export default odooApi; -- cgit v1.2.3 From 4ac372ff318ee78e5d5019a1dbe95bf47b661766 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 5 Dec 2023 09:57:39 +0700 Subject: onbording popup --- src/pages/index.jsx | 98 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 64f3ac10..65d953d2 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -1,46 +1,64 @@ -import dynamic from 'next/dynamic' -import MobileView from '@/core/components/views/MobileView' -import DesktopView from '@/core/components/views/DesktopView' -import { useRef } from 'react' -import Seo from '@/core/components/Seo' -import DelayRender from '@/core/components/elements/DelayRender/DelayRender' -import { HeroBannerSkeleton } from '@/components/skeleton/BannerSkeleton' -import { PopularProductSkeleton } from '@/components/skeleton/PopularProductSkeleton' -import PromotinProgram from '@/lib/promotinProgram/components/HomePage' -import PreferredBrandSkeleton from '@/lib/home/components/Skeleton/PreferredBrandSkeleton' -import { FlashSaleSkeleton } from '@/lib/flashSale/skeleton/FlashSaleSkeleton' +import dynamic from 'next/dynamic'; +import MobileView from '@/core/components/views/MobileView'; +import DesktopView from '@/core/components/views/DesktopView'; +import { useRef } from 'react'; +import Seo from '@/core/components/Seo'; +import DelayRender from '@/core/components/elements/DelayRender/DelayRender'; +import { HeroBannerSkeleton } from '@/components/skeleton/BannerSkeleton'; +import { PopularProductSkeleton } from '@/components/skeleton/PopularProductSkeleton'; +import PromotinProgram from '@/lib/promotinProgram/components/HomePage'; +import PreferredBrandSkeleton from '@/lib/home/components/Skeleton/PreferredBrandSkeleton'; +import { FlashSaleSkeleton } from '@/lib/flashSale/skeleton/FlashSaleSkeleton'; +import PagePopupIformation from '~/modules/popup-information'; -const BasicLayout = dynamic(() => import('@/core/components/layouts/BasicLayout')) +const BasicLayout = dynamic(() => + import('@/core/components/layouts/BasicLayout') +); const HeroBanner = dynamic(() => import('@/components/ui/HeroBanner'), { - loading: () => -}) -const HeroBannerSecondary = dynamic(() => import('@/components/ui/HeroBannerSecondary'), { - loading: () => -}) + loading: () => , +}); +const HeroBannerSecondary = dynamic( + () => import('@/components/ui/HeroBannerSecondary'), + { + loading: () => , + } +); const PopularProduct = dynamic(() => import('@/components/ui/PopularProduct'), { - loading: () => -}) + loading: () => , +}); -const PreferredBrand = dynamic(() => import('@/lib/home/components/PreferredBrand'), { - loading: () => -}) +const PreferredBrand = dynamic( + () => import('@/lib/home/components/PreferredBrand'), + { + loading: () => , + } +); -const FlashSale = dynamic(() => import('@/lib/flashSale/components/FlashSale'), { - loading: () => -}) -const BannerSection = dynamic(() => import('@/lib/home/components/BannerSection')) -const CategoryHomeId = dynamic(() => import('@/lib/home/components/CategoryHomeId')) -const CustomerReviews = dynamic(() => import('@/lib/review/components/CustomerReviews')) -const ServiceList = dynamic(() => import('@/lib/home/components/ServiceList')) +const FlashSale = dynamic( + () => import('@/lib/flashSale/components/FlashSale'), + { + loading: () => , + } +); +const BannerSection = dynamic(() => + import('@/lib/home/components/BannerSection') +); +const CategoryHomeId = dynamic(() => + import('@/lib/home/components/CategoryHomeId') +); +const CustomerReviews = dynamic(() => + import('@/lib/review/components/CustomerReviews') +); +const ServiceList = dynamic(() => import('@/lib/home/components/ServiceList')); export default function Home() { - const bannerRef = useRef(null) - const wrapperRef = useRef(null) + const bannerRef = useRef(null); + const wrapperRef = useRef(null); const handleOnLoad = () => { wrapperRef.current.style.height = - bannerRef.current?.querySelector(':first-child')?.clientHeight + 'px' - } + bannerRef.current?.querySelector(':first-child')?.clientHeight + 'px'; + }; return ( @@ -51,14 +69,19 @@ export default function Home() { { name: 'keywords', content: - 'indoteknik, indoteknik.com, toko teknik, toko perkakas, jual genset, jual fogging, jual krisbow, harga krisbow, harga alat safety, harga pompa air' - } + 'indoteknik, indoteknik.com, toko teknik, toko perkakas, jual genset, jual fogging, jual krisbow, harga krisbow, harga alat safety, harga pompa air', + }, ]} /> +
-
+
@@ -85,6 +108,7 @@ export default function Home() { + @@ -114,5 +138,5 @@ export default function Home() {
- ) + ); } -- cgit v1.2.3