11import Header from '@/components/Header'
22import useEmblaCarousel from 'embla-carousel-react'
33import { twMerge } from 'tailwind-merge'
4- import FirstSlide from './FirstSlide'
5- import SecondSlide from './SecondSlide'
6- import ThirdSlide from './ThirdSlide'
74import useAuthStore from '@/stores/authStore'
85import { useDotButton } from '@/hooks/useDotButton'
96import SolidButton from '@/components/SolidButton'
107import { shareLink } from '@/utils/shareLink'
118import { useEffect } from 'react'
129import { useQueryClient } from '@tanstack/react-query'
10+ import Slide from './Slide'
1311
1412export default function Onboarding ( ) {
1513 const nickname = useAuthStore ( ( state ) => state . user ) ?. nickname ?? ''
1614 const [ emblaRef , emblaApi ] = useEmblaCarousel ( )
1715 const { selectedIndex, scrollSnaps, onDotButtonClick } = useDotButton ( emblaApi )
1816 const queryClient = useQueryClient ( )
1917
18+ const SLIDE_DATA = [
19+ {
20+ title : `${ nickname } 님, 어두웠던 아파트를\n밝혀주셨어요` ,
21+ subtitle : '이제 가족, 친구들과 함께 더 많은 불빛을 켜볼까요?' ,
22+ windowObj : { 0 : nickname } ,
23+ } ,
24+ {
25+ title : `공유하기 버튼을 눌러\n친구에게 초대 링크를 보내고` ,
26+ windowObj : { 0 : nickname , 7 : '내 친구' , 9 : '내 친구' } ,
27+ } ,
28+ {
29+ title : `친구가 감사메시지를 남기면\n불빛이 켜져요` ,
30+ subtitle : '함께하는 사람마다 불빛이 하나씩 늘어날거에요' ,
31+ windowObj : { 0 : nickname , 7 : '내 친구' , 9 : '내 친구' , 2 : '' } ,
32+ } ,
33+ {
34+ title : `${ nickname } 님의 공유 한 번이\n이 도시를 빛나게 할거에요` ,
35+ subtitle : `익숙하지 않은 이름이 보여도 놀라지 마세요\n${ nickname } 님의 선한 영향력을 받은 분이에요` ,
36+ windowObj : {
37+ 0 : nickname ,
38+ 7 : '내 친구' ,
39+ 9 : '내 친구' ,
40+ 2 : '' ,
41+ 8 : '' ,
42+ } ,
43+ } ,
44+ {
45+ title : `자, 이제 친구들에게\n공유해볼까요?` ,
46+ windowObj : {
47+ 0 : nickname ,
48+ 7 : '내 친구' ,
49+ 9 : '내 친구' ,
50+ 2 : '' ,
51+ 5 : '' ,
52+ 8 : '' ,
53+ } ,
54+ } ,
55+ ]
56+
2057 useEffect ( ( ) => {
2158 document . body . style . overflowY = 'hidden'
2259 return ( ) => {
@@ -34,23 +71,33 @@ export default function Onboarding() {
3471 return (
3572 < >
3673 < Header className = "bg-[#14192F]" prevPath = "/" />
74+ < div className = "px-5" >
75+ < div className = "h-[2px] w-full rounded-full bg-white/20" >
76+ < div
77+ className = "tras h-full rounded-full bg-brand-yellow transition-all duration-300 ease-out"
78+ style = { { width : `calc(100% * (${ selectedIndex } + 1) / ${ SLIDE_DATA . length } )` } }
79+ />
80+ </ div >
81+ </ div >
3782 < main className = "flex grow flex-col pt-[7%] text-center" >
3883 < div className = "absolute left-1/2 top-[10px] z-[-10] h-[350px] w-screen -translate-x-1/2 bg-star-top bg-cover bg-center" />
3984 < div className = "absolute left-1/2 top-[325px] z-[-10] h-[390px] w-screen -translate-x-1/2 bg-star-bottom bg-cover bg-center" />
4085 < section className = "flex w-full grow flex-col" >
4186 < div className = "flex grow flex-col overflow-hidden" ref = { emblaRef } >
4287 < div className = "flex grow touch-pan-y touch-pinch-zoom" >
43- < FirstSlide nickname = { nickname } />
44- < SecondSlide nickname = { nickname } />
45- < ThirdSlide nickname = { nickname } />
88+ { SLIDE_DATA . map ( ( { title , subtitle , windowObj } ) => (
89+ < Slide key = { title } title = { title } subtitle = { subtitle } windowObj = { windowObj } />
90+ ) ) }
4691 </ div >
4792 </ div >
4893 < SolidButton
4994 variant = "primary"
5095 size = "large"
5196 className = { twMerge (
5297 'fixed bottom-[5%] left-1/2 z-20 w-[175px] -translate-x-1/2 rounded-full px-[30px] py-4 drop-shadow-[0_15px_25px_rgba(0,0,0,0.35)] transition-opacity duration-300' ,
53- selectedIndex === 2 ? 'opacity-100' : 'pointer-events-none opacity-0'
98+ selectedIndex === SLIDE_DATA . length - 1
99+ ? 'opacity-100'
100+ : 'pointer-events-none opacity-0'
54101 ) }
55102 onClick = { ( ) => {
56103 shareLink ( nickname )
0 commit comments