import React, { useState } from 'react'; import { Eye, EyeOff, Copy, Check } from 'lucide-react'; import { useToast } from './Toast'; export interface ObfuscatedIdNumberProps { idNumber?: string | null; className?: string; allowToggle?: boolean; } export function maskIdNumber(id: string): string { const clean = id ? id.trim() : ''; if (clean.length <= 4) { return '••••'; } if (clean.length <= 8) { return `${clean.slice(0, 2)}••••${clean.slice(-2)}`; } // SA ID (13 digits) or standard national IDs: keep first 6 (DOB), mask middle 5, show last 2 return `${clean.slice(0, 6)}•••••${clean.slice(-2)}`; } export function ObfuscatedIdNumber({ idNumber, className = '', allowToggle = true, }: ObfuscatedIdNumberProps): React.ReactElement { const [isRevealed, setIsRevealed] = useState(false); const [copied, setCopied] = useState(false); const { success } = useToast(); if (!idNumber) { return -; } const rawId: string = idNumber; const handleCopy = async (e: React.MouseEvent): Promise => { e.stopPropagation(); try { await navigator.clipboard.writeText(rawId); setCopied(true); success('Copied to Clipboard', 'ID Number copied.'); setTimeout(() => setCopied(false), 2000); } catch { // Clipboard fallback } }; const handleToggle = (e: React.MouseEvent): void => { e.stopPropagation(); setIsRevealed((prev) => !prev); }; const displayedText = isRevealed ? rawId : maskIdNumber(rawId); return (
{displayedText} {allowToggle && ( )}
); }