UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 36.5 kB
{"version":3,"file":"invitations.cjs","sources":["../../../../../src/components/auth/invitations/invitations.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Organization Invitation Components\n *\n * Handles organization invitation acceptance flow with token validation,\n * preview, accept/decline actions, and post-invitation redirects.\n */\n\nimport {\n\tAvatar,\n\tBadge,\n\tButton,\n\tCard,\n\tCardBody,\n\tCardHeader,\n\tDivider,\n\tInput,\n} from \"@/components/ui\";\nimport {\n\tBuildingOfficeIcon,\n\tCheckCircleIcon,\n\tClockIcon,\n\tExclamationTriangleIcon,\n\tShieldCheckIcon,\n\tXCircleIcon,\n} from \"@heroicons/react/24/outline\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { useAuth } from \"../../../hooks/use-auth\";\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { withErrorBoundary } from \"../common/error-boundary\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface InvitationData {\n\tid: string;\n\ttoken: string;\n\temail: string;\n\torganizationId: string;\n\torganizationName: string;\n\torganizationLogo?: string;\n\troleId: string;\n\troleName: string;\n\tinvitedBy: string;\n\tinvitedByName?: string;\n\tinvitedByAvatar?: string;\n\texpiresAt: string;\n\tmessage?: string;\n\tcustomFields?: Record<string, any>;\n\tredirectUrl?: string;\n}\n\nexport interface InviteAcceptanceProps {\n\ttoken?: string;\n\tonAcceptSuccess?: (result: {\n\t\torganizationId: string;\n\t\tuserId: string;\n\t}) => void;\n\tonDeclineSuccess?: () => void;\n\tonError?: (error: Error) => void;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}\n\nexport interface InvitePreviewProps {\n\tinvitation: InvitationData;\n\tonAccept?: () => void;\n\tonDecline?: () => void;\n\tisLoading?: boolean;\n\tclassName?: string;\n}\n\nexport interface InviteAcceptFormProps {\n\tinvitation: InvitationData;\n\tonSubmit: (userData: {\n\t\tfirstName?: string;\n\t\tlastName?: string;\n\t\tpassword?: string;\n\t}) => void;\n\tisLoading?: boolean;\n\trequiresSignUp?: boolean;\n\tclassName?: string;\n}\n\nexport interface InviteStatusProps {\n\tstatus:\n\t\t| \"validating\"\n\t\t| \"valid\"\n\t\t| \"accepted\"\n\t\t| \"declined\"\n\t\t| \"expired\"\n\t\t| \"invalid\"\n\t\t| \"error\";\n\tinvitation?: InvitationData;\n\terror?: string;\n\tclassName?: string;\n}\n\n// ============================================================================\n// Hook for Invitation Management\n// ============================================================================\n\ninterface UseInvitationProps {\n\ttoken?: string;\n\tonAcceptSuccess?: (result: {\n\t\torganizationId: string;\n\t\tuserId: string;\n\t}) => void;\n\tonDeclineSuccess?: () => void;\n\tonError?: (error: Error) => void;\n}\n\nfunction useInvitation({\n\ttoken,\n\tonAcceptSuccess,\n\tonDeclineSuccess,\n\tonError,\n}: UseInvitationProps) {\n\tconst { client, user } = useAuth();\n\tconst [invitation, setInvitation] = useState<InvitationData | null>(null);\n\tconst [status, setStatus] = useState<\n\t\t| \"idle\"\n\t\t| \"validating\"\n\t\t| \"valid\"\n\t\t| \"accepting\"\n\t\t| \"declining\"\n\t\t| \"accepted\"\n\t\t| \"declined\"\n\t\t| \"expired\"\n\t\t| \"invalid\"\n\t\t| \"error\"\n\t>(\"idle\");\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst validateInvitation = useCallback(\n\t\tasync (invitationToken: string) => {\n\t\t\ttry {\n\t\t\t\tsetStatus(\"validating\");\n\t\t\t\tsetError(null);\n\n\t\t\t\tconst response = await client.invitations.validateInvitation({\n\t\t\t\t\tinvitationValidationRequest: {\n\t\t\t\t\t\ttoken: invitationToken,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tif (response.valid && response.invitation) {\n\t\t\t\t\tsetInvitation(response.invitation);\n\n\t\t\t\t\t// Check if invitation is expired\n\t\t\t\t\tconst expiresAt = new Date(response.invitation.expiresAt);\n\t\t\t\t\tif (expiresAt < new Date()) {\n\t\t\t\t\t\tsetStatus(\"expired\");\n\t\t\t\t\t\tsetError(\"This invitation has expired\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetStatus(\"valid\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetStatus(\"invalid\");\n\t\t\t\t\tsetError(response.message || \"Invalid invitation token\");\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error =\n\t\t\t\t\terr instanceof Error\n\t\t\t\t\t\t? err\n\t\t\t\t\t\t: new Error(\"Failed to validate invitation\");\n\t\t\t\tsetStatus(\"error\");\n\t\t\t\tsetError(error.message);\n\t\t\t\tonError?.(error);\n\t\t\t}\n\t\t},\n\t\t[client, onError],\n\t);\n\n\tconst acceptInvitation = useCallback(\n\t\tasync (userData?: {\n\t\t\tfirstName?: string;\n\t\t\tlastName?: string;\n\t\t\tpassword?: string;\n\t\t}) => {\n\t\t\tif (!invitation) {\n\t\t\t\tsetError(\"No invitation data available\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tsetStatus(\"accepting\");\n\t\t\t\tsetError(null);\n\n\t\t\t\tconst acceptRequest: any = {\n\t\t\t\t\ttoken: invitation.token,\n\t\t\t\t};\n\n\t\t\t\t// Add user data if provided (for sign-up flow)\n\t\t\t\tif (userData) {\n\t\t\t\t\tacceptRequest.userData = userData;\n\t\t\t\t}\n\n\t\t\t\tconst response = await client.invitations.acceptInvitation({\n\t\t\t\t\tacceptInvitationRequest: acceptRequest,\n\t\t\t\t});\n\n\t\t\t\tif (response.success) {\n\t\t\t\t\tsetStatus(\"accepted\");\n\t\t\t\t\tonAcceptSuccess?.({\n\t\t\t\t\t\torganizationId: invitation.organizationId,\n\t\t\t\t\t\tuserId: response.userId || user?.id || \"\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Handle redirect if specified\n\t\t\t\t\tif (invitation.redirectUrl) {\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\twindow.location.href = invitation.redirectUrl!;\n\t\t\t\t\t\t}, 2000);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(response.message || \"Failed to accept invitation\");\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error =\n\t\t\t\t\terr instanceof Error ? err : new Error(\"Failed to accept invitation\");\n\t\t\t\tsetStatus(\"error\");\n\t\t\t\tsetError(error.message);\n\t\t\t\tonError?.(error);\n\t\t\t}\n\t\t},\n\t\t[invitation, client, user, onAcceptSuccess, onError],\n\t);\n\n\tconst declineInvitation = useCallback(async () => {\n\t\tif (!invitation) {\n\t\t\tsetError(\"No invitation data available\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetStatus(\"declining\");\n\t\t\tsetError(null);\n\n\t\t\tconst response = await client.invitations.declineInvitation({\n\t\t\t\tdeclineInvitationRequest: {\n\t\t\t\t\ttoken: invitation.token,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (response.success) {\n\t\t\t\tsetStatus(\"declined\");\n\t\t\t\tonDeclineSuccess?.();\n\t\t\t} else {\n\t\t\t\tthrow new Error(response.message || \"Failed to decline invitation\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error =\n\t\t\t\terr instanceof Error ? err : new Error(\"Failed to decline invitation\");\n\t\t\tsetStatus(\"error\");\n\t\t\tsetError(error.message);\n\t\t\tonError?.(error);\n\t\t}\n\t}, [invitation, client, onDeclineSuccess, onError]);\n\n\t// Auto-validate when token is provided\n\tuseEffect(() => {\n\t\tif (token && status === \"idle\") {\n\t\t\tvalidateInvitation(token);\n\t\t}\n\t}, [token, status, validateInvitation]);\n\n\t// Extract token from URL if not provided\n\tuseEffect(() => {\n\t\tif (!token && typeof window !== \"undefined\") {\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\t\tconst urlToken =\n\t\t\t\turlParams.get(\"invitation_token\") || urlParams.get(\"invite\");\n\n\t\t\tif (urlToken && status === \"idle\") {\n\t\t\t\tvalidateInvitation(urlToken);\n\t\t\t}\n\t\t}\n\t}, [token, status, validateInvitation]);\n\n\treturn {\n\t\tinvitation,\n\t\tstatus,\n\t\terror,\n\t\tvalidateInvitation,\n\t\tacceptInvitation,\n\t\tdeclineInvitation,\n\t\tisLoading:\n\t\t\tstatus === \"validating\" ||\n\t\t\tstatus === \"accepting\" ||\n\t\t\tstatus === \"declining\",\n\t};\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction formatExpirationDate(expiresAt: string): string {\n\tconst date = new Date(expiresAt);\n\tconst now = new Date();\n\tconst diffMs = date.getTime() - now.getTime();\n\tconst diffHours = Math.ceil(diffMs / (1000 * 60 * 60));\n\tconst diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n\n\tif (diffMs <= 0) {\n\t\treturn \"Expired\";\n\t} else if (diffHours <= 24) {\n\t\treturn `Expires in ${diffHours} hour${diffHours !== 1 ? \"s\" : \"\"}`;\n\t} else {\n\t\treturn `Expires in ${diffDays} day${diffDays !== 1 ? \"s\" : \"\"}`;\n\t}\n}\n\nfunction getInvitationStatus(\n\texpiresAt: string,\n): \"active\" | \"expiring\" | \"expired\" {\n\tconst date = new Date(expiresAt);\n\tconst now = new Date();\n\tconst diffMs = date.getTime() - now.getTime();\n\tconst diffHours = diffMs / (1000 * 60 * 60);\n\n\tif (diffMs <= 0) return \"expired\";\n\tif (diffHours <= 24) return \"expiring\";\n\treturn \"active\";\n}\n\n// ============================================================================\n// Invite Acceptance Component\n// ============================================================================\n\nexport const InviteAcceptance = withErrorBoundary(function InviteAcceptance({\n\ttoken,\n\tonAcceptSuccess,\n\tonDeclineSuccess,\n\tonError,\n\tclassName,\n\tstyle,\n}: InviteAcceptanceProps) {\n\tconst { user } = useAuth();\n\tconst { config } = useConfig();\n\tconst {\n\t\tinvitation,\n\t\tstatus,\n\t\terror,\n\t\tacceptInvitation,\n\t\tdeclineInvitation,\n\t\tisLoading,\n\t} = useInvitation({\n\t\ttoken,\n\t\tonAcceptSuccess,\n\t\tonDeclineSuccess,\n\t\tonError,\n\t});\n\n\tconst handleAccept = async (userData?: {\n\t\tfirstName?: string;\n\t\tlastName?: string;\n\t\tpassword?: string;\n\t}) => {\n\t\tawait acceptInvitation(userData);\n\t};\n\n\tconst handleDecline = async () => {\n\t\tawait declineInvitation();\n\t};\n\n\tconst renderContent = () => {\n\t\tif (status === \"validating\") {\n\t\t\treturn <InviteStatus status=\"validating\" />;\n\t\t}\n\n\t\tif (status === \"invalid\" || status === \"error\") {\n\t\t\treturn (\n\t\t\t\t<InviteStatus\n\t\t\t\t\tstatus={status === \"invalid\" ? \"invalid\" : \"error\"}\n\t\t\t\t\terror={error || undefined}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tif (status === \"expired\") {\n\t\t\treturn (\n\t\t\t\t<InviteStatus status=\"expired\" invitation={invitation || undefined} />\n\t\t\t);\n\t\t}\n\n\t\tif (status === \"accepted\") {\n\t\t\treturn (\n\t\t\t\t<InviteStatus status=\"accepted\" invitation={invitation || undefined} />\n\t\t\t);\n\t\t}\n\n\t\tif (status === \"declined\") {\n\t\t\treturn (\n\t\t\t\t<InviteStatus status=\"declined\" invitation={invitation || undefined} />\n\t\t\t);\n\t\t}\n\n\t\tif (invitation && status === \"valid\") {\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t<InvitePreview\n\t\t\t\t\t\tinvitation={invitation}\n\t\t\t\t\t\tonAccept={() => handleAccept()}\n\t\t\t\t\t\tonDecline={handleDecline}\n\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{!user && (\n\t\t\t\t\t\t<InviteAcceptForm\n\t\t\t\t\t\t\tinvitation={invitation}\n\t\t\t\t\t\t\tonSubmit={handleAccept}\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\trequiresSignUp={true}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn null;\n\t};\n\n\treturn (\n\t\t<div className={className} style={style}>\n\t\t\t{renderContent()}\n\t\t</div>\n\t);\n});\n\n// ============================================================================\n// Invite Preview Component\n// ============================================================================\n\nexport const InvitePreview = withErrorBoundary(function InvitePreview({\n\tinvitation,\n\tonAccept,\n\tonDecline,\n\tisLoading = false,\n\tclassName,\n}: InvitePreviewProps) {\n\tconst invitationStatus = getInvitationStatus(invitation.expiresAt);\n\tconst expirationText = formatExpirationDate(invitation.expiresAt);\n\n\treturn (\n\t\t<Card className={`max-w-md mx-auto ${className || \"\"}`} variant=\"shadow\">\n\t\t\t<CardHeader className=\"flex flex-col items-center pb-2\">\n\t\t\t\t<div className=\"flex items-center justify-center w-16 h-16 bg-primary-100 rounded-full mb-4\">\n\t\t\t\t\t<BuildingOfficeIcon className=\"h-8 w-8 text-primary\" />\n\t\t\t\t</div>\n\t\t\t\t<h2 className=\"text-xl font-bold text-center\">\n\t\t\t\t\tOrganization Invitation\n\t\t\t\t</h2>\n\t\t\t\t<Badge\n\t\t\t\t\tcolor={\n\t\t\t\t\t\tinvitationStatus === \"expired\"\n\t\t\t\t\t\t\t? \"danger\"\n\t\t\t\t\t\t\t: invitationStatus === \"expiring\"\n\t\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t\t: \"success\"\n\t\t\t\t\t}\n\t\t\t\t\tvariant=\"flat\"\n\t\t\t\t\tclassName=\"mt-2\"\n\t\t\t\t>\n\t\t\t\t\t{expirationText}\n\t\t\t\t</Badge>\n\t\t\t</CardHeader>\n\n\t\t\t<CardBody className=\"space-y-6\">\n\t\t\t\t{/* Organization Info */}\n\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t<div className=\"flex items-center justify-center mb-3\">\n\t\t\t\t\t\t{invitation.organizationLogo ? (\n\t\t\t\t\t\t\t<Avatar\n\t\t\t\t\t\t\t\tsrc={invitation.organizationLogo}\n\t\t\t\t\t\t\t\talt={invitation.organizationName}\n\t\t\t\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\t\t\t\tclassName=\"mr-3\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"w-12 h-12 bg-default-200 rounded-full flex items-center justify-center mr-3\">\n\t\t\t\t\t\t\t\t<BuildingOfficeIcon className=\"h-6 w-6 text-default-500\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">\n\t\t\t\t\t\t\t\t{invitation.organizationName}\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<p className=\"text-sm text-default-500\">\n\t\t\t\t\t\t\t\twants you to join their organization\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<Divider />\n\n\t\t\t\t{/* Invitation Details */}\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<span className=\"text-sm text-default-600\">Email:</span>\n\t\t\t\t\t\t<span className=\"text-sm font-medium\">{invitation.email}</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<span className=\"text-sm text-default-600\">Role:</span>\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\tvariant=\"flat\"\n\t\t\t\t\t\t\tstartContent={<ShieldCheckIcon className=\"h-3 w-3\" />}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{invitation.roleName}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{invitation.invitedByName && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t<span className=\"text-sm text-default-600\">Invited by:</span>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t{invitation.invitedByAvatar && (\n\t\t\t\t\t\t\t\t\t<Avatar src={invitation.invitedByAvatar} size=\"sm\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t{invitation.invitedByName}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Custom Message */}\n\t\t\t\t{invitation.message && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Divider />\n\t\t\t\t\t\t<div className=\"bg-default-50 p-4 rounded-lg\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-default-700 italic\">\n\t\t\t\t\t\t\t\t\"{invitation.message}\"\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{/* Action Buttons */}\n\t\t\t\t<div className=\"flex gap-3 pt-4\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tcolor=\"success\"\n\t\t\t\t\t\tvariant=\"solid\"\n\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\tonClick={onAccept}\n\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\tdisabled={invitationStatus === \"expired\"}\n\t\t\t\t\t\tstartContent={<CheckCircleIcon className=\"h-4 w-4\" />}\n\t\t\t\t\t>\n\t\t\t\t\t\tAccept Invitation\n\t\t\t\t\t</Button>\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\tcolor=\"danger\"\n\t\t\t\t\t\tvariant=\"flat\"\n\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\tonClick={onDecline}\n\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\tdisabled={invitationStatus === \"expired\"}\n\t\t\t\t\t\tstartContent={<XCircleIcon className=\"h-4 w-4\" />}\n\t\t\t\t\t>\n\t\t\t\t\t\tDecline\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</CardBody>\n\t\t</Card>\n\t);\n});\n\n// ============================================================================\n// Invite Accept Form Component\n// ============================================================================\n\nexport const InviteAcceptForm = withErrorBoundary(function InviteAcceptForm({\n\tinvitation,\n\tonSubmit,\n\tisLoading = false,\n\trequiresSignUp = false,\n\tclassName,\n}: InviteAcceptFormProps) {\n\tconst [formData, setFormData] = useState({\n\t\tfirstName: \"\",\n\t\tlastName: \"\",\n\t\tpassword: \"\",\n\t\tconfirmPassword: \"\",\n\t});\n\tconst [errors, setErrors] = useState<Record<string, string>>({});\n\n\tconst handleInputChange = (field: string, value: string) => {\n\t\tsetFormData((prev) => ({ ...prev, [field]: value }));\n\t\tif (errors[field]) {\n\t\t\tsetErrors((prev) => ({ ...prev, [field]: \"\" }));\n\t\t}\n\t};\n\n\tconst validateForm = (): boolean => {\n\t\tconst newErrors: Record<string, string> = {};\n\n\t\tif (requiresSignUp) {\n\t\t\tif (!formData.firstName.trim()) {\n\t\t\t\tnewErrors.firstName = \"First name is required\";\n\t\t\t}\n\n\t\t\tif (!formData.lastName.trim()) {\n\t\t\t\tnewErrors.lastName = \"Last name is required\";\n\t\t\t}\n\n\t\t\tif (!formData.password) {\n\t\t\t\tnewErrors.password = \"Password is required\";\n\t\t\t} else if (formData.password.length < 8) {\n\t\t\t\tnewErrors.password = \"Password must be at least 8 characters\";\n\t\t\t}\n\n\t\t\tif (formData.password !== formData.confirmPassword) {\n\t\t\t\tnewErrors.confirmPassword = \"Passwords do not match\";\n\t\t\t}\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn Object.keys(newErrors).length === 0;\n\t};\n\n\tconst handleSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!validateForm()) return;\n\n\t\tconst userData = requiresSignUp\n\t\t\t? {\n\t\t\t\t\tfirstName: formData.firstName,\n\t\t\t\t\tlastName: formData.lastName,\n\t\t\t\t\tpassword: formData.password,\n\t\t\t\t}\n\t\t\t: undefined;\n\n\t\tonSubmit(userData);\n\t};\n\n\tif (!requiresSignUp) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Card className={`max-w-md mx-auto ${className || \"\"}`} variant=\"flat\">\n\t\t\t<CardHeader>\n\t\t\t\t<h3 className=\"text-lg font-semibold\">Complete Your Profile</h3>\n\t\t\t\t<p className=\"text-sm text-default-500\">\n\t\t\t\t\tCreate your account to join {invitation.organizationName}\n\t\t\t\t</p>\n\t\t\t</CardHeader>\n\n\t\t\t<CardBody>\n\t\t\t\t<form onSubmit={handleSubmit} className=\"space-y-4\">\n\t\t\t\t\t<div className=\"grid grid-cols-2 gap-3\">\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"First Name\"\n\t\t\t\t\t\t\tplaceholder=\"Enter your first name\"\n\t\t\t\t\t\t\tvalue={formData.firstName}\n\t\t\t\t\t\t\tonChange={(e) => handleInputChange(\"firstName\", e.target.value)}\n\t\t\t\t\t\t\tisInvalid={!!errors.firstName}\n\t\t\t\t\t\t\terrorMessage={errors.firstName}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"Last Name\"\n\t\t\t\t\t\t\tplaceholder=\"Enter your last name\"\n\t\t\t\t\t\t\tvalue={formData.lastName}\n\t\t\t\t\t\t\tonChange={(e) => handleInputChange(\"lastName\", e.target.value)}\n\t\t\t\t\t\t\tisInvalid={!!errors.lastName}\n\t\t\t\t\t\t\terrorMessage={errors.lastName}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\tlabel=\"Password\"\n\t\t\t\t\t\tplaceholder=\"Create a strong password\"\n\t\t\t\t\t\tvalue={formData.password}\n\t\t\t\t\t\tonChange={(e) => handleInputChange(\"password\", e.target.value)}\n\t\t\t\t\t\tisInvalid={!!errors.password}\n\t\t\t\t\t\terrorMessage={errors.password}\n\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\tlabel=\"Confirm Password\"\n\t\t\t\t\t\tplaceholder=\"Confirm your password\"\n\t\t\t\t\t\tvalue={formData.confirmPassword}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\thandleInputChange(\"confirmPassword\", e.target.value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tisInvalid={!!errors.confirmPassword}\n\t\t\t\t\t\terrorMessage={errors.confirmPassword}\n\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tJoin Organization\n\t\t\t\t\t</Button>\n\t\t\t\t</form>\n\t\t\t</CardBody>\n\t\t</Card>\n\t);\n});\n\n// ============================================================================\n// Invite Status Component\n// ============================================================================\n\nexport const InviteStatus = withErrorBoundary(function InviteStatus({\n\tstatus,\n\tinvitation,\n\terror,\n\tclassName,\n}: InviteStatusProps) {\n\tconst getStatusConfig = () => {\n\t\tswitch (status) {\n\t\t\tcase \"validating\":\n\t\t\t\treturn {\n\t\t\t\t\ticon: <ClockIcon className=\"h-16 w-16 text-primary animate-spin\" />,\n\t\t\t\t\ttitle: \"Validating Invitation\",\n\t\t\t\t\tmessage: \"Please wait while we verify your invitation...\",\n\t\t\t\t\tcolor: \"primary\",\n\t\t\t\t};\n\t\t\tcase \"valid\":\n\t\t\t\treturn {\n\t\t\t\t\ticon: <CheckCircleIcon className=\"h-16 w-16 text-success\" />,\n\t\t\t\t\ttitle: \"Valid Invitation\",\n\t\t\t\t\tmessage: \"Your invitation is valid and ready to accept.\",\n\t\t\t\t\tcolor: \"success\",\n\t\t\t\t};\n\t\t\tcase \"accepted\":\n\t\t\t\treturn {\n\t\t\t\t\ticon: <CheckCircleIcon className=\"h-16 w-16 text-success\" />,\n\t\t\t\t\ttitle: \"Invitation Accepted!\",\n\t\t\t\t\tmessage: invitation\n\t\t\t\t\t\t? `Welcome to ${invitation.organizationName}! You've been added as ${invitation.roleName}.`\n\t\t\t\t\t\t: \"Your invitation has been accepted successfully.\",\n\t\t\t\t\tcolor: \"success\",\n\t\t\t\t};\n\t\t\tcase \"declined\":\n\t\t\t\treturn {\n\t\t\t\t\ticon: <XCircleIcon className=\"h-16 w-16 text-default-500\" />,\n\t\t\t\t\ttitle: \"Invitation Declined\",\n\t\t\t\t\tmessage: \"You have declined this organization invitation.\",\n\t\t\t\t\tcolor: \"default\",\n\t\t\t\t};\n\t\t\tcase \"expired\":\n\t\t\t\treturn {\n\t\t\t\t\ticon: <ExclamationTriangleIcon className=\"h-16 w-16 text-warning\" />,\n\t\t\t\t\ttitle: \"Invitation Expired\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"This invitation has expired. Please request a new invitation from the organization.\",\n\t\t\t\t\tcolor: \"warning\",\n\t\t\t\t};\n\t\t\tcase \"invalid\":\n\t\t\t\treturn {\n\t\t\t\t\ticon: <XCircleIcon className=\"h-16 w-16 text-danger\" />,\n\t\t\t\t\ttitle: \"Invalid Invitation\",\n\t\t\t\t\tmessage: \"This invitation link is invalid or has already been used.\",\n\t\t\t\t\tcolor: \"danger\",\n\t\t\t\t};\n\t\t\tcase \"error\":\n\t\t\t\treturn {\n\t\t\t\t\ticon: <ExclamationTriangleIcon className=\"h-16 w-16 text-danger\" />,\n\t\t\t\t\ttitle: \"Error\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror || \"An error occurred while processing your invitation.\",\n\t\t\t\t\tcolor: \"danger\",\n\t\t\t\t};\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\ticon: <ClockIcon className=\"h-16 w-16 text-default-500\" />,\n\t\t\t\t\ttitle: \"Unknown Status\",\n\t\t\t\t\tmessage: \"Unable to determine invitation status.\",\n\t\t\t\t\tcolor: \"default\",\n\t\t\t\t};\n\t\t}\n\t};\n\n\tconst config = getStatusConfig();\n\n\treturn (\n\t\t<Card className={`max-w-md mx-auto ${className || \"\"}`} variant=\"flat\">\n\t\t\t<CardBody className=\"text-center py-8\">\n\t\t\t\t<div className=\"flex justify-center mb-6\">{config.icon}</div>\n\n\t\t\t\t<h2 className=\"text-xl font-semibold mb-3\">{config.title}</h2>\n\t\t\t\t<p className=\"text-default-600 mb-6\">{config.message}</p>\n\n\t\t\t\t{status === \"accepted\" && invitation?.redirectUrl && (\n\t\t\t\t\t<p className=\"text-sm text-default-500\">\n\t\t\t\t\t\tRedirecting you to the organization dashboard...\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\n\t\t\t\t{(status === \"expired\" ||\n\t\t\t\t\tstatus === \"invalid\" ||\n\t\t\t\t\tstatus === \"error\") && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\tvariant=\"flat\"\n\t\t\t\t\t\tonClick={() => (window.location.href = \"/\")}\n\t\t\t\t\t>\n\t\t\t\t\t\tReturn to Home\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</CardBody>\n\t\t</Card>\n\t);\n});\n\n// ============================================================================\n// Export All Components\n// ============================================================================\n\nexport const InvitationComponents = {\n\tInviteAcceptance,\n\tInvitePreview,\n\tInviteAcceptForm,\n\tInviteStatus,\n};\n"],"names":["useInvitation","token","onAcceptSuccess","onDeclineSuccess","onError","client","user","useAuth","invitation","setInvitation","useState","status","setStatus","error","setError","validateInvitation","useCallback","invitationToken","response","err","acceptInvitation","userData","acceptRequest","declineInvitation","useEffect","urlParams","urlToken","formatExpirationDate","expiresAt","date","now","diffMs","diffHours","diffDays","getInvitationStatus","InviteAcceptance","withErrorBoundary","className","style","config","useConfig","isLoading","handleAccept","handleDecline","renderContent","jsx","InviteStatus","jsxs","InvitePreview","InviteAcceptForm","onAccept","onDecline","invitationStatus","expirationText","Card","CardHeader","BuildingOfficeIcon","Badge","CardBody","Avatar","Divider","ShieldCheckIcon","Fragment","Button","CheckCircleIcon","XCircleIcon","onSubmit","requiresSignUp","formData","setFormData","errors","setErrors","handleInputChange","field","value","prev","validateForm","newErrors","handleSubmit","e","Input","ClockIcon","ExclamationTriangleIcon","InvitationComponents"],"mappings":"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"}