You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.7 KiB
69 lines
1.7 KiB
import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
interface CountdownTimerProps {
|
|
initialSeconds: number,
|
|
onComplete?: Function
|
|
}
|
|
|
|
export interface CountdownTimerRef {
|
|
handleStop: Function,
|
|
handleStart: Function,
|
|
handleReset: Function,
|
|
isActive: boolean
|
|
}
|
|
|
|
const CountdownTimer = forwardRef<CountdownTimerRef, CountdownTimerProps>((props, ref) => {
|
|
|
|
const { initialSeconds, onComplete } = props
|
|
const { t } = useTranslation()
|
|
const [seconds, setSeconds] = useState(initialSeconds);
|
|
const [isActive, setIsActive] = useState(false);
|
|
const [title, setTitle] = useState('Send verification code')
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
handleStop,
|
|
handleReset,
|
|
handleStart,
|
|
isActive
|
|
}))
|
|
|
|
const handleStop = () => {
|
|
setIsActive(false);
|
|
setTitle('Send verification code')
|
|
};
|
|
|
|
const handleStart = () => {
|
|
if (isActive) return
|
|
setSeconds(initialSeconds)
|
|
setIsActive(true);
|
|
};
|
|
|
|
const handleReset = () => {
|
|
setSeconds(initialSeconds);
|
|
setIsActive(true);
|
|
};
|
|
|
|
useEffect(() => {
|
|
let interval: any = null;
|
|
|
|
if (isActive && seconds > 0) {
|
|
interval = setInterval(() => {
|
|
setSeconds(seconds => seconds - 1);
|
|
}, 1000);
|
|
} else {
|
|
clearInterval(interval)
|
|
seconds <= 0 && setTitle('Resend')
|
|
setIsActive(false)
|
|
// onComplete && onComplete(seconds)
|
|
}
|
|
|
|
return () => clearInterval(interval);
|
|
}, [isActive, seconds, onComplete]);
|
|
|
|
return (
|
|
<div style={{ whiteSpace: 'pre-wrap' }}>{isActive ? <span className='fz-18 fw550'>{seconds}s</span> : t(title)}</div>
|
|
);
|
|
});
|
|
|
|
export default CountdownTimer;
|