summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2024-06-21 15:31:12 +0700
committerit-fixcomart <it@fixcomart.co.id>2024-06-21 15:31:12 +0700
commit3ada88f0faf901e05bd56ecff8c4bcb209c06787 (patch)
tree789d149b4c7bf6822ab13d38668d6f16b6354a45
parent7b08c9358888148bf6f6c2c7145d75e466550298 (diff)
<iman> update all-promotion
-rw-r--r--src-migrate/modules/promo/components/FlashSale.tsx21
-rw-r--r--src-migrate/modules/promo/components/PromoList.jsx98
-rw-r--r--src-migrate/modules/promo/components/PromotinProgram.jsx2
-rw-r--r--src-migrate/pages/shop/promo/index.tsx19
-rw-r--r--src/api/promoApi.js7
-rw-r--r--src/pages/shop/promo/[slug].tsx8
6 files changed, 125 insertions, 30 deletions
diff --git a/src-migrate/modules/promo/components/FlashSale.tsx b/src-migrate/modules/promo/components/FlashSale.tsx
new file mode 100644
index 00000000..dac0365c
--- /dev/null
+++ b/src-migrate/modules/promo/components/FlashSale.tsx
@@ -0,0 +1,21 @@
+import dynamic from "next/dynamic";
+import React from "react";
+import { FlashSaleSkeleton } from "@/lib/flashSale/skeleton/FlashSaleSkeleton";
+
+const FlashSale = dynamic(
+ () => import('@/lib/flashSale/components/FlashSale'),
+ {
+ loading: () => <FlashSaleSkeleton />,
+ }
+ );
+
+ const FlashSalePromo = ()=> {
+ return(
+ <>
+ <h1 className='text-h-sm md:text-h-lg font-semibold py-4'>Bayar Setengahnya!</h1>
+ <FlashSale/>
+ </>
+ )
+ }
+
+ export default FlashSalePromo \ No newline at end of file
diff --git a/src-migrate/modules/promo/components/PromoList.jsx b/src-migrate/modules/promo/components/PromoList.jsx
index ed758fbc..fb4b6ee3 100644
--- a/src-migrate/modules/promo/components/PromoList.jsx
+++ b/src-migrate/modules/promo/components/PromoList.jsx
@@ -1,24 +1,92 @@
-import Image from 'next/image';
-import Link from '@/core/components/elements/Link/Link';
-import ProductPromoCard from '../../../../src-migrate/modules/product-promo/components/Card'
+import React, { useState, useEffect } from 'react';
+import ProductPromoCard from '../../../../src-migrate/modules/product-promo/components/Card';
+import { fetchPromoItemsSolr } from '../../../../src/api/promoApi';
+import { Swiper, SwiperSlide } from 'swiper/react';
+import useDevice from '@/core/hooks/useDevice';
+import LogoSpinner from '../../../../src/core/components/elements/Spinner/LogoSpinner'
const PromoList = ({ selectedPromo }) => {
- let title = '';
-
- if (selectedPromo === 'Bundling') {
- title = 'Kombinasi Kilat Pilihan Kami!';
- } else if (selectedPromo === 'Loading') {
- title = 'Belanja Borong Pilihan Kami!';
- } else if (selectedPromo === 'Merchandise') {
- title = 'Gratis Merchandise Spesial Indoteknik';
- }
+ const [title, setTitle] = useState('');
+ const [slug, setSlug] = useState('');
+ const [promoItems, setPromoItems] = useState([]);
+ const [promoData, setPromoData] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+ const { isMobile } = useDevice();
+
+ useEffect(() => {
+ if (selectedPromo === 'Bundling') {
+ setTitle('Kombinasi Kilat Pilihan Kami!');
+ setSlug('bundling');
+ } else if (selectedPromo === 'Loading') {
+ setTitle('Belanja Borong Pilihan Kami!');
+ setSlug('discount_loading');
+ } else if (selectedPromo === 'Merchandise') {
+ setTitle('Gratis Merchandise Spesial Indoteknik');
+ setSlug('merchandise');
+ }
+ }, [selectedPromo]);
+
+ useEffect(() => {
+ const fetchPromotions = async () => {
+ setIsLoading(true);
+ try {
+ const items = await fetchPromoItemsSolr(`type_value_s:${slug}`, 0, 50);
+ setPromoItems(items);
+
+ console.log("selectedPromo",selectedPromo)
+ console.log("slug",slug)
+ console.log("items",items)
+ console.log("promoItems",promoItems)
+
+ const promoDataPromises = items.map(async (item) => {
+ try {
+ const response = await fetchPromoItemsSolr(`id:${item.id}`, 0, 10);
+ return response;
+ } catch (fetchError) {
+ return [];
+ }
+ });
+
+ const promoDataArray = await Promise.all(promoDataPromises);
+ const mergedPromoData = promoDataArray.reduce((accumulator, currentValue) => accumulator.concat(currentValue), []);
+ setPromoData(mergedPromoData);
+ } catch (error) {
+ console.error('Error fetching promo items:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ if (slug) {
+ setIsLoading(true);
+ // Reset the promoItems and promoData when slug changes
+ setPromoItems([]);
+ setPromoData([]);
+ fetchPromotions();
+ }
+ }, [slug]);
return (
<div>
- <h1 className='text-h-sm md:text-h-lg font-semibold mb-4'>{title}</h1>
- <div>DISINI CARD {selectedPromo}</div>
+ <h1 className='text-h-sm md:text-h-lg font-semibold py-4'>{title}</h1>
+ {isLoading ? (
+ <div className="loading-spinner flex justify-center">
+ <LogoSpinner width={48} height={48} />
+ </div>
+ ) : (
+
+ <Swiper slidesPerView={isMobile ? 1.5 : 3.25} spaceBetween={12} freeMode>
+ {promoData?.map((promotion) => (
+ <SwiperSlide key={promotion.id}>
+ <div className="min-w-[380px] max-w-[380px] mb-[20px] sm:min-w-[330px] md:min-w-[360px] lg:min-w-[380px] xl:min-w-[380px]">
+ <ProductPromoCard promotion={promotion} />
+ </div>
+ </SwiperSlide>
+ ))}
+ </Swiper>
+ )}
</div>
);
-}
+};
export default PromoList;
diff --git a/src-migrate/modules/promo/components/PromotinProgram.jsx b/src-migrate/modules/promo/components/PromotinProgram.jsx
index a7e5dfef..13a8405b 100644
--- a/src-migrate/modules/promo/components/PromotinProgram.jsx
+++ b/src-migrate/modules/promo/components/PromotinProgram.jsx
@@ -5,7 +5,7 @@ import { InfoIcon } from "lucide-react"
const PromotionProgram = ({ selectedPromo, onSelectPromo }) => {
return (
<>
- <div className="text-h-sm md:text-h-lg font-semibold mb-4">Serba Serbi Promo</div>
+ <div className="text-h-sm md:text-h-lg font-semibold py-4">Serba Serbi Promo</div>
<div className='px-4 sm:px-0'>
<div className='grid md:grid-cols-3 grid-cols-2 justify-between gap-2 items-center'>
<div className='w-full'>
diff --git a/src-migrate/pages/shop/promo/index.tsx b/src-migrate/pages/shop/promo/index.tsx
index 5fdd80aa..d1d6d70a 100644
--- a/src-migrate/pages/shop/promo/index.tsx
+++ b/src-migrate/pages/shop/promo/index.tsx
@@ -4,8 +4,11 @@ import { LazyLoadComponent } from 'react-lazy-load-image-component'
import Hero from '~/modules/promo/components/Hero'
import PromotionProgram from '~/modules/promo/components/PromotinProgram'
import Voucher from '~/modules/promo/components/Voucher'
+import FlashSale from '../../../modules/promo/components/FlashSale'
const PromoList = dynamic(() => import('../../../modules/promo/components/PromoList'));
+
+
const PromoPage = () => {
const [selectedPromo, setSelectedPromo] = useState('Bundling');
return (
@@ -14,16 +17,18 @@ const PromoPage = () => {
<Hero />
</LazyLoadComponent>
- <div className='h-10' />
<LazyLoadComponent>
- <PromotionProgram
- selectedPromo={selectedPromo}
- onSelectPromo={setSelectedPromo}
- />
+ <PromotionProgram
+ selectedPromo={selectedPromo}
+ onSelectPromo={setSelectedPromo}
+ />
+ <PromoList selectedPromo={selectedPromo} />
+ </LazyLoadComponent>
+
+ <LazyLoadComponent>
+ <FlashSale />
</LazyLoadComponent>
- <PromoList selectedPromo={selectedPromo} />
- <div className='h-10' />
<LazyLoadComponent>
<Voucher />
diff --git a/src/api/promoApi.js b/src/api/promoApi.js
index 4c386fba..95a27fd3 100644
--- a/src/api/promoApi.js
+++ b/src/api/promoApi.js
@@ -13,13 +13,14 @@ export const fetchPromoItems = async (type) => {
}
};
-export const fetchPromoItemsSolr = async (type) => {
+export const fetchPromoItemsSolr = async (type, start, rows) => {
// let query = type ? `type_value_s:${type}` : '*:*';
- let start = 0
- let rows = 100
+ // let start = 0
+ // let rows = 10
try {
const queryParams = new URLSearchParams({ q: type });
const response = await fetch(`/solr/promotion_program_lines/select?${queryParams.toString()}&rows=${rows}&start=${start}`);
+ console.log("URL",`/solr/promotion_program_lines/select?${queryParams.toString()}&rows=${rows}&start=${start}`)
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
diff --git a/src/pages/shop/promo/[slug].tsx b/src/pages/shop/promo/[slug].tsx
index bd69c071..aaee1249 100644
--- a/src/pages/shop/promo/[slug].tsx
+++ b/src/pages/shop/promo/[slug].tsx
@@ -91,7 +91,7 @@ export default function PromoDetail() {
setCurrentPage(pageNumber)
try {
- const items = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug}`);
+ const items = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug}`,0,100);
setPromoItems(items);
if (items.length === 0) {
@@ -147,16 +147,16 @@ export default function PromoDetail() {
const response = await fetchVariantSolr(`id:${item.product_id} AND ${combinedQuery}`);
const product = response.response.docs[0];
const product_id = product.id;
- const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} AND ${combinedQueryPrice}`);
+ const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} AND ${combinedQueryPrice}`,0,100);
return response2;
}else if(combinedQuery){
const response = await fetchVariantSolr(`id:${item.product_id} AND ${combinedQuery}`);
const product = response.response.docs[0];
const product_id = product.id;
- const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} `);
+ const response2 = await fetchPromoItemsSolr(`type_value_s:${Array.isArray(slug) ? slug[0] : slug} AND product_ids:${product_id} `,0,100);
return response2;
} else {
- const response = await fetchPromoItemsSolr(`id:${item.id}`);
+ const response = await fetchPromoItemsSolr(`id:${item.id}`,0,100);
return response;
}
} catch (fetchError) {