@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 35.7 kB
Source Map (JSON)
{"version":3,"file":"link.cjs","sources":["../../../../../src/components/auth/account-linking/link.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Account Linking Components\n *\n * Components for connecting and managing OAuth providers and external accounts,\n * with support for linking, unlinking, and managing connected accounts.\n */\n\n\"use client\";\n\nimport {\n\tCard,\n\tCardBody,\n\tChip,\n\tButton as HButton,\n\tModal,\n\tModalBody,\n\tModalFooter,\n\tModalHeader,\n\tTooltip,\n} from \"@/components/ui\";\nimport {\n\tCheckCircleIcon,\n\tExclamationTriangleIcon,\n\tShieldCheckIcon,\n\tLinkIcon as UnlinkIcon,\n\tUserCircleIcon,\n} from \"@heroicons/react/24/outline\";\nimport React, { useCallback, useMemo, useState } from \"react\";\n\nimport { useAuth } from \"../../../hooks/use-auth\";\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { useOAuth } from \"../../../hooks/use-oauth\";\nimport FormWrapper from \"../../forms/form-wrapper\";\n\n// ============================================================================\n// Account Linking Types\n// ============================================================================\n\nexport interface AccountLinkingProps {\n\t/**\n\t * Success callback\n\t */\n\tonSuccess?: (provider: string, result: any) => void;\n\n\t/**\n\t * Error callback\n\t */\n\tonError?: (error: Error) => void;\n\n\t/**\n\t * Custom title\n\t */\n\ttitle?: string;\n\n\t/**\n\t * Custom subtitle\n\t */\n\tsubtitle?: string;\n\n\t/**\n\t * Component variant\n\t */\n\tvariant?: \"default\" | \"card\" | \"modal\";\n\n\t/**\n\t * Size\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\n\t/**\n\t * Custom className\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Show only specific providers\n\t */\n\tproviders?: string[];\n\n\t/**\n\t * Show connection status\n\t */\n\tshowStatus?: boolean;\n\n\t/**\n\t * Allow unlinking\n\t */\n\tallowUnlink?: boolean;\n\n\t/**\n\t * Require minimum connections\n\t */\n\tminimumConnections?: number;\n}\n\nexport interface ConnectedAccountCardProps {\n\tprovider: string;\n\taccount: any;\n\tonUnlink?: () => void;\n\tallowUnlink?: boolean;\n\tisLoading?: boolean;\n\tshowDetails?: boolean;\n}\n\nexport interface ProviderConnectionButtonProps {\n\tprovider: string;\n\tisConnected: boolean;\n\tonConnect: () => void;\n\tonDisconnect: () => void;\n\tisLoading: boolean;\n\tdisabled?: boolean;\n\tallowUnlink?: boolean;\n}\n\n// ============================================================================\n// Provider Icons (Static)\n// ============================================================================\n\nconst ProviderIcon = React.memo(\n\t({\n\t\tprovider,\n\t\tclassName = \"w-5 h-5\",\n\t}: { provider: string; className?: string }) => {\n\t\tconst icons: Record<string, JSX.Element> = {\n\t\t\tgoogle: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tfill=\"#4285F4\"\n\t\t\t\t\t\td=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n\t\t\t\t\t/>\n\t\t\t\t\t<path\n\t\t\t\t\t\tfill=\"#34A853\"\n\t\t\t\t\t\td=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n\t\t\t\t\t/>\n\t\t\t\t\t<path\n\t\t\t\t\t\tfill=\"#FBBC05\"\n\t\t\t\t\t\td=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n\t\t\t\t\t/>\n\t\t\t\t\t<path\n\t\t\t\t\t\tfill=\"#EA4335\"\n\t\t\t\t\t\td=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tgithub: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tmicrosoft: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path fill=\"#f25022\" d=\"M1 1h10v10H1z\" />\n\t\t\t\t\t<path fill=\"#00a4ef\" d=\"M13 1h10v10H13z\" />\n\t\t\t\t\t<path fill=\"#7fba00\" d=\"M1 13h10v10H1z\" />\n\t\t\t\t\t<path fill=\"#ffb900\" d=\"M13 13h10v10H13z\" />\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tapple: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\" />\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tfacebook: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} fill=\"#1877f2\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\ttwitter: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z\" />\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tlinkedin: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} fill=\"#0077b5\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tdiscord: (\n\t\t\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: <explanation>\n\t\t\t\t<svg className={className} fill=\"#5865f2\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419-.0001 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9554 2.4189-2.1568 2.4189Z\" />\n\t\t\t\t</svg>\n\t\t\t),\n\t\t};\n\n\t\treturn icons[provider] || <UserCircleIcon className={className} />;\n\t},\n);\n\nProviderIcon.displayName = \"ProviderIcon\";\n\n// ============================================================================\n// Connected Account Card Component\n// ============================================================================\n\nconst ConnectedAccountCard = React.memo(\n\t({\n\t\tprovider,\n\t\taccount,\n\t\tonUnlink,\n\t\tallowUnlink = true,\n\t\tisLoading = false,\n\t\tshowDetails = true,\n\t}: ConnectedAccountCardProps) => {\n\t\tconst { components } = useConfig();\n\t\tconst Button = components.Button ?? HButton;\n\n\t\tconst [showUnlinkModal, setShowUnlinkModal] = useState(false);\n\n\t\tconst handleUnlinkConfirm = useCallback(() => {\n\t\t\tonUnlink?.();\n\t\t\tsetShowUnlinkModal(false);\n\t\t}, [onUnlink]);\n\n\t\tconst getProviderDisplayName = (provider: string) => {\n\t\t\tconst names: Record<string, string> = {\n\t\t\t\tgoogle: \"Google\",\n\t\t\t\tgithub: \"GitHub\",\n\t\t\t\tmicrosoft: \"Microsoft\",\n\t\t\t\tapple: \"Apple\",\n\t\t\t\tfacebook: \"Facebook\",\n\t\t\t\ttwitter: \"Twitter\",\n\t\t\t\tlinkedin: \"LinkedIn\",\n\t\t\t\tdiscord: \"Discord\",\n\t\t\t};\n\t\t\treturn (\n\t\t\t\tnames[provider] || provider.charAt(0).toUpperCase() + provider.slice(1)\n\t\t\t);\n\t\t};\n\n\t\tconst formatConnectionDate = (date: string | Date) => {\n\t\t\ttry {\n\t\t\t\treturn new Date(date).toLocaleDateString();\n\t\t\t} catch {\n\t\t\t\treturn \"Unknown\";\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Card className=\"w-full\">\n\t\t\t\t\t<CardBody className=\"p-4\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t\t<div className=\"flex-shrink-0\">\n\t\t\t\t\t\t\t\t\t<ProviderIcon provider={provider} className=\"w-8 h-8\" />\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t<h4 className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{getProviderDisplayName(provider)}\n\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t<Chip\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"flat\"\n\t\t\t\t\t\t\t\t\t\t\tstartContent={<CheckCircleIcon className=\"w-3 h-3\" />}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tConnected\n\t\t\t\t\t\t\t\t\t\t</Chip>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{showDetails && account && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-1 space-y-1\">\n\t\t\t\t\t\t\t\t\t\t\t{account.email && (\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-default-500 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{account.email}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{account.connectedAt && (\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-default-400\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tConnected {formatConnectionDate(account.connectedAt)}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{allowUnlink && (\n\t\t\t\t\t\t\t\t\t\t<Tooltip content=\"Disconnect account\">\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tisIconOnly\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"danger\"\n\t\t\t\t\t\t\t\t\t\t\t\tonPress={() => setShowUnlinkModal(true)}\n\t\t\t\t\t\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<UnlinkIcon className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\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</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardBody>\n\t\t\t\t</Card>\n\n\t\t\t\t{/* Unlink Confirmation Modal */}\n\t\t\t\t<Modal\n\t\t\t\t\tisOpen={showUnlinkModal}\n\t\t\t\t\tonClose={() => setShowUnlinkModal(false)}\n\t\t\t\t\tplacement=\"center\"\n\t\t\t\t>\n\t\t\t\t\t<ModalHeader>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<ExclamationTriangleIcon className=\"w-5 h-5 text-warning-600\" />\n\t\t\t\t\t\t\tDisconnect Account\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ModalHeader>\n\t\t\t\t\t<ModalBody>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tAre you sure you want to disconnect your{\" \"}\n\t\t\t\t\t\t\t{getProviderDisplayName(provider)} account?\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"text-sm text-default-500\">\n\t\t\t\t\t\t\tYou won't be able to sign in using{\" \"}\n\t\t\t\t\t\t\t{getProviderDisplayName(provider)} until you reconnect it.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</ModalBody>\n\t\t\t\t\t<ModalFooter>\n\t\t\t\t\t\t<Button variant=\"light\" onPress={() => setShowUnlinkModal(false)}>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tcolor=\"danger\"\n\t\t\t\t\t\t\tonPress={handleUnlinkConfirm}\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tDisconnect\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</ModalFooter>\n\t\t\t\t</Modal>\n\t\t\t</>\n\t\t);\n\t},\n);\n\nConnectedAccountCard.displayName = \"ConnectedAccountCard\";\n\n// ============================================================================\n// Provider Connection Button Component\n// ============================================================================\n\nconst ProviderConnectionButton = React.memo(\n\t({\n\t\tprovider,\n\t\tisConnected,\n\t\tonConnect,\n\t\tonDisconnect,\n\t\tisLoading,\n\t\tdisabled = false,\n\t\tallowUnlink = true,\n\t}: ProviderConnectionButtonProps) => {\n\t\tconst { components } = useConfig();\n\t\tconst Button = components.Button ?? Button;\n\n\t\tconst getProviderDisplayName = (provider: string) => {\n\t\t\tconst names: Record<string, string> = {\n\t\t\t\tgoogle: \"Google\",\n\t\t\t\tgithub: \"GitHub\",\n\t\t\t\tmicrosoft: \"Microsoft\",\n\t\t\t\tapple: \"Apple\",\n\t\t\t\tfacebook: \"Facebook\",\n\t\t\t\ttwitter: \"Twitter\",\n\t\t\t\tlinkedin: \"LinkedIn\",\n\t\t\t\tdiscord: \"Discord\",\n\t\t\t};\n\t\t\treturn (\n\t\t\t\tnames[provider] || provider.charAt(0).toUpperCase() + provider.slice(1)\n\t\t\t);\n\t\t};\n\n\t\tif (isConnected) {\n\t\t\treturn (\n\t\t\t\t<div className=\"flex items-center justify-between p-4 border border-success-200 bg-success-50 dark:bg-success-900/20 rounded-lg\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<ProviderIcon provider={provider} className=\"w-6 h-6\" />\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t\t{getProviderDisplayName(provider)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-sm text-success-600 dark:text-success-400\">\n\t\t\t\t\t\t\t\tConnected\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\n\t\t\t\t\t{allowUnlink && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\tcolor=\"danger\"\n\t\t\t\t\t\t\tonPress={onDisconnect}\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tisDisabled={disabled}\n\t\t\t\t\t\t\tstartContent={<UnlinkIcon className=\"w-4 h-4\" />}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tDisconnect\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tvariant=\"bordered\"\n\t\t\t\tclassName=\"w-full justify-start p-4 h-auto\"\n\t\t\t\tonPress={onConnect}\n\t\t\t\tisLoading={isLoading}\n\t\t\t\tisDisabled={disabled}\n\t\t\t\tstartContent={<ProviderIcon provider={provider} className=\"w-6 h-6\" />}\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-col items-start\">\n\t\t\t\t\t<span className=\"font-medium\">\n\t\t\t\t\t\tConnect {getProviderDisplayName(provider)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-xs text-default-500\">\n\t\t\t\t\t\tLink your {getProviderDisplayName(provider)} account\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</Button>\n\t\t);\n\t},\n);\n\nProviderConnectionButton.displayName = \"ProviderConnectionButton\";\n\n// ============================================================================\n// Main Account Linking Component\n// ============================================================================\n\nexport function AccountLinking({\n\tonSuccess,\n\tonError,\n\ttitle = \"Connected Accounts\",\n\tsubtitle = \"Manage your connected social accounts\",\n\tvariant = \"default\",\n\tsize = \"md\",\n\tclassName = \"\",\n\tproviders,\n\tshowStatus = true,\n\tallowUnlink = true,\n\tminimumConnections = 0,\n}: AccountLinkingProps) {\n\tconst {\n\t\tproviders: availableProviders,\n\t\tconnectProvider,\n\t\tdisconnectProvider,\n\t\tisProviderConnected,\n\t\tisLoading,\n\t} = useOAuth();\n\n\tconst { user } = useAuth();\n\tconst { components } = useConfig();\n\n\tconst [loadingProvider, setLoadingProvider] = useState<string | null>(null);\n\n\t// Filter providers if specified\n\tconst displayProviders = useMemo(() => {\n\t\tif (providers && providers.length > 0) {\n\t\t\treturn availableProviders.filter((p) => providers.includes(p.name));\n\t\t}\n\t\treturn availableProviders;\n\t}, [availableProviders, providers]);\n\n\t// Get connected accounts\n\tconst connectedAccounts = useMemo(() => {\n\t\tif (!user?.connectedAccounts) return [];\n\t\treturn user.connectedAccounts;\n\t}, [user]);\n\n\t// Handle connect provider\n\tconst handleConnect = useCallback(\n\t\tasync (provider: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoadingProvider(provider);\n\t\t\t\tawait connectProvider(provider);\n\t\t\t\tonSuccess?.(provider, { action: \"connect\" });\n\t\t\t} catch (error) {\n\t\t\t\tonError?.(\n\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t? error\n\t\t\t\t\t\t: new Error(`Failed to connect ${provider}`),\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tsetLoadingProvider(null);\n\t\t\t}\n\t\t},\n\t\t[connectProvider, onSuccess, onError],\n\t);\n\n\t// Handle disconnect provider\n\tconst handleDisconnect = useCallback(\n\t\tasync (provider: string) => {\n\t\t\t// Check minimum connections\n\t\t\tconst connectedCount = connectedAccounts.length;\n\t\t\tif (minimumConnections > 0 && connectedCount <= minimumConnections) {\n\t\t\t\tonError?.(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`You must have at least ${minimumConnections} connected account(s)`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tsetLoadingProvider(provider);\n\t\t\t\tawait disconnectProvider(provider);\n\t\t\t\tonSuccess?.(provider, { action: \"disconnect\" });\n\t\t\t} catch (error) {\n\t\t\t\tonError?.(\n\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t? error\n\t\t\t\t\t\t: new Error(`Failed to disconnect ${provider}`),\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tsetLoadingProvider(null);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tdisconnectProvider,\n\t\t\tconnectedAccounts.length,\n\t\t\tminimumConnections,\n\t\t\tonSuccess,\n\t\t\tonError,\n\t\t],\n\t);\n\n\t// Form wrapper props\n\tconst formWrapperProps = useMemo(\n\t\t() => ({\n\t\t\tsize,\n\t\t\tvariant: \"flat\" as const,\n\t\t\tclassName: `space-y-6 ${className}`,\n\t\t\ttitle,\n\t\t\tsubtitle,\n\t\t\tshowCard: variant === \"card\",\n\t\t}),\n\t\t[size, className, title, subtitle, variant],\n\t);\n\n\treturn (\n\t\t<FormWrapper {...formWrapperProps}>\n\t\t\t{/* Connection Status */}\n\t\t\t{showStatus && (\n\t\t\t\t<div className=\"flex items-center gap-2 p-4 bg-default-100 dark:bg-default-900/50 rounded-lg\">\n\t\t\t\t\t<ShieldCheckIcon className=\"w-5 h-5 text-success-600\" />\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p className=\"text-sm font-medium text-foreground\">\n\t\t\t\t\t\t\tAccount Security\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"text-xs text-default-500\">\n\t\t\t\t\t\t\t{connectedAccounts.length} account(s) connected\n\t\t\t\t\t\t\t{minimumConnections > 0 && (\n\t\t\t\t\t\t\t\t<span className=\"ml-1\">\n\t\t\t\t\t\t\t\t\t(minimum {minimumConnections} required)\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Connected Accounts */}\n\t\t\t{connectedAccounts.length > 0 && (\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<h3 className=\"text-lg font-semibold text-foreground\">\n\t\t\t\t\t\tConnected Accounts\n\t\t\t\t\t</h3>\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t{connectedAccounts.map((account: any) => (\n\t\t\t\t\t\t\t<ConnectedAccountCard\n\t\t\t\t\t\t\t\tkey={account.provider}\n\t\t\t\t\t\t\t\tprovider={account.provider}\n\t\t\t\t\t\t\t\taccount={account}\n\t\t\t\t\t\t\t\tonUnlink={() => handleDisconnect(account.provider)}\n\t\t\t\t\t\t\t\tallowUnlink={allowUnlink}\n\t\t\t\t\t\t\t\tisLoading={loadingProvider === account.provider}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Available Providers */}\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t<h3 className=\"text-lg font-semibold text-foreground\">\n\t\t\t\t\t{connectedAccounts.length > 0\n\t\t\t\t\t\t? \"Available Connections\"\n\t\t\t\t\t\t: \"Connect Your Accounts\"}\n\t\t\t\t</h3>\n\n\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t{displayProviders\n\t\t\t\t\t\t.filter((provider) => !isProviderConnected(provider.name))\n\t\t\t\t\t\t.map((provider) => (\n\t\t\t\t\t\t\t<ProviderConnectionButton\n\t\t\t\t\t\t\t\tkey={provider.name}\n\t\t\t\t\t\t\t\tprovider={provider.name}\n\t\t\t\t\t\t\t\tisConnected={false}\n\t\t\t\t\t\t\t\tonConnect={() => handleConnect(provider.name)}\n\t\t\t\t\t\t\t\tonDisconnect={() => handleDisconnect(provider.name)}\n\t\t\t\t\t\t\t\tisLoading={loadingProvider === provider.name}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t</div>\n\n\t\t\t\t{displayProviders.filter((p) => !isProviderConnected(p.name)).length ===\n\t\t\t\t\t0 && (\n\t\t\t\t\t<div className=\"text-center py-8\">\n\t\t\t\t\t\t<UserCircleIcon className=\"w-12 h-12 text-default-400 mx-auto mb-4\" />\n\t\t\t\t\t\t<p className=\"text-default-500\">\n\t\t\t\t\t\t\tAll available accounts are connected\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Security Note */}\n\t\t\t<div className=\"text-center text-xs text-default-400 border-t pt-4\">\n\t\t\t\t<p>\n\t\t\t\t\tConnected accounts can be used to sign in to your account. You can\n\t\t\t\t\tdisconnect them at any time.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</FormWrapper>\n\t);\n}\n\n// ============================================================================\n// Account Linking Variants\n// ============================================================================\n\n/**\n * Account Linking Card\n */\nexport function AccountLinkingCard(\n\tprops: Omit<AccountLinkingProps, \"variant\">,\n) {\n\treturn <AccountLinking {...props} variant=\"card\" />;\n}\n\n/**\n * Simple Provider List (for settings pages)\n */\nexport function ConnectedAccountsList({\n\tallowUnlink = true,\n\tshowDetails = true,\n\tonUnlink,\n}: {\n\tallowUnlink?: boolean;\n\tshowDetails?: boolean;\n\tonUnlink?: (provider: string) => void;\n}) {\n\tconst { user } = useAuth();\n\tconst { disconnectProvider } = useOAuth();\n\tconst [loadingProvider, setLoadingProvider] = useState<string | null>(null);\n\n\tconst handleUnlink = useCallback(\n\t\tasync (provider: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoadingProvider(provider);\n\t\t\t\tawait disconnectProvider(provider);\n\t\t\t\tonUnlink?.(provider);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to unlink provider:\", error);\n\t\t\t} finally {\n\t\t\t\tsetLoadingProvider(null);\n\t\t\t}\n\t\t},\n\t\t[disconnectProvider, onUnlink],\n\t);\n\n\tconst connectedAccounts = user?.connectedAccounts || [];\n\n\tif (connectedAccounts.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"text-center py-4\">\n\t\t\t\t<p className=\"text-default-500 text-sm\">No connected accounts</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t{connectedAccounts.map((account: any) => (\n\t\t\t\t<ConnectedAccountCard\n\t\t\t\t\tkey={account.provider}\n\t\t\t\t\tprovider={account.provider}\n\t\t\t\t\taccount={account}\n\t\t\t\t\tonUnlink={() => handleUnlink(account.provider)}\n\t\t\t\t\tallowUnlink={allowUnlink}\n\t\t\t\t\tisLoading={loadingProvider === account.provider}\n\t\t\t\t\tshowDetails={showDetails}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport default AccountLinking;\n"],"names":["ProviderIcon","React","provider","className","jsxs","jsx","UserCircleIcon","ConnectedAccountCard","account","onUnlink","allowUnlink","isLoading","showDetails","components","useConfig","Button","HButton","showUnlinkModal","setShowUnlinkModal","useState","handleUnlinkConfirm","useCallback","getProviderDisplayName","formatConnectionDate","date","Fragment","Card","CardBody","Chip","CheckCircleIcon","Tooltip","UnlinkIcon","Modal","ModalHeader","ExclamationTriangleIcon","ModalBody","ModalFooter","ProviderConnectionButton","isConnected","onConnect","onDisconnect","disabled","AccountLinking","onSuccess","onError","title","subtitle","variant","size","providers","showStatus","minimumConnections","availableProviders","connectProvider","disconnectProvider","isProviderConnected","useOAuth","user","useAuth","loadingProvider","setLoadingProvider","displayProviders","useMemo","p","connectedAccounts","handleConnect","error","handleDisconnect","connectedCount","formWrapperProps","FormWrapper","ShieldCheckIcon","AccountLinkingCard","props","ConnectedAccountsList","handleUnlink"],"mappings":"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"}