@hexclave/next 1.0.0 → 1.0.1
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.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 +9 -9
- 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.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 +2 -2
- 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.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.d.ts +3 -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 +2 -2
- 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.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.d.ts +3 -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 +213 -213
- 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 +5 -5
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfa.js","names":["KnownErrors","InputOTP","InputOTPGroup","InputOTPSlot","CheckIcon","Typography","Spinner","FormWarningText","Button","MaybeFullPage"],"sources":["../../src/components-page/mfa.tsx"],"sourcesContent":["\"use client\";\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport {\n Button,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n Spinner,\n Typography,\n cn,\n} from \"@stackframe/stack-ui\";\nimport { CheckIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useTranslation } from \"../lib/translations\";\n\nfunction MfaForm({ onSuccess, onCancel }: {\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const stackApp = useStackApp();\n const { t } = useTranslation();\n const [otp, setOtp] = useState<string>(\"\");\n const formRef = useRef<HTMLFormElement>(null);\n\n const [submitting, setSubmitting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [verified, setVerified] = useState<boolean>(false);\n\n const [attemptCode, setAttemptCode] = useState<string | null>(null);\n\n useEffect(() => {\n if (!attemptCode && typeof window !== \"undefined\") {\n // Hexclave rebrand: prefer the new MFA attempt code key, fall back to the legacy key.\n const code = window.sessionStorage.getItem(\"hexclave_mfa_attempt_code\") ?? window.sessionStorage.getItem(\"stack_mfa_attempt_code\");\n if (code) {\n setAttemptCode(code);\n }\n }\n }, [ attemptCode]);\n\n // Handle OTP verification when code is complete\n useEffect(() => {\n if (otp.length === 6 && !submitting) {\n // Blur any focused inputs\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n if (formRef.current) {\n const inputs = formRef.current.querySelectorAll('input');\n for (const input of inputs) {\n input.blur();\n }\n }\n\n setSubmitting(true);\n setError(null);\n\n if (attemptCode) {\n stackApp\n .signInWithMfa(otp, attemptCode, { noRedirect: true })\n .then(async (result) => {\n if (result.status === \"ok\") {\n setVerified(true);\n\n // Cleanup session storage\n if (typeof window !== \"undefined\") {\n // Hexclave rebrand: remove both the new and legacy MFA attempt code keys.\n window.sessionStorage.removeItem(\"hexclave_mfa_attempt_code\");\n window.sessionStorage.removeItem(\"stack_mfa_attempt_code\");\n }\n\n if (onSuccess) {\n onSuccess();\n } else {\n await stackApp.redirectToAfterSignIn();\n }\n } else {\n throw result.error;\n }\n })\n .catch((e) => {\n if (e instanceof KnownErrors.InvalidTotpCode) {\n setError(t(\"Invalid TOTP code\"));\n } else {\n setError(t(\"Verification failed\"));\n }\n })\n .finally(() => {\n setSubmitting(false);\n if (!verified) {\n setOtp(\"\");\n }\n });\n } else {\n setSubmitting(false);\n setError(t(\"Missing verification information\"));\n }\n }\n\n // Clear error when user is typing\n if (otp.length !== 0 && otp.length !== 6) {\n setError(null);\n }\n }, [otp, submitting, onSuccess, attemptCode, stackApp, t, verified]);\n\n\n const inputStyleClass = useMemo(() => {\n if (verified) {\n return \"opacity-85 transition-all duration-300\";\n }\n\n if (error) {\n return \"ring-red-500 border-red-500\";\n }\n\n return \"focus:ring-primary/50\";\n }, [error, verified]);\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <form ref={formRef} className=\"w-full flex flex-col items-center gap-4\">\n <InputOTP\n maxLength={6}\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"······\"\n value={otp}\n onChange={(value) => setOtp(value.toUpperCase())}\n disabled={submitting || verified}\n >\n <InputOTPGroup>\n {[0, 1, 2, 3, 4, 5].map((index) => (\n <InputOTPSlot\n key={index}\n index={index}\n size=\"lg\"\n className={cn(\n \"border focus:ring-2 transition-all\",\n inputStyleClass,\n )}\n />\n ))}\n </InputOTPGroup>\n </InputOTP>\n\n {/* Verification Status */}\n <div className=\"h-8 flex flex-col gap-4 items-center justify-center w-full\">\n {verified ? (\n <div className=\"flex items-center gap-2 animate-in fade-in duration-300 slide-in-from-bottom-2\">\n <CheckIcon className=\"w-5 h-5 text-green-600 animate-in zoom-in duration-300\" />\n <Typography className=\"text-sm font-medium\">{t(\"Verified! Redirecting...\")}</Typography>\n </div>\n ) : submitting ? (\n <div className=\"flex items-center gap-2\">\n <Spinner className=\"text-primary h-4 w-4\" />\n <Typography className=\"text-sm\">{t(\"Verifying...\")}</Typography>\n </div>\n ) : null}\n\n {/* Error reporting */}\n {error !== null && !submitting && !verified ? <FormWarningText text={error} /> : null}\n </div>\n </form>\n\n {/* Cancel Button */}\n {onCancel && !verified && (\n <Button\n variant=\"link\"\n onClick={onCancel}\n className=\"underline mt-4 self-center\"\n disabled={submitting || verified}\n >\n {t(\"Cancel\")}\n </Button>\n )}\n </div>\n );\n}\n\nexport function MFA(props: {\n fullPage?: boolean,\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const { t } = useTranslation();\n\n const headerText = t(\"Multi-Factor Authentication\");\n const instructionText = t(\"Enter the six-digit code from your authenticator app\");\n\n if (props.fullPage) {\n return (\n <MaybeFullPage fullPage={true}>\n <div\n className=\"stack-scope flex flex-col items-stretch\"\n style={{ maxWidth: \"380px\", flexBasis: \"380px\", padding: \"1rem\" }}\n >\n <div className=\"text-center mb-6\">\n <Typography type=\"h2\">{headerText}</Typography>\n <Typography className=\"mt-2\">{instructionText}</Typography>\n </div>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n </MaybeFullPage>\n );\n }\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <Typography className=\"mb-4 text-center\">{instructionText}</Typography>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mfa.js","names":["KnownErrors","InputOTP","InputOTPGroup","InputOTPSlot","CheckIcon","Typography","Spinner","FormWarningText","Button","MaybeFullPage"],"sources":["../../src/components-page/mfa.tsx"],"sourcesContent":["\"use client\";\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownErrors } from \"@hexclave/shared\";\nimport {\n Button,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n Spinner,\n Typography,\n cn,\n} from \"@hexclave/ui\";\nimport { CheckIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useTranslation } from \"../lib/translations\";\n\nfunction MfaForm({ onSuccess, onCancel }: {\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const stackApp = useStackApp();\n const { t } = useTranslation();\n const [otp, setOtp] = useState<string>(\"\");\n const formRef = useRef<HTMLFormElement>(null);\n\n const [submitting, setSubmitting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [verified, setVerified] = useState<boolean>(false);\n\n const [attemptCode, setAttemptCode] = useState<string | null>(null);\n\n useEffect(() => {\n if (!attemptCode && typeof window !== \"undefined\") {\n // Hexclave rebrand: prefer the new MFA attempt code key, fall back to the legacy key.\n const code = window.sessionStorage.getItem(\"hexclave_mfa_attempt_code\") ?? window.sessionStorage.getItem(\"stack_mfa_attempt_code\");\n if (code) {\n setAttemptCode(code);\n }\n }\n }, [ attemptCode]);\n\n // Handle OTP verification when code is complete\n useEffect(() => {\n if (otp.length === 6 && !submitting) {\n // Blur any focused inputs\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n if (formRef.current) {\n const inputs = formRef.current.querySelectorAll('input');\n for (const input of inputs) {\n input.blur();\n }\n }\n\n setSubmitting(true);\n setError(null);\n\n if (attemptCode) {\n stackApp\n .signInWithMfa(otp, attemptCode, { noRedirect: true })\n .then(async (result) => {\n if (result.status === \"ok\") {\n setVerified(true);\n\n // Cleanup session storage\n if (typeof window !== \"undefined\") {\n // Hexclave rebrand: remove both the new and legacy MFA attempt code keys.\n window.sessionStorage.removeItem(\"hexclave_mfa_attempt_code\");\n window.sessionStorage.removeItem(\"stack_mfa_attempt_code\");\n }\n\n if (onSuccess) {\n onSuccess();\n } else {\n await stackApp.redirectToAfterSignIn();\n }\n } else {\n throw result.error;\n }\n })\n .catch((e) => {\n if (e instanceof KnownErrors.InvalidTotpCode) {\n setError(t(\"Invalid TOTP code\"));\n } else {\n setError(t(\"Verification failed\"));\n }\n })\n .finally(() => {\n setSubmitting(false);\n if (!verified) {\n setOtp(\"\");\n }\n });\n } else {\n setSubmitting(false);\n setError(t(\"Missing verification information\"));\n }\n }\n\n // Clear error when user is typing\n if (otp.length !== 0 && otp.length !== 6) {\n setError(null);\n }\n }, [otp, submitting, onSuccess, attemptCode, stackApp, t, verified]);\n\n\n const inputStyleClass = useMemo(() => {\n if (verified) {\n return \"opacity-85 transition-all duration-300\";\n }\n\n if (error) {\n return \"ring-red-500 border-red-500\";\n }\n\n return \"focus:ring-primary/50\";\n }, [error, verified]);\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <form ref={formRef} className=\"w-full flex flex-col items-center gap-4\">\n <InputOTP\n maxLength={6}\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"······\"\n value={otp}\n onChange={(value) => setOtp(value.toUpperCase())}\n disabled={submitting || verified}\n >\n <InputOTPGroup>\n {[0, 1, 2, 3, 4, 5].map((index) => (\n <InputOTPSlot\n key={index}\n index={index}\n size=\"lg\"\n className={cn(\n \"border focus:ring-2 transition-all\",\n inputStyleClass,\n )}\n />\n ))}\n </InputOTPGroup>\n </InputOTP>\n\n {/* Verification Status */}\n <div className=\"h-8 flex flex-col gap-4 items-center justify-center w-full\">\n {verified ? (\n <div className=\"flex items-center gap-2 animate-in fade-in duration-300 slide-in-from-bottom-2\">\n <CheckIcon className=\"w-5 h-5 text-green-600 animate-in zoom-in duration-300\" />\n <Typography className=\"text-sm font-medium\">{t(\"Verified! Redirecting...\")}</Typography>\n </div>\n ) : submitting ? (\n <div className=\"flex items-center gap-2\">\n <Spinner className=\"text-primary h-4 w-4\" />\n <Typography className=\"text-sm\">{t(\"Verifying...\")}</Typography>\n </div>\n ) : null}\n\n {/* Error reporting */}\n {error !== null && !submitting && !verified ? <FormWarningText text={error} /> : null}\n </div>\n </form>\n\n {/* Cancel Button */}\n {onCancel && !verified && (\n <Button\n variant=\"link\"\n onClick={onCancel}\n className=\"underline mt-4 self-center\"\n disabled={submitting || verified}\n >\n {t(\"Cancel\")}\n </Button>\n )}\n </div>\n );\n}\n\nexport function MFA(props: {\n fullPage?: boolean,\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const { t } = useTranslation();\n\n const headerText = t(\"Multi-Factor Authentication\");\n const instructionText = t(\"Enter the six-digit code from your authenticator app\");\n\n if (props.fullPage) {\n return (\n <MaybeFullPage fullPage={true}>\n <div\n className=\"stack-scope flex flex-col items-stretch\"\n style={{ maxWidth: \"380px\", flexBasis: \"380px\", padding: \"1rem\" }}\n >\n <div className=\"text-center mb-6\">\n <Typography type=\"h2\">{headerText}</Typography>\n <Typography className=\"mt-2\">{instructionText}</Typography>\n </div>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n </MaybeFullPage>\n );\n }\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <Typography className=\"mb-4 text-center\">{instructionText}</Typography>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
-
let
|
|
6
|
-
let
|
|
7
|
-
let
|
|
5
|
+
let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
|
|
6
|
+
let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
7
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
8
8
|
let react = require("react");
|
|
9
9
|
let ___index_js = require("../index.js");
|
|
10
10
|
let ___lib_translations_js = require("../lib/translations.js");
|
|
11
11
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
12
|
-
let
|
|
12
|
+
let _hexclave_shared = require("@hexclave/shared");
|
|
13
13
|
let ___components_elements_maybe_full_page_js = require("../components/elements/maybe-full-page.js");
|
|
14
14
|
let ___components_link_js = require("../components/link.js");
|
|
15
15
|
let ___lib_stack_app_index_js = require("../lib/stack-app/index.js");
|
|
@@ -21,7 +21,7 @@ function OAuthCallback({ fullPage }) {
|
|
|
21
21
|
const called = (0, react.useRef)(false);
|
|
22
22
|
const [showRedirectLink, setShowRedirectLink] = (0, react.useState)(false);
|
|
23
23
|
const [redirectUrl, setRedirectUrl] = (0, react.useState)(null);
|
|
24
|
-
(0, react.useEffect)(() => (0,
|
|
24
|
+
(0, react.useEffect)(() => (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(async () => {
|
|
25
25
|
if (called.current) return;
|
|
26
26
|
called.current = true;
|
|
27
27
|
const redirectToError = async (url) => {
|
|
@@ -35,7 +35,7 @@ function OAuthCallback({ fullPage }) {
|
|
|
35
35
|
try {
|
|
36
36
|
if (!await app.callOAuthCallback()) await app.redirectToSignIn({ noRedirectBack: true });
|
|
37
37
|
} catch (e) {
|
|
38
|
-
if (
|
|
38
|
+
if (_hexclave_shared.KnownError.isKnownError(e)) {
|
|
39
39
|
const errorUrl = new URL(app.urls.error, window.location.href);
|
|
40
40
|
errorUrl.searchParams.set("errorCode", e.errorCode);
|
|
41
41
|
errorUrl.searchParams.set("message", e.message);
|
|
@@ -43,7 +43,7 @@ function OAuthCallback({ fullPage }) {
|
|
|
43
43
|
await redirectToError(errorUrl);
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
|
-
(0,
|
|
46
|
+
(0, _hexclave_shared_dist_utils_errors.captureError)("<OAuthCallback />", e);
|
|
47
47
|
await redirectToError(new URL(app.urls.error, window.location.href));
|
|
48
48
|
}
|
|
49
49
|
}), [app]);
|
|
@@ -54,10 +54,10 @@ function OAuthCallback({ fullPage }) {
|
|
|
54
54
|
fullPage: fullPage ?? false,
|
|
55
55
|
containerClassName: "flex items-center justify-center",
|
|
56
56
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
57
|
-
className: (0,
|
|
57
|
+
className: (0, _hexclave_ui.cn)("text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]", fullPage ? "p-4" : "p-0"),
|
|
58
58
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
59
59
|
className: "flex flex-col justify-center items-center gap-4",
|
|
60
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
60
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Spinner, { size: 20 })
|
|
61
61
|
}), showRedirectLink || redirectUrl != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", { children: [t("If you are not redirected automatically, "), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_link_js.StyledLink, {
|
|
62
62
|
className: "whitespace-nowrap",
|
|
63
63
|
href: redirectUrl ?? app.urls.home,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-callback.js","names":["stackAppInternalsSymbol","KnownError","MaybeFullPage","Spinner","StyledLink"],"sources":["../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownError } from \"@
|
|
1
|
+
{"version":3,"file":"oauth-callback.js","names":["stackAppInternalsSymbol","KnownError","MaybeFullPage","Spinner","StyledLink"],"sources":["../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownError } from \"@hexclave/shared\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Spinner, cn } from \"@hexclave/ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { StyledLink } from \"../components/link\";\nimport { stackAppInternalsSymbol } from \"../lib/stack-app\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback({ fullPage }: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n const [redirectUrl, setRedirectUrl] = useState<string | null>(null);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n const redirectToError = async (url: URL) => {\n const urlString = url.toString();\n if (app[stackAppInternalsSymbol].getRedirectMethod() === \"none\") {\n setRedirectUrl(urlString);\n return;\n }\n await app[stackAppInternalsSymbol].redirectToUrl(urlString, { replace: true });\n };\n try {\n const hasRedirected = await app.callOAuthCallback();\n if (!hasRedirected) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n const errorUrl = new URL(app.urls.error, window.location.href);\n errorUrl.searchParams.set(\"errorCode\", e.errorCode);\n errorUrl.searchParams.set(\"message\", e.message);\n errorUrl.searchParams.set(\"details\", JSON.stringify(e.details ?? {}));\n await redirectToError(errorUrl);\n return;\n }\n captureError(\"<OAuthCallback />\", e);\n await redirectToError(new URL(app.urls.error, window.location.href));\n }\n }), [app]);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return (\n <MaybeFullPage\n fullPage={fullPage ?? false}\n containerClassName=\"flex items-center justify-center\"\n >\n <div\n className={cn(\n \"text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]\",\n fullPage ? \"p-4\" : \"p-0\"\n )}\n >\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Spinner size={20} />\n </div>\n {showRedirectLink || redirectUrl != null ? <p>{t('If you are not redirected automatically, ')}<StyledLink className=\"whitespace-nowrap\" href={redirectUrl ?? app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAgB,cAAc,EAAE,YAAoC;CAClE,MAAM,EAAE,kDAAsB;CAC9B,MAAM,oCAAmB;CACzB,MAAM,2BAAgB,MAAM;CAC5B,MAAM,CAAC,kBAAkB,2CAAgC,MAAM;CAC/D,MAAM,CAAC,aAAa,sCAA0C,KAAK;AAEnE,wFAAkC,YAAY;AAC5C,MAAI,OAAO,QAAS;AACpB,SAAO,UAAU;EACjB,MAAM,kBAAkB,OAAO,QAAa;GAC1C,MAAM,YAAY,IAAI,UAAU;AAChC,OAAI,IAAIA,mDAAyB,mBAAmB,KAAK,QAAQ;AAC/D,mBAAe,UAAU;AACzB;;AAEF,SAAM,IAAIA,mDAAyB,cAAc,WAAW,EAAE,SAAS,MAAM,CAAC;;AAEhF,MAAI;AAEF,OAAI,CADkB,MAAM,IAAI,mBAAmB,CAEjD,OAAM,IAAI,iBAAiB,EAAE,gBAAgB,MAAM,CAAC;WAE/C,GAAG;AACV,OAAIC,4BAAW,aAAa,EAAE,EAAE;IAC9B,MAAM,WAAW,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK;AAC9D,aAAS,aAAa,IAAI,aAAa,EAAE,UAAU;AACnD,aAAS,aAAa,IAAI,WAAW,EAAE,QAAQ;AAC/C,aAAS,aAAa,IAAI,WAAW,KAAK,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AACrE,UAAM,gBAAgB,SAAS;AAC/B;;AAEF,wDAAa,qBAAqB,EAAE;AACpC,SAAM,gBAAgB,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK,CAAC;;GAEtE,EAAE,CAAC,IAAI,CAAC;AAEV,4BAAgB;AACd,mBAAiB,oBAAoB,KAAK,EAAE,IAAK;IAChD,EAAE,CAAC;AAEN,QACE,2CAACC;EACC,UAAU,YAAY;EACtB,oBAAmB;YAEnB,4CAAC;GACC,gCACE,yFACA,WAAW,QAAQ,MACpB;cAED,2CAAC;IAAI,WAAU;cACb,2CAACC,wBAAQ,MAAM,KAAM;KACjB,EACL,oBAAoB,eAAe,OAAO,4CAAC,kBAAG,EAAE,4CAA4C,EAAC,2CAACC;IAAW,WAAU;IAAoB,MAAM,eAAe,IAAI,KAAK;cAAO,EAAE,aAAa;KAAc,IAAI,GAAG;IAC7M;GACQ"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
5
|
let _hookform_resolvers_yup = require("@hookform/resolvers/yup");
|
|
6
|
-
let
|
|
7
|
-
let
|
|
8
|
-
let
|
|
6
|
+
let _hexclave_shared_dist_schema_fields = require("@hexclave/shared/dist/schema-fields");
|
|
7
|
+
let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
8
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
9
9
|
let react = require("react");
|
|
10
10
|
let react_hook_form = require("react-hook-form");
|
|
11
11
|
let ___index_js = require("../index.js");
|
|
@@ -23,11 +23,11 @@ function Onboarding(props) {
|
|
|
23
23
|
includeRestricted: true
|
|
24
24
|
});
|
|
25
25
|
if (user && !user.isRestricted) {
|
|
26
|
-
(0,
|
|
26
|
+
(0, _hexclave_shared_dist_utils_promises.runAsynchronously)(stackApp.redirectToAfterSignIn());
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
29
|
if (!user || user.isAnonymous) {
|
|
30
|
-
(0,
|
|
30
|
+
(0, _hexclave_shared_dist_utils_promises.runAsynchronously)(stackApp.redirectToSignIn());
|
|
31
31
|
return null;
|
|
32
32
|
}
|
|
33
33
|
if (user.restrictedReason?.type === "email_not_verified") {
|
|
@@ -56,7 +56,7 @@ function AddEmailForm(props) {
|
|
|
56
56
|
});
|
|
57
57
|
(0, ___index_js.useStackApp)();
|
|
58
58
|
const [loading, setLoading] = (0, react.useState)(false);
|
|
59
|
-
const { register, handleSubmit, formState: { errors } } = (0, react_hook_form.useForm)({ resolver: (0, _hookform_resolvers_yup.yupResolver)((0,
|
|
59
|
+
const { register, handleSubmit, formState: { errors } } = (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")).defined().nonEmpty(t("Email is required")) })) });
|
|
60
60
|
const onSubmit = async (data) => {
|
|
61
61
|
setLoading(true);
|
|
62
62
|
try {
|
|
@@ -73,21 +73,21 @@ function AddEmailForm(props) {
|
|
|
73
73
|
secondaryAction: async () => {
|
|
74
74
|
await user.signOut();
|
|
75
75
|
},
|
|
76
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
76
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
77
77
|
className: "mb-4",
|
|
78
78
|
children: t("Please add an email address to complete your account setup. We'll send you a verification email.")
|
|
79
79
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
|
|
80
|
-
onSubmit: (e) => (0,
|
|
80
|
+
onSubmit: (e) => (0, _hexclave_shared_dist_utils_promises.runAsynchronouslyWithAlert)(handleSubmit(onSubmit)(e)),
|
|
81
81
|
noValidate: true,
|
|
82
82
|
className: "flex flex-col gap-2",
|
|
83
83
|
children: [
|
|
84
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
84
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Input, {
|
|
85
85
|
...register("email"),
|
|
86
86
|
placeholder: t("Enter your email"),
|
|
87
87
|
type: "email"
|
|
88
88
|
}),
|
|
89
89
|
errors.email && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_elements_form_warning_js.FormWarningText, { text: errors.email.message }),
|
|
90
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
90
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
91
91
|
type: "submit",
|
|
92
92
|
loading,
|
|
93
93
|
className: "w-full",
|
|
@@ -116,7 +116,7 @@ function VerifyEmailScreen(props) {
|
|
|
116
116
|
secondaryAction: async () => {
|
|
117
117
|
await user.signOut();
|
|
118
118
|
},
|
|
119
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(
|
|
119
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.Typography, { children: [
|
|
120
120
|
t("Please verify your email address "),
|
|
121
121
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
122
122
|
className: "font-semibold",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","names":["MessageCard","Typography","Input","FormWarningText","Button"],"sources":["../../src/components-page/onboarding.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { strictEmailSchema, yupObject } from \"@
|
|
1
|
+
{"version":3,"file":"onboarding.js","names":["MessageCard","Typography","Input","FormWarningText","Button"],"sources":["../../src/components-page/onboarding.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously, runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { useStackApp, useUser } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function Onboarding(props: {\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser({ or: \"return-null\", includeRestricted: true });\n\n // If user is not restricted anymore, redirect to the intended destination\n // redirectToAfterSignIn automatically checks for after_auth_return_to in the URL\n if (user && !user.isRestricted) {\n runAsynchronously(stackApp.redirectToAfterSignIn());\n // TODO: This should return a loading indicator, not just null\n return null;\n }\n\n // If user is anonymous or not logged in, redirect to sign-in\n if (!user || user.isAnonymous) {\n runAsynchronously(stackApp.redirectToSignIn());\n // TODO: This should return a loading indicator, not just null\n return null;\n }\n\n // User is restricted - show appropriate onboarding step based on restricted reason\n const restrictedReason = user.restrictedReason;\n\n if (restrictedReason?.type === \"email_not_verified\") {\n // Check if user has a primary email\n const hasPrimaryEmail = !!user.primaryEmail;\n\n if (!hasPrimaryEmail) {\n // User needs to add an email first\n return <AddEmailForm fullPage={props.fullPage} />;\n }\n\n // User has email but it's not verified\n return <VerifyEmailScreen user={user} email={user.primaryEmail} fullPage={props.fullPage} />;\n }\n\n // Unknown restricted reason - show generic message\n return (\n <MessageCard\n title={t(\"Complete your account setup\")}\n fullPage={!!props.fullPage}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <p>{t(\"You have not yet completed your account setup. Please reach out to support if you believe this is an error.\")}</p>\n </MessageCard>\n );\n}\n\nfunction AddEmailForm(props: {\n fullPage?: boolean,\n onEmailAdded?: () => void,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: \"throw\", includeRestricted: true });\n const stackApp = useStackApp();\n const [loading, setLoading] = useState(false);\n\n const emailSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address'))\n .defined()\n .nonEmpty(t('Email is required')),\n });\n\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(emailSchema)\n });\n\n const onSubmit = async (data: yup.InferType<typeof emailSchema>) => {\n setLoading(true);\n try {\n await user.update({ primaryEmail: data.email });\n props.onEmailAdded?.();\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <MessageCard\n title={t(\"Add your email address\")}\n fullPage={!!props.fullPage}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <Typography className=\"mb-4\">\n {t(\"Please add an email address to complete your account setup. We'll send you a verification email.\")}\n </Typography>\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n className='flex flex-col gap-2'\n >\n <Input\n {...register(\"email\")}\n placeholder={t(\"Enter your email\")}\n type=\"email\"\n />\n {errors.email && <FormWarningText text={errors.email.message} />}\n <Button type=\"submit\" loading={loading} className=\"w-full\">\n {t(\"Continue\")}\n </Button>\n </form>\n </MessageCard>\n );\n}\n\nfunction VerifyEmailScreen(props: {\n user: NonNullable<ReturnType<typeof useUser>>,\n email: string,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const { user, email } = props;\n const [changingEmail, setChangingEmail] = useState(false);\n\n if (changingEmail) {\n return <AddEmailForm fullPage={props.fullPage} onEmailAdded={() => setChangingEmail(false)} />;\n }\n\n return (\n <MessageCard\n title={t(\"Please check your email inbox\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Resend verification email\")}\n primaryAction={async () => {\n await user.sendVerificationEmail();\n }}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <Typography>\n {t(\"Please verify your email address \")}\n <span className=\"font-semibold\">{email}</span>\n {\" (\"}\n <button\n type=\"button\"\n className=\"text-primary hover:underline\"\n onClick={() => setChangingEmail(true)}\n >\n {t(\"change\")}\n </button>\n {\"). \"}\n {t(\"Click the button below to resend the verification link.\")}\n </Typography>\n </MessageCard>\n );\n}\n\n"],"mappings":"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"}
|
|
@@ -3,38 +3,38 @@
|
|
|
3
3
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
4
|
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
5
|
let _hookform_resolvers_yup = require("@hookform/resolvers/yup");
|
|
6
|
-
let
|
|
7
|
-
let
|
|
8
|
-
let
|
|
6
|
+
let _hexclave_shared_dist_schema_fields = require("@hexclave/shared/dist/schema-fields");
|
|
7
|
+
let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
8
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
9
9
|
let react = require("react");
|
|
10
10
|
let react_hook_form = require("react-hook-form");
|
|
11
11
|
let ___index_js = require("../index.js");
|
|
12
12
|
let ___components_elements_form_warning_js = require("../components/elements/form-warning.js");
|
|
13
13
|
let ___lib_translations_js = require("../lib/translations.js");
|
|
14
14
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
15
|
-
let
|
|
15
|
+
let _hexclave_shared_dist_helpers_password = require("@hexclave/shared/dist/helpers/password");
|
|
16
16
|
let yup = require("yup");
|
|
17
17
|
yup = require_chunk.__toESM(yup);
|
|
18
|
-
let
|
|
18
|
+
let _hexclave_shared = require("@hexclave/shared");
|
|
19
19
|
let ___components_elements_maybe_full_page_js = require("../components/elements/maybe-full-page.js");
|
|
20
20
|
let ___components_message_cards_predefined_message_card_js = require("../components/message-cards/predefined-message-card.js");
|
|
21
21
|
let ___components_message_cards_message_card_js = require("../components/message-cards/message-card.js");
|
|
22
|
-
let
|
|
23
|
-
let
|
|
22
|
+
let _hexclave_shared_dist_utils_caches = require("@hexclave/shared/dist/utils/caches");
|
|
23
|
+
let _hexclave_shared_dist_utils_react = require("@hexclave/shared/dist/utils/react");
|
|
24
24
|
|
|
25
25
|
//#region src/components-page/password-reset.tsx
|
|
26
26
|
function PasswordResetForm(props) {
|
|
27
27
|
const { t } = (0, ___lib_translations_js.useTranslation)();
|
|
28
|
-
const { register, handleSubmit, formState: { errors }, clearErrors } = (0, react_hook_form.useForm)({ resolver: (0, _hookform_resolvers_yup.yupResolver)((0,
|
|
29
|
-
password:
|
|
28
|
+
const { register, handleSubmit, formState: { errors }, clearErrors } = (0, react_hook_form.useForm)({ resolver: (0, _hookform_resolvers_yup.yupResolver)((0, _hexclave_shared_dist_schema_fields.yupObject)({
|
|
29
|
+
password: _hexclave_shared_dist_schema_fields.passwordSchema.defined(t("Please enter your password")).nonEmpty(t("Please enter your password")).test({
|
|
30
30
|
name: "is-valid-password",
|
|
31
31
|
test: (value, ctx) => {
|
|
32
|
-
const error = (0,
|
|
32
|
+
const error = (0, _hexclave_shared_dist_helpers_password.getPasswordError)(value);
|
|
33
33
|
if (error) return ctx.createError({ message: error.message });
|
|
34
34
|
else return true;
|
|
35
35
|
}
|
|
36
36
|
}),
|
|
37
|
-
passwordRepeat: (0,
|
|
37
|
+
passwordRepeat: (0, _hexclave_shared_dist_schema_fields.yupString)().nullable().oneOf([yup.ref("password"), null], t("Passwords do not match")).defined().nonEmpty(t("Please repeat your password"))
|
|
38
38
|
})) });
|
|
39
39
|
const stackApp = (0, ___index_js.useStackApp)();
|
|
40
40
|
const [finished, setFinished] = (0, react.useState)(false);
|
|
@@ -68,24 +68,24 @@ function PasswordResetForm(props) {
|
|
|
68
68
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_elements_maybe_full_page_js.MaybeFullPage, {
|
|
69
69
|
fullPage: !!props.fullPage,
|
|
70
70
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
71
|
-
className: (0,
|
|
71
|
+
className: (0, _hexclave_ui.cn)("flex flex-col items-stretch max-w-[380px] flex-basis-[380px]", props.fullPage ? "p-4" : "p-0"),
|
|
72
72
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
73
73
|
className: "text-center mb-6",
|
|
74
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
74
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
75
75
|
type: "h2",
|
|
76
76
|
children: t("Reset Your Password")
|
|
77
77
|
})
|
|
78
78
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
|
|
79
79
|
className: "flex flex-col items-stretch",
|
|
80
|
-
onSubmit: (e) => (0,
|
|
80
|
+
onSubmit: (e) => (0, _hexclave_shared_dist_utils_promises.runAsynchronouslyWithAlert)(handleSubmit(onSubmit)(e)),
|
|
81
81
|
noValidate: true,
|
|
82
82
|
children: [
|
|
83
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
83
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Label, {
|
|
84
84
|
htmlFor: "password",
|
|
85
85
|
className: "mb-1",
|
|
86
86
|
children: t("New Password")
|
|
87
87
|
}),
|
|
88
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
88
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.PasswordInput, {
|
|
89
89
|
id: "password",
|
|
90
90
|
autoComplete: "new-password",
|
|
91
91
|
...register("password"),
|
|
@@ -95,12 +95,12 @@ function PasswordResetForm(props) {
|
|
|
95
95
|
}
|
|
96
96
|
}),
|
|
97
97
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_elements_form_warning_js.FormWarningText, { text: errors.password?.message?.toString() }),
|
|
98
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
98
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Label, {
|
|
99
99
|
htmlFor: "repeat-password",
|
|
100
100
|
className: "mt-4 mb-1",
|
|
101
101
|
children: t("Repeat New Password")
|
|
102
102
|
}),
|
|
103
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
103
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.PasswordInput, {
|
|
104
104
|
id: "repeat-password",
|
|
105
105
|
autoComplete: "new-password",
|
|
106
106
|
...register("passwordRepeat"),
|
|
@@ -110,7 +110,7 @@ function PasswordResetForm(props) {
|
|
|
110
110
|
}
|
|
111
111
|
}),
|
|
112
112
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_elements_form_warning_js.FormWarningText, { text: errors.passwordRepeat?.message?.toString() }),
|
|
113
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
113
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
114
114
|
type: "submit",
|
|
115
115
|
className: "mt-6",
|
|
116
116
|
loading,
|
|
@@ -121,7 +121,7 @@ function PasswordResetForm(props) {
|
|
|
121
121
|
})
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
|
-
const cachedVerifyPasswordResetCode = (0,
|
|
124
|
+
const cachedVerifyPasswordResetCode = (0, _hexclave_shared_dist_utils_caches.cacheFunction)(async (stackApp, code) => {
|
|
125
125
|
return await stackApp.verifyPasswordResetCode(code);
|
|
126
126
|
});
|
|
127
127
|
function PasswordReset({ searchParams, fullPage = false }) {
|
|
@@ -130,24 +130,24 @@ function PasswordReset({ searchParams, fullPage = false }) {
|
|
|
130
130
|
const invalidJsx = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_message_card_js.MessageCard, {
|
|
131
131
|
title: t("Invalid Password Reset Link"),
|
|
132
132
|
fullPage,
|
|
133
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
133
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: t("Please double check if you have the correct password reset link.") })
|
|
134
134
|
});
|
|
135
135
|
const expiredJsx = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_message_card_js.MessageCard, {
|
|
136
136
|
title: t("Expired Password Reset Link"),
|
|
137
137
|
fullPage,
|
|
138
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
138
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: t("Your password reset link has expired. Please request a new password reset link from the login page.") })
|
|
139
139
|
});
|
|
140
140
|
const usedJsx = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_message_card_js.MessageCard, {
|
|
141
141
|
title: t("Used Password Reset Link"),
|
|
142
142
|
fullPage,
|
|
143
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
143
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: t("This password reset link has already been used. If you need to reset your password again, please request a new password reset link from the login page.") })
|
|
144
144
|
});
|
|
145
145
|
const code = searchParams.code;
|
|
146
146
|
if (!code) return invalidJsx;
|
|
147
|
-
const result = (0,
|
|
148
|
-
if (result.status === "error") if (
|
|
149
|
-
else if (
|
|
150
|
-
else if (
|
|
147
|
+
const result = (0, _hexclave_shared_dist_utils_react.use)(cachedVerifyPasswordResetCode(stackApp, code));
|
|
148
|
+
if (result.status === "error") if (_hexclave_shared.KnownErrors.VerificationCodeNotFound.isInstance(result.error)) return invalidJsx;
|
|
149
|
+
else if (_hexclave_shared.KnownErrors.VerificationCodeExpired.isInstance(result.error)) return expiredJsx;
|
|
150
|
+
else if (_hexclave_shared.KnownErrors.VerificationCodeAlreadyUsed.isInstance(result.error)) return usedJsx;
|
|
151
151
|
else throw result.error;
|
|
152
152
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PasswordResetForm, {
|
|
153
153
|
code,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-reset.js","names":["passwordSchema","PredefinedMessageCard","MessageCard","MaybeFullPage","Typography","Label","PasswordInput","FormWarningText","Button","KnownErrors"],"sources":["../../src/components-page/password-reset.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@
|
|
1
|
+
{"version":3,"file":"password-reset.js","names":["passwordSchema","PredefinedMessageCard","MessageCard","MaybeFullPage","Typography","Label","PasswordInput","FormWarningText","Button","KnownErrors"],"sources":["../../src/components-page/password-reset.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@hexclave/shared\";\nimport { getPasswordError } from \"@hexclave/shared/dist/helpers/password\";\nimport { passwordSchema, yupObject, yupString } from \"@hexclave/shared/dist/schema-fields\";\nimport { cacheFunction } from \"@hexclave/shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { use } from \"@hexclave/shared/dist/utils/react\";\nimport { Button, Label, PasswordInput, Typography, cn } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { StackClientApp, useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport default function PasswordResetForm(props: {\n code: string,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n\n const schema = yupObject({\n password: passwordSchema.defined(t(\"Please enter your password\")).nonEmpty(t(\"Please enter your password\")).test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n passwordRepeat: yupString().nullable().oneOf([yup.ref('password'), null], t(\"Passwords do not match\")).defined().nonEmpty(t(\"Please repeat your password\"))\n });\n\n const { register, handleSubmit, formState: { errors }, clearErrors } = useForm({\n resolver: yupResolver(schema)\n });\n const stackApp = useStackApp();\n const [finished, setFinished] = useState(false);\n const [resetError, setResetError] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n setLoading(true);\n try {\n const { password } = data;\n const result = await stackApp.resetPassword({ password, code: props.code });\n if (result.status === 'error') {\n setResetError(true);\n return;\n }\n\n setFinished(true);\n } finally {\n setLoading(false);\n }\n };\n\n if (finished) {\n return <PredefinedMessageCard type='passwordReset' fullPage={!!props.fullPage} />;\n }\n\n if (resetError) {\n return (\n <MessageCard title={t(\"Failed to reset password\")} fullPage={!!props.fullPage}>\n {t(\"Failed to reset password. Please request a new password reset link\")}\n </MessageCard>\n );\n }\n\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className={cn(\n \"flex flex-col items-stretch max-w-[380px] flex-basis-[380px]\",\n props.fullPage ? \"p-4\" : \"p-0\"\n )}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>{t(\"Reset Your Password\")}</Typography>\n </div>\n\n <form\n className=\"flex flex-col items-stretch\"\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"password\" className=\"mb-1\">{t(\"New Password\")}</Label>\n <PasswordInput\n id=\"password\"\n autoComplete=\"new-password\"\n {...register('password')}\n onChange={() => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.password?.message?.toString()} />\n\n <Label htmlFor=\"repeat-password\" className=\"mt-4 mb-1\">{t(\"Repeat New Password\")}</Label>\n <PasswordInput\n id=\"repeat-password\"\n autoComplete=\"new-password\"\n {...register('passwordRepeat')}\n onChange={() => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.passwordRepeat?.message?.toString()} />\n\n <Button type=\"submit\" className=\"mt-6\" loading={loading}>\n {t(\"Reset Password\")}\n </Button>\n </form>\n </div>\n </MaybeFullPage>\n );\n}\n\n\nconst cachedVerifyPasswordResetCode = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyPasswordResetCode(code);\n});\n\nexport function PasswordReset({\n searchParams,\n fullPage = false,\n}: {\n searchParams: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Password Reset Link\")} fullPage={fullPage}>\n <Typography>{t(\"Please double check if you have the correct password reset link.\")}</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Password Reset Link\")} fullPage={fullPage}>\n <Typography>{t(\"Your password reset link has expired. Please request a new password reset link from the login page.\")}</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title={t(\"Used Password Reset Link\")} fullPage={fullPage}>\n <Typography>{t(\"This password reset link has already been used. If you need to reset your password again, please request a new password reset link from the login page.\")}</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n const result = use(cachedVerifyPasswordResetCode(stackApp, code));\n\n if (result.status === 'error') {\n if (KnownErrors.VerificationCodeNotFound.isInstance(result.error)) {\n return invalidJsx;\n } else if (KnownErrors.VerificationCodeExpired.isInstance(result.error)) {\n return expiredJsx;\n } else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(result.error)) {\n return usedJsx;\n } else {\n throw result.error;\n }\n }\n\n return <PasswordResetForm code={code} fullPage={fullPage} />;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let
|
|
1
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
2
2
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -5,16 +5,16 @@ const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
|
5
5
|
let ___index_js = require("../index.js");
|
|
6
6
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
7
|
let ___components_message_cards_predefined_message_card_js = require("../components/message-cards/predefined-message-card.js");
|
|
8
|
-
let
|
|
9
|
-
let
|
|
8
|
+
let _hexclave_shared_dist_utils_caches = require("@hexclave/shared/dist/utils/caches");
|
|
9
|
+
let _hexclave_shared_dist_utils_react = require("@hexclave/shared/dist/utils/react");
|
|
10
10
|
|
|
11
11
|
//#region src/components-page/sign-out.tsx
|
|
12
|
-
const cacheSignOut = (0,
|
|
12
|
+
const cacheSignOut = (0, _hexclave_shared_dist_utils_caches.cacheFunction)(async (user) => {
|
|
13
13
|
return await user.signOut();
|
|
14
14
|
});
|
|
15
15
|
function SignOut(props) {
|
|
16
16
|
const user = (0, ___index_js.useUser)();
|
|
17
|
-
if (user) (0,
|
|
17
|
+
if (user) (0, _hexclave_shared_dist_utils_react.use)(cacheSignOut(user));
|
|
18
18
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_predefined_message_card_js.PredefinedMessageCard, {
|
|
19
19
|
type: "signedOut",
|
|
20
20
|
fullPage: props.fullPage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-out.js","names":["PredefinedMessageCard"],"sources":["../../src/components-page/sign-out.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { cacheFunction } from \"@
|
|
1
|
+
{"version":3,"file":"sign-out.js","names":["PredefinedMessageCard"],"sources":["../../src/components-page/sign-out.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { cacheFunction } from \"@hexclave/shared/dist/utils/caches\";\nimport { use } from \"@hexclave/shared/dist/utils/react\";\nimport { CurrentUser, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\n\nconst cacheSignOut = cacheFunction(async (user: CurrentUser) => {\n return await user.signOut();\n});\n\nexport function SignOut(props: { fullPage?: boolean }) {\n const user = useUser();\n\n if (user) {\n use(cacheSignOut(user));\n }\n\n return <PredefinedMessageCard type='signedOut' fullPage={props.fullPage} />;\n}\n"],"mappings":";;;;;;;;;;;AAYA,MAAM,qEAA6B,OAAO,SAAsB;AAC9D,QAAO,MAAM,KAAK,SAAS;EAC3B;AAEF,SAAgB,QAAQ,OAA+B;CACrD,MAAM,iCAAgB;AAEtB,KAAI,KACF,4CAAI,aAAa,KAAK,CAAC;AAGzB,QAAO,2CAACA;EAAsB,MAAK;EAAY,UAAU,MAAM;GAAY"}
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
-
let
|
|
6
|
-
let
|
|
5
|
+
let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
|
|
6
|
+
let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
7
7
|
let react = require("react");
|
|
8
8
|
let ___index_js = require("../index.js");
|
|
9
9
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
10
|
let ___lib_hooks_js = require("../lib/hooks.js");
|
|
11
|
-
let _stackframe_stack_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
|
|
12
|
-
let ___lib_stack_app_url_targets_js = require("../lib/stack-app/url-targets.js");
|
|
13
11
|
let __cli_auth_confirm_js = require("./cli-auth-confirm.js");
|
|
14
12
|
let ___components_message_cards_message_card_js = require("../components/message-cards/message-card.js");
|
|
15
13
|
let ___lib_stack_app_index_js = require("../lib/stack-app/index.js");
|
|
16
|
-
let
|
|
14
|
+
let _hexclave_shared_dist_utils_objects = require("@hexclave/shared/dist/utils/objects");
|
|
15
|
+
let _hexclave_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
|
|
17
16
|
let next_navigation = require("next/navigation");
|
|
17
|
+
let ___lib_stack_app_url_targets_js = require("../lib/stack-app/url-targets.js");
|
|
18
18
|
let __account_settings_js = require("./account-settings.js");
|
|
19
19
|
let __email_verification_js = require("./email-verification.js");
|
|
20
20
|
let __error_page_js = require("./error-page.js");
|
|
@@ -140,7 +140,7 @@ function renderComponent(props) {
|
|
|
140
140
|
...filterUndefinedINU(componentProps?.Onboarding)
|
|
141
141
|
});
|
|
142
142
|
default: {
|
|
143
|
-
if (Object.values(availablePaths).includes(path)) throw new
|
|
143
|
+
if (Object.values(availablePaths).includes(path)) throw new _hexclave_shared_dist_utils_errors.HexclaveAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
|
|
144
144
|
for (const [key, value] of Object.entries(pathAliases)) if (path.toLowerCase().replaceAll("-", "") === key.toLowerCase().replaceAll("-", "")) return { redirect: `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}` };
|
|
145
145
|
const defaultUnknownPathUrl = getDefaultUnknownPathUrl?.(path);
|
|
146
146
|
if (defaultUnknownPathUrl != null) {
|
|
@@ -199,7 +199,7 @@ function StackHandlerClient(props) {
|
|
|
199
199
|
const redirectToPage = result != null && typeof result === "object" && "redirectToPage" in result ? result.redirectToPage : void 0;
|
|
200
200
|
(0, react.useEffect)(() => {
|
|
201
201
|
if (redirectToPage == null) return;
|
|
202
|
-
(0,
|
|
202
|
+
(0, _hexclave_shared_dist_utils_promises.runAsynchronouslyWithAlert)(stackApp[___lib_stack_app_index_js.stackAppInternalsSymbol].redirectToHandler(redirectToPage, { replace: true }));
|
|
203
203
|
}, [redirectToPage, stackApp]);
|
|
204
204
|
if (redirectToPage != null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_message_card_js.MessageCard, {
|
|
205
205
|
title: "Redirecting...",
|
|
@@ -209,10 +209,10 @@ function StackHandlerClient(props) {
|
|
|
209
209
|
return result;
|
|
210
210
|
}
|
|
211
211
|
function filterUndefinedINU(value) {
|
|
212
|
-
return value === void 0 ? value : (0,
|
|
212
|
+
return value === void 0 ? value : (0, _hexclave_shared_dist_utils_objects.filterUndefined)(value);
|
|
213
213
|
}
|
|
214
214
|
function toAbsoluteOrRelativeRedirectTarget(url) {
|
|
215
|
-
return url.origin === "http://example.com" ? (0,
|
|
215
|
+
return url.origin === "http://example.com" ? (0, _hexclave_shared_dist_utils_urls.getRelativePart)(url) : url.toString();
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
//#endregion
|