{"version":3,"sources":["../../src/react/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\r\nimport type { ChangeEvent } from 'react';\r\nimport {\r\n    isValidAadhaar,\r\n    isValidPAN,\r\n    isValidGSTIN,\r\n    isValidIFSC,\r\n    isValidPincode,\r\n    isValidTAN,\r\n    isValidUAN,\r\n    isValidVoterID,\r\n    isValidDrivingLicense,\r\n    isValidPassport,\r\n    isValidUPI,\r\n    isValidIndianPhone,\r\n    isValidMSME,\r\n} from '../validators';\r\nimport { detectFraudSignals, type FraudRisk } from '../intelligence/fraudSignals';\r\nimport { validateKYCBundle, type KYCBundleInput, type KYCBundleResult } from '../intelligence/kycBundle';\r\n\r\nexport type DocumentType =\r\n    | 'aadhaar'\r\n    | 'pan'\r\n    | 'gstin'\r\n    | 'ifsc'\r\n    | 'pincode'\r\n    | 'tan'\r\n    | 'uan'\r\n    | 'voter-id'\r\n    | 'dl'\r\n    | 'passport'\r\n    | 'upi'\r\n    | 'phone'\r\n    | 'msme';\r\n\r\nexport type ValidatorState = {\r\n    value: string;\r\n    isValid: boolean | null;\r\n    error: string | null;\r\n    isTouched: boolean;\r\n    fraudRisk: FraudRisk | null;\r\n};\r\n\r\nexport interface UseValidatorOptions {\r\n    validateOnChange?: boolean;\r\n    validateOnBlur?: boolean;\r\n    detectFraud?: boolean;\r\n    debounceMs?: number;\r\n}\r\n\r\ntype ValidationResolver = {\r\n    validate: (value: string) => boolean;\r\n    errorMessage: string;\r\n    requiredMessage: string;\r\n    fraudType: string;\r\n};\r\n\r\nconst validationResolverByType: Record<DocumentType, ValidationResolver> = {\r\n    aadhaar: {\r\n        validate: isValidAadhaar,\r\n        errorMessage: 'Invalid Aadhaar number',\r\n        requiredMessage: 'Aadhaar is required',\r\n        fraudType: 'aadhaar',\r\n    },\r\n    pan: {\r\n        validate: isValidPAN,\r\n        errorMessage: 'Invalid PAN number',\r\n        requiredMessage: 'PAN is required',\r\n        fraudType: 'pan',\r\n    },\r\n    gstin: {\r\n        validate: isValidGSTIN,\r\n        errorMessage: 'Invalid GSTIN',\r\n        requiredMessage: 'GSTIN is required',\r\n        fraudType: 'gstin',\r\n    },\r\n    ifsc: {\r\n        validate: isValidIFSC,\r\n        errorMessage: 'Invalid IFSC code',\r\n        requiredMessage: 'IFSC is required',\r\n        fraudType: 'ifsc',\r\n    },\r\n    pincode: {\r\n        validate: isValidPincode,\r\n        errorMessage: 'Invalid pincode',\r\n        requiredMessage: 'Pincode is required',\r\n        fraudType: 'pincode',\r\n    },\r\n    tan: {\r\n        validate: isValidTAN,\r\n        errorMessage: 'Invalid TAN',\r\n        requiredMessage: 'TAN is required',\r\n        fraudType: 'tan',\r\n    },\r\n    uan: {\r\n        validate: isValidUAN,\r\n        errorMessage: 'Invalid UAN',\r\n        requiredMessage: 'UAN is required',\r\n        fraudType: 'uan',\r\n    },\r\n    'voter-id': {\r\n        validate: isValidVoterID,\r\n        errorMessage: 'Invalid voter ID',\r\n        requiredMessage: 'Voter ID is required',\r\n        fraudType: 'voterid',\r\n    },\r\n    dl: {\r\n        validate: isValidDrivingLicense,\r\n        errorMessage: 'Invalid driving license',\r\n        requiredMessage: 'Driving License is required',\r\n        fraudType: 'drivinglicense',\r\n    },\r\n    passport: {\r\n        validate: isValidPassport,\r\n        errorMessage: 'Invalid passport number',\r\n        requiredMessage: 'Passport is required',\r\n        fraudType: 'passport',\r\n    },\r\n    upi: {\r\n        validate: isValidUPI,\r\n        errorMessage: 'Invalid UPI ID',\r\n        requiredMessage: 'UPI ID is required',\r\n        fraudType: 'upi',\r\n    },\r\n    phone: {\r\n        validate: isValidIndianPhone,\r\n        errorMessage: 'Invalid Indian phone number',\r\n        requiredMessage: 'Phone number is required',\r\n        fraudType: 'phone',\r\n    },\r\n    msme: {\r\n        validate: isValidMSME,\r\n        errorMessage: 'Invalid MSME number',\r\n        requiredMessage: 'MSME number is required',\r\n        fraudType: 'msme',\r\n    },\r\n};\r\n\r\nconst createInitialState = (): ValidatorState => ({\r\n    value: '',\r\n    isValid: null,\r\n    error: null,\r\n    isTouched: false,\r\n    fraudRisk: null,\r\n});\r\n\r\n/**\r\n * @example\r\n * import { useValidator } from '@prashanttiw/pramana/react'\r\n *\r\n * function AadhaarInput() {\r\n *   const { isValid, error, inputProps } = useValidator('aadhaar', {\r\n *     validateOnChange: true,\r\n *     detectFraud: true,\r\n *   })\r\n *\r\n *   return (\r\n *     <div>\r\n *       <input placeholder=\"Enter Aadhaar\" {...inputProps} />\r\n *       {error && <span style={{ color: 'red' }}>{error}</span>}\r\n *       {isValid && <span style={{ color: 'green' }}>Valid</span>}\r\n *     </div>\r\n *   )\r\n * }\r\n */\r\nexport function useValidator(documentType: DocumentType, options?: UseValidatorOptions) {\r\n    const validateOnChange = options?.validateOnChange ?? true;\r\n    const validateOnBlur = options?.validateOnBlur ?? true;\r\n    const detectFraud = options?.detectFraud ?? false;\r\n    const debounceMs = options?.debounceMs ?? 300;\r\n\r\n    const [state, setState] = useState<ValidatorState>(createInitialState);\r\n    const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n    const latestValueRef = useRef<string>('');\r\n\r\n    const runValidation = useCallback((value: string, markTouched: boolean) => {\r\n        const resolver = validationResolverByType[documentType];\r\n\r\n        setState((prev) => {\r\n            const touched = markTouched || prev.isTouched;\r\n            const normalized = value.trim();\r\n            let isValid: boolean | null = null;\r\n            let error: string | null = null;\r\n            let fraudRisk: FraudRisk | null = null;\r\n\r\n            if (normalized.length === 0) {\r\n                if (touched) {\r\n                    isValid = false;\r\n                    error = resolver.requiredMessage;\r\n                }\r\n            } else {\r\n                isValid = resolver.validate(value);\r\n                error = isValid ? null : resolver.errorMessage;\r\n\r\n                if (detectFraud && isValid) {\r\n                    fraudRisk = detectFraudSignals(resolver.fraudType, value).risk;\r\n                }\r\n            }\r\n\r\n            return {\r\n                ...prev,\r\n                value,\r\n                isTouched: touched,\r\n                isValid,\r\n                error,\r\n                fraudRisk,\r\n            };\r\n        });\r\n    }, [detectFraud, documentType]);\r\n\r\n    const validate = useCallback((value: string = latestValueRef.current) => {\r\n        latestValueRef.current = value;\r\n        runValidation(value, true);\r\n    }, [runValidation]);\r\n\r\n    const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\r\n        const value = e.target.value;\r\n        latestValueRef.current = value;\r\n\r\n        setState((prev) => ({\r\n            ...prev,\r\n            value,\r\n        }));\r\n\r\n        if (!validateOnChange) return;\r\n\r\n        if (debounceRef.current != null) {\r\n            clearTimeout(debounceRef.current);\r\n        }\r\n\r\n        debounceRef.current = setTimeout(() => {\r\n            runValidation(value, false);\r\n        }, debounceMs);\r\n    }, [debounceMs, runValidation, validateOnChange]);\r\n\r\n    const handleBlur = useCallback(() => {\r\n        if (debounceRef.current != null) {\r\n            clearTimeout(debounceRef.current);\r\n            debounceRef.current = null;\r\n        }\r\n\r\n        if (validateOnBlur) {\r\n            runValidation(latestValueRef.current, true);\r\n            return;\r\n        }\r\n\r\n        setState((prev) => ({\r\n            ...prev,\r\n            isTouched: true,\r\n        }));\r\n    }, [runValidation, validateOnBlur]);\r\n\r\n    const reset = useCallback(() => {\r\n        if (debounceRef.current != null) {\r\n            clearTimeout(debounceRef.current);\r\n            debounceRef.current = null;\r\n        }\r\n        latestValueRef.current = '';\r\n        setState(createInitialState());\r\n    }, []);\r\n\r\n    useEffect(() => {\r\n        return () => {\r\n            if (debounceRef.current != null) {\r\n                clearTimeout(debounceRef.current);\r\n            }\r\n        };\r\n    }, []);\r\n\r\n    return {\r\n        value: state.value,\r\n        isValid: state.isValid,\r\n        error: state.error,\r\n        isTouched: state.isTouched,\r\n        fraudRisk: state.fraudRisk,\r\n        validate,\r\n        handleChange,\r\n        handleBlur,\r\n        reset,\r\n        inputProps: {\r\n            value: state.value,\r\n            onChange: handleChange,\r\n            onBlur: handleBlur,\r\n        },\r\n    };\r\n}\r\n\r\nexport function useKYCValidator() {\r\n    const [bundle, setBundle] = useState<KYCBundleInput>({});\r\n    const [result, setResult] = useState<KYCBundleResult | null>(null);\r\n    const [isValidating, setIsValidating] = useState(false);\r\n\r\n    const setDocument = useCallback((type: string, value: string) => {\r\n        setBundle((prev) => ({\r\n            ...prev,\r\n            [type]: value,\r\n        } as KYCBundleInput));\r\n    }, []);\r\n\r\n    const validate = useCallback(() => {\r\n        setIsValidating(true);\r\n        const validationResult = validateKYCBundle(bundle);\r\n        setResult(validationResult);\r\n        setIsValidating(false);\r\n    }, [bundle]);\r\n\r\n    return {\r\n        bundle,\r\n        setDocument,\r\n        validate,\r\n        result,\r\n        isValidating,\r\n    };\r\n}\r\n"]}