diff --git a/src/app/home/components/Banners3.tsx b/src/app/home/components/Banners3.tsx index 5f06c6d..3b69179 100644 --- a/src/app/home/components/Banners3.tsx +++ b/src/app/home/components/Banners3.tsx @@ -1,35 +1,83 @@ 'use client' -import { FC } from 'react' -import { useGetLanding } from '../hooks/useHomeData' import Image from 'next/image' import Link from 'next/link' +import { FC, useMemo } from 'react' + +import { IBanner } from '@/types/landing.types' +import { useGetLanding } from '@/app/home/hooks/useHomeData' const Banners3: FC = () => { const { data } = useGetLanding() - const sortedBanners = data?.results?.banners?.sort((a, b) => a.order - b.order) || [] + const { desktopBanners, mobileBanners } = useMemo(() => { + const allBanners = data?.results?.banners ?? [] + + const sortByOrder = (items: IBanner[]) => + [...items].sort((firstBanner, secondBanner) => firstBanner.order - secondBanner.order) + + const groupByDisplayLocation = (displayLocation: IBanner['displayLocation']) => + sortByOrder(allBanners.filter((banner) => banner.displayLocation === displayLocation)) + + return { + desktopBanners: groupByDisplayLocation('desktop'), + mobileBanners: groupByDisplayLocation('mobile'), + } + }, [data?.results?.banners]) + + const renderLayout = (banners: IBanner[]) => { + if (banners.length < 3) return null + + const [firstBanner, secondBanner, thirdBanner] = banners + + if (!firstBanner?.imageUrl || !secondBanner?.imageUrl || !thirdBanner?.imageUrl) return null + + return ( +
+
+
+ + {firstBanner.altText} + +
+
+ + {secondBanner.altText} + +
+
+
+ + {thirdBanner.altText} + +
+
+ ) + } return ( -
-
-
- - {sortedBanners[1]?.altText - -
-
- - {sortedBanners[2]?.altText - -
-
-
- - {sortedBanners[0]?.altText - -
-
+ <> +
{renderLayout(desktopBanners)}
+
{renderLayout(mobileBanners)}
+ ) } diff --git a/src/app/home/components/Banners4.tsx b/src/app/home/components/Banners4.tsx index 2809397..514f96e 100644 --- a/src/app/home/components/Banners4.tsx +++ b/src/app/home/components/Banners4.tsx @@ -1,43 +1,101 @@ 'use client' -import { FC } from 'react' -import { useGetLanding } from '../hooks/useHomeData' import Image from 'next/image' import Link from 'next/link' +import { FC, useMemo } from 'react' + +import { IBanner } from '@/types/landing.types' +import { useGetLanding } from '@/app/home/hooks/useHomeData' const Banners4: FC = () => { const { data } = useGetLanding() - const sortedBanners = data?.results?.banners?.sort((a, b) => a.order - b.order) || [] + const { desktopBanners, mobileBanners } = useMemo(() => { + const allBanners = data?.results?.banners ?? [] + const sortByOrder = (items: IBanner[]) => + [...items].sort((firstBanner, secondBanner) => firstBanner.order - secondBanner.order) + + const groupByDisplayLocation = (displayLocation: IBanner['displayLocation']) => + sortByOrder(allBanners.filter((banner) => banner.displayLocation === displayLocation)) + + return { + desktopBanners: groupByDisplayLocation('desktop'), + mobileBanners: groupByDisplayLocation('mobile'), + } + }, [data?.results?.banners]) + + const renderLayout = (banners: IBanner[]) => { + if (banners.length < 4) return null + + const [firstBanner, secondBanner, thirdBanner, fourthBanner] = banners + + if ( + !firstBanner?.imageUrl || + !secondBanner?.imageUrl || + !thirdBanner?.imageUrl || + !fourthBanner?.imageUrl + ) + return null + + return ( +
+
+ + {firstBanner.altText} + +
+ +
+
+ + {secondBanner.altText} + +
+
+ + {thirdBanner.altText} + +
+
+ +
+ + {fourthBanner.altText} + +
+
+ ) + } return ( -
-
- - {data?.results?.banners?.[0]?.altText - -
- -
-
- - {data?.results?.banners?.[0]?.altText - -
-
- - {data?.results?.banners?.[0]?.altText - -
-
- -
- - {data?.results?.banners?.[0]?.altText - -
- -
+ <> +
{renderLayout(desktopBanners)}
+
{renderLayout(mobileBanners)}
+ ) } diff --git a/src/types/landing.types.ts b/src/types/landing.types.ts index ce2c158..74d62bf 100644 --- a/src/types/landing.types.ts +++ b/src/types/landing.types.ts @@ -157,6 +157,7 @@ export interface IBanner { linkUrl: string; isActive: boolean; order: number; + displayLocation: "desktop" | "mobile"; createdAt: string; updatedAt: string; }