@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 23.1 kB
Source Map (JSON)
{"version":3,"file":"sign-in.cjs","sources":["../../../../../src/components/auth/sign-in/sign-in.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Main Sign In Component\n *\n * Universal sign-in component that can render as form, modal, or card\n * based on props. Focuses on organization-user relationships and provides\n * comprehensive authentication flows for multi-tenant applications.\n */\n\n\"use client\";\n\nimport React from \"react\";\n\nimport { SignInCard } from \"./sign-in-card\";\nimport { SignInForm } from \"./sign-in-form\";\nimport { SignInModal } from \"./sign-in-modal\";\n\nimport type {\n\tBaseSignInProps,\n\tSignInCardProps,\n\tSignInFormProps,\n\tSignInModalProps,\n} from \"./index\";\n\n// ============================================================================\n// Sign In Component Types\n// ============================================================================\n\nexport interface SignInProps extends BaseSignInProps {\n\t/**\n\t * Render mode\n\t */\n\tmode?: \"form\" | \"modal\" | \"card\";\n\n\t/**\n\t * Modal-specific props (when mode is 'modal')\n\t */\n\tmodalProps?: Partial<SignInModalProps>;\n\n\t/**\n\t * Card-specific props (when mode is 'card')\n\t */\n\tcardProps?: Partial<SignInCardProps>;\n\n\t/**\n\t * Form-specific props (when mode is 'form' or not specified)\n\t */\n\tformProps?: Partial<SignInFormProps>;\n\n\t/**\n\t * Auto-detect mode based on context\n\t */\n\tautoMode?: boolean;\n\n\t/**\n\t * Organization-specific sign-in flow\n\t */\n\torganizationFlow?: boolean;\n\n\t/**\n\t * Show organization selector\n\t */\n\tshowOrganizationSelector?: boolean;\n\n\t/**\n\t * Pre-select organization from URL or context\n\t */\n\tautoSelectOrganization?: boolean;\n}\n\n// ============================================================================\n// Main Sign In Component\n// ============================================================================\n\n/**\n * Universal Sign In component that can render in different modes\n *\n * @example Form mode (default)\n * ```tsx\n * <SignIn\n * methods={['password', 'oauth']}\n * organizationId=\"org_123\"\n * onSuccess={(result) => console.log('Signed in:', result)}\n * />\n * ```\n *\n * @example Modal mode\n * ```tsx\n * <SignIn\n * mode=\"modal\"\n * isOpen={isModalOpen}\n * onClose={() => setIsModalOpen(false)}\n * organizationFlow\n * onSuccess={(result) => console.log('Signed in:', result)}\n * />\n * ```\n *\n * @example Card mode with organization branding\n * ```tsx\n * <SignIn\n * mode=\"card\"\n * centered\n * organizationId=\"org_123\"\n * showBranding\n * onSuccess={(result) => console.log('Signed in:', result)}\n * />\n * ```\n *\n * @example Auto-mode with organization flow\n * ```tsx\n * <SignIn\n * autoMode\n * organizationFlow\n * autoSelectOrganization\n * onSuccess={(result) => console.log('Signed in:', result)}\n * />\n * ```\n */\nexport function SignIn({\n\tmode = \"form\",\n\tmodalProps = {},\n\tcardProps = {},\n\tformProps = {},\n\tautoMode = false,\n\torganizationFlow = false,\n\tshowOrganizationSelector = false,\n\tautoSelectOrganization = false,\n\t...baseProps\n}: SignInProps) {\n\t// Auto-detect mode based on context\n\tconst detectedMode = React.useMemo(() => {\n\t\tif (!autoMode) return mode;\n\n\t\t// Check if we're in a modal context (has backdrop)\n\t\tconst hasBackdrop =\n\t\t\ttypeof window !== \"undefined\" &&\n\t\t\tdocument.querySelector(\"[data-modal-backdrop]\");\n\n\t\tif (hasBackdrop) return \"modal\";\n\n\t\t// Check if we're in a card context (has card container)\n\t\tconst hasCardContainer =\n\t\t\ttypeof window !== \"undefined\" &&\n\t\t\tdocument.querySelector(\"[data-card-container]\");\n\n\t\tif (hasCardContainer) return \"card\";\n\n\t\t// Default to form\n\t\treturn \"form\";\n\t}, [autoMode, mode]);\n\n\tconst finalMode = autoMode ? detectedMode : mode;\n\n\t// Auto-select organization from URL params or context\n\tconst selectedOrganizationId = React.useMemo(() => {\n\t\tif (!autoSelectOrganization) return baseProps.organizationId;\n\n\t\t// Check URL parameters\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\t\tconst orgFromUrl =\n\t\t\t\turlParams.get(\"org\") || urlParams.get(\"organization_id\");\n\t\t\tif (orgFromUrl) return orgFromUrl;\n\n\t\t\t// Check subdomain for organization slug\n\t\t\tconst subdomain = window.location.hostname.split(\".\")[0];\n\t\t\tif (subdomain && subdomain !== \"www\" && subdomain !== \"app\") {\n\t\t\t\treturn subdomain; // Assume subdomain is organization slug\n\t\t\t}\n\t\t}\n\n\t\treturn baseProps.organizationId;\n\t}, [autoSelectOrganization, baseProps.organizationId]);\n\n\t// Enhanced props with organization flow\n\tconst enhancedBaseProps = {\n\t\t...baseProps,\n\t\torganizationId: selectedOrganizationId,\n\t\tshowOrganizationSelector: organizationFlow\n\t\t\t? showOrganizationSelector\n\t\t\t: false,\n\t};\n\n\t// Enhanced form props for organization flow\n\tconst enhancedFormProps = {\n\t\t...formProps,\n\t\tshowOrganizationSelector: organizationFlow\n\t\t\t? showOrganizationSelector\n\t\t\t: formProps.showOrganizationSelector,\n\t\tvariant: organizationFlow ? \"default\" : formProps.variant,\n\t};\n\n\t// Render based on mode\n\tswitch (finalMode) {\n\t\tcase \"modal\":\n\t\t\treturn (\n\t\t\t\t<SignInModal\n\t\t\t\t\t{...enhancedBaseProps}\n\t\t\t\t\t{...modalProps}\n\t\t\t\t\tshowOrganizationSelector={\n\t\t\t\t\t\torganizationFlow\n\t\t\t\t\t\t\t? showOrganizationSelector\n\t\t\t\t\t\t\t: modalProps.showOrganizationSelector\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t);\n\n\t\tcase \"card\":\n\t\t\treturn (\n\t\t\t\t<SignInCard\n\t\t\t\t\t{...enhancedBaseProps}\n\t\t\t\t\t{...cardProps}\n\t\t\t\t\tshowOrganizationBranding={organizationFlow}\n\t\t\t\t/>\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn <SignInForm {...enhancedBaseProps} {...enhancedFormProps} />;\n\t}\n}\n\n// ============================================================================\n// Sign In Component Variants\n// ============================================================================\n\n/**\n * Sign In Form (explicit form mode)\n */\nexport function SignInFormComponent(props: SignInProps) {\n\treturn <SignIn {...props} mode=\"form\" />;\n}\n\n/**\n * Sign In Modal (explicit modal mode)\n */\nexport function SignInModalComponent(props: SignInProps) {\n\treturn <SignIn {...props} mode=\"modal\" />;\n}\n\n/**\n * Sign In Card (explicit card mode)\n */\nexport function SignInCardComponent(props: SignInProps) {\n\treturn <SignIn {...props} mode=\"card\" />;\n}\n\n// ============================================================================\n// Organization-Focused Sign In Components\n// ============================================================================\n\n/**\n * Organization Sign In - Focused on organization-user relationships\n */\nexport interface OrganizationSignInProps\n\textends Omit<SignInProps, \"organizationFlow\" | \"organizationId\"> {\n\t/**\n\t * Organization ID (required)\n\t */\n\torganizationId: string;\n\n\t/**\n\t * Organization name for display\n\t */\n\torganizationName?: string;\n\n\t/**\n\t * Organization logo URL\n\t */\n\torganizationLogo?: string;\n\n\t/**\n\t * Allow users to switch organizations\n\t */\n\tallowOrganizationSwitching?: boolean;\n\n\t/**\n\t * Show organization member count or info\n\t */\n\tshowOrganizationInfo?: boolean;\n\n\t/**\n\t * Custom organization welcome message\n\t */\n\torganizationWelcomeMessage?: string;\n\n\t/**\n\t * Organization-specific auth methods\n\t */\n\torganizationAuthMethods?: (\n\t\t| \"password\"\n\t\t| \"oauth\"\n\t\t| \"magic-link\"\n\t\t| \"passkey\"\n\t\t| \"sso\"\n\t)[];\n}\n\nexport function OrganizationSignIn({\n\torganizationId,\n\torganizationName,\n\torganizationLogo,\n\tallowOrganizationSwitching = false,\n\tshowOrganizationInfo = true,\n\torganizationWelcomeMessage,\n\torganizationAuthMethods,\n\ttitle,\n\tsubtitle,\n\tmethods,\n\t...props\n}: OrganizationSignInProps) {\n\tconst finalTitle =\n\t\ttitle ||\n\t\t(organizationName ? `Welcome to ${organizationName}` : \"Welcome back\");\n\tconst finalSubtitle =\n\t\tsubtitle || organizationWelcomeMessage || \"Sign in to your account\";\n\tconst finalMethods = organizationAuthMethods ||\n\t\tmethods || [\"password\", \"oauth\", \"sso\"];\n\n\treturn (\n\t\t<SignIn\n\t\t\t{...props}\n\t\t\torganizationId={organizationId}\n\t\t\torganizationFlow\n\t\t\ttitle={finalTitle}\n\t\t\tsubtitle={finalSubtitle}\n\t\t\tmethods={finalMethods}\n\t\t\tshowOrganizationSelector={allowOrganizationSwitching}\n\t\t\tshowBranding={showOrganizationInfo}\n\t\t/>\n\t);\n}\n\n/**\n * Multi-Organization Sign In - Allows users to select from their organizations\n */\nexport interface MultiOrganizationSignInProps\n\textends Omit<SignInProps, \"organizationId\"> {\n\t/**\n\t * Available organizations for the user\n\t */\n\torganizations?: Array<{\n\t\tid: string;\n\t\tname: string;\n\t\tslug?: string;\n\t\tlogoUrl?: string;\n\t}>;\n\n\t/**\n\t * Default organization to pre-select\n\t */\n\tdefaultOrganizationId?: string;\n\n\t/**\n\t * Show organization logos in selector\n\t */\n\tshowOrganizationLogos?: boolean;\n\n\t/**\n\t * Allow creating new organization\n\t */\n\tallowCreateOrganization?: boolean;\n\n\t/**\n\t * Callback when organization is selected\n\t */\n\tonOrganizationSelected?: (organizationId: string) => void;\n}\n\nexport function MultiOrganizationSignIn({\n\torganizations = [],\n\tdefaultOrganizationId,\n\tshowOrganizationLogos = true,\n\tallowCreateOrganization = false,\n\tonOrganizationSelected,\n\t...props\n}: MultiOrganizationSignInProps) {\n\tconst [selectedOrgId, setSelectedOrgId] = React.useState(\n\t\tdefaultOrganizationId,\n\t);\n\n\tconst handleOrganizationChange = React.useCallback(\n\t\t(orgId: string) => {\n\t\t\tsetSelectedOrgId(orgId);\n\t\t\tonOrganizationSelected?.(orgId);\n\t\t},\n\t\t[onOrganizationSelected],\n\t);\n\n\treturn (\n\t\t<SignIn\n\t\t\t{...props}\n\t\t\torganizationId={selectedOrgId}\n\t\t\torganizationFlow\n\t\t\tshowOrganizationSelector\n\t\t\tautoSelectOrganization={false}\n\t\t/>\n\t);\n}\n\n/**\n * SSO Sign In - Focused on Single Sign-On flows\n */\nexport function SSOSignIn({\n\torganizationId,\n\t...props\n}: Omit<OrganizationSignInProps, \"organizationAuthMethods\">) {\n\treturn (\n\t\t<OrganizationSignIn\n\t\t\t{...props}\n\t\t\torganizationId={organizationId}\n\t\t\torganizationAuthMethods={[\"sso\", \"password\"]}\n\t\t\ttitle=\"Single Sign-On\"\n\t\t\tsubtitle=\"Sign in with your organization's SSO provider\"\n\t\t/>\n\t);\n}\n\n/**\n * Passwordless Sign In - No password required\n */\nexport function PasswordlessSignIn(props: SignInProps) {\n\treturn (\n\t\t<SignIn\n\t\t\t{...props}\n\t\t\tmethods={[\"magic-link\", \"passkey\", \"oauth\", \"sso\"]}\n\t\t\ttitle=\"Sign in securely\"\n\t\t\tsubtitle=\"No password required\"\n\t\t/>\n\t);\n}\n\n/**\n * Secure Sign In - Enhanced security features\n */\nexport function SecureSignIn(props: SignInProps) {\n\treturn (\n\t\t<SignIn\n\t\t\t{...props}\n\t\t\tmethods={[\"passkey\", \"password\", \"sso\"]}\n\t\t\ttitle=\"Secure Sign In\"\n\t\t\tsubtitle=\"Sign in with enhanced security\"\n\t\t/>\n\t);\n}\n\n// ============================================================================\n// Context-Aware Sign In Components\n// ============================================================================\n\n/**\n * Subdomain Sign In - Automatically detects organization from subdomain\n */\nexport function SubdomainSignIn(\n\tprops: Omit<SignInProps, \"organizationId\" | \"autoSelectOrganization\">,\n) {\n\treturn (\n\t\t<SignIn {...props} organizationFlow autoSelectOrganization showBranding />\n\t);\n}\n\n/**\n * URL-Based Sign In - Detects organization from URL parameters\n */\nexport function URLBasedSignIn(\n\tprops: Omit<SignInProps, \"organizationId\" | \"autoSelectOrganization\">,\n) {\n\treturn (\n\t\t<SignIn\n\t\t\t{...props}\n\t\t\torganizationFlow\n\t\t\tautoSelectOrganization\n\t\t\tshowOrganizationSelector\n\t\t/>\n\t);\n}\n\n/**\n * Invitation-Based Sign In - For organization invitations\n */\nexport interface InvitationSignInProps\n\textends Omit<SignInProps, \"organizationId\"> {\n\t/**\n\t * Invitation token\n\t */\n\tinvitationToken: string;\n\n\t/**\n\t * Organization name from invitation\n\t */\n\torganizationName?: string;\n\n\t/**\n\t * Inviter information\n\t */\n\tinviterInfo?: {\n\t\tname?: string;\n\t\temail?: string;\n\t};\n\n\t/**\n\t * Auto-create account if not exists\n\t */\n\tautoCreateAccount?: boolean;\n}\n\nexport function InvitationSignIn({\n\tinvitationToken,\n\torganizationName,\n\tinviterInfo,\n\tautoCreateAccount = true,\n\ttitle,\n\tsubtitle,\n\tonSuccess,\n\t...props\n}: InvitationSignInProps) {\n\t// Parse invitation token to get organization info\n\tconst invitationData = React.useMemo(() => {\n\t\ttry {\n\t\t\tconst decoded = atob(invitationToken);\n\t\t\treturn JSON.parse(decoded);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}, [invitationToken]);\n\n\tconst orgName =\n\t\torganizationName || invitationData?.orgName || \"the organization\";\n\tconst inviterName = inviterInfo?.name || invitationData?.inviterName;\n\n\tconst finalTitle = title || `Join ${orgName}`;\n\tconst finalSubtitle =\n\t\tsubtitle ||\n\t\t(inviterName\n\t\t\t? `${inviterName} invited you to sign in to ${orgName}`\n\t\t\t: `You've been invited to sign in to ${orgName}`);\n\n\t// Enhanced success handler for invitations\n\tconst handleSuccess = React.useCallback(\n\t\t(result: any) => {\n\t\t\t// Handle invitation acceptance logic here\n\t\t\tonSuccess?.(result);\n\t\t},\n\t\t[onSuccess],\n\t);\n\n\treturn (\n\t\t<SignIn\n\t\t\t{...props}\n\t\t\torganizationId={invitationData?.orgId}\n\t\t\torganizationFlow\n\t\t\ttitle={finalTitle}\n\t\t\tsubtitle={finalSubtitle}\n\t\t\tshowBranding\n\t\t\tonSuccess={handleSuccess}\n\t\t\tformProps={{\n\t\t\t\t...props.formProps,\n\t\t\t\tfooter: (\n\t\t\t\t\t<div className=\"text-center text-sm text-default-500\">\n\t\t\t\t\t\t{autoCreateAccount && (\n\t\t\t\t\t\t\t<p>Don't have an account? One will be created for you.</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t),\n\t\t\t}}\n\t\t/>\n\t);\n}\n\n// ============================================================================\n// Progressive Sign In Flow\n// ============================================================================\n\n/**\n * Progressive Sign In - Adapts based on user context and organization\n */\nexport function ProgressiveSignIn({ onSuccess, ...props }: SignInProps) {\n\tconst [step, setStep] = React.useState<\n\t\t\"organization\" | \"credentials\" | \"mfa\" | \"complete\"\n\t>(\"organization\");\n\tconst [selectedOrg, setSelectedOrg] = React.useState<string | undefined>(\n\t\tprops.organizationId,\n\t);\n\tconst [authData, setAuthData] = React.useState<any>(null);\n\n\t// Handle organization selection\n\tconst handleOrganizationSelected = React.useCallback((orgId: string) => {\n\t\tsetSelectedOrg(orgId);\n\t\tsetStep(\"credentials\");\n\t}, []);\n\n\t// Handle credential success\n\tconst handleCredentialSuccess = React.useCallback(\n\t\t(result: any) => {\n\t\t\tif (result.status === \"complete\") {\n\t\t\t\tsetStep(\"complete\");\n\t\t\t\tonSuccess?.(result);\n\t\t\t} else if (result.status === \"needs_mfa\") {\n\t\t\t\tsetAuthData(result);\n\t\t\t\tsetStep(\"mfa\");\n\t\t\t} else {\n\t\t\t\tonSuccess?.(result);\n\t\t\t}\n\t\t},\n\t\t[onSuccess],\n\t);\n\n\t// Handle MFA success\n\tconst handleMFASuccess = React.useCallback(\n\t\t(result: any) => {\n\t\t\tsetStep(\"complete\");\n\t\t\tonSuccess?.(result);\n\t\t},\n\t\t[onSuccess],\n\t);\n\n\t// Render based on step\n\tswitch (step) {\n\t\tcase \"organization\":\n\t\t\tif (selectedOrg) {\n\t\t\t\tsetStep(\"credentials\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<MultiOrganizationSignIn\n\t\t\t\t\t{...props}\n\t\t\t\t\tonOrganizationSelected={handleOrganizationSelected}\n\t\t\t\t/>\n\t\t\t);\n\n\t\tcase \"mfa\":\n\t\t\treturn (\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<h2 className=\"text-xl font-semibold\">Two-Factor Authentication</h2>\n\t\t\t\t\t\t<p className=\"text-default-500\">Complete your sign-in with MFA</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t{/* MFA component would go here */}\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"complete\":\n\t\t\treturn (\n\t\t\t\t<div className=\"text-center space-y-4\">\n\t\t\t\t\t<div className=\"text-success-600 text-xl\">✓</div>\n\t\t\t\t\t<h2 className=\"text-xl font-semibold\">Welcome back!</h2>\n\t\t\t\t\t<p className=\"text-default-500\">\n\t\t\t\t\t\tYou have been successfully signed in.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<OrganizationSignIn\n\t\t\t\t\t{...props}\n\t\t\t\t\torganizationId={selectedOrg!}\n\t\t\t\t\tonSuccess={handleCredentialSuccess}\n\t\t\t\t/>\n\t\t\t);\n\t}\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport default SignIn;\n"],"names":["SignIn","mode","modalProps","cardProps","formProps","autoMode","organizationFlow","showOrganizationSelector","autoSelectOrganization","baseProps","detectedMode","React","finalMode","selectedOrganizationId","urlParams","orgFromUrl","subdomain","enhancedBaseProps","enhancedFormProps","jsx","SignInModal","SignInCard","SignInForm","OrganizationSignIn","organizationId","organizationName","organizationLogo","allowOrganizationSwitching","showOrganizationInfo","organizationWelcomeMessage","organizationAuthMethods","title","subtitle","methods","props","finalTitle","finalSubtitle","finalMethods","MultiOrganizationSignIn","organizations","defaultOrganizationId","showOrganizationLogos","allowCreateOrganization","onOrganizationSelected","selectedOrgId","setSelectedOrgId","orgId","SSOSignIn","PasswordlessSignIn","SecureSignIn","SubdomainSignIn","URLBasedSignIn","InvitationSignIn","invitationToken","inviterInfo","autoCreateAccount","onSuccess","invitationData","decoded","orgName","inviterName","handleSuccess","result","ProgressiveSignIn","step","setStep","selectedOrg","setSelectedOrg","authData","setAuthData","handleOrganizationSelected","handleCredentialSuccess","jsxs"],"mappings":"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"}