From c82f37fbb57c1ab03a1ba8876745163b8d611312 Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Wed, 29 Oct 2025 14:28:47 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=98=EB=8B=A8=20=EB=B0=B0=EB=84=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entities/home/model/types.ts | 19 +++++-- src/entities/home/ui/home-banner-list.tsx | 5 +- src/entities/home/ui/home-bottom-banner.tsx | 62 ++++++++++++++++++--- src/locales/ko.json | 1 + src/pages/home/home-page.tsx | 46 +++++++++++++-- src/shared/ui/filter/select-mid.tsx | 55 ++++++++++++++++++ 6 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 src/shared/ui/filter/select-mid.tsx diff --git a/src/entities/home/model/types.ts b/src/entities/home/model/types.ts index 394eecc..fad9768 100644 --- a/src/entities/home/model/types.ts +++ b/src/entities/home/model/types.ts @@ -6,6 +6,7 @@ import { export interface HomeBottomBannerProps { setBottomBannerOn: (bottomBannerOn: boolean) => void; bottomBannerOn: boolean; + bannerList: Array; }; export interface AuthRegisterProps { setAuthRegisterOn: (authRegisterOn: boolean) => void; @@ -79,14 +80,20 @@ export interface HomeGroupsParams { export interface HomeGroupsResponse { mids: Array; }; -export interface HomeBannerListParams {}; + +export enum BannerType { + MAIN = 'MAIN', + BOTTOM = 'BOTTOM' +}; +export interface HomeBannerListParams { + bannerType: BannerType; +}; export interface HomeBannerListResponse { bannerList: Array }; export interface BannerList { - bannerId: number; - title: string; - imageUrl: string; - linkUrl: string; - priority: number; + title?: string; + imageUrl?: string; + linkUrl?: string; + order?: number; }; \ No newline at end of file diff --git a/src/entities/home/ui/home-banner-list.tsx b/src/entities/home/ui/home-banner-list.tsx index a5ee6e1..774829a 100644 --- a/src/entities/home/ui/home-banner-list.tsx +++ b/src/entities/home/ui/home-banner-list.tsx @@ -7,6 +7,7 @@ import { IMAGE_ROOT } from '@/shared/constants/common'; import { useHomeBannerListMutation } from '../api/use-home-banner-list-mutation'; import { BannerList, + BannerType, HomeBannerListParams, HomeBannerListResponse } from '../model/types'; @@ -18,7 +19,9 @@ export const HomeBannerList = () => { const [bannerList, setBannerList] = useState>([]); const callHomeBannerList = () => { - let params: HomeBannerListParams = {}; + let params: HomeBannerListParams = { + bannerType: BannerType.MAIN + }; homeBannerList(params).then((rs: HomeBannerListResponse) => { console.log(rs); diff --git a/src/entities/home/ui/home-bottom-banner.tsx b/src/entities/home/ui/home-bottom-banner.tsx index 2cfcd13..bf54b59 100644 --- a/src/entities/home/ui/home-bottom-banner.tsx +++ b/src/entities/home/ui/home-bottom-banner.tsx @@ -8,14 +8,19 @@ import { HomeBottomBannerProps } from '../model/types'; import { useStore } from '@/shared/model/store'; import { BottomSheetMotionDuration, BottomSheetMotionVaiants } from '@/entities/common/model/constant'; import { useEffect, useState } from 'react'; +import { Swiper, SwiperSlide } from 'swiper/react'; +import 'swiper/css'; +import { Autoplay, Pagination } from 'swiper/modules'; export const HomeBottomBanner = ({ setBottomBannerOn, - bottomBannerOn + bottomBannerOn, + bannerList }: HomeBottomBannerProps) => { const { navigate } = useNavigate(); const [isFirstOpen, setIsFirstOpen] = useState(false); + const [currentSlide, setCurrentSlide] = useState(1); const onClickToClose = () => { setBottomBannerOn(false); @@ -30,6 +35,13 @@ export const HomeBottomBanner = ({ onClickToClose(); }; + const swiperPagination = { + type: 'fraction', + currentClass: 'current', + totalClass: 'total', + el: '.banner-page' + }; + useEffect(() => { let bannerInfo = useStore.getState().BannerStore.bannerInfo; if(!!bannerInfo.HomneBottomBanner){ @@ -43,7 +55,7 @@ export const HomeBottomBanner = ({ return ( <> - {bottomBannerOn && isFirstOpen && + { bottomBannerOn && isFirstOpen &&
}
- 배너 -
- 1 + + { bannerList.map((value, index) => ( + + { + + )) + } + +
+ / - 3 +
diff --git a/src/locales/ko.json b/src/locales/ko.json index 5092fa6..b3a8c9b 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -125,6 +125,7 @@ "inquiryButton": "1:1 문의하기", "categories": { "all": "모두", + "00": "TOP 10", "01": "계약", "02": "취소", "03": "정산/세금계산서", diff --git a/src/pages/home/home-page.tsx b/src/pages/home/home-page.tsx index 3aeb1f9..b8e748f 100644 --- a/src/pages/home/home-page.tsx +++ b/src/pages/home/home-page.tsx @@ -17,6 +17,9 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; import { useStore } from '@/shared/model/store'; import { UserFavorite } from '@/entities/user/model/types'; +import { useHomeBannerListMutation } from '@/entities/home/api/use-home-banner-list-mutation'; +import { BannerList, BannerType, HomeBannerListParams, HomeBannerListResponse } from '@/entities/home/model/types'; +import { IMAGE_ROOT } from '@/shared/constants/common'; export let homeReloadKey = 1; export const setHomeReloadKey = () => { @@ -25,6 +28,7 @@ export const setHomeReloadKey = () => { export const HomePage = () => { const { openBiometricRegistrationPopup } = useAppBridge(); + const { mutateAsync: homeBannerList } = useHomeBannerListMutation(); useSetHeaderTitle(''); useSetHeaderType(HeaderType.Home); @@ -37,7 +41,35 @@ export const HomePage = () => { const [bottomBannerOn, setBottomBannerOn] = useState(false); const [authRegisterOn, setAuthRegisterOn] = useState(false); const [favoriteItems, setFavoriteItems] = useState>([]); + const [bannerList, setBannerList] = useState>([]); + + const callHomeBannerList = () => { + let params: HomeBannerListParams = { + bannerType: BannerType.BOTTOM + }; + + homeBannerList(params).then((rs: HomeBannerListResponse) => { + console.log(rs); + if(rs.bannerList && rs.bannerList.length > 0){ + setBannerList(rs.bannerList); + } + else{ + setBannerList([]); + } + }).finally(() => { + /* + let items = [ + {title: '배너 이미지1', imageUrl: IMAGE_ROOT + '/sample_banner_0.png', linkUrl: 'http://www.google.com', order: 3}, + {title: '배너 이미지2', imageUrl: IMAGE_ROOT + '/home-banner01.png', linkUrl: 'http://www.naver.com', order: 1}, + {title: '배너 이미지3', imageUrl: IMAGE_ROOT + '/home-banner01.png', linkUrl: 'http://www.daum.net', order: 2}, + ]; + items.sort((a, b) => a.order - b.order); + setBannerList(items); + */ + }); + }; + const checkBottomBannerOpen = () => { if(!!bannerToday){ bannerToday = bannerToday.toString(); @@ -74,6 +106,7 @@ export const HomePage = () => { let userFavorite = useStore.getState().UserStore.userFavorite; setFavoriteItems(userFavorite); + callHomeBannerList(); }, []); @@ -103,11 +136,14 @@ export const HomePage = () => {
- - { (!bottomBannerOn) && + { !!bannerList && bannerList.length > 0 && + + } + { (!bottomBannerOn) && void; +}; +export const FilterSelectMid = ({ + title, + selectValue, + selectSetter, +}: FilterSelectMidProps) => { + const midOptions = useStore.getState().UserStore.selectOptionsMids; + const userMid = useStore.getState().UserStore.mid; + + const [filterMid, setFilterMid] = useState(userMid); + + const getSelectMidOptions = () => { + let rs = []; + for(let i=0;i{ midOptions[i]?.name } + ); + } + return rs; + }; + const onChangeMidSelect = (val: string) => { + setFilterMid(val); + }; + + useEffect(() => { + + }, [filterMid]); + + return ( + <> +
+
{ title }
+
+ +
+
+ + ); +}; \ No newline at end of file