UNPKG

react-native-biometric-verifier

Version:

A React Native module for biometric verification with face recognition and QR code scanning

113 lines (95 loc) 3.18 kB
import { useRef, useState, useEffect, useCallback } from 'react'; import { Global } from '../utils/Global'; /** * Custom hook for a countdown timer with pause/resume functionality. * * @param {Function} onExpire - Callback fired when countdown reaches zero. * @returns {Object} countdown, startCountdown, resetCountdown, pauseCountdown, resumeCountdown */ export const useCountdown = (onExpire) => { const [countdown, setCountdown] = useState(Global.CountdownDuration); const timerRef = useRef(null); const countdownRef = useRef(Global.CountdownDuration); const isPausedRef = useRef(false); const onExpireRef = useRef(onExpire); // Update onExpire callback reference useEffect(() => { onExpireRef.current = onExpire; }, [onExpire]); // Start or restart the countdown const startCountdown = useCallback((onExpireCallback) => { try { // Reset countdown countdownRef.current = Global.CountdownDuration; setCountdown(Global.CountdownDuration); isPausedRef.current = false; // Clear any existing timer if (timerRef.current) { clearInterval(timerRef.current); timerRef.current = null; } // Use provided callback or stored one const expireCallback = onExpireCallback || onExpireRef.current; // Start new timer timerRef.current = setInterval(() => { if (isPausedRef.current) return; countdownRef.current -= 1; if (countdownRef.current <= 0) { clearInterval(timerRef.current); timerRef.current = null; if (typeof expireCallback === 'function') { expireCallback(); } } else { setCountdown(countdownRef.current); } }, 1000); } catch (error) { console.error('Error in startCountdown:', error); } }, []); // Pause the countdown const pauseCountdown = useCallback(() => { isPausedRef.current = true; }, []); // Resume the countdown const resumeCountdown = useCallback(() => { isPausedRef.current = false; }, []); // Reset countdown to initial duration const resetCountdown = useCallback(() => { try { countdownRef.current = Global.CountdownDuration; setCountdown(Global.CountdownDuration); isPausedRef.current = false; if (timerRef.current) { clearInterval(timerRef.current); timerRef.current = null; } } catch (error) { console.error('Error in resetCountdown:', error); } }, []); // Get current countdown value const getCurrentCountdown = useCallback(() => countdownRef.current, []); // Check if countdown is paused const isPaused = useCallback(() => isPausedRef.current, []); // Clean up on unmount useEffect(() => { return () => { if (timerRef.current) { clearInterval(timerRef.current); timerRef.current = null; } }; }, []); return { countdown, startCountdown, resetCountdown, pauseCountdown, resumeCountdown, getCurrentCountdown, isPaused }; };