From 1e89e64ec0bccbe89b9cede0b2054547d40589fa Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 22 May 2023 15:27:01 +0700 Subject: Refactor hero banner and popular product section --- src/api/BannerApi.js | 5 --- src/api/bannerApi.js | 5 +++ src/api/productApi.js | 10 +++++ src/components/skeleton/BannerSkeleton.jsx | 29 +++++++------- src/components/skeleton/PopularProductSkeleton.jsx | 22 +++++++++++ src/components/ui/HeroBanner.jsx | 4 +- src/components/ui/HeroBannerSecondary.jsx | 4 +- src/components/ui/PopularProduct.jsx | 44 ++++++++++++++++++++++ src/lib/home/components/PopularProduct.jsx | 42 --------------------- src/lib/home/hooks/usePopularProduct.js | 13 ------- src/pages/index.jsx | 23 ++++++----- 11 files changed, 111 insertions(+), 90 deletions(-) delete mode 100644 src/api/BannerApi.js create mode 100644 src/api/bannerApi.js create mode 100644 src/api/productApi.js create mode 100644 src/components/skeleton/PopularProductSkeleton.jsx create mode 100644 src/components/ui/PopularProduct.jsx delete mode 100644 src/lib/home/components/PopularProduct.jsx delete mode 100644 src/lib/home/hooks/usePopularProduct.js (limited to 'src') diff --git a/src/api/BannerApi.js b/src/api/BannerApi.js deleted file mode 100644 index 8ebecd26..00000000 --- a/src/api/BannerApi.js +++ /dev/null @@ -1,5 +0,0 @@ -import odooApi from '@/core/api/odooApi' - -export const BannerApi = ({ type }) => { - return async () => await odooApi('GET', `/api/v1/banner?type=${type}`) -} diff --git a/src/api/bannerApi.js b/src/api/bannerApi.js new file mode 100644 index 00000000..8bae131d --- /dev/null +++ b/src/api/bannerApi.js @@ -0,0 +1,5 @@ +import odooApi from '@/core/api/odooApi' + +export const bannerApi = ({ type }) => { + return async () => await odooApi('GET', `/api/v1/banner?type=${type}`) +} diff --git a/src/api/productApi.js b/src/api/productApi.js new file mode 100644 index 00000000..cca052f7 --- /dev/null +++ b/src/api/productApi.js @@ -0,0 +1,10 @@ +import axios from 'axios' + +export const popularProductApi = () => { + return async () => { + const dataPopularProducts = await axios( + `${process.env.NEXT_PUBLIC_SELF_HOST}/api/shop/search?q=*&page=1&orderBy=popular` + ) + return dataPopularProducts.data.response + } +} diff --git a/src/components/skeleton/BannerSkeleton.jsx b/src/components/skeleton/BannerSkeleton.jsx index 3de9c027..7cb3952d 100644 --- a/src/components/skeleton/BannerSkeleton.jsx +++ b/src/components/skeleton/BannerSkeleton.jsx @@ -1,19 +1,20 @@ +import useDevice from '@/core/hooks/useDevice' +import classNames from 'classnames' +import Skeleton from 'react-loading-skeleton' +import 'react-loading-skeleton/dist/skeleton.css' + const HeroBannerSkeleton = () => { + const { isDesktop, isMobile } = useDevice() + + const deviceClassName = { + 'min-h-[460px]': isDesktop, + 'min-h-[230px]': isMobile + } + const defaultClassName = 'h-full' + const combinedClassName = classNames(defaultClassName, deviceClassName) + return ( -
-
- -
- Loading... -
+ ) } diff --git a/src/components/skeleton/PopularProductSkeleton.jsx b/src/components/skeleton/PopularProductSkeleton.jsx new file mode 100644 index 00000000..0aea5c59 --- /dev/null +++ b/src/components/skeleton/PopularProductSkeleton.jsx @@ -0,0 +1,22 @@ +import DesktopView from '@/core/components/views/DesktopView' +import MobileView from '@/core/components/views/MobileView' +import Skeleton from 'react-loading-skeleton' + +const PopularProductSkeleton = () => { + return ( + <> + +
+ + +
+
+ + + + + + ) +} + +export { PopularProductSkeleton } diff --git a/src/components/ui/HeroBanner.jsx b/src/components/ui/HeroBanner.jsx index 1b5bf165..96bd8917 100644 --- a/src/components/ui/HeroBanner.jsx +++ b/src/components/ui/HeroBanner.jsx @@ -9,7 +9,7 @@ import { useMemo } from 'react' import Link from '@/core/components/elements/Link/Link' import Image from '@/core/components/elements/Image/Image' import { useQuery } from 'react-query' -import { BannerApi } from '@/api/BannerApi' +import { bannerApi } from '@/api/bannerApi' import { HeroBannerSkeleton } from '../skeleton/BannerSkeleton' const swiperBanner = { @@ -24,7 +24,7 @@ const swiperBanner = { } const HeroBanner = () => { - const heroBanner = useQuery('heroBanner', BannerApi({ type: 'index-a-1' })) + const heroBanner = useQuery('heroBanner', bannerApi({ type: 'index-a-1' })) const swiperBannerMobile = { ...swiperBanner, diff --git a/src/components/ui/HeroBannerSecondary.jsx b/src/components/ui/HeroBannerSecondary.jsx index a3227002..b1023990 100644 --- a/src/components/ui/HeroBannerSecondary.jsx +++ b/src/components/ui/HeroBannerSecondary.jsx @@ -4,10 +4,10 @@ import Image from 'next/image' import { useMemo } from 'react' import { useQuery } from 'react-query' import { HeroBannerSkeleton } from '../skeleton/BannerSkeleton' -import { BannerApi } from '@/api/BannerApi' +import { bannerApi } from '@/api/bannerApi' const HeroBannerSecondary = () => { - const heroBannerSecondary = useQuery('heroBannerSecondary', BannerApi({ type: 'index-a-2' })) + const heroBannerSecondary = useQuery('heroBannerSecondary', bannerApi({ type: 'index-a-2' })) const randomIndex = useMemo(() => { if (!heroBannerSecondary.data) return null diff --git a/src/components/ui/PopularProduct.jsx b/src/components/ui/PopularProduct.jsx new file mode 100644 index 00000000..211291c8 --- /dev/null +++ b/src/components/ui/PopularProduct.jsx @@ -0,0 +1,44 @@ +import { popularProductApi } from '@/api/productApi' +import MobileView from '@/core/components/views/MobileView' +import ProductSlider from '@/lib/product/components/ProductSlider' +import { useQuery } from 'react-query' +import { PopularProductSkeleton } from '../skeleton/PopularProductSkeleton' +import DesktopView from '@/core/components/views/DesktopView' +import ProductCard from '@/lib/product/components/ProductCard' + +const PopularProduct = () => { + const popularProduct = useQuery('popularProduct', popularProductApi()) + + if (popularProduct.isLoading) return + + return ( + popularProduct.data && ( + <> + +
+
Produk Banyak Dilihat
+ +
+
+ + +
+
+ Produk Banyak Dilihat +
+
+ {popularProduct.data && + popularProduct.data.products.map((product) => ( +
+ +
+ ))} +
+
+
+ + ) + ) +} + +export default PopularProduct diff --git a/src/lib/home/components/PopularProduct.jsx b/src/lib/home/components/PopularProduct.jsx deleted file mode 100644 index 3ce7527e..00000000 --- a/src/lib/home/components/PopularProduct.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import usePopularProduct from '../hooks/usePopularProduct' -import PopularProductSkeleton from './Skeleton/PopularProductSkeleton' -import ProductSlider from '@/lib/product/components/ProductSlider' -import DesktopView from '@/core/components/views/DesktopView' -import MobileView from '@/core/components/views/MobileView' -import ProductCard from '@/lib/product/components/ProductCard' - -const PopularProduct = () => { - const { popularProducts } = usePopularProduct() - - return ( - <> - -
-
Produk Banyak Dilihat
- {popularProducts.isLoading && } - {!popularProducts.isLoading && ( - - )} -
-
- - -
-
- Produk Banyak Dilihat -
-
- {popularProducts.data && - popularProducts.data.products.map((product) => ( -
- -
- ))} -
-
-
- - ) -} - -export default PopularProduct diff --git a/src/lib/home/hooks/usePopularProduct.js b/src/lib/home/hooks/usePopularProduct.js deleted file mode 100644 index d0c34bb0..00000000 --- a/src/lib/home/hooks/usePopularProduct.js +++ /dev/null @@ -1,13 +0,0 @@ -import popularProductApi from '../api/popularProductApi' -import { useQuery } from 'react-query' - -const usePopularProduct = () => { - const fetchPopularProduct = async () => await popularProductApi() - const { data, isLoading } = useQuery('popularProduct', fetchPopularProduct) - - return { - popularProducts: { data, isLoading } - } -} - -export default usePopularProduct diff --git a/src/pages/index.jsx b/src/pages/index.jsx index ea4949b2..43a3b8c9 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -1,29 +1,28 @@ import dynamic from 'next/dynamic' -import ImageSkeleton from '@/core/components/elements/Skeleton/ImageSkeleton' -import PopularProductSkeleton from '@/lib/home/components/Skeleton/PopularProductSkeleton' 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 HeroBannerSecondary from '@/components/ui/HeroBannerSecondary' import { HeroBannerSkeleton } from '@/components/skeleton/BannerSkeleton' +import { PopularProductSkeleton } from '@/components/skeleton/PopularProductSkeleton' const BasicLayout = dynamic(() => import('@/core/components/layouts/BasicLayout')) -const FlashSale = dynamic(() => import('@/lib/flashSale/components/FlashSale')) -const BannerSection = dynamic(() => import('@/lib/home/components/BannerSection')) const HeroBanner = dynamic(() => import('@/components/ui/HeroBanner'), { loading: () => }) -const PreferredBrand = dynamic(() => import('@/lib/home/components/PreferredBrand'), { - loading: () => -}) -const PopularProduct = dynamic(() => import('@/lib/home/components/PopularProduct'), { - loading: () => +const HeroBannerSecondary = dynamic(() => import('@/components/ui/HeroBannerSecondary'), { + loading: () => }) -const CategoryHomeId = dynamic(() => import('@/lib/home/components/CategoryHomeId'), { +const PopularProduct = dynamic(() => import('@/components/ui/PopularProduct'), { loading: () => }) + +const PreferredBrand = dynamic(() => import('@/lib/home/components/PreferredBrand')) + +const FlashSale = dynamic(() => import('@/lib/flashSale/components/FlashSale')) +const BannerSection = dynamic(() => import('@/lib/home/components/BannerSection')) +const CategoryHomeId = dynamic(() => import('@/lib/home/components/CategoryHomeId')) const CustomerReviews = dynamic(() => import('@/lib/review/components/CustomerReviews')) export default function Home() { @@ -51,7 +50,7 @@ export default function Home() {
-
+
-- cgit v1.2.3