From 33da0fcb718335eb1d077af4321ac65e0146a2d6 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 22 May 2023 11:58:05 +0700 Subject: Refactoring hero banner feature --- src/components/skeleton/BannerSkeleton.jsx | 20 ++++++++++ src/components/ui/HeroBanner.jsx | 64 ++++++++++++++++++++++++++++++ src/components/ui/HeroBannerSecondary.jsx | 35 ++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 src/components/skeleton/BannerSkeleton.jsx create mode 100644 src/components/ui/HeroBanner.jsx create mode 100644 src/components/ui/HeroBannerSecondary.jsx (limited to 'src/components') diff --git a/src/components/skeleton/BannerSkeleton.jsx b/src/components/skeleton/BannerSkeleton.jsx new file mode 100644 index 00000000..3de9c027 --- /dev/null +++ b/src/components/skeleton/BannerSkeleton.jsx @@ -0,0 +1,20 @@ +const HeroBannerSkeleton = () => { + return ( +
+
+ +
+ Loading... +
+ ) +} + +export { HeroBannerSkeleton } diff --git a/src/components/ui/HeroBanner.jsx b/src/components/ui/HeroBanner.jsx new file mode 100644 index 00000000..1b5bf165 --- /dev/null +++ b/src/components/ui/HeroBanner.jsx @@ -0,0 +1,64 @@ +import DesktopView from '@/core/components/views/DesktopView' +import MobileView from '@/core/components/views/MobileView' +import { Swiper, SwiperSlide } from 'swiper/react' +import { Pagination, Autoplay } from 'swiper' +import 'swiper/css' +import 'swiper/css/pagination' +import 'swiper/css/autoplay' +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 { HeroBannerSkeleton } from '../skeleton/BannerSkeleton' + +const swiperBanner = { + autoplay: { + delay: 6000, + disableOnInteraction: false + }, + modules: [Pagination, Autoplay], + loop: true, + className: 'border border-gray_r-6', + slidesPerView: 1 +} + +const HeroBanner = () => { + const heroBanner = useQuery('heroBanner', BannerApi({ type: 'index-a-1' })) + + const swiperBannerMobile = { + ...swiperBanner, + pagination: { dynamicBullets: true, clickable: true } + } + + const swiperBannerDesktop = { + ...swiperBanner, + pagination: { dynamicBullets: false, clickable: true } + } + + const BannerComponent = useMemo(() => { + return heroBanner.data?.map((banner, index) => ( + + + {banner.name} + + + )) + }, [heroBanner.data]) + + if (heroBanner.isLoading) return + + return ( + <> + + {BannerComponent} + + + + {BannerComponent} + + + ) +} + +export default HeroBanner diff --git a/src/components/ui/HeroBannerSecondary.jsx b/src/components/ui/HeroBannerSecondary.jsx new file mode 100644 index 00000000..a3227002 --- /dev/null +++ b/src/components/ui/HeroBannerSecondary.jsx @@ -0,0 +1,35 @@ +import Link from '@/core/components/elements/Link/Link' +import { getRandomInt } from '@/utils/getRandomInt' +import Image from 'next/image' +import { useMemo } from 'react' +import { useQuery } from 'react-query' +import { HeroBannerSkeleton } from '../skeleton/BannerSkeleton' +import { BannerApi } from '@/api/BannerApi' + +const HeroBannerSecondary = () => { + const heroBannerSecondary = useQuery('heroBannerSecondary', BannerApi({ type: 'index-a-2' })) + + const randomIndex = useMemo(() => { + if (!heroBannerSecondary.data) return null + const length = heroBannerSecondary.data?.length + return getRandomInt(length) + }, [heroBannerSecondary.data]) + + if (heroBannerSecondary.isLoading) return + + return ( + heroBannerSecondary.data && ( + + {heroBannerSecondary.data[randomIndex].name} + + ) + ) +} + +export default HeroBannerSecondary -- cgit v1.2.3