@hexclave/next 1.0.0 → 1.0.2
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/README.md +7 -23
- package/dist/components/api-key-dialogs.js +18 -18
- package/dist/components/api-key-dialogs.js.map +1 -1
- package/dist/components/api-key-table.js +19 -19
- package/dist/components/api-key-table.js.map +1 -1
- package/dist/components/credential-sign-in.js +12 -12
- package/dist/components/credential-sign-in.js.map +1 -1
- package/dist/components/credential-sign-up.js +19 -19
- package/dist/components/credential-sign-up.js.map +1 -1
- package/dist/components/elements/separator-with-text.js +3 -3
- package/dist/components/elements/separator-with-text.js.map +1 -1
- package/dist/components/elements/sidebar-layout.js +15 -15
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/elements/user-avatar.js +3 -3
- package/dist/components/elements/user-avatar.js.map +1 -1
- package/dist/components/link.js +2 -2
- package/dist/components/link.js.map +1 -1
- package/dist/components/magic-link-sign-in.js +17 -17
- package/dist/components/magic-link-sign-in.js.map +1 -1
- package/dist/components/message-cards/known-error-message-card.js +2 -2
- package/dist/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/components/message-cards/message-card.js +4 -4
- package/dist/components/message-cards/message-card.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js +2 -2
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components/oauth-button.d.ts.map +1 -1
- package/dist/components/oauth-button.js +15 -15
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/passkey-button.js +2 -2
- package/dist/components/passkey-button.js.map +1 -1
- package/dist/components/profile-image-editor.js +9 -9
- package/dist/components/profile-image-editor.js.map +1 -1
- package/dist/components/selected-team-switcher.js +4 -4
- package/dist/components/selected-team-switcher.js.map +1 -1
- package/dist/components/team-icon.js +4 -4
- package/dist/components/team-icon.js.map +1 -1
- package/dist/components/team-switcher.js +21 -21
- package/dist/components/team-switcher.js.map +1 -1
- package/dist/components/user-button.js +13 -13
- package/dist/components/user-button.js.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +32 -32
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/components-page/account-settings/api-keys/api-keys-page.js +2 -2
- package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/components-page/account-settings/editable-text.js +5 -5
- package/dist/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.js +22 -22
- package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js +17 -17
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/otp-section.js +9 -9
- package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js +9 -9
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.js +23 -23
- package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/components-page/account-settings/notifications/notifications-page.js +6 -6
- package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/components-page/account-settings/payments/payments-panel.js +52 -52
- package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
- package/dist/components-page/account-settings/section.js +4 -4
- package/dist/components-page/account-settings/section.js.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.js +7 -7
- package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.js +2 -2
- package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.js +5 -5
- package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.js +5 -5
- package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.js +7 -7
- package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js +20 -20
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.js +5 -5
- package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/components-page/account-settings.js +22 -22
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/auth-page.js +23 -23
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.js +9 -9
- package/dist/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.test.js +4 -4
- package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
- package/dist/components-page/email-verification.js +6 -6
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.js +11 -11
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/forgot-password.js +11 -11
- package/dist/components-page/forgot-password.js.map +1 -1
- package/dist/components-page/magic-link-callback.js +8 -8
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/mfa.js +13 -13
- package/dist/components-page/mfa.js.map +1 -1
- package/dist/components-page/oauth-callback.js +9 -9
- package/dist/components-page/oauth-callback.js.map +1 -1
- package/dist/components-page/onboarding.js +11 -11
- package/dist/components-page/onboarding.js.map +1 -1
- package/dist/components-page/password-reset.js +27 -27
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/section.js +1 -1
- package/dist/components-page/sign-out.js +4 -4
- package/dist/components-page/sign-out.js.map +1 -1
- package/dist/components-page/stack-handler-client.js +14 -10
- package/dist/components-page/stack-handler-client.js.map +1 -1
- package/dist/components-page/stack-handler.d.ts +14 -9
- package/dist/components-page/stack-handler.d.ts.map +1 -1
- package/dist/components-page/stack-handler.js +8 -2
- package/dist/components-page/stack-handler.js.map +1 -1
- package/dist/components-page/team-creation.js +9 -9
- package/dist/components-page/team-creation.js.map +1 -1
- package/dist/components-page/team-invitation.js +20 -20
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-core.js +25 -25
- package/dist/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.test.js +1 -1
- package/dist/dev-tool/index.js +6 -6
- package/dist/dev-tool/index.js.map +1 -1
- package/dist/esm/components/api-key-dialogs.js.map +1 -1
- package/dist/esm/components/api-key-table.js.map +1 -1
- package/dist/esm/components/credential-sign-in.js.map +1 -1
- package/dist/esm/components/credential-sign-up.js.map +1 -1
- package/dist/esm/components/elements/separator-with-text.js.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components/elements/user-avatar.js.map +1 -1
- package/dist/esm/components/link.js.map +1 -1
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/esm/components/message-cards/message-card.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components/oauth-button.d.ts.map +1 -1
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/passkey-button.js.map +1 -1
- package/dist/esm/components/profile-image-editor.js.map +1 -1
- package/dist/esm/components/selected-team-switcher.js.map +1 -1
- package/dist/esm/components/team-icon.js.map +1 -1
- package/dist/esm/components/team-switcher.js.map +1 -1
- package/dist/esm/components/user-button.js.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-panel.js +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
- package/dist/esm/components-page/account-settings/section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.test.js +2 -2
- package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/forgot-password.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/mfa.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/components-page/onboarding.js.map +1 -1
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/sign-out.js.map +1 -1
- package/dist/esm/components-page/stack-handler-client.js +8 -4
- package/dist/esm/components-page/stack-handler-client.js.map +1 -1
- package/dist/esm/components-page/stack-handler.d.ts +13 -9
- package/dist/esm/components-page/stack-handler.d.ts.map +1 -1
- package/dist/esm/components-page/stack-handler.js +5 -2
- package/dist/esm/components-page/stack-handler.js.map +1 -1
- package/dist/esm/components-page/team-creation.js.map +1 -1
- package/dist/esm/components-page/team-invitation.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js +4 -4
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +1 -1
- package/dist/esm/dev-tool/index.js.map +1 -1
- package/dist/esm/generated/global-css.d.ts +1 -1
- package/dist/esm/generated/global-css.js +1 -1
- package/dist/esm/generated/global-css.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.d.ts +2 -2
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js +5 -6
- package/dist/esm/integrations/convex.js.map +1 -1
- package/dist/esm/lib/auth.js +1 -1
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/auth.test.js.map +1 -1
- package/dist/esm/lib/cookie.js.map +1 -1
- package/dist/esm/lib/hooks.d.ts +11 -1
- package/dist/esm/lib/hooks.d.ts.map +1 -1
- package/dist/esm/lib/hooks.js +19 -9
- package/dist/esm/lib/hooks.js.map +1 -1
- package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts +11 -11
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +3 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +67 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts +4 -3
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +20 -4
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js +3 -3
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.js +3 -2
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts +4 -0
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts +5 -0
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts +4 -0
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/esm/lib/stack-app/common.d.ts +1 -1
- package/dist/esm/lib/stack-app/common.js.map +1 -1
- package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -1
- package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -1
- package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
- package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
- package/dist/esm/lib/stack-app/url-targets.js.map +1 -1
- package/dist/esm/lib/stack-app/url-targets.test.js +1 -1
- package/dist/esm/lib/stack-app/url-targets.test.js.map +1 -1
- package/dist/esm/lib/stack-app/users/index.js.map +1 -1
- package/dist/esm/providers/stack-context.d.ts +3 -2
- package/dist/esm/providers/stack-context.d.ts.map +1 -1
- package/dist/esm/providers/stack-context.js +3 -1
- package/dist/esm/providers/stack-context.js.map +1 -1
- package/dist/esm/providers/stack-provider-client.js.map +1 -1
- package/dist/esm/providers/stack-provider.d.ts +5 -1
- package/dist/esm/providers/stack-provider.d.ts.map +1 -1
- package/dist/esm/providers/stack-provider.js +5 -1
- package/dist/esm/providers/stack-provider.js.map +1 -1
- package/dist/esm/providers/theme-provider.d.ts +6 -2
- package/dist/esm/providers/theme-provider.d.ts.map +1 -1
- package/dist/esm/providers/theme-provider.js +6 -2
- package/dist/esm/providers/theme-provider.js.map +1 -1
- package/dist/esm/providers/translation-provider-client.d.ts +4 -3
- package/dist/esm/providers/translation-provider-client.d.ts.map +1 -1
- package/dist/esm/providers/translation-provider-client.js +4 -2
- package/dist/esm/providers/translation-provider-client.js.map +1 -1
- package/dist/esm/providers/translation-provider.js.map +1 -1
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/generated/global-css.d.ts +1 -1
- package/dist/generated/global-css.js +1 -1
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.d.ts +2 -2
- package/dist/generated/quetzal-translations.js +16 -16
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.js +9 -12
- package/dist/integrations/convex/component/convex.config.d.ts +1 -1
- package/dist/integrations/convex.js +5 -5
- package/dist/integrations/convex.js.map +1 -1
- package/dist/lib/auth.js +12 -12
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/auth.test.js +2 -2
- package/dist/lib/auth.test.js.map +1 -1
- package/dist/lib/cookie.js +13 -13
- package/dist/lib/cookie.js.map +1 -1
- package/dist/lib/hooks.d.ts +11 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +19 -8
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/stack-app/api-keys/index.js +2 -2
- package/dist/lib/stack-app/api-keys/index.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts +11 -11
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +39 -37
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +66 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +4 -3
- package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js +231 -215
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +30 -30
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.js +7 -7
- package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.js +3 -3
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/index.js +4 -4
- package/dist/lib/stack-app/apps/implementations/index.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js +8 -8
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +70 -70
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/implementations/session-replay.js +13 -12
- package/dist/lib/stack-app/apps/implementations/session-replay.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts +4 -0
- package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.js +1 -0
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.d.ts +5 -0
- package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js +1 -0
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.d.ts +5 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.js +1 -0
- package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/lib/stack-app/common.d.ts +1 -1
- package/dist/lib/stack-app/common.js.map +1 -1
- package/dist/lib/stack-app/contact-channels/index.js.map +1 -1
- package/dist/lib/stack-app/email-templates/index.js.map +1 -1
- package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/lib/stack-app/projects/index.js.map +1 -1
- package/dist/lib/stack-app/teams/index.js.map +1 -1
- package/dist/lib/stack-app/url-targets.js +6 -6
- package/dist/lib/stack-app/url-targets.js.map +1 -1
- package/dist/lib/stack-app/url-targets.test.js +1 -1
- package/dist/lib/stack-app/url-targets.test.js.map +1 -1
- package/dist/lib/stack-app/users/index.js +3 -3
- package/dist/lib/stack-app/users/index.js.map +1 -1
- package/dist/providers/stack-context.d.ts +3 -2
- package/dist/providers/stack-context.d.ts.map +1 -1
- package/dist/providers/stack-context.js +3 -1
- package/dist/providers/stack-context.js.map +1 -1
- package/dist/providers/stack-provider-client.js +2 -2
- package/dist/providers/stack-provider-client.js.map +1 -1
- package/dist/providers/stack-provider.d.ts +6 -1
- package/dist/providers/stack-provider.d.ts.map +1 -1
- package/dist/providers/stack-provider.js +8 -1
- package/dist/providers/stack-provider.js.map +1 -1
- package/dist/providers/theme-provider.d.ts +6 -2
- package/dist/providers/theme-provider.d.ts.map +1 -1
- package/dist/providers/theme-provider.js +10 -5
- package/dist/providers/theme-provider.js.map +1 -1
- package/dist/providers/translation-provider-client.d.ts +4 -3
- package/dist/providers/translation-provider-client.d.ts.map +1 -1
- package/dist/providers/translation-provider-client.js +4 -1
- package/dist/providers/translation-provider-client.js.map +1 -1
- package/dist/providers/translation-provider.js +2 -2
- package/dist/providers/translation-provider.js.map +1 -1
- package/dist/{storage-DxMLntUt.d.ts → storage-kTmOAWHW.d.ts} +1 -1
- package/dist/{storage-DxMLntUt.d.ts.map → storage-kTmOAWHW.d.ts.map} +1 -1
- package/dist/utils/url.js +2 -2
- package/dist/utils/url.js.map +1 -1
- package/package.json +9 -9
- package/dist/esm/internal/deprecation-warning.d.ts +0 -1
- package/dist/esm/internal/deprecation-warning.js +0 -24
- package/dist/esm/internal/deprecation-warning.js.map +0 -1
- package/dist/internal/deprecation-warning.d.ts +0 -1
- package/dist/internal/deprecation-warning.js +0 -24
- package/dist/internal/deprecation-warning.js.map +0 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_chunk = require('../../../chunk-BE-pF4vm.js');
|
|
3
3
|
let _hookform_resolvers_yup = require("@hookform/resolvers/yup");
|
|
4
|
-
let
|
|
5
|
-
let
|
|
6
|
-
let
|
|
4
|
+
let _hexclave_shared_dist_schema_fields = require("@hexclave/shared/dist/schema-fields");
|
|
5
|
+
let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
6
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
7
7
|
let react = require("react");
|
|
8
8
|
let react_hook_form = require("react-hook-form");
|
|
9
9
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
10
|
let _________lib_hooks_js = require("../../../lib/hooks.js");
|
|
11
11
|
let _________lib_translations_js = require("../../../lib/translations.js");
|
|
12
|
-
let
|
|
12
|
+
let _hexclave_shared_dist_known_errors = require("@hexclave/shared/dist/known-errors");
|
|
13
13
|
let _________components_elements_form_warning_js = require("../../../components/elements/form-warning.js");
|
|
14
14
|
|
|
15
15
|
//#region src/components-page/account-settings/email-and-auth/emails-section.tsx
|
|
@@ -18,11 +18,11 @@ function EmailsSection(props) {
|
|
|
18
18
|
const user = (0, _________lib_hooks_js.useUser)({ or: props?.mockMode ? "return-null" : "redirect" });
|
|
19
19
|
if (props?.mockMode && !user) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
20
20
|
className: "flex flex-col md:flex-row justify-between mb-4 gap-4",
|
|
21
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
21
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
22
22
|
className: "font-medium",
|
|
23
23
|
children: t("Emails")
|
|
24
24
|
})
|
|
25
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
25
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
26
26
|
variant: "secondary",
|
|
27
27
|
children: t("Email management is not available in demo mode.")
|
|
28
28
|
})] });
|
|
@@ -33,13 +33,13 @@ function EmailsSection(props) {
|
|
|
33
33
|
const [addedEmail, setAddedEmail] = (0, react.useState)(null);
|
|
34
34
|
const isLastEmailUsedForAuth = contactChannels.filter((x) => x.usedForAuth && x.type === "email").length === 1;
|
|
35
35
|
(0, react.useEffect)(() => {
|
|
36
|
-
if (addedEmail) (0,
|
|
36
|
+
if (addedEmail) (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(async () => {
|
|
37
37
|
const cc = contactChannels.find((x) => x.value === addedEmail);
|
|
38
38
|
if (cc && !cc.isVerified) await cc.sendVerificationEmail();
|
|
39
39
|
setAddedEmail(null);
|
|
40
40
|
});
|
|
41
41
|
}, [contactChannels, addedEmail]);
|
|
42
|
-
const { register, handleSubmit, formState: { errors }, reset } = (0, react_hook_form.useForm)({ resolver: (0, _hookform_resolvers_yup.yupResolver)((0,
|
|
42
|
+
const { register, handleSubmit, formState: { errors }, reset } = (0, react_hook_form.useForm)({ resolver: (0, _hookform_resolvers_yup.yupResolver)((0, _hexclave_shared_dist_schema_fields.yupObject)({ email: (0, _hexclave_shared_dist_schema_fields.strictEmailSchema)(t("Please enter a valid email address")).notOneOf(contactChannels.map((x) => x.value), t("Email already exists")).defined().nonEmpty(t("Email is required")) })) });
|
|
43
43
|
const onSubmit = async (data) => {
|
|
44
44
|
setAddingEmailLoading(true);
|
|
45
45
|
try {
|
|
@@ -57,28 +57,28 @@ function EmailsSection(props) {
|
|
|
57
57
|
};
|
|
58
58
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
59
59
|
className: "flex flex-col md:flex-row justify-between mb-4 gap-4",
|
|
60
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
60
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
61
61
|
className: "font-medium",
|
|
62
62
|
children: t("Emails")
|
|
63
63
|
}), addingEmail ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
|
|
64
64
|
onSubmit: (e) => {
|
|
65
65
|
e.preventDefault();
|
|
66
|
-
(0,
|
|
66
|
+
(0, _hexclave_shared_dist_utils_promises.runAsynchronously)(handleSubmit(onSubmit));
|
|
67
67
|
},
|
|
68
68
|
className: "flex flex-col",
|
|
69
69
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
70
70
|
className: "flex gap-2",
|
|
71
71
|
children: [
|
|
72
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
72
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Input, {
|
|
73
73
|
...register("email"),
|
|
74
74
|
placeholder: t("Enter email")
|
|
75
75
|
}),
|
|
76
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
76
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
77
77
|
type: "submit",
|
|
78
78
|
loading: addingEmailLoading,
|
|
79
79
|
children: t("Add")
|
|
80
80
|
}),
|
|
81
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
81
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
82
82
|
variant: "secondary",
|
|
83
83
|
onClick: () => {
|
|
84
84
|
setAddingEmail(false);
|
|
@@ -90,7 +90,7 @@ function EmailsSection(props) {
|
|
|
90
90
|
}), errors.email && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_________components_elements_form_warning_js.FormWarningText, { text: errors.email.message })]
|
|
91
91
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
92
92
|
className: "flex md:justify-end",
|
|
93
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
93
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
94
94
|
variant: "secondary",
|
|
95
95
|
onClick: () => setAddingEmail(true),
|
|
96
96
|
children: t("Add an email")
|
|
@@ -98,29 +98,29 @@ function EmailsSection(props) {
|
|
|
98
98
|
})]
|
|
99
99
|
}), contactChannels.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
100
100
|
className: "border rounded-md",
|
|
101
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
101
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Table, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableBody, { children: contactChannels.filter((x) => x.type === "email").sort((a, b) => {
|
|
102
102
|
if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1;
|
|
103
103
|
if (a.isVerified !== b.isVerified) return a.isVerified ? -1 : 1;
|
|
104
104
|
return 0;
|
|
105
|
-
}).map((x) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(
|
|
105
|
+
}).map((x) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.TableRow, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
106
106
|
className: "flex flex-col md:flex-row gap-2 md:gap-4",
|
|
107
107
|
children: [x.value, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
108
108
|
className: "flex gap-2",
|
|
109
109
|
children: [
|
|
110
|
-
x.isPrimary ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
111
|
-
!x.isVerified ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
110
|
+
x.isPrimary ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Badge, { children: t("Primary") }) : null,
|
|
111
|
+
!x.isVerified ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Badge, {
|
|
112
112
|
variant: "destructive",
|
|
113
113
|
children: t("Unverified")
|
|
114
114
|
}) : null,
|
|
115
|
-
x.usedForAuth ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
115
|
+
x.usedForAuth ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Badge, {
|
|
116
116
|
variant: "outline",
|
|
117
117
|
children: t("Used for sign-in")
|
|
118
118
|
}) : null
|
|
119
119
|
]
|
|
120
120
|
})]
|
|
121
|
-
}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
121
|
+
}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, {
|
|
122
122
|
className: "flex justify-end",
|
|
123
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
123
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.ActionCell, { items: [
|
|
124
124
|
...!x.isVerified ? [{
|
|
125
125
|
item: t("Send verification email"),
|
|
126
126
|
onClick: async () => {
|
|
@@ -144,7 +144,7 @@ function EmailsSection(props) {
|
|
|
144
144
|
try {
|
|
145
145
|
await x.update({ usedForAuth: true });
|
|
146
146
|
} catch (e) {
|
|
147
|
-
if (
|
|
147
|
+
if (_hexclave_shared_dist_known_errors.KnownErrors.ContactChannelAlreadyUsedForAuthBySomeoneElse.isInstance(e)) alert(t("This email is already used for sign-in by another user."));
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
}] : [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emails-section.js","names":["Typography","Input","Button","FormWarningText","Table","TableBody","TableRow","TableCell","Badge","ActionCell","KnownErrors"],"sources":["../../../../src/components-page/account-settings/email-and-auth/emails-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@stackframe/stack-shared/dist/known-errors\";\nimport { strictEmailSchema, yupObject } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Input, Table, TableBody, TableCell, TableRow, Typography } from \"@stackframe/stack-ui\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\n\nexport function EmailsSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n </div>\n <Typography variant='secondary'>{t(\"Email management is not available in demo mode.\")}</Typography>\n </div>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to redirect\n }\n\n const contactChannels = user.useContactChannels();\n const [addingEmail, setAddingEmail] = useState(contactChannels.length === 0);\n const [addingEmailLoading, setAddingEmailLoading] = useState(false);\n const [addedEmail, setAddedEmail] = useState<string | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isLastEmailUsedForAuth = contactChannels.filter(x => x.usedForAuth && x.type === 'email').length === 1;\n\n useEffect(() => {\n if (addedEmail) {\n runAsynchronously(async () => {\n const cc = contactChannels.find(x => x.value === addedEmail);\n if (cc && !cc.isVerified) {\n await cc.sendVerificationEmail();\n }\n setAddedEmail(null);\n });\n }\n }, [contactChannels, addedEmail]);\n\n const emailSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address'))\n .notOneOf(contactChannels.map(x => x.value), t('Email already exists'))\n .defined()\n .nonEmpty(t('Email is required')),\n });\n\n const { register, handleSubmit, formState: { errors }, reset } = useForm({\n resolver: yupResolver(emailSchema)\n });\n\n const onSubmit = async (data: yup.InferType<typeof emailSchema>) => {\n setAddingEmailLoading(true);\n try {\n await user.createContactChannel({ type: 'email', value: data.email, usedForAuth: false });\n setAddedEmail(data.email);\n } finally {\n setAddingEmailLoading(false);\n }\n setAddingEmail(false);\n reset();\n };\n\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n {addingEmail ? (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n runAsynchronously(handleSubmit(onSubmit));\n }}\n className='flex flex-col'\n >\n <div className='flex gap-2'>\n <Input\n {...register(\"email\")}\n placeholder={t(\"Enter email\")}\n />\n <Button type=\"submit\" loading={addingEmailLoading}>\n {t(\"Add\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => {\n setAddingEmail(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n {errors.email && <FormWarningText text={errors.email.message} />}\n </form>\n ) : (\n <div className='flex md:justify-end'>\n <Button variant='secondary' onClick={() => setAddingEmail(true)}>{t(\"Add an email\")}</Button>\n </div>\n )}\n </div>\n\n {contactChannels.length > 0 ? (\n <div className='border rounded-md'>\n <Table>\n <TableBody>\n {/*eslint-disable-next-line @typescript-eslint/no-unnecessary-condition*/}\n {contactChannels.filter(x => x.type === 'email')\n .sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1;\n if (a.isVerified !== b.isVerified) return a.isVerified ? -1 : 1;\n return 0;\n })\n .map(x => (\n <TableRow key={x.id}>\n <TableCell>\n <div className='flex flex-col md:flex-row gap-2 md:gap-4'>\n {x.value}\n <div className='flex gap-2'>\n {x.isPrimary ? <Badge>{t(\"Primary\")}</Badge> : null}\n {!x.isVerified ? <Badge variant='destructive'>{t(\"Unverified\")}</Badge> : null}\n {x.usedForAuth ? <Badge variant='outline'>{t(\"Used for sign-in\")}</Badge> : null}\n </div>\n </div>\n </TableCell>\n <TableCell className=\"flex justify-end\">\n <ActionCell items={[\n ...(!x.isVerified ? [{\n item: t(\"Send verification email\"),\n onClick: async () => { await x.sendVerificationEmail(); },\n }] : []),\n ...(!x.isPrimary && x.isVerified ? [{\n item: t(\"Set as primary\"),\n onClick: async () => { await x.update({ isPrimary: true }); },\n }] :\n !x.isPrimary ? [{\n item: t(\"Set as primary\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"Please verify your email first\"),\n }] : []),\n ...(!x.usedForAuth && x.isVerified ? [{\n item: t(\"Use for sign-in\"),\n onClick: async () => {\n try {\n await x.update({ usedForAuth: true });\n } catch (e) {\n if (KnownErrors.ContactChannelAlreadyUsedForAuthBySomeoneElse.isInstance(e)) {\n alert(t(\"This email is already used for sign-in by another user.\"));\n }\n }\n }\n }] : []),\n ...(x.usedForAuth && !isLastEmailUsedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => { await x.update({ usedForAuth: false }); },\n }] : x.usedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }] : []),\n // Determine if this email can be removed\n ...(!isLastEmailUsedForAuth || !x.usedForAuth ? [{\n item: t(\"Remove\"),\n onClick: async () => { await x.delete(); },\n danger: true,\n }] : [{\n item: t(\"Remove\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }]),\n ]}/>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"emails-section.js","names":["Typography","Input","Button","FormWarningText","Table","TableBody","TableRow","TableCell","Badge","ActionCell","KnownErrors"],"sources":["../../../../src/components-page/account-settings/email-and-auth/emails-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Input, Table, TableBody, TableCell, TableRow, Typography } from \"@hexclave/ui\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\n\nexport function EmailsSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n </div>\n <Typography variant='secondary'>{t(\"Email management is not available in demo mode.\")}</Typography>\n </div>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to redirect\n }\n\n const contactChannels = user.useContactChannels();\n const [addingEmail, setAddingEmail] = useState(contactChannels.length === 0);\n const [addingEmailLoading, setAddingEmailLoading] = useState(false);\n const [addedEmail, setAddedEmail] = useState<string | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isLastEmailUsedForAuth = contactChannels.filter(x => x.usedForAuth && x.type === 'email').length === 1;\n\n useEffect(() => {\n if (addedEmail) {\n runAsynchronously(async () => {\n const cc = contactChannels.find(x => x.value === addedEmail);\n if (cc && !cc.isVerified) {\n await cc.sendVerificationEmail();\n }\n setAddedEmail(null);\n });\n }\n }, [contactChannels, addedEmail]);\n\n const emailSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address'))\n .notOneOf(contactChannels.map(x => x.value), t('Email already exists'))\n .defined()\n .nonEmpty(t('Email is required')),\n });\n\n const { register, handleSubmit, formState: { errors }, reset } = useForm({\n resolver: yupResolver(emailSchema)\n });\n\n const onSubmit = async (data: yup.InferType<typeof emailSchema>) => {\n setAddingEmailLoading(true);\n try {\n await user.createContactChannel({ type: 'email', value: data.email, usedForAuth: false });\n setAddedEmail(data.email);\n } finally {\n setAddingEmailLoading(false);\n }\n setAddingEmail(false);\n reset();\n };\n\n return (\n <div>\n <div className='flex flex-col md:flex-row justify-between mb-4 gap-4'>\n <Typography className='font-medium'>{t(\"Emails\")}</Typography>\n {addingEmail ? (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n runAsynchronously(handleSubmit(onSubmit));\n }}\n className='flex flex-col'\n >\n <div className='flex gap-2'>\n <Input\n {...register(\"email\")}\n placeholder={t(\"Enter email\")}\n />\n <Button type=\"submit\" loading={addingEmailLoading}>\n {t(\"Add\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => {\n setAddingEmail(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n {errors.email && <FormWarningText text={errors.email.message} />}\n </form>\n ) : (\n <div className='flex md:justify-end'>\n <Button variant='secondary' onClick={() => setAddingEmail(true)}>{t(\"Add an email\")}</Button>\n </div>\n )}\n </div>\n\n {contactChannels.length > 0 ? (\n <div className='border rounded-md'>\n <Table>\n <TableBody>\n {/*eslint-disable-next-line @typescript-eslint/no-unnecessary-condition*/}\n {contactChannels.filter(x => x.type === 'email')\n .sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1;\n if (a.isVerified !== b.isVerified) return a.isVerified ? -1 : 1;\n return 0;\n })\n .map(x => (\n <TableRow key={x.id}>\n <TableCell>\n <div className='flex flex-col md:flex-row gap-2 md:gap-4'>\n {x.value}\n <div className='flex gap-2'>\n {x.isPrimary ? <Badge>{t(\"Primary\")}</Badge> : null}\n {!x.isVerified ? <Badge variant='destructive'>{t(\"Unverified\")}</Badge> : null}\n {x.usedForAuth ? <Badge variant='outline'>{t(\"Used for sign-in\")}</Badge> : null}\n </div>\n </div>\n </TableCell>\n <TableCell className=\"flex justify-end\">\n <ActionCell items={[\n ...(!x.isVerified ? [{\n item: t(\"Send verification email\"),\n onClick: async () => { await x.sendVerificationEmail(); },\n }] : []),\n ...(!x.isPrimary && x.isVerified ? [{\n item: t(\"Set as primary\"),\n onClick: async () => { await x.update({ isPrimary: true }); },\n }] :\n !x.isPrimary ? [{\n item: t(\"Set as primary\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"Please verify your email first\"),\n }] : []),\n ...(!x.usedForAuth && x.isVerified ? [{\n item: t(\"Use for sign-in\"),\n onClick: async () => {\n try {\n await x.update({ usedForAuth: true });\n } catch (e) {\n if (KnownErrors.ContactChannelAlreadyUsedForAuthBySomeoneElse.isInstance(e)) {\n alert(t(\"This email is already used for sign-in by another user.\"));\n }\n }\n }\n }] : []),\n ...(x.usedForAuth && !isLastEmailUsedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => { await x.update({ usedForAuth: false }); },\n }] : x.usedForAuth ? [{\n item: t(\"Stop using for sign-in\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }] : []),\n // Determine if this email can be removed\n ...(!isLastEmailUsedForAuth || !x.usedForAuth ? [{\n item: t(\"Remove\"),\n onClick: async () => { await x.delete(); },\n danger: true,\n }] : [{\n item: t(\"Remove\"),\n onClick: async () => {},\n disabled: true,\n disabledTooltip: t(\"You can not remove your last sign-in email\"),\n }]),\n ]}/>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_chunk = require('../../../chunk-BE-pF4vm.js');
|
|
3
|
-
let
|
|
4
|
-
let
|
|
5
|
-
let
|
|
3
|
+
let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
|
|
4
|
+
let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
5
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
6
6
|
let react = require("react");
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
let _________lib_hooks_js = require("../../../lib/hooks.js");
|
|
9
9
|
let _________lib_translations_js = require("../../../lib/translations.js");
|
|
10
10
|
let _oslojs_otp = require("@oslojs/otp");
|
|
11
|
-
let
|
|
12
|
-
let
|
|
11
|
+
let _hexclave_shared_dist_hooks_use_async_callback = require("@hexclave/shared/dist/hooks/use-async-callback");
|
|
12
|
+
let _hexclave_shared_dist_utils_crypto = require("@hexclave/shared/dist/utils/crypto");
|
|
13
13
|
let qrcode = require("qrcode");
|
|
14
14
|
qrcode = require_chunk.__toESM(qrcode);
|
|
15
15
|
let ___section_js = require("../section.js");
|
|
@@ -22,7 +22,7 @@ function MfaSection(props) {
|
|
|
22
22
|
if (props?.mockMode && !user) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___section_js.Section, {
|
|
23
23
|
title: t("Multi-factor authentication"),
|
|
24
24
|
description: t("MFA management is not available in demo mode."),
|
|
25
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
25
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
26
26
|
variant: "secondary",
|
|
27
27
|
children: t("MFA management is not available in demo mode.")
|
|
28
28
|
})
|
|
@@ -33,7 +33,7 @@ function MfaSection(props) {
|
|
|
33
33
|
const [mfaCode, setMfaCode] = (0, react.useState)("");
|
|
34
34
|
const [isMaybeWrong, setIsMaybeWrong] = (0, react.useState)(false);
|
|
35
35
|
const isEnabled = user.isMultiFactorRequired;
|
|
36
|
-
const [handleSubmit, isLoading] = (0,
|
|
36
|
+
const [handleSubmit, isLoading] = (0, _hexclave_shared_dist_hooks_use_async_callback.useAsyncCallback)(async () => {
|
|
37
37
|
await user.update({ totpMultiFactorSecret: generatedSecret });
|
|
38
38
|
setGeneratedSecret(null);
|
|
39
39
|
setQrCodeUrl(null);
|
|
@@ -41,7 +41,7 @@ function MfaSection(props) {
|
|
|
41
41
|
}, [generatedSecret, user]);
|
|
42
42
|
(0, react.useEffect)(() => {
|
|
43
43
|
setIsMaybeWrong(false);
|
|
44
|
-
(0,
|
|
44
|
+
(0, _hexclave_shared_dist_utils_promises.runAsynchronouslyWithAlert)(async () => {
|
|
45
45
|
if (generatedSecret && (0, _oslojs_otp.verifyTOTP)(generatedSecret, 30, 6, mfaCode)) await handleSubmit();
|
|
46
46
|
setIsMaybeWrong(true);
|
|
47
47
|
});
|
|
@@ -56,15 +56,15 @@ function MfaSection(props) {
|
|
|
56
56
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
57
57
|
className: "flex flex-col gap-4",
|
|
58
58
|
children: [!isEnabled && generatedSecret && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
59
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
59
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: t("Scan this QR code with your authenticator app:") }),
|
|
60
60
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
|
|
61
61
|
width: 200,
|
|
62
62
|
height: 200,
|
|
63
|
-
src: qrCodeUrl ?? (0,
|
|
63
|
+
src: qrCodeUrl ?? (0, _hexclave_shared_dist_utils_errors.throwErr)("TOTP QR code failed to generate"),
|
|
64
64
|
alt: t("TOTP multi-factor authentication QR code")
|
|
65
65
|
}),
|
|
66
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
67
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
66
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: t("Then, enter your six-digit MFA code:") }),
|
|
67
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Input, {
|
|
68
68
|
value: mfaCode,
|
|
69
69
|
onChange: (e) => {
|
|
70
70
|
setIsMaybeWrong(false);
|
|
@@ -74,13 +74,13 @@ function MfaSection(props) {
|
|
|
74
74
|
maxLength: 6,
|
|
75
75
|
disabled: isLoading
|
|
76
76
|
}),
|
|
77
|
-
isMaybeWrong && mfaCode.length === 6 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
77
|
+
isMaybeWrong && mfaCode.length === 6 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
78
78
|
variant: "destructive",
|
|
79
79
|
children: t("Incorrect code. Please try again.")
|
|
80
80
|
}),
|
|
81
81
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
82
82
|
className: "flex",
|
|
83
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
83
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
84
84
|
variant: "secondary",
|
|
85
85
|
onClick: () => {
|
|
86
86
|
setGeneratedSecret(null);
|
|
@@ -92,16 +92,16 @@ function MfaSection(props) {
|
|
|
92
92
|
})
|
|
93
93
|
] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
94
94
|
className: "flex gap-2",
|
|
95
|
-
children: isEnabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
95
|
+
children: isEnabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
96
96
|
variant: "secondary",
|
|
97
97
|
onClick: async () => {
|
|
98
98
|
await user.update({ totpMultiFactorSecret: null });
|
|
99
99
|
},
|
|
100
100
|
children: t("Disable MFA")
|
|
101
|
-
}) : !generatedSecret && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
101
|
+
}) : !generatedSecret && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
102
102
|
variant: "secondary",
|
|
103
103
|
onClick: async () => {
|
|
104
|
-
const secret = (0,
|
|
104
|
+
const secret = (0, _hexclave_shared_dist_utils_crypto.generateRandomValues)(new Uint8Array(20));
|
|
105
105
|
setQrCodeUrl(await generateTotpQrCode(project, user, secret));
|
|
106
106
|
setGeneratedSecret(secret);
|
|
107
107
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfa-section.js","names":["Section","Typography","Input","Button","QRCode"],"sources":["../../../../src/components-page/account-settings/email-and-auth/mfa-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { createTOTPKeyURI, verifyTOTP } from \"@oslojs/otp\";\nimport { useAsyncCallback } from '@
|
|
1
|
+
{"version":3,"file":"mfa-section.js","names":["Section","Typography","Input","Button","QRCode"],"sources":["../../../../src/components-page/account-settings/email-and-auth/mfa-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { createTOTPKeyURI, verifyTOTP } from \"@oslojs/otp\";\nimport { useAsyncCallback } from '@hexclave/shared/dist/hooks/use-async-callback';\nimport { generateRandomValues } from '@hexclave/shared/dist/utils/crypto';\nimport { throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport * as QRCode from 'qrcode';\nimport { useEffect, useState } from \"react\";\nimport { CurrentUser, Project } from '../../..';\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function MfaSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const project = useStackApp().useProject();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Multi-factor authentication\")}\n description={t(\"MFA management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"MFA management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const [generatedSecret, setGeneratedSecret] = useState<Uint8Array | null>(null);\n const [qrCodeUrl, setQrCodeUrl] = useState<string | null>(null);\n const [mfaCode, setMfaCode] = useState<string>(\"\");\n const [isMaybeWrong, setIsMaybeWrong] = useState(false);\n const isEnabled = user.isMultiFactorRequired;\n\n const [handleSubmit, isLoading] = useAsyncCallback(async () => {\n await user.update({\n totpMultiFactorSecret: generatedSecret,\n });\n setGeneratedSecret(null);\n setQrCodeUrl(null);\n setMfaCode(\"\");\n }, [generatedSecret, user]);\n\n useEffect(() => {\n setIsMaybeWrong(false);\n runAsynchronouslyWithAlert(async () => {\n if (generatedSecret && verifyTOTP(generatedSecret, 30, 6, mfaCode)) {\n await handleSubmit();\n }\n setIsMaybeWrong(true);\n });\n }, [mfaCode, generatedSecret, handleSubmit]);\n\n return (\n <Section\n title={t(\"Multi-factor authentication\")}\n description={isEnabled\n ? t(\"Multi-factor authentication is currently enabled.\")\n : t(\"Multi-factor authentication is currently disabled.\")}\n >\n <div className='flex flex-col gap-4'>\n {!isEnabled && generatedSecret && (\n <>\n <Typography>{t(\"Scan this QR code with your authenticator app:\")}</Typography>\n <img width={200} height={200} src={qrCodeUrl ?? throwErr(\"TOTP QR code failed to generate\")} alt={t(\"TOTP multi-factor authentication QR code\")} />\n <Typography>{t(\"Then, enter your six-digit MFA code:\")}</Typography>\n <Input\n value={mfaCode}\n onChange={(e) => {\n setIsMaybeWrong(false);\n setMfaCode(e.target.value);\n }}\n placeholder=\"123456\"\n maxLength={6}\n disabled={isLoading}\n />\n {isMaybeWrong && mfaCode.length === 6 && (\n <Typography variant=\"destructive\">{t(\"Incorrect code. Please try again.\")}</Typography>\n )}\n <div className='flex'>\n <Button\n variant='secondary'\n onClick={() => {\n setGeneratedSecret(null);\n setQrCodeUrl(null);\n setMfaCode(\"\");\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </>\n )}\n <div className='flex gap-2'>\n {isEnabled ? (\n <Button\n variant='secondary'\n onClick={async () => {\n await user.update({\n totpMultiFactorSecret: null,\n });\n }}\n >\n {t(\"Disable MFA\")}\n </Button>\n ) : !generatedSecret && (\n <Button\n variant='secondary'\n onClick={async () => {\n const secret = generateRandomValues(new Uint8Array(20));\n setQrCodeUrl(await generateTotpQrCode(project, user, secret));\n setGeneratedSecret(secret);\n }}\n >\n {t(\"Enable MFA\")}\n </Button>\n )}\n </div>\n </div>\n </Section>\n );\n}\n\n\nasync function generateTotpQrCode(project: Project, user: CurrentUser, secret: Uint8Array) {\n const uri = createTOTPKeyURI(project.displayName, user.primaryEmail ?? user.id, secret, 30, 6);\n return await QRCode.toDataURL(uri) as any;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAgB,WAAW,OAExB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,kDAAuB,CAAC,YAAY;CAC1C,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,8BAA8B;EACvC,aAAa,EAAE,gDAAgD;YAE/D,2CAACC;GAAW,SAAQ;aAAa,EAAE,gDAAgD;IAAc;GACzF;AAId,KAAI,CAAC,KACH,QAAO;CAET,MAAM,CAAC,iBAAiB,0CAAkD,KAAK;CAC/E,MAAM,CAAC,WAAW,oCAAwC,KAAK;CAC/D,MAAM,CAAC,SAAS,kCAA+B,GAAG;CAClD,MAAM,CAAC,cAAc,uCAA4B,MAAM;CACvD,MAAM,YAAY,KAAK;CAEvB,MAAM,CAAC,cAAc,kFAA8B,YAAY;AAC7D,QAAM,KAAK,OAAO,EAChB,uBAAuB,iBACxB,CAAC;AACF,qBAAmB,KAAK;AACxB,eAAa,KAAK;AAClB,aAAW,GAAG;IACb,CAAC,iBAAiB,KAAK,CAAC;AAE3B,4BAAgB;AACd,kBAAgB,MAAM;AACtB,uEAA2B,YAAY;AACrC,OAAI,+CAA8B,iBAAiB,IAAI,GAAG,QAAQ,CAChE,OAAM,cAAc;AAEtB,mBAAgB,KAAK;IACrB;IACD;EAAC;EAAS;EAAiB;EAAa,CAAC;AAE5C,QACE,2CAACD;EACC,OAAO,EAAE,8BAA8B;EACvC,aAAa,YACT,EAAE,oDAAoD,GACtD,EAAE,qDAAqD;YAE3D,4CAAC;GAAI,WAAU;cACZ,CAAC,aAAa,mBACb;IACE,2CAACC,qCAAY,EAAE,iDAAiD,GAAc;IAC9E,2CAAC;KAAI,OAAO;KAAK,QAAQ;KAAK,KAAK,8DAAsB,kCAAkC;KAAE,KAAK,EAAE,2CAA2C;MAAI;IACnJ,2CAACA,qCAAY,EAAE,uCAAuC,GAAc;IACpE,2CAACC;KACC,OAAO;KACP,WAAW,MAAM;AACf,sBAAgB,MAAM;AACtB,iBAAW,EAAE,OAAO,MAAM;;KAE5B,aAAY;KACZ,WAAW;KACX,UAAU;MACV;IACD,gBAAgB,QAAQ,WAAW,KAClC,2CAACD;KAAW,SAAQ;eAAe,EAAE,oCAAoC;MAAc;IAEzF,2CAAC;KAAI,WAAU;eACb,2CAACE;MACC,SAAQ;MACR,eAAe;AACb,0BAAmB,KAAK;AACxB,oBAAa,KAAK;AAClB,kBAAW,GAAG;;gBAGf,EAAE,SAAS;OACL;MACL;OACL,EAEL,2CAAC;IAAI,WAAU;cACZ,YACC,2CAACA;KACC,SAAQ;KACR,SAAS,YAAY;AACnB,YAAM,KAAK,OAAO,EAChB,uBAAuB,MACxB,CAAC;;eAGH,EAAE,cAAc;MACV,GACP,CAAC,mBACH,2CAACA;KACC,SAAQ;KACR,SAAS,YAAY;MACnB,MAAM,sEAA8B,IAAI,WAAW,GAAG,CAAC;AACvD,mBAAa,MAAM,mBAAmB,SAAS,MAAM,OAAO,CAAC;AAC7D,yBAAmB,OAAO;;eAG3B,EAAE,aAAa;MACT;KAEP;IACF;GACE;;AAKd,eAAe,mBAAmB,SAAkB,MAAmB,QAAoB;CACzF,MAAM,wCAAuB,QAAQ,aAAa,KAAK,gBAAgB,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC9F,QAAO,MAAMC,OAAO,UAAU,IAAI"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_chunk = require('../../../chunk-BE-pF4vm.js');
|
|
3
|
-
let
|
|
3
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
4
4
|
let react = require("react");
|
|
5
5
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
6
|
let _________lib_hooks_js = require("../../../lib/hooks.js");
|
|
@@ -14,7 +14,7 @@ function OtpSection(props) {
|
|
|
14
14
|
if (props?.mockMode && !user) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___section_js.Section, {
|
|
15
15
|
title: t("One-Time Password"),
|
|
16
16
|
description: t("OTP management is not available in demo mode."),
|
|
17
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
17
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
18
18
|
variant: "secondary",
|
|
19
19
|
children: t("OTP management is not available in demo mode.")
|
|
20
20
|
})
|
|
@@ -35,38 +35,38 @@ function OtpSection(props) {
|
|
|
35
35
|
description: user.otpAuthEnabled ? t("OTP/magic link sign-in is currently enabled.") : t("Enable sign-in via magic link or OTP sent to your sign-in emails."),
|
|
36
36
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
37
37
|
className: "flex md:justify-end",
|
|
38
|
-
children: hasValidEmail ? user.otpAuthEnabled ? !isLastAuth ? !disabling ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
38
|
+
children: hasValidEmail ? user.otpAuthEnabled ? !isLastAuth ? !disabling ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
39
39
|
variant: "secondary",
|
|
40
40
|
onClick: () => setDisabling(true),
|
|
41
41
|
children: t("Disable OTP")
|
|
42
42
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
43
43
|
className: "flex flex-col gap-2",
|
|
44
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
44
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
45
45
|
variant: "destructive",
|
|
46
46
|
children: t("Are you sure you want to disable OTP sign-in? You will not be able to sign in with only emails anymore.")
|
|
47
47
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
48
48
|
className: "flex gap-2",
|
|
49
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
49
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
50
50
|
variant: "destructive",
|
|
51
51
|
onClick: handleDisableOTP,
|
|
52
52
|
children: t("Disable")
|
|
53
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
53
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
54
54
|
variant: "secondary",
|
|
55
55
|
onClick: () => setDisabling(false),
|
|
56
56
|
children: t("Cancel")
|
|
57
57
|
})]
|
|
58
58
|
})]
|
|
59
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
59
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
60
60
|
variant: "secondary",
|
|
61
61
|
type: "label",
|
|
62
62
|
children: t("OTP sign-in is enabled and cannot be disabled as it is currently the only sign-in method")
|
|
63
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
63
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
64
64
|
variant: "secondary",
|
|
65
65
|
onClick: async () => {
|
|
66
66
|
await user.update({ otpAuthEnabled: true });
|
|
67
67
|
},
|
|
68
68
|
children: t("Enable OTP")
|
|
69
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
69
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
70
70
|
variant: "secondary",
|
|
71
71
|
type: "label",
|
|
72
72
|
children: t("To enable OTP sign-in, please add a verified sign-in email.")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otp-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/otp-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Typography } from \"@
|
|
1
|
+
{"version":3,"file":"otp-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/otp-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function OtpSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"One-Time Password\")}\n description={t(\"OTP management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"OTP management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const project = useStackApp().useProject();\n const contactChannels = user.useContactChannels();\n const isLastAuth = user.otpAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.passkeyAuthEnabled;\n const [disabling, setDisabling] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.magicLinkEnabled) {\n return null;\n }\n\n const handleDisableOTP = async () => {\n await user.update({ otpAuthEnabled: false });\n setDisabling(false);\n };\n\n return (\n <Section title={t(\"OTP sign-in\")} description={user.otpAuthEnabled ? t(\"OTP/magic link sign-in is currently enabled.\") : t(\"Enable sign-in via magic link or OTP sent to your sign-in emails.\")}>\n <div className='flex md:justify-end'>\n {hasValidEmail ? (\n user.otpAuthEnabled ? (\n !isLastAuth ? (\n !disabling ? (\n <Button\n variant='secondary'\n onClick={() => setDisabling(true)}\n >\n {t(\"Disable OTP\")}\n </Button>\n ) : (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable OTP sign-in? You will not be able to sign in with only emails anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDisableOTP}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setDisabling(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )\n ) : (\n <Typography variant='secondary' type='label'>{t(\"OTP sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )\n ) : (\n <Button\n variant='secondary'\n onClick={async () => {\n await user.update({ otpAuthEnabled: true });\n }}\n >\n {t(\"Enable OTP\")}\n </Button>\n )\n ) : (\n <Typography variant='secondary' type='label'>{t(\"To enable OTP sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n </div>\n </Section>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAgB,WAAW,OAExB;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,gDAAgD;YAE/D,2CAACC;GAAW,SAAQ;aAAa,EAAE,gDAAgD;IAAc;GACzF;AAId,KAAI,CAAC,KACH,QAAO;CAET,MAAM,kDAAuB,CAAC,YAAY;CAC1C,MAAM,kBAAkB,KAAK,oBAAoB;CACjD,MAAM,aAAa,KAAK,kBAAkB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;CACzG,MAAM,CAAC,WAAW,oCAAyB,MAAM;CAGjD,MAAM,gBAAgB,gBAAgB,QAAO,MAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,SAAS;AAEhH,KAAI,CAAC,QAAQ,OAAO,iBAClB,QAAO;CAGT,MAAM,mBAAmB,YAAY;AACnC,QAAM,KAAK,OAAO,EAAE,gBAAgB,OAAO,CAAC;AAC5C,eAAa,MAAM;;AAGrB,QACE,2CAACD;EAAQ,OAAO,EAAE,cAAc;EAAE,aAAa,KAAK,iBAAiB,EAAE,+CAA+C,GAAG,EAAE,oEAAoE;YAC7L,2CAAC;GAAI,WAAU;aACZ,gBACC,KAAK,iBACH,CAAC,aACC,CAAC,YACC,2CAACE;IACC,SAAQ;IACR,eAAe,aAAa,KAAK;cAEhC,EAAE,cAAc;KACV,GAET,4CAAC;IAAI,WAAU;eACb,2CAACD;KAAW,SAAQ;eACjB,EAAE,0GAA0G;MAClG,EACb,4CAAC;KAAI,WAAU;gBACb,2CAACC;MACC,SAAQ;MACR,SAAS;gBAER,EAAE,UAAU;OACN,EACT,2CAACA;MACC,SAAQ;MACR,eAAe,aAAa,MAAM;gBAEjC,EAAE,SAAS;OACL;MACL;KACF,GAGR,2CAACD;IAAW,SAAQ;IAAY,MAAK;cAAS,EAAE,2FAA2F;KAAc,GAG3J,2CAACC;IACC,SAAQ;IACR,SAAS,YAAY;AACnB,WAAM,KAAK,OAAO,EAAE,gBAAgB,MAAM,CAAC;;cAG5C,EAAE,aAAa;KACT,GAGX,2CAACD;IAAW,SAAQ;IAAY,MAAK;cAAS,EAAE,8DAA8D;KAAc;IAE1H;GACE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_chunk = require('../../../chunk-BE-pF4vm.js');
|
|
3
|
-
let
|
|
3
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
4
4
|
let react = require("react");
|
|
5
5
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
6
|
let _________lib_hooks_js = require("../../../lib/hooks.js");
|
|
@@ -15,7 +15,7 @@ function PasskeySection(props) {
|
|
|
15
15
|
if (props?.mockMode && !user) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___section_js.Section, {
|
|
16
16
|
title: t("Passkey"),
|
|
17
17
|
description: t("Passkey management is not available in demo mode."),
|
|
18
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
18
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
19
19
|
variant: "secondary",
|
|
20
20
|
children: t("Passkey management is not available in demo mode.")
|
|
21
21
|
})
|
|
@@ -41,38 +41,38 @@ function PasskeySection(props) {
|
|
|
41
41
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
42
42
|
className: "flex md:justify-end gap-2",
|
|
43
43
|
children: [
|
|
44
|
-
!hasValidEmail && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
44
|
+
!hasValidEmail && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
45
45
|
variant: "secondary",
|
|
46
46
|
type: "label",
|
|
47
47
|
children: t("To enable Passkey sign-in, please add a verified sign-in email.")
|
|
48
48
|
}),
|
|
49
|
-
hasValidEmail && hasPasskey && isLastAuth && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
49
|
+
hasValidEmail && hasPasskey && isLastAuth && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
50
50
|
variant: "secondary",
|
|
51
51
|
type: "label",
|
|
52
52
|
children: t("Passkey sign-in is enabled and cannot be disabled as it is currently the only sign-in method")
|
|
53
53
|
}),
|
|
54
|
-
!hasPasskey && hasValidEmail && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
54
|
+
!hasPasskey && hasValidEmail && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
55
55
|
onClick: handleAddNewPasskey,
|
|
56
56
|
variant: "secondary",
|
|
57
57
|
children: t("Add new passkey")
|
|
58
58
|
}) }),
|
|
59
|
-
hasValidEmail && hasPasskey && !isLastAuth && !showConfirmationModal && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
59
|
+
hasValidEmail && hasPasskey && !isLastAuth && !showConfirmationModal && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
60
60
|
variant: "secondary",
|
|
61
61
|
onClick: () => setShowConfirmationModal(true),
|
|
62
62
|
children: t("Delete Passkey")
|
|
63
63
|
}),
|
|
64
64
|
hasValidEmail && hasPasskey && !isLastAuth && showConfirmationModal && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
65
65
|
className: "flex flex-col gap-2",
|
|
66
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
66
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
67
67
|
variant: "destructive",
|
|
68
68
|
children: t("Are you sure you want to disable Passkey sign-in? You will not be able to sign in with your passkey anymore.")
|
|
69
69
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
70
70
|
className: "flex gap-2",
|
|
71
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
71
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
72
72
|
variant: "destructive",
|
|
73
73
|
onClick: handleDeletePasskey,
|
|
74
74
|
children: t("Disable")
|
|
75
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
75
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
76
76
|
variant: "secondary",
|
|
77
77
|
onClick: () => setShowConfirmationModal(false),
|
|
78
78
|
children: t("Cancel")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/passkey-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Typography } from \"@
|
|
1
|
+
{"version":3,"file":"passkey-section.js","names":["Section","Typography","Button"],"sources":["../../../../src/components-page/account-settings/email-and-auth/passkey-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Button, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useStackApp } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function PasskeySection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Passkey\")}\n description={t(\"Passkey management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"Passkey management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const stackApp = useStackApp();\n const project = stackApp.useProject();\n const contactChannels = user.useContactChannels();\n\n\n // passkey is enabled if there is a passkey\n const hasPasskey = user.passkeyAuthEnabled;\n\n const isLastAuth = user.passkeyAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.otpAuthEnabled;\n const [showConfirmationModal, setShowConfirmationModal] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.passkeyEnabled) {\n return null;\n }\n\n const handleDeletePasskey = async () => {\n await user.update({ passkeyAuthEnabled: false });\n setShowConfirmationModal(false);\n };\n\n\n const handleAddNewPasskey = async () => {\n await user.registerPasskey();\n };\n\n return (\n <>\n <Section title={t(\"Passkey\")} description={hasPasskey ? t(\"Passkey registered\") : t(\"Register a passkey\")}>\n <div className='flex md:justify-end gap-2'>\n {!hasValidEmail && (\n <Typography variant='secondary' type='label'>{t(\"To enable Passkey sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n {hasValidEmail && hasPasskey && isLastAuth && (\n <Typography variant='secondary' type='label'>{t(\"Passkey sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )}\n {!hasPasskey && hasValidEmail && (\n <div>\n <Button onClick={handleAddNewPasskey} variant='secondary'>{t(\"Add new passkey\")}</Button>\n </div>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && !showConfirmationModal && (\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(true)}\n >\n {t(\"Delete Passkey\")}\n </Button>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && showConfirmationModal && (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable Passkey sign-in? You will not be able to sign in with your passkey anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeletePasskey}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n\n </>\n\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAAe,OAE5B;CACD,MAAM,EAAE,wDAAsB;CAC9B,MAAM,0CAAe,EAAE,IAAI,OAAO,WAAW,gBAAgB,SAAS,CAAC;AAGvE,KAAI,OAAO,YAAY,CAAC,KACtB,QACE,2CAACA;EACC,OAAO,EAAE,UAAU;EACnB,aAAa,EAAE,oDAAoD;YAEnE,2CAACC;GAAW,SAAQ;aAAa,EAAE,oDAAoD;IAAc;GAC7F;AAId,KAAI,CAAC,KACH,QAAO;CAGT,MAAM,8CADwB,CACL,YAAY;CACrC,MAAM,kBAAkB,KAAK,oBAAoB;CAIjD,MAAM,aAAa,KAAK;CAExB,MAAM,aAAa,KAAK,sBAAsB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;CAC7G,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CAGzE,MAAM,gBAAgB,gBAAgB,QAAO,MAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,SAAS;AAEhH,KAAI,CAAC,QAAQ,OAAO,eAClB,QAAO;CAGT,MAAM,sBAAsB,YAAY;AACtC,QAAM,KAAK,OAAO,EAAE,oBAAoB,OAAO,CAAC;AAChD,2BAAyB,MAAM;;CAIjC,MAAM,sBAAsB,YAAY;AACtC,QAAM,KAAK,iBAAiB;;AAG9B,QACE,mFACE,2CAACD;EAAQ,OAAO,EAAE,UAAU;EAAE,aAAa,aAAa,EAAE,qBAAqB,GAAG,EAAE,qBAAqB;YACvG,4CAAC;GAAI,WAAU;;IACZ,CAAC,iBACA,2CAACC;KAAW,SAAQ;KAAY,MAAK;eAAS,EAAE,kEAAkE;MAAc;IAEjI,iBAAiB,cAAc,cAC9B,2CAACA;KAAW,SAAQ;KAAY,MAAK;eAAS,EAAE,+FAA+F;MAAc;IAE9J,CAAC,cAAc,iBACd,2CAAC,mBACC,2CAACC;KAAO,SAAS;KAAqB,SAAQ;eAAa,EAAE,kBAAkB;MAAU,GACrF;IAEP,iBAAiB,cAAc,CAAC,cAAc,CAAC,yBAC9C,2CAACA;KACC,SAAQ;KACR,eAAe,yBAAyB,KAAK;eAE5C,EAAE,iBAAiB;MACb;IAEV,iBAAiB,cAAc,CAAC,cAAc,yBAC7C,4CAAC;KAAI,WAAU;gBACb,2CAACD;MAAW,SAAQ;gBACjB,EAAE,+GAA+G;OACvG,EACb,4CAAC;MAAI,WAAU;iBACb,2CAACC;OACC,SAAQ;OACR,SAAS;iBAER,EAAE,UAAU;QACN,EACT,2CAACA;OACC,SAAQ;OACR,eAAe,yBAAyB,MAAM;iBAE7C,EAAE,SAAS;QACL;OACL;MACF;;IAEJ;GACE,GAGT"}
|