1- /* eslint-disable react-hooks/exhaustive-deps */
21/* eslint-disable no-restricted-imports */
3- import { useEffect , useState } from 'react' ;
2+ import { useEffect , useRef , useState } from 'react' ;
43import { isKoinError } from '@bcsdlab/koin' ;
54import { useMutation } from '@tanstack/react-query' ;
65import { checkPhone , smsSend , smsVerify } from 'api/auth' ;
@@ -52,6 +51,7 @@ function MobileVerification({ onNext }: MobileVerificationProps) {
5251 const [ isVerified , enableVerified ] = useBooleanState ( false ) ;
5352 const [ isCodeCorrect , setCorrect , setIncorrect ] = useBooleanState ( false ) ;
5453 const [ smsSendCountData , setSmsSendCountData ] = useState < SmsSendCountData | null > ( null ) ;
54+ const verificationMessageTimerRef = useRef < ReturnType < typeof setTimeout > | null > ( null ) ;
5555
5656 const {
5757 isRunning : isTimer ,
@@ -65,12 +65,24 @@ function MobileVerification({ onNext }: MobileVerificationProps) {
6565 } ,
6666 } ) ;
6767
68+ const clearVerificationMessageTimer = ( ) => {
69+ if ( verificationMessageTimerRef . current ) {
70+ clearTimeout ( verificationMessageTimerRef . current ) ;
71+ verificationMessageTimerRef . current = null ;
72+ }
73+ } ;
74+
6875 const { mutate : sendSMSToUser } = useMutation ( {
6976 mutationFn : smsSend ,
7077 onSuccess : ( data : SmsSendResponse ) => {
78+ clearVerificationMessageTimer ( ) ;
7179 setPhoneMessage ( { type : 'success' , content : MESSAGES . PHONE . CODE_SENT } ) ;
7280 runTimer ( ) ;
7381 showVerification ( ) ;
82+ clearVerificationMessageTimer ( ) ;
83+ verificationMessageTimerRef . current = setTimeout ( ( ) => {
84+ setVerificationMessage ( { type : 'default' , content : MESSAGES . VERIFICATION . DEFAULT } ) ;
85+ } , 60000 ) ;
7486 setSmsSendCountData ( {
7587 total_count : data . total_count ,
7688 remaining_count : data . remaining_count ,
@@ -149,21 +161,20 @@ function MobileVerification({ onNext }: MobileVerificationProps) {
149161 } ) ;
150162 } ;
151163
152- const isNameAndGenderFilled = name ?. trim ( ) && gender ?. length > 0 ;
153-
154- useEffect ( ( ) => {
164+ const resetVerificationState = ( ) => {
165+ clearVerificationMessageTimer ( ) ;
155166 disableButton ( ) ;
156167 stopTimer ( ) ;
157168 setVerificationMessage ( null ) ;
158169 setPhoneMessage ( null ) ;
159170 setIncorrect ( ) ;
160- } , [ phoneNumber ] ) ;
171+ } ;
172+
173+ const isNameAndGenderFilled = name ?. trim ( ) && gender ?. length > 0 ;
161174
162175 useEffect ( ( ) => {
163- if ( timerValue === 120 ) {
164- setVerificationMessage ( { type : 'default' , content : MESSAGES . VERIFICATION . DEFAULT } ) ;
165- }
166- } , [ timerValue ] ) ;
176+ return ( ) => clearVerificationMessageTimer ( ) ;
177+ } , [ ] ) ;
167178
168179 return (
169180 < div className = { styles . container } >
@@ -208,6 +219,12 @@ function MobileVerification({ onNext }: MobileVerificationProps) {
208219 render = { ( { field } ) => (
209220 < CustomInput
210221 { ...field }
222+ onChange = { ( e ) => {
223+ if ( e . target . value !== field . value ) {
224+ resetVerificationState ( ) ;
225+ }
226+ field . onChange ( e ) ;
227+ } }
211228 placeholder = "- 없이 번호를 입력해 주세요."
212229 isDelete = { ! isVerified }
213230 message = { phoneMessage }
0 commit comments