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
JavaScript
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
};
};