1- import { Progress , Button , sendGAEvent } from '@pinback/design-system/ui' ;
2- import { useState , useEffect , lazy , Suspense } from 'react' ;
1+ import { Progress , Button } from '@pinback/design-system/ui' ;
2+ import { lazy , Suspense } from 'react' ;
33import { motion , AnimatePresence } from 'framer-motion' ;
44import SocialLoginStep from './step/SocialLoginStep' ;
55const StoryStep = lazy ( ( ) => import ( './step/StoryStep' ) ) ;
@@ -8,21 +8,13 @@ const AlarmStep = lazy(() => import('./step/AlarmStep'));
88const MacStep = lazy ( ( ) => import ( './step/MacStep' ) ) ;
99const FinalStep = lazy ( ( ) => import ( './step/FinalStep' ) ) ;
1010import { cva } from 'class-variance-authority' ;
11- import { usePostSignUp } from '@shared/apis/queries' ;
12- import { useNavigate , useLocation } from 'react-router-dom' ;
13- import { firebaseConfig } from '../../../../firebase-config' ;
14- import { initializeApp } from 'firebase/app' ;
15- import { getMessaging , getToken } from 'firebase/messaging' ;
16- import { registerServiceWorker } from '@pages/onBoarding/utils/registerServiceWorker' ;
17- import { AlarmsType } from '@constants/alarms' ;
18- import { normalizeTime } from '@pages/onBoarding/utils/formatRemindTime' ;
1911const stepProgress = [ { progress : 33 } , { progress : 66 } , { progress : 100 } ] ;
2012import {
2113 Step ,
22- stepOrder ,
2314 StepType ,
2415 storySteps ,
2516} from '@pages/onBoarding/constants/onboardingSteps' ;
17+ import { useOnboardingFunnel } from '@pages/onBoarding/hooks/useOnboardingFunnel' ;
2618
2719const variants = {
2820 slideIn : ( direction : number ) => ( {
@@ -50,78 +42,16 @@ const CardStyle = cva(
5042) ;
5143
5244const MainCard = ( ) => {
53- const navigate = useNavigate ( ) ;
54- const location = useLocation ( ) ;
55- const { mutate : postSignData } = usePostSignUp ( ) ;
56-
57- const [ step , setStep ] = useState < StepType > ( Step . STORY_0 ) ;
58- const [ direction , setDirection ] = useState ( 0 ) ;
59- const [ alarmSelected , setAlarmSelected ] = useState < 1 | 2 | 3 > ( 1 ) ;
60- const [ isMac , setIsMac ] = useState ( false ) ;
61- const [ userEmail , setUserEmail ] = useState ( '' ) ;
62- const [ remindTime , setRemindTime ] = useState ( '09:00' ) ;
63- const [ fcmToken , setFcmToken ] = useState < string | null > ( null ) ;
64- const [ jobShareAgree , setJobShareAgree ] = useState ( true ) ;
65-
66- useEffect ( ( ) => {
67- const params = new URLSearchParams ( location . search ) ;
68- const storedEmail = localStorage . getItem ( 'email' ) ;
69- if ( storedEmail ) {
70- setUserEmail ( storedEmail ) ;
71- }
72-
73- const stepParam = params . get ( 'step' ) as StepType ;
74- if ( stepParam && Object . values ( Step ) . includes ( stepParam ) ) {
75- setStep ( stepParam ) ;
76- }
77- } , [ location . search ] ) ;
78-
79- const app = initializeApp ( firebaseConfig ) ;
80- const messaging = getMessaging ( app ) ;
81-
82- const requestFCMToken = async ( ) : Promise < string | null > => {
83- try {
84- const permission = await Notification . requestPermission ( ) ;
85- registerServiceWorker ( ) ;
86-
87- if ( permission !== 'granted' ) {
88- alert ( '알림 권한 허용이 필요합니다!' ) ;
89- return null ;
90- }
91-
92- const forFcmtoken = await getToken ( messaging , {
93- vapidKey : import . meta. env . VITE_FIREBASE_VAPID_KEY ,
94- } ) ;
95-
96- if ( forFcmtoken ) {
97- return forFcmtoken ;
98- } else {
99- alert ( '토큰 생성 실패. 다시 시도해주세요.' ) ;
100- return null ;
101- }
102- } catch ( error ) {
103- console . error ( 'FCM 토큰 받는 도중 오류:' , error ) ;
104- alert ( '알림 설정 중 오류가 발생했습니다. 다시 시도해주세요.' ) ;
105- return null ;
106- }
107- } ;
108-
109- useEffect ( ( ) => {
110- const ua = navigator . userAgent . toLowerCase ( ) ;
111- if ( ua . includes ( 'mac os' ) || ua . includes ( 'iphone' ) || ua . includes ( 'ipad' ) ) {
112- setIsMac ( true ) ;
113- }
114-
115- ( async ( ) => {
116- const token = await requestFCMToken ( ) ;
117- if ( token ) {
118- setFcmToken ( token ) ;
119- localStorage . setItem ( 'FcmToken' , token ) ;
120- } else {
121- alert ( '푸시 알람 설정 에러' ) ;
122- }
123- } ) ( ) ;
124- } , [ ] ) ;
45+ const {
46+ step,
47+ direction,
48+ alarmSelected,
49+ jobShareAgree,
50+ setAlarmSelected,
51+ setJobShareAgree,
52+ nextStep,
53+ prevStep,
54+ } = useOnboardingFunnel ( ) ;
12555
12656 const renderStep = ( ) => {
12757 switch ( step ) {
@@ -153,64 +83,6 @@ const MainCard = () => {
15383 }
15484 } ;
15585
156- const nextStep = async ( ) => {
157- const idx = stepOrder . indexOf ( step ) ;
158- const next = stepOrder [ idx + 1 ] ;
159- const isAlarmStep = step === Step . ALARM ;
160- const isFinalStep = step === Step . FINAL ;
161- const isMacStep = next === Step . MAC ;
162- const shouldSkipMacStep = isMacStep && ! isMac ;
163-
164- if ( isAlarmStep ) {
165- if ( alarmSelected === 1 ) setRemindTime ( '09:00' ) ;
166- else if ( alarmSelected === 2 ) setRemindTime ( '20:00' ) ;
167- else {
168- const raw = AlarmsType [ alarmSelected - 1 ] . time ;
169- setRemindTime ( normalizeTime ( raw ) ) ;
170- }
171- }
172-
173- if ( shouldSkipMacStep ) {
174- setDirection ( 1 ) ;
175- setStep ( Step . FINAL ) ;
176- navigate ( `/onboarding?step=${ Step . FINAL } ` ) ;
177- return ;
178- }
179-
180- if ( isFinalStep ) {
181- postSignData (
182- { email : userEmail , remindDefault : remindTime , fcmToken } ,
183- {
184- onSuccess : ( ) => ( window . location . href = '/' ) ,
185- onError : ( ) => {
186- const savedEmail = localStorage . getItem ( 'email' ) ;
187- if ( savedEmail ) window . location . href = '/' ;
188- } ,
189- }
190- ) ;
191- return ;
192- }
193-
194- setDirection ( 1 ) ;
195- setStep ( next ) ;
196- navigate ( `/onboarding?step=${ next } ` ) ;
197- sendGAEvent (
198- `onboard-step-${ idx + 1 } ` ,
199- `onboard-step-${ idx + 1 } ` ,
200- `onboard-step-${ idx + 1 } `
201- ) ;
202- } ;
203-
204- const prevStep = ( ) => {
205- const idx = stepOrder . indexOf ( step ) ;
206- if ( idx > 0 ) {
207- const previous = stepOrder [ idx - 1 ] ;
208- setDirection ( - 1 ) ;
209- setStep ( previous ) ;
210- navigate ( `/onboarding?step=${ previous } ` ) ;
211- }
212- } ;
213-
21486 return (
21587 < div
21688 className = { CardStyle ( {
0 commit comments