@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
|
@@ -2,8 +2,8 @@
|
|
|
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_promises = require("@hexclave/shared/dist/utils/promises");
|
|
6
|
+
let _hexclave_ui = require("@hexclave/ui");
|
|
7
7
|
let react = require("react");
|
|
8
8
|
react = require_chunk.__toESM(react);
|
|
9
9
|
let ___index_js = require("../index.js");
|
|
@@ -14,17 +14,17 @@ let __elements_user_avatar_js = require("./elements/user-avatar.js");
|
|
|
14
14
|
|
|
15
15
|
//#region src/components/user-button.tsx
|
|
16
16
|
function Item(props) {
|
|
17
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
18
|
-
onClick: () => (0,
|
|
17
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuItem, {
|
|
18
|
+
onClick: () => (0, _hexclave_shared_dist_utils_promises.runAsynchronouslyWithAlert)(props.onClick),
|
|
19
19
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
20
20
|
className: "flex gap-2 items-center",
|
|
21
|
-
children: [props.icon, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
21
|
+
children: [props.icon, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: props.text })]
|
|
22
22
|
})
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
function UserButton(props) {
|
|
26
26
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Suspense, {
|
|
27
|
-
fallback: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
27
|
+
fallback: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Skeleton, { className: "h-[34px] w-[34px] rounded-full stack-scope" }),
|
|
28
28
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UserButtonInner, { ...props })
|
|
29
29
|
});
|
|
30
30
|
}
|
|
@@ -52,7 +52,7 @@ function UserButtonInnerInner(props) {
|
|
|
52
52
|
size: 20,
|
|
53
53
|
className: "h-4 w-4"
|
|
54
54
|
};
|
|
55
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(
|
|
55
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.DropdownMenu, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuTrigger, {
|
|
56
56
|
className: "outline-none stack-scope rounded-lg hover:bg-muted/50 transition-colors hover:transition-none p-1.5",
|
|
57
57
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
58
58
|
className: "flex gap-2 items-center",
|
|
@@ -67,26 +67,26 @@ function UserButtonInnerInner(props) {
|
|
|
67
67
|
})]
|
|
68
68
|
})]
|
|
69
69
|
})
|
|
70
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(
|
|
70
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.DropdownMenuContent, {
|
|
71
71
|
className: "stack-scope",
|
|
72
72
|
children: [
|
|
73
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
73
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuLabel, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
74
74
|
className: "flex gap-2 items-center",
|
|
75
75
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__elements_user_avatar_js.UserAvatar, { user }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
|
|
76
|
-
user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
76
|
+
user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
77
77
|
className: "max-w-40 truncate",
|
|
78
78
|
children: user.displayName
|
|
79
79
|
}),
|
|
80
|
-
user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
80
|
+
user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
81
81
|
className: "max-w-40 truncate",
|
|
82
82
|
variant: "secondary",
|
|
83
83
|
type: "label",
|
|
84
84
|
children: user.primaryEmail
|
|
85
85
|
}),
|
|
86
|
-
!user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
86
|
+
!user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: t("Not signed in") })
|
|
87
87
|
] })]
|
|
88
88
|
}) }),
|
|
89
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
89
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.DropdownMenuSeparator, {}),
|
|
90
90
|
user && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Item, {
|
|
91
91
|
text: t("Account settings"),
|
|
92
92
|
onClick: async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-button.js","names":["DropdownMenuItem","Typography","Suspense","Skeleton","DropdownMenu","DropdownMenuTrigger","UserAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","CircleUser","LogIn","UserPlus","SunMoon","LogOut"],"sources":["../../src/components/user-button.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 { runAsynchronouslyWithAlert } from \"@
|
|
1
|
+
{"version":3,"file":"user-button.js","names":["DropdownMenuItem","Typography","Suspense","Skeleton","DropdownMenu","DropdownMenuTrigger","UserAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","CircleUser","LogIn","UserPlus","SunMoon","LogOut"],"sources":["../../src/components/user-button.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 { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Skeleton, Typography } from \"@hexclave/ui\";\nimport { CircleUser, LogIn, LogOut, SunMoon, UserPlus } from \"lucide-react\";\nimport React, { Suspense } from \"react\";\nimport { CurrentUser, useStackApp, useUser } from \"..\";\nimport { useTranslation } from \"../lib/translations\";\nimport { UserAvatar } from \"./elements/user-avatar\";\n\nfunction Item(props: { text: string, icon: React.ReactNode, onClick: () => void | Promise<void> }) {\n return (\n <DropdownMenuItem onClick={() => runAsynchronouslyWithAlert(props.onClick)}>\n <div className=\"flex gap-2 items-center\">\n {props.icon}\n <Typography>{props.text}</Typography>\n </div>\n </DropdownMenuItem>\n );\n}\n\ntype UserButtonProps = {\n showUserInfo?: boolean,\n colorModeToggle?: () => void | Promise<void>,\n extraItems?: {\n text: string,\n icon: React.ReactNode,\n onClick: () => void | Promise<void>,\n }[],\n mockUser?: {\n displayName?: string,\n primaryEmail?: string,\n profileImageUrl?: string,\n },\n};\n\nexport function UserButton(props: UserButtonProps) {\n return (\n <Suspense fallback={<Skeleton className=\"h-[34px] w-[34px] rounded-full stack-scope\" />}>\n <UserButtonInner {...props} />\n </Suspense>\n );\n}\n\nfunction UserButtonInner(props: UserButtonProps) {\n const userFromHook = useUser();\n\n // Use mock user if provided, otherwise use real user\n const user = props.mockUser ? {\n displayName: props.mockUser.displayName || 'Mock User',\n primaryEmail: props.mockUser.primaryEmail || 'mock@example.com',\n profileImageUrl: props.mockUser.profileImageUrl,\n signOut: () => {\n console.log('Mock sign out - no action taken in demo mode');\n return Promise.resolve();\n }\n } as CurrentUser : userFromHook;\n\n return <UserButtonInnerInner {...props} user={user} />;\n}\n\n\nfunction UserButtonInnerInner(props: UserButtonProps & { user: CurrentUser | null }) {\n const { t } = useTranslation();\n const user = props.user;\n const app = useStackApp();\n\n const iconProps = { size: 20, className: 'h-4 w-4' };\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"outline-none stack-scope rounded-lg hover:bg-muted/50 transition-colors hover:transition-none p-1.5\">\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n {user && props.showUserInfo &&\n <div className=\"flex flex-col justify-center text-left min-w-0\">\n <div className=\"max-w-40 truncate text-sm font-medium\">{user.displayName}</div>\n <div className=\"max-w-40 truncate text-xs text-muted-foreground\">{user.primaryEmail}</div>\n </div>\n }\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"stack-scope\">\n <DropdownMenuLabel>\n <div className=\"flex gap-2 items-center\">\n <UserAvatar user={user} />\n <div>\n {user && <Typography className=\"max-w-40 truncate\">{user.displayName}</Typography>}\n {user && <Typography className=\"max-w-40 truncate\" variant=\"secondary\" type='label'>{user.primaryEmail}</Typography>}\n {!user && <Typography>{t('Not signed in')}</Typography>}\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {user && <Item\n text={t('Account settings')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock account settings - no navigation in demo mode');\n } else {\n await app.redirectToAccountSettings();\n }\n }}\n icon={<CircleUser {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign in')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign in - no navigation in demo mode');\n } else {\n await app.redirectToSignIn();\n }\n }}\n icon={<LogIn {...iconProps} />}\n />}\n {!user && <Item\n text={t('Sign up')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign up - no navigation in demo mode');\n } else {\n await app.redirectToSignUp();\n }\n }}\n icon={<UserPlus {...iconProps}/> }\n />}\n {user && props.extraItems && props.extraItems.map((item, index) => (\n <Item key={index} {...item} />\n ))}\n {props.colorModeToggle && (\n <Item\n text={t('Toggle theme')}\n onClick={props.colorModeToggle}\n icon={<SunMoon {...iconProps} />}\n />\n )}\n {user && <Item\n text={t('Sign out')}\n onClick={async () => {\n if (props.mockUser) {\n console.log('Mock sign out - no action taken in demo mode');\n } else {\n await user.signOut();\n }\n }}\n icon={<LogOut {...iconProps} />}\n />}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,KAAK,OAAqF;AACjG,QACE,2CAACA;EAAiB,oFAA0C,MAAM,QAAQ;YACxE,4CAAC;GAAI,WAAU;cACZ,MAAM,MACP,2CAACC,qCAAY,MAAM,OAAkB;IACjC;GACW;;AAmBvB,SAAgB,WAAW,OAAwB;AACjD,QACE,2CAACC;EAAS,UAAU,2CAACC,yBAAS,WAAU,+CAA+C;YACrF,2CAAC,mBAAgB,GAAI,QAAS;GACrB;;AAIf,SAAS,gBAAgB,OAAwB;CAC/C,MAAM,yCAAwB;CAG9B,MAAM,OAAO,MAAM,WAAW;EAC5B,aAAa,MAAM,SAAS,eAAe;EAC3C,cAAc,MAAM,SAAS,gBAAgB;EAC7C,iBAAiB,MAAM,SAAS;EAChC,eAAe;AACb,WAAQ,IAAI,+CAA+C;AAC3D,UAAO,QAAQ,SAAS;;EAE3B,GAAkB;AAEnB,QAAO,2CAAC;EAAqB,GAAI;EAAa;GAAQ;;AAIxD,SAAS,qBAAqB,OAAuD;CACnF,MAAM,EAAE,kDAAsB;CAC9B,MAAM,OAAO,MAAM;CACnB,MAAM,oCAAmB;CAEzB,MAAM,YAAY;EAAE,MAAM;EAAI,WAAW;EAAW;AAEpD,QACE,4CAACC,wCACC,2CAACC;EAAoB,WAAU;YAC7B,4CAAC;GAAI,WAAU;cACb,2CAACC,wCAAiB,OAAQ,EACzB,QAAQ,MAAM,gBACb,4CAAC;IAAI,WAAU;eACb,2CAAC;KAAI,WAAU;eAAyC,KAAK;MAAkB,EAC/E,2CAAC;KAAI,WAAU;eAAmD,KAAK;MAAmB;KACtF;IAEJ;GACc,EACtB,4CAACC;EAAoB,WAAU;;GAC7B,2CAACC,4CACC,4CAAC;IAAI,WAAU;eACb,2CAACF,wCAAiB,OAAQ,EAC1B,4CAAC;KACE,QAAQ,2CAACL;MAAW,WAAU;gBAAqB,KAAK;OAAyB;KACjF,QAAQ,2CAACA;MAAW,WAAU;MAAoB,SAAQ;MAAY,MAAK;gBAAS,KAAK;OAA0B;KACnH,CAAC,QAAQ,2CAACA,qCAAY,EAAE,gBAAgB,GAAc;QACnD;KACF,GACY;GACpB,2CAACQ,uCAAwB;GACxB,QAAQ,2CAAC;IACR,MAAM,EAAE,mBAAmB;IAC3B,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,qDAAqD;SAEjE,OAAM,IAAI,2BAA2B;;IAGzC,MAAM,2CAACC,2BAAW,GAAI,YAAa;KACnC;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,sBAAM,GAAI,YAAa;KAC9B;GACD,CAAC,QAAQ,2CAAC;IACT,MAAM,EAAE,UAAU;IAClB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,4CAA4C;SAExD,OAAM,IAAI,kBAAkB;;IAGhC,MAAM,2CAACC,yBAAS,GAAI,YAAY;KAChC;GACD,QAAQ,MAAM,cAAc,MAAM,WAAW,KAAK,MAAM,UACvD,2CAAC,QAAiB,GAAI,QAAX,MAAmB,CAC9B;GACD,MAAM,mBACL,2CAAC;IACC,MAAM,EAAE,eAAe;IACvB,SAAS,MAAM;IACf,MAAM,2CAACC,wBAAQ,GAAI,YAAa;KAChC;GAEH,QAAQ,2CAAC;IACR,MAAM,EAAE,WAAW;IACnB,SAAS,YAAY;AACnB,SAAI,MAAM,SACR,SAAQ,IAAI,+CAA+C;SAE3D,OAAM,KAAK,SAAS;;IAGxB,MAAM,2CAACC,uBAAO,GAAI,YAAa;KAC/B;;GACkB,IACT"}
|
|
@@ -1,11 +1,11 @@
|
|
|
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
|
-
let
|
|
8
|
+
let _hexclave_shared_dist_utils_dates = require("@hexclave/shared/dist/utils/dates");
|
|
9
9
|
let _________lib_hooks_js = require("../../../lib/hooks.js");
|
|
10
10
|
let _________lib_translations_js = require("../../../lib/translations.js");
|
|
11
11
|
let ___page_layout_js = require("../page-layout.js");
|
|
@@ -56,7 +56,7 @@ function ActiveSessionsPage(props) {
|
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
58
|
if (!userFromHook) return;
|
|
59
|
-
(0,
|
|
59
|
+
(0, _hexclave_shared_dist_utils_promises.runAsynchronously)(async () => {
|
|
60
60
|
setIsLoading(true);
|
|
61
61
|
setSessions(await userFromHook.getActiveSessions());
|
|
62
62
|
setIsLoading(false);
|
|
@@ -72,7 +72,7 @@ function ActiveSessionsPage(props) {
|
|
|
72
72
|
await userFromHook.revokeSession(sessionId);
|
|
73
73
|
setSessions((prev) => prev.filter((session) => session.id !== sessionId));
|
|
74
74
|
} catch (error) {
|
|
75
|
-
(0,
|
|
75
|
+
(0, _hexclave_shared_dist_utils_errors.captureError)("session-revoke", {
|
|
76
76
|
sessionId,
|
|
77
77
|
error
|
|
78
78
|
});
|
|
@@ -89,7 +89,7 @@ function ActiveSessionsPage(props) {
|
|
|
89
89
|
setSessions((prevSessions) => prevSessions.filter((session) => session.isCurrentSession));
|
|
90
90
|
}
|
|
91
91
|
} catch (error) {
|
|
92
|
-
(0,
|
|
92
|
+
(0, _hexclave_shared_dist_utils_errors.captureError)("all-sessions-revoke", {
|
|
93
93
|
error,
|
|
94
94
|
sessionIds: sessions.map((session) => session.id)
|
|
95
95
|
});
|
|
@@ -102,95 +102,95 @@ function ActiveSessionsPage(props) {
|
|
|
102
102
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___page_layout_js.PageLayout, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
|
|
103
103
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
104
104
|
className: "flex justify-between items-center mb-2",
|
|
105
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
105
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
106
106
|
className: "font-medium",
|
|
107
107
|
children: t("Active Sessions")
|
|
108
108
|
}), sessions.filter((s) => !s.isCurrentSession).length > 0 && !isLoading && (showConfirmRevokeAll ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
109
109
|
className: "flex gap-2",
|
|
110
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
110
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
111
111
|
variant: "destructive",
|
|
112
112
|
size: "sm",
|
|
113
113
|
loading: isRevokingAll,
|
|
114
114
|
onClick: handleRevokeAllSessions,
|
|
115
115
|
children: t("Confirm")
|
|
116
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
116
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
117
117
|
variant: "secondary",
|
|
118
118
|
size: "sm",
|
|
119
119
|
disabled: isRevokingAll,
|
|
120
120
|
onClick: () => setShowConfirmRevokeAll(false),
|
|
121
121
|
children: t("Cancel")
|
|
122
122
|
})]
|
|
123
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
123
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
124
124
|
variant: "outline",
|
|
125
125
|
size: "sm",
|
|
126
126
|
onClick: () => setShowConfirmRevokeAll(true),
|
|
127
127
|
children: t("Revoke All Other Sessions")
|
|
128
128
|
}))]
|
|
129
129
|
}),
|
|
130
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
130
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
131
131
|
variant: "secondary",
|
|
132
132
|
type: "footnote",
|
|
133
133
|
className: "mb-4",
|
|
134
134
|
children: t("These are devices where you're currently logged in. You can revoke access to end a session.")
|
|
135
135
|
}),
|
|
136
|
-
isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
136
|
+
isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Skeleton, { className: "h-[300px] w-full rounded-md" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
137
137
|
className: "border rounded-md",
|
|
138
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(
|
|
139
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
138
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.Table, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHeader, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.TableRow, { children: [
|
|
139
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
|
|
140
140
|
className: "w-[200px]",
|
|
141
141
|
children: t("Session")
|
|
142
142
|
}),
|
|
143
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
143
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
|
|
144
144
|
className: "w-[150px]",
|
|
145
145
|
children: t("IP Address")
|
|
146
146
|
}),
|
|
147
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
147
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
|
|
148
148
|
className: "w-[150px]",
|
|
149
149
|
children: t("Location")
|
|
150
150
|
}),
|
|
151
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
151
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, {
|
|
152
152
|
className: "w-[150px]",
|
|
153
153
|
children: t("Last used")
|
|
154
154
|
}),
|
|
155
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
156
|
-
] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
155
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableHead, { className: "w-[80px]" })
|
|
156
|
+
] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableBody, { children: sessions.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableRow, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, {
|
|
157
157
|
colSpan: 5,
|
|
158
158
|
className: "text-center py-6",
|
|
159
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
159
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
160
160
|
variant: "secondary",
|
|
161
161
|
children: t("No active sessions found")
|
|
162
162
|
})
|
|
163
|
-
}) }) : sessions.map((session) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(
|
|
164
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
163
|
+
}) }) : sessions.map((session) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_hexclave_ui.TableRow, { children: [
|
|
164
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
165
165
|
className: "flex flex-col",
|
|
166
166
|
children: [
|
|
167
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
168
|
-
session.isImpersonation && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
167
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.isCurrentSession ? t("Current Session") : t("Other Session") }),
|
|
168
|
+
session.isImpersonation && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Badge, {
|
|
169
169
|
variant: "secondary",
|
|
170
170
|
className: "w-fit mt-1",
|
|
171
171
|
children: t("Impersonation")
|
|
172
172
|
}),
|
|
173
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
173
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
174
174
|
variant: "secondary",
|
|
175
175
|
type: "footnote",
|
|
176
176
|
children: t("Signed in {time}", { time: new Date(session.createdAt).toLocaleDateString() })
|
|
177
177
|
})
|
|
178
178
|
]
|
|
179
179
|
}) }),
|
|
180
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
181
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
182
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
180
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.geoInfo?.ip || t("-") }) }),
|
|
181
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.geoInfo?.cityName || t("Unknown") }) }),
|
|
182
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
183
183
|
className: "flex flex-col",
|
|
184
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
184
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: session.lastUsedAt ? (0, _hexclave_shared_dist_utils_dates.fromNow)(new Date(session.lastUsedAt)) : t("Never") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, {
|
|
185
185
|
variant: "secondary",
|
|
186
186
|
type: "footnote",
|
|
187
187
|
title: session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : "",
|
|
188
188
|
children: session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : ""
|
|
189
189
|
})]
|
|
190
190
|
}) }),
|
|
191
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
191
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.TableCell, {
|
|
192
192
|
align: "right",
|
|
193
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
193
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.ActionCell, { items: [{
|
|
194
194
|
item: t("Revoke"),
|
|
195
195
|
onClick: () => handleRevokeSession(session.id),
|
|
196
196
|
danger: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-sessions-page.js","names":["PageLayout","Typography","Button","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Badge","ActionCell"],"sources":["../../../../src/components-page/account-settings/active-sessions/active-sessions-page.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 { fromNow } from \"@stackframe/stack-shared/dist/utils/dates\";\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@stackframe/stack-ui\";\nimport { useEffect, useState } from \"react\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ActiveSession } from \"../../../lib/stack-app/users\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\nexport function ActiveSessionsPage(props?: {\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: (props?.mockSessions || props?.mockMode) ? 'return-null' : 'throw' });\n const [isLoading, setIsLoading] = useState(!props?.mockSessions);\n const [isRevokingAll, setIsRevokingAll] = useState(false);\n const [sessions, setSessions] = useState<ActiveSession[]>([]);\n const [showConfirmRevokeAll, setShowConfirmRevokeAll] = useState(false);\n\n // Use mock data if provided\n const mockSessionsData = props?.mockSessions ? props.mockSessions.map(session => ({\n id: session.id,\n isCurrentSession: session.isCurrentSession,\n isImpersonation: session.isImpersonation || false,\n createdAt: session.createdAt,\n lastUsedAt: session.lastUsedAt,\n geoInfo: session.geoInfo,\n })) : [\n {\n id: 'current-session',\n isCurrentSession: true,\n createdAt: new Date().toISOString(),\n lastUsedAt: new Date().toISOString(),\n geoInfo: { ip: '192.168.1.1', cityName: 'San Francisco' }\n },\n {\n id: 'mobile-session',\n isCurrentSession: false,\n createdAt: new Date(Date.now() - 86400000).toISOString(), // 1 day ago\n lastUsedAt: new Date(Date.now() - 7200000).toISOString(), // 2 hours ago\n geoInfo: { ip: '10.0.0.1', cityName: 'New York' }\n }\n ];\n\n // Fetch sessions when component mounts (only if not using mock data)\n useEffect(() => {\n if (props?.mockSessions) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n // If in mock mode but no mock sessions provided, use default mock data\n if (props?.mockMode && !userFromHook) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n if (!userFromHook) return;\n\n runAsynchronously(async () => {\n setIsLoading(true);\n const sessionsData = await userFromHook.getActiveSessions();\n const enhancedSessions = sessionsData;\n setSessions(enhancedSessions);\n setIsLoading(false);\n });\n }, [userFromHook, props?.mockSessions]);\n\n const handleRevokeSession = async (sessionId: string) => {\n if (props?.mockSessions) {\n // Mock revoke - just remove from list\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n return;\n }\n\n if (!userFromHook) return;\n\n try {\n await userFromHook.revokeSession(sessionId);\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n } catch (error) {\n captureError(\"session-revoke\", { sessionId ,error });\n throw error;\n }\n };\n\n const handleRevokeAllSessions = async () => {\n setIsRevokingAll(true);\n try {\n if (props?.mockSessions) {\n // Mock revoke all - just keep current session\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n } else if (userFromHook) {\n const deletionPromises = sessions\n .filter(session => !session.isCurrentSession)\n .map(session => userFromHook.revokeSession(session.id));\n await Promise.all(deletionPromises);\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n }\n } catch (error) {\n captureError(\"all-sessions-revoke\", { error, sessionIds: sessions.map(session => session.id) });\n throw error;\n } finally {\n setIsRevokingAll(false);\n setShowConfirmRevokeAll(false);\n }\n };\n\n return (\n <PageLayout>\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <Typography className='font-medium'>{t(\"Active Sessions\")}</Typography>\n {sessions.filter(s => !s.isCurrentSession).length > 0 && !isLoading && (\n showConfirmRevokeAll ? (\n <div className=\"flex gap-2\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n loading={isRevokingAll}\n onClick={handleRevokeAllSessions}\n >\n {t(\"Confirm\")}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={isRevokingAll}\n onClick={() => setShowConfirmRevokeAll(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowConfirmRevokeAll(true)}\n >\n {t(\"Revoke All Other Sessions\")}\n </Button>\n )\n )}\n </div>\n <Typography variant='secondary' type='footnote' className=\"mb-4\">\n {t(\"These are devices where you're currently logged in. You can revoke access to end a session.\")}\n </Typography>\n\n {isLoading ? (\n <Skeleton className=\"h-[300px] w-full rounded-md\" />\n ) : (\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Session\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"IP Address\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Location\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Last used\")}</TableHead>\n <TableHead className=\"w-[80px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sessions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-6\">\n <Typography variant=\"secondary\">{t(\"No active sessions found\")}</Typography>\n </TableCell>\n </TableRow>\n ) : (\n sessions.map((session) => (\n <TableRow key={session.id}>\n <TableCell>\n <div className=\"flex flex-col\">\n {/* We currently do not save any usefull information about the user, in the future, the name should probably say what kind of session it is (e.g. cli, browser, maybe what auth method was used) */}\n <Typography>{session.isCurrentSession ? t(\"Current Session\") : t(\"Other Session\")}</Typography>\n {session.isImpersonation && <Badge variant=\"secondary\" className=\"w-fit mt-1\">{t(\"Impersonation\")}</Badge>}\n <Typography variant='secondary' type='footnote'>\n {t(\"Signed in {time}\", { time: new Date(session.createdAt).toLocaleDateString() })}\n </Typography>\n </div>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.ip || t('-')}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.cityName || t('Unknown')}</Typography>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col\">\n <Typography>{session.lastUsedAt ? fromNow(new Date(session.lastUsedAt)) : t(\"Never\")}</Typography>\n <Typography variant='secondary' type='footnote' title={session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : \"\"}>\n {session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : \"\"}\n </Typography>\n </div>\n </TableCell>\n <TableCell align=\"right\">\n <ActionCell\n items={[\n {\n item: t(\"Revoke\"),\n onClick: () => handleRevokeSession(session.id),\n danger: true,\n disabled: session.isCurrentSession,\n disabledTooltip: session.isCurrentSession ? t(\"You cannot revoke your current session\") : undefined,\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"active-sessions-page.js","names":["PageLayout","Typography","Button","Skeleton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Badge","ActionCell"],"sources":["../../../../src/components-page/account-settings/active-sessions/active-sessions-page.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 { fromNow } from \"@hexclave/shared/dist/utils/dates\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { ActionCell, Badge, Button, Skeleton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { useEffect, useState } from \"react\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ActiveSession } from \"../../../lib/stack-app/users\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\nexport function ActiveSessionsPage(props?: {\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: (props?.mockSessions || props?.mockMode) ? 'return-null' : 'throw' });\n const [isLoading, setIsLoading] = useState(!props?.mockSessions);\n const [isRevokingAll, setIsRevokingAll] = useState(false);\n const [sessions, setSessions] = useState<ActiveSession[]>([]);\n const [showConfirmRevokeAll, setShowConfirmRevokeAll] = useState(false);\n\n // Use mock data if provided\n const mockSessionsData = props?.mockSessions ? props.mockSessions.map(session => ({\n id: session.id,\n isCurrentSession: session.isCurrentSession,\n isImpersonation: session.isImpersonation || false,\n createdAt: session.createdAt,\n lastUsedAt: session.lastUsedAt,\n geoInfo: session.geoInfo,\n })) : [\n {\n id: 'current-session',\n isCurrentSession: true,\n createdAt: new Date().toISOString(),\n lastUsedAt: new Date().toISOString(),\n geoInfo: { ip: '192.168.1.1', cityName: 'San Francisco' }\n },\n {\n id: 'mobile-session',\n isCurrentSession: false,\n createdAt: new Date(Date.now() - 86400000).toISOString(), // 1 day ago\n lastUsedAt: new Date(Date.now() - 7200000).toISOString(), // 2 hours ago\n geoInfo: { ip: '10.0.0.1', cityName: 'New York' }\n }\n ];\n\n // Fetch sessions when component mounts (only if not using mock data)\n useEffect(() => {\n if (props?.mockSessions) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n // If in mock mode but no mock sessions provided, use default mock data\n if (props?.mockMode && !userFromHook) {\n setSessions(mockSessionsData as any);\n setIsLoading(false);\n return;\n }\n\n if (!userFromHook) return;\n\n runAsynchronously(async () => {\n setIsLoading(true);\n const sessionsData = await userFromHook.getActiveSessions();\n const enhancedSessions = sessionsData;\n setSessions(enhancedSessions);\n setIsLoading(false);\n });\n }, [userFromHook, props?.mockSessions]);\n\n const handleRevokeSession = async (sessionId: string) => {\n if (props?.mockSessions) {\n // Mock revoke - just remove from list\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n return;\n }\n\n if (!userFromHook) return;\n\n try {\n await userFromHook.revokeSession(sessionId);\n setSessions(prev => prev.filter(session => session.id !== sessionId));\n } catch (error) {\n captureError(\"session-revoke\", { sessionId ,error });\n throw error;\n }\n };\n\n const handleRevokeAllSessions = async () => {\n setIsRevokingAll(true);\n try {\n if (props?.mockSessions) {\n // Mock revoke all - just keep current session\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n } else if (userFromHook) {\n const deletionPromises = sessions\n .filter(session => !session.isCurrentSession)\n .map(session => userFromHook.revokeSession(session.id));\n await Promise.all(deletionPromises);\n setSessions(prevSessions => prevSessions.filter(session => session.isCurrentSession));\n }\n } catch (error) {\n captureError(\"all-sessions-revoke\", { error, sessionIds: sessions.map(session => session.id) });\n throw error;\n } finally {\n setIsRevokingAll(false);\n setShowConfirmRevokeAll(false);\n }\n };\n\n return (\n <PageLayout>\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <Typography className='font-medium'>{t(\"Active Sessions\")}</Typography>\n {sessions.filter(s => !s.isCurrentSession).length > 0 && !isLoading && (\n showConfirmRevokeAll ? (\n <div className=\"flex gap-2\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n loading={isRevokingAll}\n onClick={handleRevokeAllSessions}\n >\n {t(\"Confirm\")}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={isRevokingAll}\n onClick={() => setShowConfirmRevokeAll(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowConfirmRevokeAll(true)}\n >\n {t(\"Revoke All Other Sessions\")}\n </Button>\n )\n )}\n </div>\n <Typography variant='secondary' type='footnote' className=\"mb-4\">\n {t(\"These are devices where you're currently logged in. You can revoke access to end a session.\")}\n </Typography>\n\n {isLoading ? (\n <Skeleton className=\"h-[300px] w-full rounded-md\" />\n ) : (\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Session\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"IP Address\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Location\")}</TableHead>\n <TableHead className=\"w-[150px]\">{t(\"Last used\")}</TableHead>\n <TableHead className=\"w-[80px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sessions.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-6\">\n <Typography variant=\"secondary\">{t(\"No active sessions found\")}</Typography>\n </TableCell>\n </TableRow>\n ) : (\n sessions.map((session) => (\n <TableRow key={session.id}>\n <TableCell>\n <div className=\"flex flex-col\">\n {/* We currently do not save any usefull information about the user, in the future, the name should probably say what kind of session it is (e.g. cli, browser, maybe what auth method was used) */}\n <Typography>{session.isCurrentSession ? t(\"Current Session\") : t(\"Other Session\")}</Typography>\n {session.isImpersonation && <Badge variant=\"secondary\" className=\"w-fit mt-1\">{t(\"Impersonation\")}</Badge>}\n <Typography variant='secondary' type='footnote'>\n {t(\"Signed in {time}\", { time: new Date(session.createdAt).toLocaleDateString() })}\n </Typography>\n </div>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.ip || t('-')}</Typography>\n </TableCell>\n <TableCell>\n <Typography>{session.geoInfo?.cityName || t('Unknown')}</Typography>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col\">\n <Typography>{session.lastUsedAt ? fromNow(new Date(session.lastUsedAt)) : t(\"Never\")}</Typography>\n <Typography variant='secondary' type='footnote' title={session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleString() : \"\"}>\n {session.lastUsedAt ? new Date(session.lastUsedAt).toLocaleDateString() : \"\"}\n </Typography>\n </div>\n </TableCell>\n <TableCell align=\"right\">\n <ActionCell\n items={[\n {\n item: t(\"Revoke\"),\n onClick: () => handleRevokeSession(session.id),\n danger: true,\n disabled: session.isCurrentSession,\n disabledTooltip: session.isCurrentSession ? t(\"You cannot revoke your current session\") : undefined,\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -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");
|
|
@@ -91,7 +91,7 @@ function ApiKeysPage(props) {
|
|
|
91
91
|
return await userFromHook.createApiKey(data);
|
|
92
92
|
};
|
|
93
93
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(___page_layout_js.PageLayout, { children: [
|
|
94
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
94
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
95
95
|
onClick: () => setIsNewApiKeyDialogOpen(true),
|
|
96
96
|
children: t("Create API Key")
|
|
97
97
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys-page.js","names":["CreateApiKeyDialog","ShowApiKeyDialog","PageLayout","Button","ApiKeyTable"],"sources":["../../../../src/components-page/account-settings/api-keys/api-keys-page.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 } from \"@
|
|
1
|
+
{"version":3,"file":"api-keys-page.js","names":["CreateApiKeyDialog","ShowApiKeyDialog","PageLayout","Button","ApiKeyTable"],"sources":["../../../../src/components-page/account-settings/api-keys/api-keys-page.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 } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { CreateApiKeyDialog, ShowApiKeyDialog } from \"../../../components/api-key-dialogs\";\nimport { ApiKeyTable } from \"../../../components/api-key-table\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { ApiKey, ApiKeyCreationOptions } from \"../../../lib/stack-app/api-keys\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\n\n\nexport function ApiKeysPage(props?: {\n mockApiKeys?: Array<{\n id: string,\n description: string,\n createdAt: string,\n expiresAt?: string,\n manuallyRevokedAt?: string,\n }>,\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n\n // Check if we're in any kind of mock mode first\n const isInMockMode = !!(props?.mockApiKeys || props?.mockMode);\n\n const userFromHook = useUser({ or: isInMockMode ? 'return-null' : 'redirect' });\n\n // In mock mode, we don't need a user - just show mock data\n if (isInMockMode && !userFromHook) {\n // This is expected in mock mode, continue with mock data\n }\n\n // Only return null if we're not in mock mode and don't have a user\n if (!isInMockMode && !userFromHook) {\n return null; // This shouldn't happen due to redirect, but just in case\n }\n\n // Use mock data if provided\n const mockApiKeysData = props?.mockApiKeys ? props.mockApiKeys.map(mockKey => ({\n id: mockKey.id,\n description: mockKey.description,\n createdAt: new Date(mockKey.createdAt),\n expiresAt: mockKey.expiresAt ? new Date(mockKey.expiresAt) : undefined,\n manuallyRevokedAt: mockKey.manuallyRevokedAt ? new Date(mockKey.manuallyRevokedAt) : null,\n value: {\n lastFour: mockKey.id.slice(-4).padStart(4, '0'), // Use last 4 chars of ID or pad with zeros\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => {\n const now = new Date();\n const isExpired = mockKey.expiresAt ? new Date(mockKey.expiresAt) < now : false;\n const isRevoked = !!mockKey.manuallyRevokedAt;\n return !isExpired && !isRevoked;\n },\n whyInvalid: () => {\n const now = new Date();\n if (mockKey.manuallyRevokedAt) return 'manually-revoked';\n if (mockKey.expiresAt && new Date(mockKey.expiresAt) < now) return 'expired';\n return null;\n },\n })) : [\n {\n id: 'key-1',\n description: 'Development Key',\n createdAt: new Date(Date.now() - 172800000), // 2 days ago\n expiresAt: undefined,\n manuallyRevokedAt: null,\n value: {\n lastFour: 'ey-1'.slice(-4).padStart(4, '0'),\n },\n type: 'user' as const,\n userId: 'mock-user-id',\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n }\n ];\n\n // Determine which API keys to use\n let apiKeys: any[];\n if (isInMockMode) {\n apiKeys = mockApiKeysData;\n } else if (userFromHook) {\n apiKeys = userFromHook.useApiKeys();\n } else {\n apiKeys = [];\n }\n\n const [isNewApiKeyDialogOpen, setIsNewApiKeyDialogOpen] = useState(false);\n const [returnedApiKey, setReturnedApiKey] = useState<ApiKey<\"user\", true> | null>(null);\n\n const CreateDialog = CreateApiKeyDialog<\"user\">;\n const ShowDialog = ShowApiKeyDialog<\"user\">;\n\n const handleCreateApiKey = async (data: ApiKeyCreationOptions<\"user\">) => {\n if (isInMockMode) {\n // Mock API key creation\n const mockApiKey = {\n id: `key-${Date.now()}`,\n description: data.description,\n createdAt: new Date().toISOString(),\n expiresAt: data.expiresAt?.toISOString(),\n value: 'sk_dev_mock_key_' + Math.random().toString(36).substring(2),\n update: async () => {\n console.log('Mock API key update called');\n },\n revoke: async () => {\n console.log('Mock API key revoke called');\n },\n isValid: () => true,\n whyInvalid: () => null,\n type: 'user' as const,\n userId: 'mock-user-id',\n };\n return mockApiKey as any;\n }\n\n if (!userFromHook) throw new Error('User not available');\n return await userFromHook.createApiKey(data);\n };\n\n return (\n <PageLayout>\n <Button onClick={() => setIsNewApiKeyDialogOpen(true)}>\n {t(\"Create API Key\")}\n </Button>\n <ApiKeyTable apiKeys={apiKeys} />\n <CreateDialog\n open={isNewApiKeyDialogOpen}\n onOpenChange={setIsNewApiKeyDialogOpen}\n onKeyCreated={setReturnedApiKey}\n createApiKey={handleCreateApiKey}\n mockMode={isInMockMode}\n />\n <ShowDialog\n apiKey={returnedApiKey}\n onClose={() => setReturnedApiKey(null)}\n />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,YAAY,OASzB;CACD,MAAM,EAAE,wDAAsB;CAG9B,MAAM,eAAe,CAAC,EAAE,OAAO,eAAe,OAAO;CAErD,MAAM,kDAAuB,EAAE,IAAI,eAAe,gBAAgB,YAAY,CAAC;AAG/E,KAAI,gBAAgB,CAAC,cAAc;AAKnC,KAAI,CAAC,gBAAgB,CAAC,aACpB,QAAO;CAIT,MAAM,kBAAkB,OAAO,cAAc,MAAM,YAAY,KAAI,aAAY;EAC7E,IAAI,QAAQ;EACZ,aAAa,QAAQ;EACrB,WAAW,IAAI,KAAK,QAAQ,UAAU;EACtC,WAAW,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG;EAC7D,mBAAmB,QAAQ,oBAAoB,IAAI,KAAK,QAAQ,kBAAkB,GAAG;EACrF,OAAO,EACL,UAAU,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAChD;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;GACb,MAAM,sBAAM,IAAI,MAAM;GACtB,MAAM,YAAY,QAAQ,YAAY,IAAI,KAAK,QAAQ,UAAU,GAAG,MAAM;GAC1E,MAAM,YAAY,CAAC,CAAC,QAAQ;AAC5B,UAAO,CAAC,aAAa,CAAC;;EAExB,kBAAkB;GAChB,MAAM,sBAAM,IAAI,MAAM;AACtB,OAAI,QAAQ,kBAAmB,QAAO;AACtC,OAAI,QAAQ,aAAa,IAAI,KAAK,QAAQ,UAAU,GAAG,IAAK,QAAO;AACnE,UAAO;;EAEV,EAAE,GAAG,CACJ;EACE,IAAI;EACJ,aAAa;EACb,2BAAW,IAAI,KAAK,KAAK,KAAK,GAAG,OAAU;EAC3C,WAAW;EACX,mBAAmB;EACnB,OAAO,EACL,UAAU,OAAO,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI,EAC5C;EACD,MAAM;EACN,QAAQ;EACR,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,QAAQ,YAAY;AAClB,WAAQ,IAAI,6BAA6B;;EAE3C,eAAe;EACf,kBAAkB;EACnB,CACF;CAGD,IAAI;AACJ,KAAI,aACF,WAAU;UACD,aACT,WAAU,aAAa,YAAY;KAEnC,WAAU,EAAE;CAGd,MAAM,CAAC,uBAAuB,gDAAqC,MAAM;CACzE,MAAM,CAAC,gBAAgB,yCAA2D,KAAK;CAEvF,MAAM,eAAeA;CACrB,MAAM,aAAaC;CAEnB,MAAM,qBAAqB,OAAO,SAAwC;AACxE,MAAI,aAmBF,QAjBmB;GACjB,IAAI,OAAO,KAAK,KAAK;GACrB,aAAa,KAAK;GAClB,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,WAAW,KAAK,WAAW,aAAa;GACxC,OAAO,qBAAqB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,EAAE;GACnE,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,QAAQ,YAAY;AAClB,YAAQ,IAAI,6BAA6B;;GAE3C,eAAe;GACf,kBAAkB;GAClB,MAAM;GACN,QAAQ;GACT;AAIH,MAAI,CAAC,aAAc,OAAM,IAAI,MAAM,qBAAqB;AACxD,SAAO,MAAM,aAAa,aAAa,KAAK;;AAG9C,QACE,4CAACC;EACC,2CAACC;GAAO,eAAe,yBAAyB,KAAK;aAClD,EAAE,iBAAiB;IACb;EACT,2CAACC,oDAAqB,UAAW;EACjC,2CAAC;GACC,MAAM;GACN,cAAc;GACd,cAAc;GACd,cAAc;GACd,UAAU;IACV;EACF,2CAAC;GACC,QAAQ;GACR,eAAe,kBAAkB,KAAK;IACtC;KACS"}
|
|
@@ -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 lucide_react = require("lucide-react");
|
|
@@ -14,11 +14,11 @@ function EditableText(props) {
|
|
|
14
14
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
15
15
|
className: "flex items-center gap-2",
|
|
16
16
|
children: editing ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
17
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
17
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Input, {
|
|
18
18
|
value: editingValue,
|
|
19
19
|
onChange: (e) => setEditingValue(e.target.value)
|
|
20
20
|
}),
|
|
21
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
21
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
22
22
|
size: "sm",
|
|
23
23
|
onClick: async () => {
|
|
24
24
|
await props.onSave?.(editingValue);
|
|
@@ -26,7 +26,7 @@ function EditableText(props) {
|
|
|
26
26
|
},
|
|
27
27
|
children: t("Save")
|
|
28
28
|
}),
|
|
29
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
29
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
30
30
|
size: "sm",
|
|
31
31
|
variant: "secondary",
|
|
32
32
|
onClick: () => {
|
|
@@ -35,7 +35,7 @@ function EditableText(props) {
|
|
|
35
35
|
},
|
|
36
36
|
children: t("Cancel")
|
|
37
37
|
})
|
|
38
|
-
] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
38
|
+
] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Typography, { children: props.value }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hexclave_ui.Button, {
|
|
39
39
|
onClick: () => setEditing(true),
|
|
40
40
|
size: "icon",
|
|
41
41
|
variant: "ghost",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable-text.js","names":["Input","Button","Typography","Edit"],"sources":["../../../src/components-page/account-settings/editable-text.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, Input, Typography } from \"@
|
|
1
|
+
{"version":3,"file":"editable-text.js","names":["Input","Button","Typography","Edit"],"sources":["../../../src/components-page/account-settings/editable-text.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, Input, Typography } from \"@hexclave/ui\";\nimport { Edit } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"../../lib/translations\";\n\n\nexport function EditableText(props: { value: string, onSave?: (value: string) => void | Promise<void> }) {\n const [editing, setEditing] = useState(false);\n const [editingValue, setEditingValue] = useState(props.value);\n const { t } = useTranslation();\n\n return (\n <div className='flex items-center gap-2'>\n {editing ? (\n <>\n <Input\n value={editingValue}\n onChange={(e) => setEditingValue(e.target.value)}\n />\n <Button\n size='sm'\n onClick={async () => {\n await props.onSave?.(editingValue);\n setEditing(false);\n }}\n >\n {t(\"Save\")}\n </Button>\n <Button\n size='sm'\n variant='secondary'\n onClick={() => {\n setEditingValue(props.value);\n setEditing(false);\n }}>\n {t(\"Cancel\")}\n </Button>\n </>\n ) : (\n <>\n <Typography>{props.value}</Typography>\n <Button onClick={() => setEditing(true)} size='icon' variant='ghost'>\n <Edit className=\"w-4 h-4\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,aAAa,OAA4E;CACvG,MAAM,CAAC,SAAS,kCAAuB,MAAM;CAC7C,MAAM,CAAC,cAAc,uCAA4B,MAAM,MAAM;CAC7D,MAAM,EAAE,qDAAsB;AAE9B,QACE,2CAAC;EAAI,WAAU;YACZ,UACC;GACE,2CAACA;IACC,OAAO;IACP,WAAW,MAAM,gBAAgB,EAAE,OAAO,MAAM;KAChD;GACF,2CAACC;IACC,MAAK;IACL,SAAS,YAAY;AACnB,WAAM,MAAM,SAAS,aAAa;AAClC,gBAAW,MAAM;;cAGlB,EAAE,OAAO;KACH;GACT,2CAACA;IACC,MAAK;IACL,SAAQ;IACR,eAAe;AACb,qBAAgB,MAAM,MAAM;AAC5B,gBAAW,MAAM;;cAElB,EAAE,SAAS;KACL;MACR,GAEH,qFACE,2CAACC,qCAAY,MAAM,QAAmB,EACtC,2CAACD;GAAO,eAAe,WAAW,KAAK;GAAE,MAAK;GAAO,SAAQ;aAC3D,2CAACE,qBAAK,WAAU,YAAY;IACrB,IACR;GAED"}
|