import React, { useCallback, useEffect, useState } from "react"; import { FlatList, Image, ImageURISource, Text, View, TextStyle, ImageStyle, ViewStyle, } from "react-native"; import styles from "./styles"; import { checkValidationRules, debounce, getDefaultRuleLabel, getValidation, } from "./utils"; import { RuleType } from "./types"; type Props = { newPassword: string; confirmPassword?: string; onPasswordValidateChange: (data: boolean) => void; validationRules: Array; containerStyle?: ViewStyle; imageStyle?: ImageStyle; isImage?: boolean; imageSource?: { success: ImageURISource; error: ImageURISource; }; labelStyle?: { success?: TextStyle; error?: TextStyle; }; iconComponent?: { success: React.ReactNode; error: React.ReactNode; }; }; type CustomRuleType = RuleType & {validation: boolean}; const PasswordValidate: React.FC = ({ newPassword, confirmPassword = "", onPasswordValidateChange, validationRules, imageSource = { success: require('./assets/success/success.png'), error: require('./assets/error/error.png'), }, containerStyle = {}, labelStyle = {}, imageStyle = {}, isImage = true, iconComponent, }) => { const [rulesList, setRulesList] = useState>([]); const validatePasswords = (list: Array) => { // check if any field is false const allSuccess = list.some((object) => object.validation === false) === false; onPasswordValidateChange(allSuccess); }; const debounceValidationCheckFunc = useCallback( debounce(validatePasswords), [] ); useEffect(() => { if (checkValidationRules(validationRules)) { setFieldsList(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [newPassword, confirmPassword, validationRules]); const setFieldsList = () => { const list: Array = []; validationRules.forEach((rule) => { const object = { ...rule, validation: getValidation(rule, newPassword, confirmPassword), label: rule.label || getDefaultRuleLabel(rule.key, rule.ruleValue || 0), }; list.push(object); }); setRulesList(list); debounceValidationCheckFunc(list); }; const renderItem = ({ item }: { item: CustomRuleType }) => ( {item.validation ? ( <> {isImage ? ( ) : ( iconComponent?.success )} {item.label} ) : ( <> {isImage ? ( ) : ( iconComponent?.error )} {item.label} )} ); const keyExtractor = (item: any, index: number) => `${index}`; return ( ); }; export default PasswordValidate;