UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 21.9 kB
{"version":3,"file":"verification.cjs","sources":["../../../../../src/components/auth/common/verification.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Common Verification Components\n *\n * Shared components used across different verification flows.\n * Includes input fields, timers, error displays, and status indicators.\n */\n\nimport {\n\tAlert,\n\tButton,\n\tChip,\n\tInput as HeroInput,\n\tProgress,\n} from \"@/components/ui\";\nimport { useConfig } from \"@/hooks\";\nimport type { RadiusT, SizeT } from \"@/types\";\nimport {\n\tCheckCircleIcon,\n\tClockIcon,\n\tExclamationTriangleIcon,\n\tXCircleIcon,\n} from \"@heroicons/react/24/outline\";\nimport type React from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { withErrorBoundary } from \"./error-boundary\";\n\n// ============================================================================\n// Verification Input Component\n// ============================================================================\n\nexport interface VerificationInputProps {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tlength?: number;\n\tdisabled?: boolean;\n\tplaceholder?: string;\n\ttype?: \"text\" | \"tel\" | \"number\";\n\tclassName?: string;\n\tautoFocus?: boolean;\n\tonComplete?: (code: string) => void;\n\tsize?: SizeT;\n\tradius?: RadiusT;\n}\n\nexport const VerificationInput = withErrorBoundary(function VerificationInput({\n\tvalue,\n\tonChange,\n\tlength = 6,\n\tdisabled = false,\n\tplaceholder = \"Enter code\",\n\ttype = \"text\",\n\tclassName,\n\tautoFocus = true,\n\tonComplete,\n\tsize = \"md\",\n\tradius = \"md\",\n}: VerificationInputProps) {\n\tconst inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\tconst [activeIndex, setActiveIndex] = useState(0);\n\n\tconst { components } = useConfig();\n\tconst Input = components.Input ?? HeroInput;\n\n\t// Initialize refs array\n\tuseEffect(() => {\n\t\tinputRefs.current = inputRefs.current.slice(0, length);\n\t}, [length]);\n\n\t// Handle value changes\n\tuseEffect(() => {\n\t\tconst digits = value.split(\"\");\n\t\tinputRefs.current.forEach((input, index) => {\n\t\t\tif (input) {\n\t\t\t\tinput.value = digits[index] || \"\";\n\t\t\t}\n\t\t});\n\n\t\tif (value.length === length) {\n\t\t\tonComplete?.(value);\n\t\t}\n\t}, [value, length, onComplete]);\n\n\t// Auto-focus first input\n\tuseEffect(() => {\n\t\tif (autoFocus && inputRefs.current[0] && !disabled) {\n\t\t\tinputRefs.current[0].focus();\n\t\t}\n\t}, [autoFocus, disabled]);\n\n\tconst handleInputChange = (index: number, inputValue: string) => {\n\t\t// Only allow digits\n\t\tconst digit = inputValue.replace(/\\D/g, \"\").slice(-1);\n\n\t\tconst newValue = value.split(\"\");\n\t\tnewValue[index] = digit;\n\n\t\t// Fill the rest with empty string if shorter\n\t\twhile (newValue.length < length) {\n\t\t\tnewValue.push(\"\");\n\t\t}\n\n\t\tconst finalValue = newValue.join(\"\").slice(0, length);\n\t\tonChange(finalValue);\n\n\t\t// Move to next input if digit entered\n\t\tif (digit && index < length - 1) {\n\t\t\tconst nextInput = inputRefs.current[index + 1];\n\t\t\tif (nextInput) {\n\t\t\t\tnextInput.focus();\n\t\t\t\tsetActiveIndex(index + 1);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleKeyDown = (\n\t\tindex: number,\n\t\te: React.KeyboardEvent<HTMLInputElement>,\n\t) => {\n\t\tif (e.key === \"Backspace\") {\n\t\t\tif (!value[index] && index > 0) {\n\t\t\t\t// Move to previous input and clear it\n\t\t\t\tconst prevInput = inputRefs.current[index - 1];\n\t\t\t\tif (prevInput) {\n\t\t\t\t\tprevInput.focus();\n\t\t\t\t\tsetActiveIndex(index - 1);\n\n\t\t\t\t\tconst newValue = value.split(\"\");\n\t\t\t\t\tnewValue[index - 1] = \"\";\n\t\t\t\t\tonChange(newValue.join(\"\"));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Clear current input\n\t\t\t\tconst newValue = value.split(\"\");\n\t\t\t\tnewValue[index] = \"\";\n\t\t\t\tonChange(newValue.join(\"\"));\n\t\t\t}\n\t\t} else if (e.key === \"ArrowLeft\" && index > 0) {\n\t\t\tconst prevInput = inputRefs.current[index - 1];\n\t\t\tif (prevInput) {\n\t\t\t\tprevInput.focus();\n\t\t\t\tsetActiveIndex(index - 1);\n\t\t\t}\n\t\t} else if (e.key === \"ArrowRight\" && index < length - 1) {\n\t\t\tconst nextInput = inputRefs.current[index + 1];\n\t\t\tif (nextInput) {\n\t\t\t\tnextInput.focus();\n\t\t\t\tsetActiveIndex(index + 1);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handlePaste = (e: React.ClipboardEvent) => {\n\t\te.preventDefault();\n\t\tconst pasteData = e.clipboardData\n\t\t\t.getData(\"text\")\n\t\t\t.replace(/\\D/g, \"\")\n\t\t\t.slice(0, length);\n\t\tonChange(pasteData);\n\n\t\t// Focus the next empty input or the last one\n\t\tconst nextIndex = Math.min(pasteData.length, length - 1);\n\t\tconst nextInput = inputRefs.current[nextIndex];\n\t\tif (nextInput) {\n\t\t\tnextInput.focus();\n\t\t\tsetActiveIndex(nextIndex);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={`flex gap-2 justify-center ${className || \"\"}`}>\n\t\t\t{Array.from({ length }, (_, index) => (\n\t\t\t\t<Input\n\t\t\t\t\tkey={index}\n\t\t\t\t\tref={(el) => (inputRefs.current[index] = el)}\n\t\t\t\t\ttype={type}\n\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\tpattern=\"[0-9]*\"\n\t\t\t\t\tmaxLength={1}\n\t\t\t\t\tclassName=\"w-12 h-12\"\n\t\t\t\t\tclassNames={{\n\t\t\t\t\t\tinput: \"text-center text-lg font-mono\",\n\t\t\t\t\t\tinputWrapper: `h-12 ${activeIndex === index ? \"ring-2 ring-primary\" : \"\"}`,\n\t\t\t\t\t}}\n\t\t\t\t\tplaceholder={index === 0 ? placeholder : \"\"}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(e) => handleInputChange(index, e.target.value)}\n\t\t\t\t\tonKeyDown={(e) => handleKeyDown(index, e)}\n\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\tonFocus={() => setActiveIndex(index)}\n\t\t\t\t\tvariant=\"bordered\"\n\t\t\t\t\tsize={size}\n\t\t\t\t\tradius={radius}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n});\n\n// ============================================================================\n// Verification Timer Component\n// ============================================================================\n\nexport interface VerificationTimerProps {\n\ttotalTime: number;\n\tremainingTime: number;\n\tonExpired?: () => void;\n\tshowProgress?: boolean;\n\tformat?: \"mm:ss\" | \"seconds\";\n\tclassName?: string;\n\tradius?: RadiusT;\n}\n\nexport const VerificationTimer = withErrorBoundary(function VerificationTimer({\n\ttotalTime,\n\tremainingTime,\n\tonExpired,\n\tshowProgress = true,\n\tformat = \"mm:ss\",\n\tclassName,\n\tradius = \"sm\",\n}: VerificationTimerProps) {\n\tuseEffect(() => {\n\t\tif (remainingTime === 0) {\n\t\t\tonExpired?.();\n\t\t}\n\t}, [remainingTime, onExpired]);\n\n\tconst formatTime = (seconds: number): string => {\n\t\tif (format === \"seconds\") {\n\t\t\treturn `${seconds}s`;\n\t\t}\n\n\t\tconst minutes = Math.floor(seconds / 60);\n\t\tconst remainingSeconds = seconds % 60;\n\t\treturn `${minutes.toString().padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n\t};\n\n\tconst progressValue =\n\t\ttotalTime > 0 ? ((totalTime - remainingTime) / totalTime) * 100 : 0;\n\tconst isExpiring = remainingTime <= 30; // Last 30 seconds\n\n\treturn (\n\t\t<div className={`flex items-center gap-3 ${className || \"\"}`}>\n\t\t\t<ClockIcon\n\t\t\t\tclassName={`h-4 w-4 ${isExpiring ? \"text-warning\" : \"text-default-500\"}`}\n\t\t\t/>\n\t\t\t<div className=\"flex-1\">\n\t\t\t\t<div className=\"flex items-center justify-between mb-1\">\n\t\t\t\t\t<span className=\"text-sm text-default-500\">Code expires in</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={`text-sm font-mono ${isExpiring ? \"text-warning\" : \"text-default-700\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t{formatTime(remainingTime)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{showProgress && (\n\t\t\t\t\t<Progress\n\t\t\t\t\t\tvalue={progressValue}\n\t\t\t\t\t\tcolor={isExpiring ? \"warning\" : \"primary\"}\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\tradius={radius}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\n// ============================================================================\n// Verification Error Component\n// ============================================================================\n\nexport interface VerificationErrorProps {\n\terror: string;\n\tonRetry?: () => void;\n\tclassName?: string;\n}\n\nexport const VerificationError = withErrorBoundary(function VerificationError({\n\terror,\n\tonRetry,\n\tclassName,\n}: VerificationErrorProps) {\n\treturn (\n\t\t<Alert\n\t\t\ticon={<ExclamationTriangleIcon className=\"h-4 w-4\" />}\n\t\t\tcolor=\"danger\"\n\t\t\tvariant=\"flat\"\n\t\t\tclassName={className}\n\t\t>\n\t\t\t<span className=\"flex items-center justify-between w-full\">\n\t\t\t\t<span>{error}</span>\n\t\t\t\t{onRetry && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tcolor=\"danger\"\n\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\t\tclassName=\"ml-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\tRetry\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t</Alert>\n\t);\n});\n\n// ============================================================================\n// Verification Badge Component\n// ============================================================================\n\nexport interface VerificationBadgeProps {\n\tstatus: \"pending\" | \"sent\" | \"verifying\" | \"verified\" | \"error\" | \"expired\";\n\tmethod?: \"email\" | \"phone\" | \"both\";\n\tclassName?: string;\n}\n\nexport const Verification = withErrorBoundary(function VerificationBadge({\n\tstatus,\n\tmethod = \"email\",\n\tclassName,\n}: VerificationBadgeProps) {\n\tconst getStatusConfig = () => {\n\t\tswitch (status) {\n\t\t\tcase \"pending\":\n\t\t\t\treturn {\n\t\t\t\t\tcolor: \"default\" as const,\n\t\t\t\t\ticon: <ClockIcon className=\"h-3 w-3\" />,\n\t\t\t\t\ttext: \"Pending\",\n\t\t\t\t};\n\t\t\tcase \"sent\":\n\t\t\t\treturn {\n\t\t\t\t\tcolor: \"primary\" as const,\n\t\t\t\t\ticon: <ClockIcon className=\"h-3 w-3\" />,\n\t\t\t\t\ttext: `Code sent ${method === \"email\" ? \"via email\" : method === \"phone\" ? \"via SMS\" : \"\"}`,\n\t\t\t\t};\n\t\t\tcase \"verifying\":\n\t\t\t\treturn {\n\t\t\t\t\tcolor: \"primary\" as const,\n\t\t\t\t\ticon: <ClockIcon className=\"h-3 w-3\" />,\n\t\t\t\t\ttext: \"Verifying...\",\n\t\t\t\t};\n\t\t\tcase \"verified\":\n\t\t\t\treturn {\n\t\t\t\t\tcolor: \"success\" as const,\n\t\t\t\t\ticon: <CheckCircleIcon className=\"h-3 w-3\" />,\n\t\t\t\t\ttext: \"Verified\",\n\t\t\t\t};\n\t\t\tcase \"error\":\n\t\t\t\treturn {\n\t\t\t\t\tcolor: \"danger\" as const,\n\t\t\t\t\ticon: <XCircleIcon className=\"h-3 w-3\" />,\n\t\t\t\t\ttext: \"Failed\",\n\t\t\t\t};\n\t\t\tcase \"expired\":\n\t\t\t\treturn {\n\t\t\t\t\tcolor: \"warning\" as const,\n\t\t\t\t\ticon: <XCircleIcon className=\"h-3 w-3\" />,\n\t\t\t\t\ttext: \"Expired\",\n\t\t\t\t};\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tcolor: \"default\" as const,\n\t\t\t\t\ticon: <ClockIcon className=\"h-3 w-3\" />,\n\t\t\t\t\ttext: \"Unknown\",\n\t\t\t\t};\n\t\t}\n\t};\n\n\tconst config = getStatusConfig();\n\n\treturn (\n\t\t<Chip\n\t\t\tcolor={config.color}\n\t\t\tvariant=\"flat\"\n\t\t\tsize=\"sm\"\n\t\t\tstartContent={config.icon}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{config.text}\n\t\t</Chip>\n\t);\n});\n\n// ============================================================================\n// Verification Progress Component\n// ============================================================================\n\nexport interface VerificationProgressProps {\n\tsteps: Array<{\n\t\tid: string;\n\t\tlabel: string;\n\t\tstatus: \"pending\" | \"active\" | \"completed\" | \"error\";\n\t}>;\n\tclassName?: string;\n}\n\nexport const VerificationProgress = withErrorBoundary(\n\tfunction VerificationProgress({\n\t\tsteps,\n\t\tclassName,\n\t}: VerificationProgressProps) {\n\t\treturn (\n\t\t\t<div className={`space-y-4 ${className || \"\"}`}>\n\t\t\t\t{steps.map((step, index) => {\n\t\t\t\t\tconst isLast = index === steps.length - 1;\n\n\t\t\t\t\tconst getStepConfig = () => {\n\t\t\t\t\t\tswitch (step.status) {\n\t\t\t\t\t\t\tcase \"completed\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcolor: \"success\" as const,\n\t\t\t\t\t\t\t\t\ticon: <CheckCircleIcon className=\"h-5 w-5\" />,\n\t\t\t\t\t\t\t\t\tbgClass: \"bg-success\",\n\t\t\t\t\t\t\t\t\ttextClass: \"text-success\",\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase \"active\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcolor: \"primary\" as const,\n\t\t\t\t\t\t\t\t\ticon: <ClockIcon className=\"h-5 w-5\" />,\n\t\t\t\t\t\t\t\t\tbgClass: \"bg-primary\",\n\t\t\t\t\t\t\t\t\ttextClass: \"text-primary\",\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcolor: \"danger\" as const,\n\t\t\t\t\t\t\t\t\ticon: <XCircleIcon className=\"h-5 w-5\" />,\n\t\t\t\t\t\t\t\t\tbgClass: \"bg-danger\",\n\t\t\t\t\t\t\t\t\ttextClass: \"text-danger\",\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcolor: \"default\" as const,\n\t\t\t\t\t\t\t\t\ticon: (\n\t\t\t\t\t\t\t\t\t\t<div className=\"h-5 w-5 rounded-full border-2 border-default-300\" />\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tbgClass: \"bg-default-200\",\n\t\t\t\t\t\t\t\t\ttextClass: \"text-default-500\",\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tconst config = getStepConfig();\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={step.id} className=\"flex items-center\">\n\t\t\t\t\t\t\t<div className=\"flex items-center\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={`flex items-center justify-center w-8 h-8 rounded-full ${config.bgClass} text-white`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{config.icon}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"ml-4\">\n\t\t\t\t\t\t\t\t\t<div className={`text-sm font-medium ${config.textClass}`}>\n\t\t\t\t\t\t\t\t\t\t{step.label}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{!isLast && (\n\t\t\t\t\t\t\t\t<div className=\"flex-1 ml-4\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={`h-0.5 ${step.status === \"completed\" ? \"bg-success\" : \"bg-default-200\"}`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\n// ============================================================================\n// Export Common Components Index\n// ============================================================================\n\nexport const VerificationCommon = {\n\tVerificationInput,\n\tVerificationTimer,\n\tVerificationError,\n\tVerificationBadge: Verification,\n\tVerificationProgress,\n};\n"],"names":["VerificationInput","withErrorBoundary","value","onChange","length","disabled","placeholder","type","className","autoFocus","onComplete","size","radius","inputRefs","useRef","activeIndex","setActiveIndex","useState","components","useConfig","Input","HeroInput","useEffect","digits","input","index","handleInputChange","inputValue","digit","newValue","finalValue","nextInput","handleKeyDown","e","prevInput","handlePaste","pasteData","nextIndex","jsx","_","el","VerificationTimer","totalTime","remainingTime","onExpired","showProgress","format","formatTime","seconds","minutes","remainingSeconds","progressValue","isExpiring","ClockIcon","jsxs","Progress","VerificationError","error","onRetry","Alert","ExclamationTriangleIcon","Button","Verification","status","method","config","CheckCircleIcon","XCircleIcon","Chip","VerificationProgress","steps","step","isLast","VerificationCommon"],"mappings":"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"}