From d32ed92902d52934a55cdb9efe110ef11cd920d8 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 16 Aug 2025 09:52:55 +0700 Subject: (andri) make component card mediacard --- src/lib/brand/components/BrandCard.jsx | 1 + src/lib/brand/components/MediaCard.jsx | 42 +++++++ src/lib/home/components/MediaNews.jsx | 137 ++++++++------------- .../home/components/Skeleton/MediaNewsSkeleton.jsx | 21 ++++ 4 files changed, 116 insertions(+), 85 deletions(-) create mode 100644 src/lib/brand/components/MediaCard.jsx create mode 100644 src/lib/home/components/Skeleton/MediaNewsSkeleton.jsx (limited to 'src/lib') diff --git a/src/lib/brand/components/BrandCard.jsx b/src/lib/brand/components/BrandCard.jsx index dff61b24..411e2669 100644 --- a/src/lib/brand/components/BrandCard.jsx +++ b/src/lib/brand/components/BrandCard.jsx @@ -5,6 +5,7 @@ import { createSlug } from '@/core/utils/slug'; const BrandCard = ({ brand }) => { const { isMobile } = useDevice(); + // console.log("Brand logo:", brand.logo); return ( { + const { isMobile } = useDevice(); + +// console.log("Media logo:", media); + + return ( + + {media.image ? ( + + ) : ( + + {media.name} + + )} + + ); +}; + +export default MediaCard; diff --git a/src/lib/home/components/MediaNews.jsx b/src/lib/home/components/MediaNews.jsx index 1e538d48..1c76398f 100644 --- a/src/lib/home/components/MediaNews.jsx +++ b/src/lib/home/components/MediaNews.jsx @@ -1,101 +1,68 @@ -import Link from '@/core/components/elements/Link/Link'; -import Image from 'next/image'; -import { bannerApi } from '@/api/bannerApi'; -import useDevice from '@/core/hooks/useDevice'; import { Swiper, SwiperSlide } from 'swiper/react'; -import BannerPromoSkeleton from '../components/Skeleton/BannerPromoSkeleton'; +import { Navigation, Pagination, Autoplay } from 'swiper'; +import { useEffect, useState, useCallback } from 'react'; +import MediaNewsSkeleton from './Skeleton/MediaNewsSkeleton'; +import MediaCard from '@/lib/brand/components/MediaCard'; +import useDevice from '@/core/hooks/useDevice'; +import Link from '@/core/components/elements/Link/Link'; -import { useEffect, useState } from 'react'; -const { useQuery } = require('react-query'); -const BannerSection = () => { +const MediaNews = () => { + const [isLoading, setIsLoading] = useState(true); + const [media, setMedia] = useState([]); const { isMobile, isDesktop } = useDevice(); - const [data, setData] = useState(null); - const [shouldFetch, setShouldFetch] = useState(false); - const [ isLoading, setIsLoading] = useState(true); - useEffect(() => { - const fetchData = async () => { - try { - const res = await fetch(`/api/hero-banner?type=banner-promotion`); - const { data } = await res.json(); - if (data) { - setData(data); - } - } catch (e) { - console.log(e); - } finally { - setIsLoading(false); - } - }; - fetchData(); + const loadMedia = useCallback(async () => { + try { + setIsLoading(true); + const res = await fetch(`/api/hero-banner?type=media-berita`); + const result = await res.json(); + setMedia(result.data || []); + } catch (err) { + console.error('Failed to load media:', err); + } finally { + setIsLoading(false); + } }, []); - const promotionProgram = data; + useEffect(() => { + loadMedia(); + }, [loadMedia]); - if (isLoading) { - return ; - } + const swiperConfig = { + modules: [Navigation, Pagination, Autoplay], + autoplay: { delay: 4000, disableOnInteraction: false }, + loop: true, + className: 'h-[70px] md:h-[100px] w-full', + slidesPerView: isMobile ? 4 : 8, + spaceBetween: isMobile ? 12 : 0, + pagination: { dynamicBullets: true, dynamicMainBullets: isMobile ? 6 : 8, clickable: true }, + }; - if (!promotionProgram || promotionProgram.length === 0) { - return null; - } + const preferredMediaData = media.slice(0, 20); return ( -
-
-

- {' '} - - Promo Tersedia +
+
+

+ + Media Berita

- {isDesktop && ( - - Lihat Semua - - )} - {isMobile && ( - - Lihat Semua - - )} + + Lihat Semua +
- {isDesktop && promotionProgram && promotionProgram?.length > 0 && ( -
- {promotionProgram?.map((banner) => ( - - {banner.name} - - ))} -
- )} - {isMobile && ( - - {promotionProgram?.map((banner) => ( - - - {banner.name} - + {isLoading ? ( + + ) : ( + + {preferredMediaData.map((item) => ( + + ))} @@ -104,4 +71,4 @@ const BannerSection = () => { ); }; -export default BannerSection; +export default MediaNews; diff --git a/src/lib/home/components/Skeleton/MediaNewsSkeleton.jsx b/src/lib/home/components/Skeleton/MediaNewsSkeleton.jsx new file mode 100644 index 00000000..c0151efd --- /dev/null +++ b/src/lib/home/components/Skeleton/MediaNewsSkeleton.jsx @@ -0,0 +1,21 @@ +import useDevice from '@/core/hooks/useDevice' +import Skeleton from 'react-loading-skeleton' + +const MediaNewsSkeleton = () => { + const { isDesktop } = useDevice() + + return ( +
+ {Array.from({ length: isDesktop ? 8 : 4 }, (_, index) => ( + + ))} +
+ ) +} + +export default MediaNewsSkeleton -- cgit v1.2.3