@datatechsolutions/ui 3.2.1 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/astrlabe/contracts.d.mts +31 -3
- package/dist/astrlabe/contracts.d.ts +31 -3
- package/dist/astrlabe/index.d.mts +22 -30
- package/dist/astrlabe/index.d.ts +22 -30
- package/dist/astrlabe/index.js +121 -121
- package/dist/astrlabe/index.mjs +7 -7
- package/dist/astrlabe/utils.js +9 -9
- package/dist/astrlabe/utils.mjs +2 -2
- package/dist/astrlabe/workflow-canvas.d.mts +6 -69
- package/dist/astrlabe/workflow-canvas.d.ts +6 -69
- package/dist/astrlabe/workflow-canvas.js +6 -6
- package/dist/astrlabe/workflow-canvas.mjs +5 -5
- package/dist/brand/index.d.mts +1 -15
- package/dist/brand/index.d.ts +1 -15
- package/dist/brand/index.js +0 -14
- package/dist/brand/index.js.map +1 -1
- package/dist/brand/index.mjs +0 -14
- package/dist/brand/index.mjs.map +1 -1
- package/dist/{chunk-FAGDZEKM.js → chunk-2OZZH2IO.js} +2 -2
- package/dist/chunk-2OZZH2IO.js.map +1 -0
- package/dist/{chunk-SYNVNTLJ.mjs → chunk-3AY5HIQ6.mjs} +2 -2
- package/dist/chunk-3AY5HIQ6.mjs.map +1 -0
- package/dist/{chunk-JSNRCYSO.js → chunk-45QAUEYT.js} +4 -4
- package/dist/{chunk-JSNRCYSO.js.map → chunk-45QAUEYT.js.map} +1 -1
- package/dist/{chunk-B67DP7MI.mjs → chunk-4GDWGWHY.mjs} +4 -4
- package/dist/{chunk-B67DP7MI.mjs.map → chunk-4GDWGWHY.mjs.map} +1 -1
- package/dist/{chunk-KR2X2WHJ.js → chunk-4ICEQJH4.js} +53 -53
- package/dist/{chunk-KR2X2WHJ.js.map → chunk-4ICEQJH4.js.map} +1 -1
- package/dist/{chunk-RXZNACMI.js → chunk-6MBWKOPF.js} +33 -33
- package/dist/{chunk-RXZNACMI.js.map → chunk-6MBWKOPF.js.map} +1 -1
- package/dist/{chunk-C3H4FM4A.js → chunk-72SWXOD5.js} +15 -2
- package/dist/chunk-72SWXOD5.js.map +1 -0
- package/dist/{chunk-JN6IL6OH.mjs → chunk-AGGOHPMZ.mjs} +1054 -5229
- package/dist/chunk-AGGOHPMZ.mjs.map +1 -0
- package/dist/{chunk-5GDKCFM5.mjs → chunk-AL73YAV4.mjs} +3 -3
- package/dist/{chunk-5GDKCFM5.mjs.map → chunk-AL73YAV4.mjs.map} +1 -1
- package/dist/{chunk-ZJPNP2YW.mjs → chunk-BUDZNAKL.mjs} +2 -2
- package/dist/chunk-BUDZNAKL.mjs.map +1 -0
- package/dist/{chunk-OL73LBX5.mjs → chunk-BW67WFHT.mjs} +3 -4
- package/dist/chunk-BW67WFHT.mjs.map +1 -0
- package/dist/{chunk-W5OEBO6E.js → chunk-CF7GOUBQ.js} +13 -14
- package/dist/chunk-CF7GOUBQ.js.map +1 -0
- package/dist/{chunk-IRPS5UCS.mjs → chunk-CUWPLPVY.mjs} +3 -3
- package/dist/{chunk-IRPS5UCS.mjs.map → chunk-CUWPLPVY.mjs.map} +1 -1
- package/dist/{chunk-NJS2YC3J.js → chunk-DJDZIRM6.js} +12 -2
- package/dist/chunk-DJDZIRM6.js.map +1 -0
- package/dist/{chunk-RL35XATZ.js → chunk-ERCDMBRT.js} +702 -647
- package/dist/chunk-ERCDMBRT.js.map +1 -0
- package/dist/{chunk-I2NZGVBG.js → chunk-FSBR4RCK.js} +1101 -5313
- package/dist/chunk-FSBR4RCK.js.map +1 -0
- package/dist/{chunk-5W7L7BT7.mjs → chunk-G7JQ4OCE.mjs} +15 -2
- package/dist/chunk-G7JQ4OCE.mjs.map +1 -0
- package/dist/{chunk-5RM6NGZ6.mjs → chunk-IDEM3DYF.mjs} +3 -3
- package/dist/{chunk-5RM6NGZ6.mjs.map → chunk-IDEM3DYF.mjs.map} +1 -1
- package/dist/{chunk-U7XM3N7F.mjs → chunk-LEXBTVGM.mjs} +12 -2
- package/dist/chunk-LEXBTVGM.mjs.map +1 -0
- package/dist/{chunk-EFOXN3LC.js → chunk-M7KSEUZR.js} +490 -389
- package/dist/chunk-M7KSEUZR.js.map +1 -0
- package/dist/{chunk-AOUUZ52N.js → chunk-MO5FBVV3.js} +85 -86
- package/dist/chunk-MO5FBVV3.js.map +1 -0
- package/dist/{chunk-H2D2CRTD.mjs → chunk-NAFWHJCM.mjs} +8 -8
- package/dist/{chunk-H2D2CRTD.mjs.map → chunk-NAFWHJCM.mjs.map} +1 -1
- package/dist/{chunk-3JJWPOK6.js → chunk-NCLZKVJK.js} +9 -10
- package/dist/chunk-NCLZKVJK.js.map +1 -0
- package/dist/{chunk-R4TQWXNG.mjs → chunk-NVQWHJQH.mjs} +6 -5
- package/dist/chunk-NVQWHJQH.mjs.map +1 -0
- package/dist/{chunk-Y6AEE56Q.js → chunk-PGVZKMOA.js} +69 -69
- package/dist/{chunk-Y6AEE56Q.js.map → chunk-PGVZKMOA.js.map} +1 -1
- package/dist/{chunk-UDDZTTLO.mjs → chunk-QBFE7ABE.mjs} +6 -7
- package/dist/chunk-QBFE7ABE.mjs.map +1 -0
- package/dist/{chunk-3ZUMJTDT.mjs → chunk-RFRXS4PC.mjs} +3 -4
- package/dist/{chunk-3JJWPOK6.js.map → chunk-RFRXS4PC.mjs.map} +1 -1
- package/dist/{chunk-ZV5EZXXO.mjs → chunk-RHRJXK5R.mjs} +3 -3
- package/dist/{chunk-ZV5EZXXO.mjs.map → chunk-RHRJXK5R.mjs.map} +1 -1
- package/dist/{chunk-SU3YPWFW.js → chunk-RLLP7VQJ.js} +26 -26
- package/dist/{chunk-SU3YPWFW.js.map → chunk-RLLP7VQJ.js.map} +1 -1
- package/dist/{chunk-YIB2YAM5.mjs → chunk-RLVOG5OQ.mjs} +3 -3
- package/dist/{chunk-YIB2YAM5.mjs.map → chunk-RLVOG5OQ.mjs.map} +1 -1
- package/dist/{chunk-QYA53LUF.mjs → chunk-SEYUYGER.mjs} +571 -517
- package/dist/chunk-SEYUYGER.mjs.map +1 -0
- package/dist/{chunk-YV72JM4B.mjs → chunk-SQ4KGLBZ.mjs} +4 -4
- package/dist/{chunk-YV72JM4B.mjs.map → chunk-SQ4KGLBZ.mjs.map} +1 -1
- package/dist/{chunk-F54Q2YJY.js → chunk-SY4MUT5V.js} +7 -7
- package/dist/{chunk-F54Q2YJY.js.map → chunk-SY4MUT5V.js.map} +1 -1
- package/dist/{chunk-ZM5MVWIT.js → chunk-TUQLZ4QD.js} +5 -6
- package/dist/chunk-TUQLZ4QD.js.map +1 -0
- package/dist/{chunk-TVMLV675.js → chunk-UE2RDQIK.js} +98 -95
- package/dist/chunk-UE2RDQIK.js.map +1 -0
- package/dist/{chunk-HDCUWUNH.js → chunk-UJVDI66K.js} +28 -27
- package/dist/chunk-UJVDI66K.js.map +1 -0
- package/dist/{chunk-IRT4T3CU.mjs → chunk-VV6SYMPM.mjs} +423 -321
- package/dist/chunk-VV6SYMPM.mjs.map +1 -0
- package/dist/{chunk-HZ4LOVHM.js → chunk-VY52Y5GC.js} +2 -2
- package/dist/chunk-VY52Y5GC.js.map +1 -0
- package/dist/{chunk-LEKZUS6N.mjs → chunk-X3GW7UPN.mjs} +4 -5
- package/dist/chunk-X3GW7UPN.mjs.map +1 -0
- package/dist/{chunk-RGI74SQH.js → chunk-Y2AYFG4E.js} +4 -4
- package/dist/{chunk-RGI74SQH.js.map → chunk-Y2AYFG4E.js.map} +1 -1
- package/dist/{chunk-TIJJHW2Z.js → chunk-YV7F7IXG.js} +36 -36
- package/dist/{chunk-TIJJHW2Z.js.map → chunk-YV7F7IXG.js.map} +1 -1
- package/dist/{chunk-MVBIAXVN.mjs → chunk-ZKSDDFHG.mjs} +14 -11
- package/dist/chunk-ZKSDDFHG.mjs.map +1 -0
- package/dist/{index-VI9gyJXl.d.mts → index-BNRGVAS5.d.mts} +9 -2
- package/dist/index-BoebbJ44.d.mts +49 -0
- package/dist/index-BoebbJ44.d.ts +49 -0
- package/dist/{index-CoB18TbG.d.ts → index-CnCY-b5V.d.ts} +9 -2
- package/dist/index.d.mts +399 -548
- package/dist/index.d.ts +399 -548
- package/dist/index.js +727 -887
- package/dist/index.mjs +3 -3
- package/dist/platform/admin/index.js +12 -12
- package/dist/platform/admin/index.mjs +6 -6
- package/dist/platform/agents-workspace.js +10 -10
- package/dist/platform/agents-workspace.mjs +9 -9
- package/dist/platform/app-shell.js +5 -5
- package/dist/platform/app-shell.mjs +4 -4
- package/dist/platform/auth/index.js +29 -29
- package/dist/platform/auth/index.mjs +6 -6
- package/dist/platform/billing/index.js +5 -5
- package/dist/platform/billing/index.mjs +4 -4
- package/dist/platform/impersonation/index.js +5 -5
- package/dist/platform/impersonation/index.mjs +4 -4
- package/dist/platform/index.d.mts +3 -39
- package/dist/platform/index.d.ts +3 -39
- package/dist/platform/index.js +102 -4812
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/index.mjs +25 -4730
- package/dist/platform/index.mjs.map +1 -1
- package/dist/platform/pages/index.d.mts +4 -4
- package/dist/platform/pages/index.d.ts +4 -4
- package/dist/platform/pages/index.js +199 -199
- package/dist/platform/pages/index.mjs +11 -11
- package/dist/platform/rbac.d.mts +2 -1
- package/dist/platform/rbac.d.ts +2 -1
- package/dist/platform/rbac.js +2 -2
- package/dist/platform/rbac.mjs +1 -1
- package/dist/platform/settings/index.js +9 -9
- package/dist/platform/settings/index.mjs +8 -8
- package/dist/platform/utils/index.js +3 -3
- package/dist/platform/utils/index.js.map +1 -1
- package/dist/platform/utils/index.mjs +1 -1
- package/dist/platform/utils/index.mjs.map +1 -1
- package/dist/platform/workflow-api-client.d.mts +2 -2
- package/dist/platform/workflow-api-client.d.ts +2 -2
- package/dist/platform/workflow-api-client.js +62 -62
- package/dist/platform/workflow-api-client.mjs +2 -2
- package/dist/platform/workflow-canvas-shell.js +7 -7
- package/dist/platform/workflow-canvas-shell.mjs +6 -6
- package/dist/{workflow-api-client-DoYj7nHz.d.mts → workflow-api-client-CpFl3WcG.d.mts} +1 -1
- package/dist/{workflow-api-client-BKD8OfP_.d.ts → workflow-api-client-uLICOanv.d.ts} +1 -1
- package/dist/workflow-canvas--qaYKuMm.d.ts +113 -0
- package/dist/workflow-canvas-B80fmD_n.d.mts +113 -0
- package/package.json +15 -5
- package/src/styles/liquid-glass.css +283 -2
- package/dist/chunk-3ZUMJTDT.mjs.map +0 -1
- package/dist/chunk-5W7L7BT7.mjs.map +0 -1
- package/dist/chunk-AOUUZ52N.js.map +0 -1
- package/dist/chunk-C3H4FM4A.js.map +0 -1
- package/dist/chunk-EFOXN3LC.js.map +0 -1
- package/dist/chunk-FAGDZEKM.js.map +0 -1
- package/dist/chunk-HDCUWUNH.js.map +0 -1
- package/dist/chunk-HZ4LOVHM.js.map +0 -1
- package/dist/chunk-I2NZGVBG.js.map +0 -1
- package/dist/chunk-IRT4T3CU.mjs.map +0 -1
- package/dist/chunk-JN6IL6OH.mjs.map +0 -1
- package/dist/chunk-LEKZUS6N.mjs.map +0 -1
- package/dist/chunk-MVBIAXVN.mjs.map +0 -1
- package/dist/chunk-NJS2YC3J.js.map +0 -1
- package/dist/chunk-OL73LBX5.mjs.map +0 -1
- package/dist/chunk-QYA53LUF.mjs.map +0 -1
- package/dist/chunk-R4TQWXNG.mjs.map +0 -1
- package/dist/chunk-RL35XATZ.js.map +0 -1
- package/dist/chunk-SYNVNTLJ.mjs.map +0 -1
- package/dist/chunk-TVMLV675.js.map +0 -1
- package/dist/chunk-U7XM3N7F.mjs.map +0 -1
- package/dist/chunk-UDDZTTLO.mjs.map +0 -1
- package/dist/chunk-W5OEBO6E.js.map +0 -1
- package/dist/chunk-ZJPNP2YW.mjs.map +0 -1
- package/dist/chunk-ZM5MVWIT.js.map +0 -1
- package/src/brand/logos/kori-icon.svg +0 -45
- package/src/brand/logos/kori-logo-dark.svg +0 -40
- package/src/brand/logos/kori-logo.svg +0 -43
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/auth/mfa-challenge.tsx","../src/platform/auth/sign-in.tsx","../src/platform/auth/verify-email.tsx","../src/platform/auth/sign-up.tsx","../src/platform/auth/forgot-password.tsx","../src/platform/auth/reset-password.tsx","../src/platform/auth/passwordless-sign-in.tsx","../src/platform/auth/consent-screen.tsx","../src/platform/auth/sso-connector-list.tsx","../src/platform/auth/sso-email-form.tsx","../src/platform/auth/user-button.tsx"],"names":["useTranslations","useAuth","useState","useCallback","triggerHaptic","jsxs","jsx","SegmentedControl","OtpInput","Spinner","Input","Button","Card","useSocialProviders","PasswordInput","Fragment","SocialLoginButtons","EnvelopeIcon","AuthLayout","useEffect","UserIcon","LockClosedIcon","PasswordStrengthMeter","FormCheckbox","EmptyState","CheckCircleIcon","BaseForm","DevicePhoneMobileIcon","PaperAirplaneIcon","CardContent","Avatar","Badge","ShieldExclamationIcon","ListCard","ListCardItem","InlineSpinner","ChevronRightIcon","BuildingOffice2Icon","Menu","ChevronUpDownIcon","Transition","ArrowRightStartOnRectangleIcon","DynamicIslandConfirm"],"mappings":"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","file":"chunk-UE2RDQIK.js","sourcesContent":["import React, { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n Input,\n SegmentedControl,\n Button,\n Spinner,\n triggerHaptic,\n} from '@ui/index'\nimport { OtpInput } from './components'\nimport { useAuth } from '../../_auth'\n\nexport type { MfaMethod, MfaChallengeProps } from '@datatechsolutions/shared-domain'\nimport type { MfaMethod, MfaChallengeProps } from '@datatechsolutions/shared-domain'\n\nexport function MfaChallenge({\n mfaToken,\n onSuccess,\n onCancel,\n availableMethods = ['totp', 'backup'],\n embedded = false,\n}: MfaChallengeProps) {\n const t = useTranslations('windsock')\n const { verifyMFA } = useAuth()\n\n const [method, setMethod] = useState<MfaMethod>('totp')\n const [totpCode, setTotpCode] = useState('')\n const [backupCode, setBackupCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [failureCount, setFailureCount] = useState(0)\n\n const handleVerify = useCallback(\n async (code: string) => {\n setError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n const result = await verifyMFA(mfaToken, code)\n if (result.success) {\n triggerHaptic('success')\n onSuccess?.()\n } else if (result.error) {\n triggerHaptic('error')\n const count = failureCount + 1\n setFailureCount(count)\n if (count >= 3) {\n setError(t('mfa.challenge.errorLockout'))\n } else {\n setError(t('mfa.challenge.errorInvalidCode'))\n }\n }\n } catch {\n triggerHaptic('error')\n setError(t('mfa.challenge.errorVerificationFailed'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [verifyMFA, mfaToken, onSuccess, failureCount, t],\n )\n\n const handleTotpComplete = useCallback(\n (code: string) => {\n handleVerify(code)\n },\n [handleVerify],\n )\n\n const handleBackupSubmit = useCallback(() => {\n if (backupCode.trim()) {\n handleVerify(backupCode.trim())\n }\n }, [backupCode, handleVerify])\n\n const handleMethodChange = useCallback((value: string) => {\n triggerHaptic('light')\n setMethod(value as MfaMethod)\n setError(null)\n setTotpCode('')\n setBackupCode('')\n }, [])\n\n const segments = availableMethods.map((m) => ({\n value: m,\n label: m === 'totp' ? t('mfa.challenge.methodTotp') : t('mfa.challenge.methodBackup'),\n }))\n\n const content = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white\">\n {t('mfa.challenge.title')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {method === 'totp'\n ? t('mfa.challenge.descriptionTotp')\n : t('mfa.challenge.descriptionBackup')}\n </p>\n </div>\n\n {/* Method toggle */}\n {availableMethods.length > 1 && (\n <div className=\"flex justify-center\">\n <SegmentedControl\n segments={segments}\n value={method}\n onChange={handleMethodChange}\n size=\"sm\"\n />\n </div>\n )}\n\n {/* Lockout warning banner */}\n {failureCount >= 3 && (\n <div className=\"rounded-xl border border-red-500/30 bg-red-500/10 px-4 py-3 text-sm text-red-600 dark:text-red-400 text-center\">\n {t('mfa.challenge.lockoutWarning')}\n </div>\n )}\n\n {/* TOTP input */}\n {method === 'totp' && (\n <div className=\"space-y-4\">\n <OtpInput\n value={totpCode}\n onChange={setTotpCode}\n onComplete={handleTotpComplete}\n error={error ?? undefined}\n disabled={isSubmitting}\n autoFocus\n />\n {isSubmitting && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n </div>\n )}\n\n {/* Backup code input */}\n {method === 'backup' && (\n <div className=\"space-y-4\">\n <Input\n value={backupCode}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setBackupCode(event.target.value)}\n placeholder={t('mfa.challenge.backupCodePlaceholder')}\n error={error ?? undefined}\n disabled={isSubmitting}\n autoFocus\n className=\"font-mono text-center tracking-widest\"\n />\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleBackupSubmit}\n disabled={!backupCode.trim() || isSubmitting}\n loading={isSubmitting}\n >\n {t('mfa.challenge.verifyBackupCode')}\n </Button>\n </div>\n )}\n\n {/* Cancel link */}\n {onCancel && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={() => {\n triggerHaptic('light')\n onCancel()\n }}\n className=\"text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('mfa.challenge.useDifferentAccount')}\n </button>\n </div>\n )}\n </div>\n )\n\n if (embedded) return content\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {content}\n </Card>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Input,\n PasswordInput,\n Button,\n} from '@ui/index'\nimport {\n AuthLayout,\n SocialLoginButtons,\n type SocialProvider,\n} from './components'\nimport { EnvelopeIcon } from '@heroicons/react/24/outline'\nimport { useAuth, useSocialProviders } from '../../_auth'\nimport { MfaChallenge } from './mfa-challenge'\n\nexport type { SignInProps } from '@datatechsolutions/shared-domain'\nimport type { SignInProps, MfaRequiredState } from '@datatechsolutions/shared-domain'\n\nexport function SignIn({\n onSuccess,\n onSignUp,\n onForgotPassword,\n onPasswordless,\n socialProviders,\n allowPasswordless,\n defaultEmail = '',\n embedded = false,\n heroPanel,\n}: SignInProps) {\n const t = useTranslations('windsock')\n const { loginWithCredentials, loginWithProvider } = useAuth()\n\n // Caller may pass an explicit `socialProviders` prop to pin the\n // button list (useful in tests / storybook); otherwise we fetch\n // the enabled set from the backend so we never advertise a button\n // whose callback will fail.\n const discovered = useSocialProviders()\n const effectiveSocialProviders: readonly SocialProvider[] = socialProviders ?? discovered.providers\n\n const [email, setEmail] = useState(defaultEmail)\n const [password, setPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [mfaRequired, setMfaRequired] = useState<MfaRequiredState | null>(null)\n const [socialLoading, setSocialLoading] = useState<SocialProvider | null>(null)\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n setIsSubmitting(true)\n\n try {\n const result = await loginWithCredentials(email, password)\n\n if (result.success) {\n onSuccess?.()\n } else if (result.mfaRequired && result.mfaToken) {\n setMfaRequired({ mfaToken: result.mfaToken })\n } else if (result.error) {\n // Surface the actual Cognito error (e.g. \"User does not\n // exist\", \"Incorrect username or password\") instead of the\n // generic placeholder. Falls back to the translated string\n // when Cognito returns no message.\n setError(result.error || t('signInError'))\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : t('signInError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [email, password, loginWithCredentials, onSuccess, t],\n )\n\n const handleSocialLogin = useCallback((provider: SocialProvider) => {\n setSocialLoading(provider)\n loginWithProvider(provider)\n }, [loginWithProvider])\n\n if (mfaRequired) {\n return (\n <MfaChallenge\n mfaToken={mfaRequired.mfaToken}\n onSuccess={onSuccess}\n onCancel={() => setMfaRequired(null)}\n embedded={embedded}\n />\n )\n }\n\n const content = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('signInTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('signInSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* Credentials form */}\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <Input\n label={t('emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('emailPlaceholder')}\n autoComplete=\"email\"\n disabled={isSubmitting}\n required\n />\n\n <PasswordInput\n label={t('passwordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('passwordPlaceholder')}\n autoComplete=\"current-password\"\n disabled={isSubmitting}\n required\n />\n\n {/* Forgot password link */}\n {onForgotPassword && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={onForgotPassword}\n className=\"text-sm font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('forgotPassword')}\n </button>\n </div>\n )}\n\n <Button\n type=\"submit\"\n color=\"ios-glass-green\"\n size=\"lg\"\n fullWidth\n disabled={isSubmitting || !email || !password}\n loading={isSubmitting}\n >\n {t('signInButton')}\n </Button>\n </form>\n\n {/* Social login divider — only renders when the backend\n reports at least one enabled provider (or the caller passed\n an explicit list). We never show a divider for zero buttons. */}\n {effectiveSocialProviders.length > 0 && (\n <>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200/60 dark:border-white/10\" />\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"bg-white/80 px-3 text-gray-400 dark:bg-gray-900/80 dark:text-gray-500\">\n {t('orContinueWith')}\n </span>\n </div>\n </div>\n\n <SocialLoginButtons\n providers={[...effectiveSocialProviders]}\n onProviderClick={handleSocialLogin}\n loading={socialLoading}\n disabled={isSubmitting}\n />\n </>\n )}\n\n {/* Passwordless sign-in button */}\n {allowPasswordless && (\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n size=\"lg\"\n fullWidth\n onClick={onPasswordless}\n >\n <EnvelopeIcon className=\"h-5 w-5\" />\n {t('signInPasswordless')}\n </Button>\n )}\n\n {/* Sign up link */}\n {onSignUp && (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n {t('noAccount')}{' '}\n <button\n type=\"button\"\n onClick={onSignUp}\n className=\"font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('signUpLink')}\n </button>\n </p>\n )}\n </div>\n )\n\n if (embedded) return content\n\n return (\n <AuthLayout heroPanel={heroPanel}>\n {content}\n </AuthLayout>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n Button,\n Spinner,\n} from '@ui/index'\nimport { OtpInput } from './components'\nimport { EnvelopeIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { VerifyEmailProps } from '@datatechsolutions/shared-domain'\nimport type { VerifyEmailProps } from '@datatechsolutions/shared-domain'\n\nconst RESEND_COOLDOWN_SECONDS = 60\n\nexport function VerifyEmail({\n email,\n onSuccess,\n onResend,\n embedded = false,\n}: VerifyEmailProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [code, setCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isResending, setIsResending] = useState(false)\n const [cooldown, setCooldown] = useState(RESEND_COOLDOWN_SECONDS)\n\n // Countdown timer for resend cooldown\n useEffect(() => {\n if (cooldown <= 0) return\n\n const timer = setInterval(() => {\n setCooldown((previous) => {\n if (previous <= 1) {\n clearInterval(timer)\n return 0\n }\n return previous - 1\n })\n }, 1000)\n\n return () => clearInterval(timer)\n }, [cooldown])\n\n const handleComplete = useCallback(\n async (completedCode: string) => {\n setError(null)\n setIsSubmitting(true)\n\n try {\n await client.verifyEmail(email, completedCode)\n onSuccess?.()\n } catch {\n setError(t('verifyEmailError'))\n setCode('')\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, email, onSuccess, t],\n )\n\n const handleResend = useCallback(async () => {\n if (cooldown > 0 || isResending) return\n\n setIsResending(true)\n setError(null)\n\n try {\n onResend?.()\n setCooldown(RESEND_COOLDOWN_SECONDS)\n } catch {\n setError(t('resendEmailError'))\n } finally {\n setIsResending(false)\n }\n }, [cooldown, isResending, onResend, t])\n\n const content = (\n <div className=\"space-y-6\">\n {/* Mail icon header */}\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-full bg-blue-50 dark:bg-blue-500/10\">\n <EnvelopeIcon className=\"h-8 w-8 text-ios-blue\" />\n </div>\n <div>\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">\n {t('verifyEmailTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('verifyEmailSubtitle', { email })}\n </p>\n </div>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red text-center\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* OTP input */}\n <OtpInput\n value={code}\n onChange={setCode}\n onComplete={handleComplete}\n error={error ?? undefined}\n disabled={isSubmitting}\n autoFocus\n />\n\n {/* Spinner while verifying */}\n {isSubmitting && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n\n {/* Resend section */}\n <div className=\"text-center space-y-1\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('verifyEmailNoCode')}\n </p>\n <Button\n type=\"button\"\n outline\n onClick={handleResend}\n disabled={cooldown > 0 || isResending || isSubmitting}\n loading={isResending}\n >\n {cooldown > 0\n ? t('resendEmailCooldown', { seconds: cooldown })\n : t('resendEmailButton')}\n </Button>\n </div>\n </div>\n )\n\n if (embedded) return content\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {content}\n </Card>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Input,\n PasswordInput,\n Button,\n FormCheckbox,\n} from '@ui/index'\nimport {\n AuthLayout,\n PasswordStrengthMeter,\n SocialLoginButtons,\n type SocialProvider,\n} from './components'\nimport { EnvelopeIcon, LockClosedIcon, UserIcon } from '@heroicons/react/24/outline'\nimport { useAuth, useSocialProviders } from '../../_auth'\nimport { VerifyEmail } from './verify-email'\n\nexport type { SignUpProps, SignUpPhase } from '@datatechsolutions/shared-domain'\nimport type { SignUpProps, SignUpPhase } from '@datatechsolutions/shared-domain'\n\nexport function SignUp({\n onSuccess,\n onSignIn,\n socialProviders,\n passwordPolicy,\n embedded = false,\n heroPanel,\n}: SignUpProps) {\n const t = useTranslations('windsock')\n const { client, loginWithProvider } = useAuth()\n\n // Same source-of-truth story as SignIn — prop override wins when\n // present, otherwise fetch the enabled list so the register page\n // never advertises a provider that can't complete the callback.\n const discovered = useSocialProviders()\n const effectiveSocialProviders: readonly SocialProvider[] = socialProviders ?? discovered.providers\n\n const [phase, setPhase] = useState<SignUpPhase>('form')\n const [registeredEmail, setRegisteredEmail] = useState('')\n\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [termsAccepted, setTermsAccepted] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [socialLoading, setSocialLoading] = useState<SocialProvider | null>(null)\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n setIsSubmitting(true)\n\n try {\n // `client.register` resolves with `{success, error}` — it does\n // NOT throw on Cognito-side failures (password policy, email\n // already in use, etc.). Without checking `result.success` the\n // user got silently bounced to the verify-code page even on\n // failed signups. Surface the actual Cognito message; fall\n // back to the generic translation only when the SDK throws\n // (network / config error).\n const result = await client.register({ name, email, password })\n if (!result.success) {\n setError(result.error ?? t('signUpError'))\n return\n }\n setRegisteredEmail(email)\n setPhase('verify')\n } catch (e) {\n setError(e instanceof Error ? e.message : t('signUpError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, name, email, password, t],\n )\n\n const handleSocialLogin = useCallback((provider: SocialProvider) => {\n setSocialLoading(provider)\n loginWithProvider(provider)\n }, [loginWithProvider])\n\n if (phase === 'verify') {\n return (\n <VerifyEmail\n email={registeredEmail}\n onSuccess={onSuccess}\n embedded={embedded}\n />\n )\n }\n\n const isFormValid = name.trim() !== '' && email.trim() !== '' && password !== '' && termsAccepted\n\n const content = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('signUpTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('signUpSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* Registration form */}\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <Input\n label={t('nameLabel')}\n type=\"text\"\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n placeholder={t('namePlaceholder')}\n icon={<UserIcon className=\"h-5 w-5\" />}\n autoComplete=\"name\"\n disabled={isSubmitting}\n required\n />\n\n <Input\n label={t('emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('emailPlaceholder')}\n icon={<EnvelopeIcon className=\"h-5 w-5\" />}\n autoComplete=\"email\"\n disabled={isSubmitting}\n required\n />\n\n <div className=\"space-y-2\">\n <PasswordInput\n label={t('passwordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('passwordPlaceholder')}\n icon={<LockClosedIcon className=\"h-5 w-5\" />}\n autoComplete=\"new-password\"\n disabled={isSubmitting}\n required\n />\n <PasswordStrengthMeter\n password={password}\n policy={passwordPolicy}\n showRequirements\n />\n </div>\n\n <FormCheckbox\n checked={termsAccepted}\n onChange={setTermsAccepted}\n label={t('termsLabel')}\n description={t('termsDescription')}\n disabled={isSubmitting}\n />\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n disabled={isSubmitting || !isFormValid}\n loading={isSubmitting}\n >\n {t('signUpButton')}\n </Button>\n </form>\n\n {/* Social login divider — only rendered when at least one\n provider is enabled. Source: caller's prop override if set,\n otherwise backend /oauth/providers. */}\n {effectiveSocialProviders.length > 0 && (\n <>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-200 dark:border-white/10\" />\n </div>\n <div className=\"relative flex justify-center text-xs\">\n <span className=\"bg-white dark:bg-gray-900 px-3 text-gray-400 dark:text-gray-500\">\n {t('orContinueWith')}\n </span>\n </div>\n </div>\n\n <SocialLoginButtons\n providers={[...effectiveSocialProviders]}\n onProviderClick={handleSocialLogin}\n loading={socialLoading}\n disabled={isSubmitting}\n />\n </>\n )}\n\n {/* Sign in link */}\n {onSignIn && (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">\n {t('alreadyHaveAccount')}{' '}\n <button\n type=\"button\"\n onClick={onSignIn}\n className=\"font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('signInLink')}\n </button>\n </p>\n )}\n </div>\n )\n\n if (embedded) return content\n\n return (\n <AuthLayout heroPanel={heroPanel}>\n {content}\n </AuthLayout>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n BaseForm,\n Input,\n EmptyState,\n} from '@ui/index'\nimport { EnvelopeIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { ForgotPasswordProps, ForgotPasswordPhase } from '@datatechsolutions/shared-domain'\nimport type { ForgotPasswordProps, ForgotPasswordPhase } from '@datatechsolutions/shared-domain'\n\nexport function ForgotPassword({\n onSuccess,\n onBack,\n defaultEmail = '',\n embedded = false,\n}: ForgotPasswordProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [phase, setPhase] = useState<ForgotPasswordPhase>('form')\n const [email, setEmail] = useState(defaultEmail)\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n setIsSubmitting(true)\n\n try {\n await client.requestPasswordReset(email)\n setPhase('sent')\n onSuccess?.()\n } catch {\n setError(t('forgotPasswordError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, email, onSuccess, t],\n )\n\n const sentContent = (\n <div className=\"space-y-5\">\n <EmptyState\n variant=\"minimal\"\n icon={CheckCircleIcon}\n message={t('forgotPasswordSuccessTitle')}\n description={t('forgotPasswordSuccessDescription', { email })}\n />\n\n {onBack && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-sm font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors\"\n >\n {t('backToSignIn')}\n </button>\n </div>\n )}\n </div>\n )\n\n const formContent = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('forgotPasswordTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('forgotPasswordSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n <BaseForm\n icon={<EnvelopeIcon className=\"h-5 w-5\" />}\n iconColor=\"blue\"\n title={t('forgotPasswordFormTitle')}\n subtitle={t('forgotPasswordFormSubtitle')}\n onSubmit={handleSubmit}\n submitLabel={t('forgotPasswordSubmit')}\n isLoading={isSubmitting}\n submitDisabled={!email.trim()}\n showHeader={false}\n >\n <Input\n label={t('emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('emailPlaceholder')}\n icon={<EnvelopeIcon className=\"h-5 w-5\" />}\n autoComplete=\"email\"\n disabled={isSubmitting}\n required\n autoFocus\n />\n </BaseForm>\n\n {/* Back link */}\n {onBack && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('backToSignIn')}\n </button>\n </div>\n )}\n </div>\n )\n\n const activeContent = phase === 'sent' ? sentContent : formContent\n\n if (embedded) return activeContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {activeContent}\n </Card>\n )\n}\n","import React, { useState, useCallback, type FormEvent } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n PasswordInput,\n Button,\n EmptyState,\n} from '@ui/index'\nimport { PasswordStrengthMeter } from './components'\nimport { LockClosedIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { ResetPasswordProps, ResetPasswordPhase } from '@datatechsolutions/shared-domain'\nimport type { ResetPasswordProps, ResetPasswordPhase } from '@datatechsolutions/shared-domain'\n\nexport function ResetPassword({\n token,\n onSuccess,\n passwordPolicy,\n embedded = false,\n}: ResetPasswordProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [phase, setPhase] = useState<ResetPasswordPhase>('form')\n const [password, setPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const passwordsMatch = password !== '' && confirmPassword !== '' && password === confirmPassword\n const hasPasswordMismatch = confirmPassword !== '' && password !== confirmPassword\n\n const handleSubmit = useCallback(\n async (event: FormEvent) => {\n event.preventDefault()\n setError(null)\n\n if (!passwordsMatch) {\n setError(t('passwordMismatchError'))\n return\n }\n\n setIsSubmitting(true)\n\n try {\n await client.resetPassword(token, password)\n setPhase('success')\n onSuccess?.()\n } catch {\n setError(t('resetPasswordError'))\n } finally {\n setIsSubmitting(false)\n }\n },\n [client, token, password, passwordsMatch, onSuccess, t],\n )\n\n const successContent = (\n <div className=\"space-y-5\">\n <EmptyState\n variant=\"minimal\"\n icon={CheckCircleIcon}\n message={t('resetPasswordSuccessTitle')}\n description={t('resetPasswordSuccessDescription')}\n />\n </div>\n )\n\n const formContent = (\n <div className=\"space-y-5\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('resetPasswordTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('resetPasswordSubtitle')}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <PasswordInput\n label={t('newPasswordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('newPasswordPlaceholder')}\n icon={<LockClosedIcon className=\"h-5 w-5\" />}\n autoComplete=\"new-password\"\n disabled={isSubmitting}\n required\n autoFocus\n />\n <PasswordStrengthMeter\n password={password}\n policy={passwordPolicy}\n showRequirements\n />\n </div>\n\n <PasswordInput\n label={t('confirmPasswordLabel')}\n value={confirmPassword}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setConfirmPassword(event.target.value)}\n placeholder={t('confirmPasswordPlaceholder')}\n icon={<LockClosedIcon className=\"h-5 w-5\" />}\n autoComplete=\"new-password\"\n disabled={isSubmitting}\n error={hasPasswordMismatch ? t('passwordMismatchError') : undefined}\n success={passwordsMatch}\n required\n />\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n disabled={isSubmitting || !passwordsMatch}\n loading={isSubmitting}\n >\n {t('resetPasswordButton')}\n </Button>\n </form>\n </div>\n )\n\n const activeContent = phase === 'success' ? successContent : formContent\n\n if (embedded) return activeContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {activeContent}\n </Card>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n Input,\n Button,\n EmptyState,\n SegmentedControl,\n Spinner,\n} from '@ui/index'\nimport { OtpInput } from './components'\nimport { EnvelopeIcon, DevicePhoneMobileIcon, PaperAirplaneIcon } from '@heroicons/react/24/outline'\nimport { useAuth } from '../../_auth'\n\nexport type { PasswordlessChannel, PasswordlessSignInProps, PasswordlessStep } from '@datatechsolutions/shared-domain'\nimport type { PasswordlessChannel, PasswordlessSignInProps, PasswordlessStep } from '@datatechsolutions/shared-domain'\n\nexport function PasswordlessSignIn({\n defaultMethod = 'email',\n allowedChannels = ['email', 'sms'],\n onSuccess,\n onBack,\n defaultEmail = '',\n embedded = false,\n}: PasswordlessSignInProps) {\n const t = useTranslations('windsock')\n const { client } = useAuth()\n\n const [step, setStep] = useState<PasswordlessStep>('input')\n const [channel, setChannel] = useState<PasswordlessChannel>(\n allowedChannels.includes(defaultMethod) ? defaultMethod : (allowedChannels[0] ?? 'email'),\n )\n const [identifier, setIdentifier] = useState(defaultEmail)\n const [code, setCode] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isSending, setIsSending] = useState(false)\n const [isVerifying, setIsVerifying] = useState(false)\n\n const channelSegments = allowedChannels.map((ch) => ({\n value: ch,\n label: ch === 'email' ? t('channelEmail') : t('channelSms'),\n }))\n\n const handleSendCode = useCallback(async () => {\n if (!identifier.trim()) return\n\n setError(null)\n setIsSending(true)\n\n try {\n await client.sendPasswordlessCode(channel, identifier.trim())\n setStep('sent')\n\n // Auto-advance to OTP entry after a brief confirmation display\n setTimeout(() => setStep('verify'), 1500)\n } catch {\n setError(t('passwordlessSendError'))\n } finally {\n setIsSending(false)\n }\n }, [client, channel, identifier, t])\n\n const handleVerifyCode = useCallback(\n async (completedCode: string) => {\n setError(null)\n setIsVerifying(true)\n\n try {\n await client.verifyPasswordlessCode(channel, identifier.trim(), completedCode)\n onSuccess?.()\n } catch {\n setError(t('passwordlessVerifyError'))\n setCode('')\n } finally {\n setIsVerifying(false)\n }\n },\n [client, channel, identifier, onSuccess, t],\n )\n\n // Step 1: Channel + identifier input\n const inputContent = (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('passwordlessTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {t('passwordlessSubtitle')}\n </p>\n </div>\n\n {/* Channel selector */}\n {allowedChannels.length > 1 && (\n <div className=\"flex justify-center\">\n <SegmentedControl\n segments={channelSegments}\n value={channel}\n onChange={(value: string) => {\n setChannel(value as PasswordlessChannel)\n setIdentifier(value === 'email' ? defaultEmail : '')\n setError(null)\n }}\n size=\"sm\"\n />\n </div>\n )}\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* Identifier input */}\n <Input\n label={channel === 'email' ? t('emailLabel') : t('phoneLabel')}\n type={channel === 'email' ? 'email' : 'tel'}\n value={identifier}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setIdentifier(event.target.value)}\n placeholder={channel === 'email' ? t('emailPlaceholder') : t('phonePlaceholder')}\n icon={\n channel === 'email'\n ? <EnvelopeIcon className=\"h-5 w-5\" />\n : <DevicePhoneMobileIcon className=\"h-5 w-5\" />\n }\n autoComplete={channel === 'email' ? 'email' : 'tel'}\n disabled={isSending}\n autoFocus\n />\n\n <Button\n type=\"button\"\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleSendCode}\n disabled={isSending || !identifier.trim()}\n loading={isSending}\n >\n {t('passwordlessSendButton')}\n </Button>\n\n {/* Back link */}\n {onBack && (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={onBack}\n className=\"text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('backToSignIn')}\n </button>\n </div>\n )}\n </div>\n )\n\n // Step 2: Sent confirmation (brief auto-advancing state)\n const sentContent = (\n <div className=\"space-y-6\">\n <EmptyState\n variant=\"minimal\"\n icon={PaperAirplaneIcon}\n message={t('passwordlessCodeSentTitle')}\n description={\n channel === 'email'\n ? t('passwordlessCodeSentEmailDescription', { email: identifier })\n : t('passwordlessCodeSentSmsDescription', { phone: identifier })\n }\n />\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n </div>\n )\n\n // Step 3: OTP entry\n const verifyContent = (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"text-center\">\n <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">\n {t('passwordlessEnterCodeTitle')}\n </h2>\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n {channel === 'email'\n ? t('passwordlessEnterCodeEmailSubtitle', { email: identifier })\n : t('passwordlessEnterCodeSmsSubtitle', { phone: identifier })}\n </p>\n </div>\n\n {/* Error banner */}\n {error && (\n <div className=\"rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red text-center\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* OTP input */}\n <OtpInput\n value={code}\n onChange={setCode}\n onComplete={handleVerifyCode}\n error={error ?? undefined}\n disabled={isVerifying}\n autoFocus\n />\n\n {/* Verifying spinner */}\n {isVerifying && (\n <div className=\"flex justify-center\">\n <Spinner />\n </div>\n )}\n\n {/* Resend / back */}\n <div className=\"flex items-center justify-between text-sm\">\n <button\n type=\"button\"\n onClick={() => {\n setStep('input')\n setCode('')\n setError(null)\n }}\n className=\"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors\"\n >\n {t('passwordlessChangeIdentifier')}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setCode('')\n setError(null)\n handleSendCode()\n }}\n disabled={isSending}\n className=\"font-medium text-ios-blue hover:text-blue-700 dark:hover:text-blue-400 transition-colors disabled:opacity-50\"\n >\n {t('resendEmailButton')}\n </button>\n </div>\n </div>\n )\n\n const activeContent = step === 'input'\n ? inputContent\n : step === 'sent'\n ? sentContent\n : verifyContent\n\n if (embedded) return activeContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto max-w-md p-6 sm:p-8\">\n {activeContent}\n </Card>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n Card,\n CardContent,\n Avatar,\n Badge,\n ListCard,\n ListCardItem,\n FormCheckbox,\n Button,\n triggerHaptic,\n} from '@ui/index'\nimport { AuthLayout } from './components'\nimport { ShieldExclamationIcon } from '@heroicons/react/24/outline'\n\nexport type { ConsentScreenProps } from '@datatechsolutions/shared-domain'\nimport type { ConsentScreenProps } from '@datatechsolutions/shared-domain'\n\nexport function ConsentScreen({\n application,\n scopes,\n grantedScopes,\n onApprove,\n onDeny,\n isSubmitting = false,\n}: ConsentScreenProps) {\n const t = useTranslations('windsock')\n\n const [checkedScopes, setCheckedScopes] = useState<Set<string>>(\n () => new Set(grantedScopes && grantedScopes.length > 0 ? grantedScopes : scopes.map((s) => s.id)),\n )\n\n const handleScopeToggle = useCallback((scopeId: string, checked: boolean) => {\n setCheckedScopes((previous) => {\n const next = new Set(previous)\n if (checked) {\n next.add(scopeId)\n } else {\n next.delete(scopeId)\n }\n return next\n })\n }, [])\n\n const handleApprove = useCallback(() => {\n triggerHaptic('light')\n onApprove(Array.from(checkedScopes))\n }, [checkedScopes, onApprove])\n\n const handleDeny = useCallback(() => {\n triggerHaptic('light')\n onDeny()\n }, [onDeny])\n\n const appInitials = application.name\n .split(' ')\n .map((word) => word[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <AuthLayout>\n <Card variant=\"glass\" className=\"mx-auto w-full max-w-md\">\n <CardContent className=\"space-y-6 p-6 sm:p-8\">\n {/* App identity */}\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Avatar\n src={application.logoUrl}\n initials={appInitials}\n alt={application.name}\n />\n\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {application.name}\n </span>\n {application.verified ? (\n <Badge color=\"green\">\n {t('consent.verified')}\n </Badge>\n ) : (\n <Badge color=\"amber\">\n {t('consent.unverified')}\n </Badge>\n )}\n </div>\n\n {application.url && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{application.url}</p>\n )}\n\n <p className=\"text-sm text-gray-600 dark:text-gray-300\">\n {t('consent.wantsAccess')}\n </p>\n </div>\n </div>\n\n {/* Unverified warning */}\n {!application.verified && (\n <div className=\"flex items-start gap-3 rounded-xl border border-amber-500/30 bg-amber-500/10 p-3\">\n <ShieldExclamationIcon className=\"mt-0.5 h-5 w-5 shrink-0 text-amber-600 dark:text-amber-400\" />\n <p className=\"text-sm text-amber-700 dark:text-amber-300\">\n {t('consent.unverifiedWarning', { name: application.name })}\n </p>\n </div>\n )}\n\n {/* Scopes */}\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {t('consent.permissionsLabel')}\n </p>\n <ListCard>\n {scopes.map((scope) => (\n <ListCardItem\n key={scope.id}\n leading={\n <FormCheckbox\n checked={checkedScopes.has(scope.id)}\n onChange={(checked: boolean) => handleScopeToggle(scope.id, checked)}\n label=\"\"\n />\n }\n onClick={() => handleScopeToggle(scope.id, !checkedScopes.has(scope.id))}\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {scope.name}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{scope.description}</p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col gap-2 sm:flex-row-reverse\">\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleApprove}\n loading={isSubmitting}\n disabled={isSubmitting || checkedScopes.size === 0}\n >\n {t('consent.approveButton')}\n </Button>\n <Button\n outline\n fullWidth\n onClick={handleDeny}\n disabled={isSubmitting}\n >\n {t('consent.denyButton')}\n </Button>\n </div>\n\n <p className=\"text-center text-xs text-gray-400 dark:text-gray-500\">\n {t('consent.footerNote')}\n </p>\n </CardContent>\n </Card>\n </AuthLayout>\n )\n}\n","import { useTranslations } from '@ui/lib/i18n-context'\nimport { Avatar, Badge, ListCard, ListCardItem, InlineSpinner } from '@ui/index'\nimport { ChevronRightIcon } from '@heroicons/react/20/solid'\n\nexport type { SsoConnector, SsoConnectorListProps } from '@datatechsolutions/shared-domain'\nimport type { SsoConnector, SsoConnectorListProps } from '@datatechsolutions/shared-domain'\n\nexport function SsoConnectorList({ connectors, onSelect, loading = false }: SsoConnectorListProps) {\n const t = useTranslations('windsock')\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center gap-2 py-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('sso.connectorList.loading')}</span>\n </div>\n )\n }\n\n if (connectors.length === 0) {\n return (\n <p className=\"py-6 text-center text-sm text-gray-500 dark:text-gray-400\">\n {t('sso.connectorList.empty')}\n </p>\n )\n }\n\n return (\n <ListCard>\n {connectors.map((connector) => {\n const initials = connector.name\n .split(' ')\n .map((word) => word[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n\n return (\n <ListCardItem\n key={connector.id}\n leading={\n <Avatar\n src={connector.logoUrl}\n initials={initials}\n alt={connector.name}\n />\n }\n trailing={\n <div className=\"flex items-center gap-2\">\n <Badge color=\"zinc\">\n {connector.type === 'saml' ? t('sso.connectorList.typeSaml') : t('sso.connectorList.typeOidc')}\n </Badge>\n <ChevronRightIcon className=\"h-4 w-4 text-gray-400\" />\n </div>\n }\n onClick={() => onSelect(connector)}\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {connector.name}\n </p>\n {connector.domain && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{connector.domain}</p>\n )}\n </div>\n </ListCardItem>\n )\n })}\n </ListCard>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { BaseForm, Input, Button, Card, CardContent } from '@ui/index'\nimport { BuildingOffice2Icon } from '@heroicons/react/24/outline'\nimport { SsoConnectorList } from './sso-connector-list'\n\nexport type { SsoConnector, SsoEmailFormProps, SsoEmailFormPhase } from '@datatechsolutions/shared-domain'\nimport type { SsoConnector, SsoEmailFormProps, SsoEmailFormPhase as Phase } from '@datatechsolutions/shared-domain'\n\nexport function SsoEmailForm({\n onEmailSubmit,\n onConnectorSelect,\n defaultEmail = '',\n embedded = false,\n}: SsoEmailFormProps) {\n const t = useTranslations('windsock')\n\n const [phase, setPhase] = useState<Phase>('email')\n const [email, setEmail] = useState(defaultEmail)\n const [emailError, setEmailError] = useState<string | null>(null)\n const [connectors, setConnectors] = useState<SsoConnector[]>([])\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [loadingConnectors, setLoadingConnectors] = useState(false)\n\n const validateEmail = useCallback(\n (value: string): boolean => {\n if (!value.trim()) {\n setEmailError(t('sso.emailForm.errorEmailRequired'))\n return false\n }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n setEmailError(t('sso.emailForm.errorEmailInvalid'))\n return false\n }\n setEmailError(null)\n return true\n },\n [t],\n )\n\n const handleEmailSubmit = useCallback(async () => {\n if (!validateEmail(email)) return\n\n setIsSubmitting(true)\n setLoadingConnectors(true)\n\n try {\n const discovered = await onEmailSubmit(email)\n setConnectors(discovered)\n setPhase('connectors')\n } catch {\n setEmailError(t('sso.emailForm.errorDiscoveryFailed'))\n } finally {\n setIsSubmitting(false)\n setLoadingConnectors(false)\n }\n }, [email, onEmailSubmit, validateEmail, t])\n\n const handleBackToEmail = useCallback(() => {\n setPhase('email')\n setConnectors([])\n setEmailError(null)\n }, [])\n\n if (phase === 'connectors') {\n const connectorsContent = (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {t('sso.emailForm.connectorsTitle')}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('sso.emailForm.connectorsSubtitle', { email })}\n </p>\n </div>\n\n <SsoConnectorList\n connectors={connectors}\n onSelect={onConnectorSelect}\n loading={loadingConnectors}\n />\n\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={handleBackToEmail}\n className=\"text-sm text-gray-500 transition-colors hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"\n >\n {t('sso.emailForm.backButton')}\n </button>\n </div>\n </div>\n )\n\n if (embedded) return connectorsContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto w-full max-w-md\">\n <CardContent className=\"p-6 sm:p-8\">\n {connectorsContent}\n </CardContent>\n </Card>\n )\n }\n\n const emailContent = (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {t('sso.emailForm.title')}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('sso.emailForm.subtitle')}\n </p>\n </div>\n\n <BaseForm onSubmit={handleEmailSubmit} submitLabel={t('sso.emailForm.continueButton')} showFooter={false}>\n <Input\n type=\"email\"\n label={t('sso.emailForm.emailLabel')}\n placeholder={t('sso.emailForm.emailPlaceholder')}\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(event.target.value)\n if (emailError) setEmailError(null)\n }}\n error={emailError ?? undefined}\n icon={<BuildingOffice2Icon className=\"h-5 w-5\" />}\n disabled={isSubmitting}\n autoFocus\n autoComplete=\"email\"\n />\n\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSubmitting}\n disabled={isSubmitting}\n >\n {t('sso.emailForm.continueButton')}\n </Button>\n </BaseForm>\n </div>\n )\n\n if (embedded) return emailContent\n\n return (\n <Card variant=\"glass\" className=\"mx-auto w-full max-w-md\">\n <CardContent className=\"p-6 sm:p-8\">\n {emailContent}\n </CardContent>\n </Card>\n )\n}\n","import { useState, useCallback, Fragment, type ReactNode } from 'react'\nimport { Menu, Transition } from '@headlessui/react'\nimport { Avatar, DynamicIslandConfirm, triggerHaptic } from '@ui/index'\nimport { useAuth } from '../../_auth'\nimport { ChevronUpDownIcon, ArrowRightStartOnRectangleIcon } from '@heroicons/react/20/solid'\n\nexport type { UserButtonProps } from '@datatechsolutions/shared-domain'\nimport type { UserButtonProps } from '@datatechsolutions/shared-domain'\n\nconst DEFAULT_LABELS = {\n menuLabel: 'User menu',\n userAlt: 'User',\n signOut: 'Sign out',\n signOutConfirmTitle: 'Sign out?',\n signOutConfirmButton: 'Sign out',\n signOutCancelButton: 'Cancel',\n} as const\n\nexport function UserButton({ menuItems = [], onSignOut, avatarUrl, labels }: UserButtonProps) {\n const resolvedLabels = { ...DEFAULT_LABELS, ...labels }\n const { user, logout, status } = useAuth()\n\n const [confirmSignOut, setConfirmSignOut] = useState(false)\n\n if (status !== 'authenticated') {\n return null\n }\n\n const userInitials = user?.name\n ? user.name\n .split(' ')\n .map((word) => word[0])\n .join('')\n .slice(0, 2)\n .toUpperCase()\n : user?.email?.slice(0, 2).toUpperCase() ?? '??'\n\n const resolvedAvatarUrl = avatarUrl ?? user?.image\n\n const handleSignOutRequest = () => {\n triggerHaptic('light')\n setConfirmSignOut(true)\n }\n\n const handleSignOutConfirm = async () => {\n triggerHaptic('success')\n setConfirmSignOut(false)\n try {\n // Pass '/' as redirect — logout() handles the full end-session flow\n // including server-side session termination and redirect.\n // onSignOut is called before the redirect for any cleanup the consumer needs.\n onSignOut?.()\n await logout('/')\n } catch {\n // logout errors are non-critical; session will expire naturally\n }\n }\n\n const handleSignOutCancel = () => {\n triggerHaptic('light')\n setConfirmSignOut(false)\n }\n\n return (\n <>\n <Menu as=\"div\" className=\"relative inline-block text-left\">\n <Menu.Button\n className=\"flex items-center gap-2 rounded-full p-1 transition-opacity hover:opacity-80 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\"\n aria-label={resolvedLabels.menuLabel}\n >\n <Avatar\n src={resolvedAvatarUrl}\n initials={userInitials}\n alt={user?.name ?? user?.email ?? resolvedLabels.userAlt}\n />\n <ChevronUpDownIcon className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n </Menu.Button>\n\n <Transition\n as={Fragment}\n enter=\"transition ease-out duration-100\"\n enterFrom=\"transform opacity-0 scale-95\"\n enterTo=\"transform opacity-100 scale-100\"\n leave=\"transition ease-in duration-75\"\n leaveFrom=\"transform opacity-100 scale-100\"\n leaveTo=\"transform opacity-0 scale-95\"\n >\n <Menu.Items className=\"liquid-surface absolute right-0 z-50 mt-2 w-60 origin-top-right rounded-2xl shadow-lg ring-1 ring-black/5 focus:outline-none dark:ring-white/10\">\n {/* User identity header */}\n <div className=\"flex items-center gap-3 border-b border-gray-200/60 px-4 py-3 dark:border-white/10\">\n <Avatar\n src={resolvedAvatarUrl}\n initials={userInitials}\n alt={user?.name ?? user?.email ?? resolvedLabels.userAlt}\n />\n <div className=\"min-w-0 flex-1\">\n {user?.name && (\n <p className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {user.name}\n </p>\n )}\n {user?.email && (\n <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">{user.email}</p>\n )}\n </div>\n </div>\n\n {/* Custom menu items */}\n {menuItems.length > 0 && (\n <>\n <div className=\"px-1 py-1\">\n {menuItems.map((item, index) => (\n <Menu.Item key={index}>\n {({ active }) => (\n <button\n type=\"button\"\n onClick={() => {\n triggerHaptic('light')\n item.onClick()\n }}\n className={`flex w-full items-center gap-2 rounded-xl px-3 py-2 text-sm transition-colors ${\n active\n ? 'bg-gray-100 text-gray-900 dark:bg-white/10 dark:text-white'\n : 'text-gray-700 dark:text-gray-300'\n }`}\n >\n {item.icon ? (\n <span className=\"h-4 w-4 shrink-0 text-gray-400\">{item.icon as ReactNode}</span>\n ) : null}\n {item.label}\n </button>\n )}\n </Menu.Item>\n ))}\n </div>\n <div className=\"border-t border-gray-200/60 dark:border-white/10\" />\n </>\n )}\n\n {/* Sign out */}\n <div className=\"border-t border-gray-200/60 px-1 py-1 dark:border-white/10\">\n <Menu.Item>\n {({ active }) => (\n <button\n type=\"button\"\n onClick={handleSignOutRequest}\n className={`flex w-full items-center gap-2 rounded-xl px-3 py-2 text-sm transition-colors ${\n active\n ? 'bg-red-50 text-red-700 dark:bg-red-500/10 dark:text-red-400'\n : 'text-red-600 dark:text-red-400'\n }`}\n >\n <ArrowRightStartOnRectangleIcon className=\"h-4 w-4 shrink-0\" />\n {resolvedLabels.signOut}\n </button>\n )}\n </Menu.Item>\n </div>\n </Menu.Items>\n </Transition>\n </Menu>\n\n {/* Sign-out confirmation */}\n <DynamicIslandConfirm\n open={confirmSignOut}\n onClose={handleSignOutCancel}\n onConfirm={handleSignOutConfirm}\n title={resolvedLabels.signOutConfirmTitle}\n confirmLabel={resolvedLabels.signOutConfirmButton}\n cancelLabel={resolvedLabels.signOutCancelButton}\n />\n </>\n )\n}\n"]}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkFSBR4RCK_js = require('./chunk-FSBR4RCK.js');
|
|
5
5
|
var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
|
|
6
6
|
var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
|
|
7
7
|
var react = require('react');
|
|
8
|
-
var client = require('@datatechsolutions/windsock/client');
|
|
9
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
10
9
|
|
|
11
10
|
var TIER_ORDER = {
|
|
@@ -20,7 +19,7 @@ function BillingPanel({
|
|
|
20
19
|
}) {
|
|
21
20
|
const t = chunkYXN2K77G_js.useTranslations("windsock");
|
|
22
21
|
const format = chunkYXN2K77G_js.useFormatter();
|
|
23
|
-
const { client
|
|
22
|
+
const { client } = chunkFSBR4RCK_js.useAuth();
|
|
24
23
|
const [subscription, setSubscription] = react.useState(null);
|
|
25
24
|
const [plans, setPlans] = react.useState([]);
|
|
26
25
|
const [isLoading, setIsLoading] = react.useState(true);
|
|
@@ -38,19 +37,21 @@ function BillingPanel({
|
|
|
38
37
|
setError(null);
|
|
39
38
|
try {
|
|
40
39
|
const [sub, availablePlans] = await Promise.all([
|
|
41
|
-
client
|
|
42
|
-
client
|
|
40
|
+
client.getSubscription(),
|
|
41
|
+
client.getPlans()
|
|
43
42
|
]);
|
|
44
43
|
setSubscription(sub);
|
|
45
44
|
setPlans(
|
|
46
|
-
[...availablePlans].filter((plan) => plan.active).sort(
|
|
45
|
+
[...availablePlans].filter((plan) => plan.active).sort(
|
|
46
|
+
(a, b) => (TIER_ORDER[a.tier] ?? 0) - (TIER_ORDER[b.tier] ?? 0)
|
|
47
|
+
)
|
|
47
48
|
);
|
|
48
49
|
} catch (loadError) {
|
|
49
50
|
setError(loadError instanceof Error ? loadError.message : String(loadError));
|
|
50
51
|
} finally {
|
|
51
52
|
setIsLoading(false);
|
|
52
53
|
}
|
|
53
|
-
}, [client
|
|
54
|
+
}, [client]);
|
|
54
55
|
react.useEffect(() => {
|
|
55
56
|
void load();
|
|
56
57
|
}, [load]);
|
|
@@ -58,7 +59,7 @@ function BillingPanel({
|
|
|
58
59
|
setBusyAction("portal");
|
|
59
60
|
chunkUZ3CMNUJ_js.triggerHaptic("light");
|
|
60
61
|
try {
|
|
61
|
-
const { url } = await client
|
|
62
|
+
const { url } = await client.createPortalSession();
|
|
62
63
|
redirect(url);
|
|
63
64
|
} catch (portalError) {
|
|
64
65
|
setError(portalError instanceof Error ? portalError.message : String(portalError));
|
|
@@ -66,12 +67,12 @@ function BillingPanel({
|
|
|
66
67
|
} finally {
|
|
67
68
|
setBusyAction(null);
|
|
68
69
|
}
|
|
69
|
-
}, [client
|
|
70
|
+
}, [client, redirect]);
|
|
70
71
|
const handleStartCheckout = react.useCallback(async (planCode) => {
|
|
71
72
|
setBusyAction(`checkout:${planCode}`);
|
|
72
73
|
chunkUZ3CMNUJ_js.triggerHaptic("light");
|
|
73
74
|
try {
|
|
74
|
-
const { url } = await client
|
|
75
|
+
const { url } = await client.createCheckoutSession(planCode, defaultBillingInterval);
|
|
75
76
|
redirect(url);
|
|
76
77
|
} catch (checkoutError) {
|
|
77
78
|
setError(checkoutError instanceof Error ? checkoutError.message : String(checkoutError));
|
|
@@ -79,7 +80,7 @@ function BillingPanel({
|
|
|
79
80
|
} finally {
|
|
80
81
|
setBusyAction(null);
|
|
81
82
|
}
|
|
82
|
-
}, [client
|
|
83
|
+
}, [client, defaultBillingInterval, redirect]);
|
|
83
84
|
const handleCancel = react.useCallback(async () => {
|
|
84
85
|
if (typeof window !== "undefined") {
|
|
85
86
|
const confirmed = window.confirm(t("billing.cancelConfirm"));
|
|
@@ -88,7 +89,7 @@ function BillingPanel({
|
|
|
88
89
|
setBusyAction("cancel");
|
|
89
90
|
chunkUZ3CMNUJ_js.triggerHaptic("warning");
|
|
90
91
|
try {
|
|
91
|
-
const result = await client
|
|
92
|
+
const result = await client.cancelSubscription();
|
|
92
93
|
if (!result.success) {
|
|
93
94
|
throw new Error(result.error ?? "Subscription cancellation failed");
|
|
94
95
|
}
|
|
@@ -100,9 +101,9 @@ function BillingPanel({
|
|
|
100
101
|
} finally {
|
|
101
102
|
setBusyAction(null);
|
|
102
103
|
}
|
|
103
|
-
}, [client
|
|
104
|
+
}, [client, load, t]);
|
|
104
105
|
if (isLoading) {
|
|
105
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
106
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.InlineSpinner, {}) });
|
|
106
107
|
}
|
|
107
108
|
const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null;
|
|
108
109
|
const currentTier = subscription?.tier ?? currentPlan?.tier ?? null;
|
|
@@ -116,7 +117,7 @@ function BillingPanel({
|
|
|
116
117
|
}
|
|
117
118
|
),
|
|
118
119
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
-
|
|
120
|
+
chunkFSBR4RCK_js.SectionCard,
|
|
120
121
|
{
|
|
121
122
|
header: {
|
|
122
123
|
title: t("billing.currentPlan.title"),
|
|
@@ -126,13 +127,13 @@ function BillingPanel({
|
|
|
126
127
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
127
128
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold text-gray-900 dark:text-white", children: currentPlan.name }),
|
|
128
129
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
129
|
-
|
|
130
|
+
chunkFSBR4RCK_js.StatusBadge,
|
|
130
131
|
{
|
|
131
132
|
status: subscription.status === "active" ? "success" : subscription.status === "past_due" ? "pending" : "error",
|
|
132
133
|
label: t(`billing.status.${subscription.status}`)
|
|
133
134
|
}
|
|
134
135
|
),
|
|
135
|
-
subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
+
subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.Badge, { color: "amber", children: t("billing.currentPlan.cancelAtPeriodEnd") })
|
|
136
137
|
] }),
|
|
137
138
|
/* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "grid grid-cols-1 gap-3 text-sm sm:grid-cols-2", children: [
|
|
138
139
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
@@ -152,7 +153,7 @@ function BillingPanel({
|
|
|
152
153
|
] }),
|
|
153
154
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2 pt-2", children: [
|
|
154
155
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
155
|
-
|
|
156
|
+
chunkFSBR4RCK_js.Button,
|
|
156
157
|
{
|
|
157
158
|
size: "sm",
|
|
158
159
|
color: "ios-glass-blue",
|
|
@@ -163,7 +164,7 @@ function BillingPanel({
|
|
|
163
164
|
}
|
|
164
165
|
),
|
|
165
166
|
subscription.status === "active" && !subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsxRuntime.jsx(
|
|
166
|
-
|
|
167
|
+
chunkFSBR4RCK_js.Button,
|
|
167
168
|
{
|
|
168
169
|
size: "sm",
|
|
169
170
|
color: "ios-glass-red",
|
|
@@ -178,21 +179,21 @@ function BillingPanel({
|
|
|
178
179
|
}
|
|
179
180
|
),
|
|
180
181
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
181
|
-
|
|
182
|
+
chunkFSBR4RCK_js.SectionCard,
|
|
182
183
|
{
|
|
183
184
|
header: {
|
|
184
185
|
title: t("billing.plans.title"),
|
|
185
186
|
subtitle: t("billing.plans.description")
|
|
186
187
|
},
|
|
187
|
-
children: plans.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t("billing.plans.empty") }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
188
|
+
children: plans.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: t("billing.plans.empty") }) : /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.ListCard, { children: plans.map((plan) => {
|
|
188
189
|
const isCurrent = currentPlan?.id === plan.id;
|
|
189
190
|
const isDowngrade = currentTier != null && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0);
|
|
190
191
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
191
|
-
|
|
192
|
+
chunkFSBR4RCK_js.ListCardItem,
|
|
192
193
|
{
|
|
193
194
|
leading: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500/20 to-blue-500/20 text-violet-600 dark:text-violet-300", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-bold uppercase", children: plan.tier.charAt(0) }) }),
|
|
194
|
-
trailing: isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
195
|
-
|
|
195
|
+
trailing: isCurrent ? /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.Badge, { color: "green", children: t("billing.plans.currentBadge") }) : isDowngrade ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
+
chunkFSBR4RCK_js.Button,
|
|
196
197
|
{
|
|
197
198
|
size: "sm",
|
|
198
199
|
plain: true,
|
|
@@ -202,7 +203,7 @@ function BillingPanel({
|
|
|
202
203
|
children: t("billing.plans.downgradeAction")
|
|
203
204
|
}
|
|
204
205
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
205
|
-
|
|
206
|
+
chunkFSBR4RCK_js.Button,
|
|
206
207
|
{
|
|
207
208
|
size: "sm",
|
|
208
209
|
color: "ios-glass-blue",
|
|
@@ -235,5 +236,5 @@ function BillingPanel({
|
|
|
235
236
|
}
|
|
236
237
|
|
|
237
238
|
exports.BillingPanel = BillingPanel;
|
|
238
|
-
//# sourceMappingURL=chunk-
|
|
239
|
-
//# sourceMappingURL=chunk-
|
|
239
|
+
//# sourceMappingURL=chunk-UJVDI66K.js.map
|
|
240
|
+
//# sourceMappingURL=chunk-UJVDI66K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/billing/billing-panel.tsx"],"names":["useTranslations","useFormatter","useAuth","useState","useCallback","useEffect","triggerHaptic","jsx","InlineSpinner","jsxs","SectionCard","StatusBadge","Badge","Button","ListCard","ListCardItem"],"mappings":"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","file":"chunk-UJVDI66K.js","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — BillingPanel\n// Shows the current organization subscription plus the plan catalogue, with\n// actions for opening the Stripe portal, starting checkout, or cancelling.\n// Backed by `AuthClient.getSubscription / getPlans / createPortalSession /\n// createCheckoutSession / cancelSubscription`.\n// =============================================================================\n\nimport { useEffect, useState, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n Badge,\n StatusBadge,\n InlineSpinner,\n ListCard,\n ListCardItem,\n triggerHaptic,\n} from '@ui/index'\nimport type {\n SubscriptionDetails,\n PlanDefinition,\n SubscriptionTier,\n} from '@datatechsolutions/shared-domain'\nimport { useAuth } from '../../_auth'\n\nexport interface BillingPanelProps {\n /**\n * Which billing interval to prefer when starting checkout. Defaults to\n * `'monthly'`. Surface a toggle in the host app if both matter.\n */\n defaultBillingInterval?: 'monthly' | 'yearly'\n /**\n * Called after the portal/checkout URL is resolved. Defaults to\n * `window.location.assign(url)`. Override to open in a new tab, use a\n * router, etc.\n */\n onRedirect?: (url: string) => void\n}\n\nconst TIER_ORDER: Record<SubscriptionTier, number> = {\n free_trial: 0,\n starter: 1,\n professional: 2,\n enterprise: 3,\n}\n\nexport function BillingPanel({\n defaultBillingInterval = 'monthly',\n onRedirect,\n}: BillingPanelProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n const { client } = useAuth()\n\n const [subscription, setSubscription] = useState<SubscriptionDetails | null>(null)\n const [plans, setPlans] = useState<PlanDefinition[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [busyAction, setBusyAction] = useState<string | null>(null)\n\n const redirect = useCallback((url: string) => {\n if (onRedirect) {\n onRedirect(url)\n } else if (typeof window !== 'undefined') {\n window.location.assign(url)\n }\n }, [onRedirect])\n\n const load = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const [sub, availablePlans] = await Promise.all([\n client.getSubscription(),\n client.getPlans(),\n ])\n setSubscription(sub)\n setPlans(\n [...availablePlans]\n .filter((plan: { active: boolean }) => plan.active)\n .sort(\n (a: { tier: SubscriptionTier }, b: { tier: SubscriptionTier }) =>\n (TIER_ORDER[a.tier] ?? 0) - (TIER_ORDER[b.tier] ?? 0),\n ),\n )\n } catch (loadError) {\n setError(loadError instanceof Error ? loadError.message : String(loadError))\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const handleOpenPortal = useCallback(async () => {\n setBusyAction('portal')\n triggerHaptic('light')\n try {\n const { url } = await client.createPortalSession()\n redirect(url)\n } catch (portalError) {\n setError(portalError instanceof Error ? portalError.message : String(portalError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, redirect])\n\n const handleStartCheckout = useCallback(async (planCode: string) => {\n setBusyAction(`checkout:${planCode}`)\n triggerHaptic('light')\n try {\n const { url } = await client.createCheckoutSession(planCode, defaultBillingInterval)\n redirect(url)\n } catch (checkoutError) {\n setError(checkoutError instanceof Error ? checkoutError.message : String(checkoutError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, defaultBillingInterval, redirect])\n\n const handleCancel = useCallback(async () => {\n if (typeof window !== 'undefined') {\n const confirmed = window.confirm(t('billing.cancelConfirm'))\n if (!confirmed) return\n }\n setBusyAction('cancel')\n triggerHaptic('warning')\n try {\n const result = await client.cancelSubscription()\n if (!result.success) {\n throw new Error(result.error ?? 'Subscription cancellation failed')\n }\n triggerHaptic('success')\n await load()\n } catch (cancelError) {\n setError(cancelError instanceof Error ? cancelError.message : String(cancelError))\n triggerHaptic('error')\n } finally {\n setBusyAction(null)\n }\n }, [client, load, t])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n const currentPlan = subscription?.plan ?? plans.find((plan) => plan.id === subscription?.planId) ?? null\n const currentTier = subscription?.tier ?? currentPlan?.tier ?? null\n\n return (\n <div className=\"space-y-6\">\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-xl border border-red-300/40 bg-red-50/80 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300\"\n >\n {error}\n </div>\n )}\n\n <SectionCard\n header={{\n title: t('billing.currentPlan.title'),\n subtitle: t('billing.currentPlan.description'),\n }}\n >\n {subscription && currentPlan ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {currentPlan.name}\n </span>\n <StatusBadge\n status={\n subscription.status === 'active' ? 'success'\n : subscription.status === 'past_due' ? 'pending'\n : 'error'\n }\n label={t(`billing.status.${subscription.status}`)}\n />\n {subscription.cancelAtPeriodEnd && (\n <Badge color=\"amber\">{t('billing.currentPlan.cancelAtPeriodEnd')}</Badge>\n )}\n </div>\n\n <dl className=\"grid grid-cols-1 gap-3 text-sm sm:grid-cols-2\">\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.price')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.number(currentPlan.price, { style: 'currency', currency: currentPlan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${currentPlan.interval}`)}\n </dd>\n </div>\n {subscription.currentPeriodEnd && (\n <div>\n <dt className=\"text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.renewsOn')}\n </dt>\n <dd className=\"font-medium text-gray-900 dark:text-white\">\n {format.dateTime(new Date(subscription.currentPeriodEnd), { dateStyle: 'medium' })}\n </dd>\n </div>\n )}\n </dl>\n\n <div className=\"flex flex-wrap gap-2 pt-2\">\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={handleOpenPortal}\n loading={busyAction === 'portal'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.manageInPortal')}\n </Button>\n {subscription.status === 'active' && !subscription.cancelAtPeriodEnd && (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={handleCancel}\n loading={busyAction === 'cancel'}\n disabled={busyAction !== null}\n >\n {t('billing.currentPlan.cancel')}\n </Button>\n )}\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.currentPlan.noSubscription')}\n </p>\n )}\n </SectionCard>\n\n <SectionCard\n header={{\n title: t('billing.plans.title'),\n subtitle: t('billing.plans.description'),\n }}\n >\n {plans.length === 0 ? (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('billing.plans.empty')}\n </p>\n ) : (\n <ListCard>\n {plans.map((plan) => {\n const isCurrent = currentPlan?.id === plan.id\n const isDowngrade = currentTier != null\n && (TIER_ORDER[plan.tier] ?? 0) < (TIER_ORDER[currentTier] ?? 0)\n return (\n <ListCardItem\n key={plan.id}\n leading={\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500/20 to-blue-500/20 text-violet-600 dark:text-violet-300\">\n <span className=\"text-sm font-bold uppercase\">{plan.tier.charAt(0)}</span>\n </div>\n }\n trailing={\n isCurrent ? (\n <Badge color=\"green\">{t('billing.plans.currentBadge')}</Badge>\n ) : (\n isDowngrade ? (\n <Button\n size=\"sm\"\n plain\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.downgradeAction')}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleStartCheckout(plan.code)}\n loading={busyAction === `checkout:${plan.code}`}\n disabled={busyAction !== null}\n >\n {t('billing.plans.selectAction')}\n </Button>\n )\n )\n }\n >\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {plan.name}\n </p>\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {format.number(plan.price, { style: 'currency', currency: plan.currency })}\n {' '}/{' '}\n {t(`billing.interval.${plan.interval}`)}\n </span>\n </div>\n {plan.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {plan.description}\n </p>\n )}\n </div>\n </ListCardItem>\n )\n })}\n </ListCard>\n )}\n </SectionCard>\n </div>\n )\n}\n"]}
|