Files
nice-app-web/src/entities/home/ui/home-bottom-banner.tsx
Jay Sheen 07bb149444 Add i18n localization to home entity
- Add translation keys to home namespace:
  - home.banner.doNotShowToday: Banner "don't show today" button
  - home.banner.close: Banner close button
  - home.biometricRegistration.*: Biometric registration dialog
  - home.notice.goTo: Notice item navigation label

- Localize 3 UI components:
  - ui/home-bottom-banner.tsx: Banner bottom sheet buttons
  - ui/home-notice-item.tsx: Notice item alt text
  - ui/auth-reguster.tsx: Biometric registration dialog

- All other home components already localized

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 18:12:18 +09:00

121 lines
3.6 KiB
TypeScript

import moment from 'moment';
import { motion } from 'framer-motion';
import { IMAGE_ROOT } from '@/shared/constants/common';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { StorageKeys } from '@/shared/constants/local-storage';
import { setLocalStorage } from '@/shared/lib/web-view-bridge';
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';
import { useTranslation } from 'react-i18next';
export const HomeBottomBanner = ({
setBottomBannerOn,
bottomBannerOn,
bannerList
}: HomeBottomBannerProps) => {
const { navigate } = useNavigate();
const { t } = useTranslation();
const [isFirstOpen, setIsFirstOpen] = useState<boolean>(false);
const [currentSlide, setCurrentSlide] = useState<number>(1);
const onClickToClose = () => {
setBottomBannerOn(false);
useStore.getState().BannerStore.setBannerInfo({
HomneBottomBanner: true
});
};
const onClickToCloseDay = () => {
// 오늘 날짜 기록
const today = moment().format('YYYYMMDD');
setLocalStorage(StorageKeys.BottomBannerClose, today);
onClickToClose();
};
const swiperPagination = {
type: 'fraction',
currentClass: 'current',
totalClass: 'total',
el: '.banner-page'
};
useEffect(() => {
let bannerInfo = useStore.getState().BannerStore.bannerInfo;
if(!!bannerInfo.HomneBottomBanner){
setIsFirstOpen(false);
}
else{
setIsFirstOpen(true);
}
}, [bottomBannerOn]);
return (
<>
{ bottomBannerOn && isFirstOpen &&
<div className="bg-dim"></div>
}
<motion.div
className="bottomsheet banner"
initial="hidden"
animate={ (bottomBannerOn && isFirstOpen)? 'visible': 'hidden' }
variants={ BottomSheetMotionVaiants }
transition={ BottomSheetMotionDuration }
>
<div className="bottomsheet-content">
<Swiper
modules={[Pagination, Autoplay]}
slidesPerView={ 1 }
pagination={{
type: 'fraction',
currentClass: 'current',
totalClass: 'total',
el: '.banner-page'
}}
style={{ height: '300px' }}
>
{ bannerList.map((value, index) => (
<SwiperSlide key={ `favorite-slide-key-${index}` }>
<img
src={ value.imageUrl }
alt={ value.title }
style={{
objectFit: 'contain',
width: '100%',
height: '100%'
}}
/>
</SwiperSlide>
))
}
</Swiper>
<div
className="banner-page"
style={{
zIndex: 20,
bottom: 'unset',
top: '15px',
left: 'unset',
width: 'unset',
color: 'var(--color-999999)'
}}
>
<span className="current"></span>
/
<span className="total"></span>
</div>
</div>
<div className="bottom-btn">
<span onClick={ () => onClickToCloseDay() }>{t('home.banner.doNotShowToday')}</span>
<span onClick={ () => onClickToClose() }>{t('home.banner.close')}</span>
</div>
</motion.div>
</>
);
};