@stackframe/stack 2.8.11 → 2.8.16
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/CHANGELOG.md +48 -0
- package/dist/components/api-key-dialogs.js +5 -4
- package/dist/components/api-key-dialogs.js.map +1 -1
- package/dist/components/credential-sign-in.js +4 -4
- package/dist/components/credential-sign-up.js +3 -3
- package/dist/components/elements/maybe-full-page.js +1 -1
- package/dist/components/elements/sidebar-layout.js +1 -1
- package/dist/components/magic-link-sign-in.js +6 -6
- 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/message-card.js +1 -1
- package/dist/components/message-cards/predefined-message-card.js +3 -3
- package/dist/components/oauth-button-group.js +2 -2
- package/dist/components/oauth-button.js +27 -16
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/passkey-button.js +2 -2
- package/dist/components/profile-image-editor.js +87 -34
- package/dist/components/profile-image-editor.js.map +1 -1
- package/dist/components/selected-team-switcher.js +41 -9
- package/dist/components/selected-team-switcher.js.map +1 -1
- package/dist/components/{iframe-preventer.js → use-in-iframe.js} +9 -19
- package/dist/components/use-in-iframe.js.map +1 -0
- package/dist/components/user-button.js +41 -8
- package/dist/components/user-button.js.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +57 -12
- 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 +100 -12
- package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/components-page/account-settings/editable-text.js +1 -1
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js +12 -12
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.js +15 -6
- 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 +18 -5
- 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 +18 -5
- 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 +19 -6
- 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 +20 -7
- package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/components-page/account-settings/profile-page/profile-page.js +18 -8
- package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.js +19 -10
- package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/components-page/account-settings/settings/settings-page.js +6 -6
- package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.js +15 -6
- 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 +3 -3
- package/dist/components-page/account-settings/teams/team-api-keys-section.js +9 -6
- 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 +19 -10
- package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.js +4 -4
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
- package/dist/components-page/account-settings/teams/team-member-list-section.js +7 -4
- package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-page.js +8 -8
- package/dist/components-page/account-settings/teams/team-profile-image-section.js +4 -4
- package/dist/components-page/account-settings/teams/team-profile-user-section.js +4 -4
- package/dist/components-page/account-settings.js +29 -21
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/auth-page.js +16 -17
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.js +3 -3
- 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 +9 -9
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/forgot-password.js +6 -6
- package/dist/components-page/magic-link-callback.js +7 -7
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/mfa.js +190 -0
- package/dist/components-page/mfa.js.map +1 -0
- package/dist/components-page/oauth-callback.js +4 -4
- package/dist/components-page/password-reset.js +9 -9
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/sign-in.js +3 -2
- package/dist/components-page/sign-in.js.map +1 -1
- package/dist/components-page/sign-out.js +2 -2
- package/dist/components-page/sign-up.js +1 -1
- package/dist/components-page/stack-handler.js +25 -14
- package/dist/components-page/stack-handler.js.map +1 -1
- package/dist/components-page/team-creation.js +4 -4
- package/dist/components-page/team-invitation.js +6 -6
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/esm/components/api-key-dialogs.js +5 -4
- package/dist/esm/components/api-key-dialogs.js.map +1 -1
- package/dist/esm/components/credential-sign-in.js +4 -4
- package/dist/esm/components/credential-sign-up.js +3 -3
- package/dist/esm/components/elements/maybe-full-page.js +1 -1
- package/dist/esm/components/elements/sidebar-layout.js +1 -1
- package/dist/esm/components/magic-link-sign-in.js +6 -6
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
- package/dist/esm/components/message-cards/message-card.js +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js +3 -3
- package/dist/esm/components/oauth-button-group.js +2 -2
- package/dist/esm/components/oauth-button.js +28 -17
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/passkey-button.js +2 -2
- package/dist/esm/components/profile-image-editor.js +86 -34
- package/dist/esm/components/profile-image-editor.js.map +1 -1
- package/dist/esm/components/selected-team-switcher.js +41 -9
- package/dist/esm/components/selected-team-switcher.js.map +1 -1
- package/dist/esm/components/use-in-iframe.js +18 -0
- package/dist/esm/components/use-in-iframe.js.map +1 -0
- package/dist/esm/components/user-button.js +41 -8
- package/dist/esm/components/user-button.js.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +57 -12
- 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 +100 -12
- 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 +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js +12 -12
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +15 -6
- 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 +18 -5
- 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 +18 -5
- 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 +19 -6
- 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 +20 -7
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js +18 -8
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js +19 -10
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/settings-page.js +6 -6
- package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js +15 -6
- 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 +3 -3
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +9 -6
- 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 +19 -10
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.js +4 -4
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js +7 -4
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-page.js +8 -8
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js +4 -4
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js +4 -4
- package/dist/esm/components-page/account-settings.js +29 -21
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/auth-page.js +16 -17
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.js +3 -3
- package/dist/esm/components-page/email-verification.js +6 -6
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.js +9 -9
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/forgot-password.js +6 -6
- package/dist/esm/components-page/magic-link-callback.js +7 -7
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/mfa.js +174 -0
- package/dist/esm/components-page/mfa.js.map +1 -0
- package/dist/esm/components-page/oauth-callback.js +4 -4
- package/dist/esm/components-page/password-reset.js +9 -9
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/sign-in.js +3 -2
- package/dist/esm/components-page/sign-in.js.map +1 -1
- package/dist/esm/components-page/sign-out.js +2 -2
- package/dist/esm/components-page/sign-up.js +1 -1
- package/dist/esm/components-page/stack-handler.js +25 -14
- package/dist/esm/components-page/stack-handler.js.map +1 -1
- package/dist/esm/components-page/team-creation.js +4 -4
- package/dist/esm/components-page/team-invitation.js +6 -6
- package/dist/esm/components-page/team-invitation.js.map +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 +3574 -2364
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/index.js +22 -22
- package/dist/esm/lib/auth.js +3 -3
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/cookie.js +1 -129
- package/dist/esm/lib/cookie.js.map +1 -1
- package/dist/esm/lib/hooks.js +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +8 -8
- 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.js +57 -26
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/index.js +3 -3
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +35 -17
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/index.js +3 -3
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +1 -1
- package/dist/esm/lib/stack-app/common.js.map +1 -1
- package/dist/esm/lib/stack-app/index.js +2 -2
- package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/esm/lib/stack-app/users/index.js.map +1 -1
- package/dist/esm/lib/translations.js +1 -1
- package/dist/esm/providers/stack-provider-client.js +2 -2
- package/dist/esm/providers/stack-provider.js +3 -3
- package/dist/esm/providers/theme-provider.js +3 -3
- package/dist/esm/providers/translation-provider.js +2 -2
- package/dist/esm/utils/browser-script.js +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 +3574 -2364
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/index.d.mts +73 -2
- package/dist/index.d.ts +73 -2
- package/dist/index.js +23 -23
- package/dist/index.js.map +1 -1
- package/dist/lib/auth.js +3 -3
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/cookie.js +4 -132
- package/dist/lib/cookie.js.map +1 -1
- package/dist/lib/hooks.js +1 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +8 -8
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js +57 -26
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/index.js +3 -3
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +35 -17
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/index.js +3 -3
- package/dist/lib/stack-app/apps/interfaces/admin-app.js +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.js +1 -1
- package/dist/lib/stack-app/common.js.map +1 -1
- package/dist/lib/stack-app/index.js +2 -2
- package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/lib/stack-app/users/index.js.map +1 -1
- package/dist/lib/translations.js +1 -1
- package/dist/providers/stack-provider-client.js +2 -2
- package/dist/providers/stack-provider.js +3 -3
- package/dist/providers/theme-provider.js +3 -3
- package/dist/providers/translation-provider.js +2 -2
- package/dist/utils/browser-script.js +1 -1
- package/package.json +5 -5
- package/dist/components/iframe-preventer.js.map +0 -1
- package/dist/esm/components/iframe-preventer.js +0 -28
- package/dist/esm/components/iframe-preventer.js.map +0 -1
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
// src/components-page/cli-auth-confirm.tsx
|
|
5
5
|
import { Typography } from "@stackframe/stack-ui";
|
|
6
6
|
import { useState } from "react";
|
|
7
|
-
import { stackAppInternalsSymbol, useStackApp } from "
|
|
8
|
-
import { MessageCard } from "../components/message-cards/message-card";
|
|
9
|
-
import { useTranslation } from "../lib/translations";
|
|
7
|
+
import { stackAppInternalsSymbol, useStackApp } from "../index.js";
|
|
8
|
+
import { MessageCard } from "../components/message-cards/message-card.js";
|
|
9
|
+
import { useTranslation } from "../lib/translations.js";
|
|
10
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
11
|
function CliAuthConfirmation({ fullPage = true }) {
|
|
12
12
|
const { t } = useTranslation();
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
import { KnownErrors } from "@stackframe/stack-shared";
|
|
6
6
|
import { throwErr } from "@stackframe/stack-shared/dist/utils/errors";
|
|
7
7
|
import React from "react";
|
|
8
|
-
import { useStackApp, useUser } from "
|
|
9
|
-
import { MessageCard } from "../components/message-cards/message-card";
|
|
10
|
-
import { useTranslation } from "../lib/translations";
|
|
8
|
+
import { useStackApp, useUser } from "../index.js";
|
|
9
|
+
import { MessageCard } from "../components/message-cards/message-card.js";
|
|
10
|
+
import { useTranslation } from "../lib/translations.js";
|
|
11
11
|
import { jsx } from "react/jsx-runtime";
|
|
12
12
|
function EmailVerification(props) {
|
|
13
13
|
const { t } = useTranslation();
|
|
@@ -38,11 +38,11 @@ function EmailVerification(props) {
|
|
|
38
38
|
);
|
|
39
39
|
} else {
|
|
40
40
|
if (result.status === "error") {
|
|
41
|
-
if (result.error
|
|
41
|
+
if (KnownErrors.VerificationCodeNotFound.isInstance(result.error)) {
|
|
42
42
|
return invalidJsx;
|
|
43
|
-
} else if (result.error
|
|
43
|
+
} else if (KnownErrors.VerificationCodeExpired.isInstance(result.error)) {
|
|
44
44
|
return expiredJsx;
|
|
45
|
-
} else if (result.error
|
|
45
|
+
} else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(result.error)) {
|
|
46
46
|
} else {
|
|
47
47
|
throw result.error;
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components-page/email-verification.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport React from \"react\";\nimport { useStackApp, useUser } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function EmailVerification(props: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser();\n const [result, setResult] = React.useState<Awaited<ReturnType<typeof stackApp.verifyEmail>> | null>(null);\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Verification Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Please check if you have the correct link. If you continue to have issues, please contact support.\")}</p>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Verification Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Your email verification link has expired. Please request a new verification link from your account settings.\")}</p>\n </MessageCard>\n );\n\n if (!props.searchParams?.code) {\n return invalidJsx;\n }\n\n if (!result) {\n return <MessageCard\n title={t(\"Do you want to verify your email?\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Verify\")}\n primaryAction={async () => {\n const result = await stackApp.verifyEmail(props.searchParams?.code || throwErr(\"No verification code provided\"));\n setResult(result);\n }}\n secondaryButtonText={t(\"Cancel\")}\n secondaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n } else {\n if (result.status === 'error') {\n if (result.error
|
|
1
|
+
{"version":3,"sources":["../../../src/components-page/email-verification.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport React from \"react\";\nimport { useStackApp, useUser } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function EmailVerification(props: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser();\n const [result, setResult] = React.useState<Awaited<ReturnType<typeof stackApp.verifyEmail>> | null>(null);\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Verification Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Please check if you have the correct link. If you continue to have issues, please contact support.\")}</p>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Verification Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Your email verification link has expired. Please request a new verification link from your account settings.\")}</p>\n </MessageCard>\n );\n\n if (!props.searchParams?.code) {\n return invalidJsx;\n }\n\n if (!result) {\n return <MessageCard\n title={t(\"Do you want to verify your email?\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Verify\")}\n primaryAction={async () => {\n const result = await stackApp.verifyEmail(props.searchParams?.code || throwErr(\"No verification code provided\"));\n setResult(result);\n }}\n secondaryButtonText={t(\"Cancel\")}\n secondaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n } else {\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 // everything fine, continue\n } else {\n throw result.error;\n }\n }\n\n return <MessageCard\n title={t(\"You email has been verified!\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Go home\")}\n primaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n }\n}\n"],"mappings":";;;AAOA,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAClB,SAAS,aAAa,eAAe;AACrC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAazB;AAXC,SAAS,kBAAkB,OAG/B;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,WAAW,YAAY;AAC7B,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAkE,IAAI;AAExG,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,2BAA2B,GAAG,UAAU,CAAC,CAAC,MAAM,UACpE,8BAAC,OAAG,YAAE,oGAAoG,GAAE,GAC9G;AAGF,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,2BAA2B,GAAG,UAAU,CAAC,CAAC,MAAM,UACpE,8BAAC,OAAG,YAAE,8GAA8G,GAAE,GACxH;AAGF,MAAI,CAAC,MAAM,cAAc,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MAAC;AAAA;AAAA,QACN,OAAO,EAAE,mCAAmC;AAAA,QAC5C,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,QAAQ;AAAA,QAC7B,eAAe,YAAY;AACzB,gBAAMA,UAAS,MAAM,SAAS,YAAY,MAAM,cAAc,QAAQ,SAAS,+BAA+B,CAAC;AAC/G,oBAAUA,OAAM;AAAA,QAClB;AAAA,QACA,qBAAqB,EAAE,QAAQ;AAAA,QAC/B,iBAAiB,YAAY;AAC3B,gBAAM,SAAS,eAAe;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,OAAO,WAAW,SAAS;AAC7B,UAAI,YAAY,yBAAyB,WAAW,OAAO,KAAK,GAAG;AACjE,eAAO;AAAA,MACT,WAAW,YAAY,wBAAwB,WAAW,OAAO,KAAK,GAAG;AACvE,eAAO;AAAA,MACT,WAAW,YAAY,4BAA4B,WAAW,OAAO,KAAK,GAAG;AAAA,MAE7E,OAAO;AACL,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MAAC;AAAA;AAAA,QACN,OAAO,EAAE,8BAA8B;AAAA,QACvC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,SAAS;AAAA,QAC9B,eAAe,YAAY;AACzB,gBAAM,SAAS,eAAe;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,EACF;AACF;","names":["result"]}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
// src/components-page/error-page.tsx
|
|
5
5
|
import { KnownError, KnownErrors } from "@stackframe/stack-shared";
|
|
6
6
|
import { Typography } from "@stackframe/stack-ui";
|
|
7
|
-
import { useStackApp } from "
|
|
8
|
-
import { KnownErrorMessageCard } from "../components/message-cards/known-error-message-card";
|
|
9
|
-
import { MessageCard } from "../components/message-cards/message-card";
|
|
10
|
-
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
|
|
11
|
-
import { useTranslation } from "../lib/translations";
|
|
7
|
+
import { useStackApp } from "../index.js";
|
|
8
|
+
import { KnownErrorMessageCard } from "../components/message-cards/known-error-message-card.js";
|
|
9
|
+
import { MessageCard } from "../components/message-cards/message-card.js";
|
|
10
|
+
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
|
|
11
|
+
import { useTranslation } from "../lib/translations.js";
|
|
12
12
|
import { jsx } from "react/jsx-runtime";
|
|
13
13
|
function ErrorPage(props) {
|
|
14
14
|
const { t } = useTranslation();
|
|
@@ -27,7 +27,7 @@ function ErrorPage(props) {
|
|
|
27
27
|
} catch (e) {
|
|
28
28
|
return unknownErrorCard;
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
30
|
+
if (KnownErrors.OAuthConnectionAlreadyConnectedToAnotherUser.isInstance(error)) {
|
|
31
31
|
return /* @__PURE__ */ jsx(
|
|
32
32
|
MessageCard,
|
|
33
33
|
{
|
|
@@ -39,7 +39,7 @@ function ErrorPage(props) {
|
|
|
39
39
|
}
|
|
40
40
|
);
|
|
41
41
|
}
|
|
42
|
-
if (
|
|
42
|
+
if (KnownErrors.UserAlreadyConnectedToAnotherOAuthConnection.isInstance(error)) {
|
|
43
43
|
return /* @__PURE__ */ jsx(
|
|
44
44
|
MessageCard,
|
|
45
45
|
{
|
|
@@ -51,7 +51,7 @@ function ErrorPage(props) {
|
|
|
51
51
|
}
|
|
52
52
|
);
|
|
53
53
|
}
|
|
54
|
-
if (
|
|
54
|
+
if (KnownErrors.OAuthProviderAccessDenied.isInstance(error)) {
|
|
55
55
|
return /* @__PURE__ */ jsx(
|
|
56
56
|
MessageCard,
|
|
57
57
|
{
|
|
@@ -61,7 +61,7 @@ function ErrorPage(props) {
|
|
|
61
61
|
primaryAction: () => stackApp.redirectToSignIn(),
|
|
62
62
|
secondaryButtonText: t("Go Home"),
|
|
63
63
|
secondaryAction: () => stackApp.redirectToHome(),
|
|
64
|
-
children: /* @__PURE__ */ jsx(Typography, { children: t("The sign-in operation has been cancelled. Please try again.
|
|
64
|
+
children: /* @__PURE__ */ jsx(Typography, { children: t("The sign-in operation has been cancelled or denied. Please try again.") })
|
|
65
65
|
}
|
|
66
66
|
);
|
|
67
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components-page/error-page.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownError, KnownErrors } from \"@stackframe/stack-shared\";\nimport { Typography } from \"@stackframe/stack-ui\";\nimport { useStackApp } from \"..\";\nimport { KnownErrorMessageCard } from \"../components/message-cards/known-error-message-card\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\n\nexport function ErrorPage(props: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const errorCode = props.searchParams.errorCode;\n const message = props.searchParams.message;\n const details = props.searchParams.details;\n\n const unknownErrorCard = <PredefinedMessageCard type='unknownError' fullPage={!!props.fullPage} />;\n\n if (!errorCode || !message) {\n return unknownErrorCard;\n }\n\n let error;\n try {\n const detailJson = details ? JSON.parse(details) : {};\n error = KnownError.fromJson({ code: errorCode, message, details: detailJson });\n } catch (e) {\n return unknownErrorCard;\n }\n\n if (
|
|
1
|
+
{"version":3,"sources":["../../../src/components-page/error-page.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownError, KnownErrors } from \"@stackframe/stack-shared\";\nimport { Typography } from \"@stackframe/stack-ui\";\nimport { useStackApp } from \"..\";\nimport { KnownErrorMessageCard } from \"../components/message-cards/known-error-message-card\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\n\nexport function ErrorPage(props: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const errorCode = props.searchParams.errorCode;\n const message = props.searchParams.message;\n const details = props.searchParams.details;\n\n const unknownErrorCard = <PredefinedMessageCard type='unknownError' fullPage={!!props.fullPage} />;\n\n if (!errorCode || !message) {\n return unknownErrorCard;\n }\n\n let error;\n try {\n const detailJson = details ? JSON.parse(details) : {};\n error = KnownError.fromJson({ code: errorCode, message, details: detailJson });\n } catch (e) {\n return unknownErrorCard;\n }\n\n if (KnownErrors.OAuthConnectionAlreadyConnectedToAnotherUser.isInstance(error)) {\n // TODO: add \"Connect a different account\" button\n return (\n <MessageCard\n title={t(\"Failed to connect account\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Go Home\")}\n primaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>\n {t(\"This account is already connected to another user. Please connect a different account.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n if (KnownErrors.UserAlreadyConnectedToAnotherOAuthConnection.isInstance(error)) {\n // TODO: add \"Connect again\" button\n return (\n <MessageCard\n title={t(\"Failed to connect account\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Go Home\")}\n primaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>\n {t(\"The user is already connected to another OAuth account. Did you maybe selected the wrong account on the OAuth provider page?\")}\n </Typography>\n </MessageCard>\n );\n }\n\n if (KnownErrors.OAuthProviderAccessDenied.isInstance(error)) {\n return (\n <MessageCard\n title={t(\"OAuth provider access denied\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Sign in again\")}\n primaryAction={() => stackApp.redirectToSignIn()}\n secondaryButtonText={t(\"Go Home\")}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>\n {t(\"The sign-in operation has been cancelled or denied. Please try again.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n return <KnownErrorMessageCard error={error} fullPage={!!props.fullPage} />;\n}\n"],"mappings":";;;AAOA,SAAS,YAAY,mBAAmB;AACxC,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAUJ;AAPpB,SAAS,UAAU,OAAqE;AAC7F,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,WAAW,YAAY;AAC7B,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,UAAU,MAAM,aAAa;AACnC,QAAM,UAAU,MAAM,aAAa;AAEnC,QAAM,mBAAmB,oBAAC,yBAAsB,MAAK,gBAAe,UAAU,CAAC,CAAC,MAAM,UAAU;AAEhG,MAAI,CAAC,aAAa,CAAC,SAAS;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,aAAa,UAAU,KAAK,MAAM,OAAO,IAAI,CAAC;AACpD,YAAQ,WAAW,SAAS,EAAE,MAAM,WAAW,SAAS,SAAS,WAAW,CAAC;AAAA,EAC/E,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,6CAA6C,WAAW,KAAK,GAAG;AAE9E,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,2BAA2B;AAAA,QACpC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,SAAS;AAAA,QAC9B,eAAe,MAAM,SAAS,eAAe;AAAA,QAE7C,8BAAC,cACE,YAAE,wFAAwF,GAC7F;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,YAAY,6CAA6C,WAAW,KAAK,GAAG;AAE9E,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,2BAA2B;AAAA,QACpC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,SAAS;AAAA,QAC9B,eAAe,MAAM,SAAS,eAAe;AAAA,QAE7C,8BAAC,cACE,YAAE,8HAA8H,GACnI;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,YAAY,0BAA0B,WAAW,KAAK,GAAG;AAC3D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,8BAA8B;AAAA,QACvC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,eAAe;AAAA,QACpC,eAAe,MAAM,SAAS,iBAAiB;AAAA,QAC/C,qBAAqB,EAAE,SAAS;AAAA,QAChC,iBAAiB,MAAM,SAAS,eAAe;AAAA,QAE/C,8BAAC,cACE,YAAE,uEAAuE,GAC5E;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO,oBAAC,yBAAsB,OAAc,UAAU,CAAC,CAAC,MAAM,UAAU;AAC1E;","names":[]}
|
|
@@ -8,12 +8,12 @@ import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/
|
|
|
8
8
|
import { Button, Input, Label, Typography, cn } from "@stackframe/stack-ui";
|
|
9
9
|
import { useState } from "react";
|
|
10
10
|
import { useForm } from "react-hook-form";
|
|
11
|
-
import { useStackApp, useUser } from "
|
|
12
|
-
import { FormWarningText } from "../components/elements/form-warning";
|
|
13
|
-
import { MaybeFullPage } from "../components/elements/maybe-full-page";
|
|
14
|
-
import { StyledLink } from "../components/link";
|
|
15
|
-
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
|
|
16
|
-
import { useTranslation } from "../lib/translations";
|
|
11
|
+
import { useStackApp, useUser } from "../index.js";
|
|
12
|
+
import { FormWarningText } from "../components/elements/form-warning.js";
|
|
13
|
+
import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
|
|
14
|
+
import { StyledLink } from "../components/link.js";
|
|
15
|
+
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
|
|
16
|
+
import { useTranslation } from "../lib/translations.js";
|
|
17
17
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
18
|
function ForgotPasswordForm({ onSent }) {
|
|
19
19
|
const { t } = useTranslation();
|
|
@@ -6,10 +6,10 @@ import { KnownErrors } from "@stackframe/stack-shared";
|
|
|
6
6
|
import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
|
|
7
7
|
import { throwErr } from "@stackframe/stack-shared/dist/utils/errors";
|
|
8
8
|
import React from "react";
|
|
9
|
-
import { useStackApp, useUser } from "
|
|
10
|
-
import { MessageCard } from "../components/message-cards/message-card";
|
|
11
|
-
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
|
|
12
|
-
import { useTranslation } from "../lib/translations";
|
|
9
|
+
import { useStackApp, useUser } from "../index.js";
|
|
10
|
+
import { MessageCard } from "../components/message-cards/message-card.js";
|
|
11
|
+
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
|
|
12
|
+
import { useTranslation } from "../lib/translations.js";
|
|
13
13
|
import { jsx } from "react/jsx-runtime";
|
|
14
14
|
var cacheSignInWithMagicLink = cacheFunction(async (stackApp, code) => {
|
|
15
15
|
return await stackApp.signInWithMagicLink(code);
|
|
@@ -47,11 +47,11 @@ function MagicLinkCallback(props) {
|
|
|
47
47
|
);
|
|
48
48
|
} else {
|
|
49
49
|
if (result.status === "error") {
|
|
50
|
-
if (result.error
|
|
50
|
+
if (KnownErrors.VerificationCodeNotFound.isInstance(result.error)) {
|
|
51
51
|
return invalidJsx;
|
|
52
|
-
} else if (result.error
|
|
52
|
+
} else if (KnownErrors.VerificationCodeExpired.isInstance(result.error)) {
|
|
53
53
|
return expiredJsx;
|
|
54
|
-
} else if (result.error
|
|
54
|
+
} else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(result.error)) {
|
|
55
55
|
return alreadyUsedJsx;
|
|
56
56
|
} else {
|
|
57
57
|
throw result.error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components-page/magic-link-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport React from \"react\";\nimport { StackClientApp, useStackApp, useUser } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cacheSignInWithMagicLink = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.signInWithMagicLink(code);\n});\n\nexport function MagicLinkCallback(props: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser();\n const [result, setResult] = React.useState<Awaited<ReturnType<typeof stackApp.signInWithMagicLink>> | null>(null);\n\n if (user) {\n return <PredefinedMessageCard type='signedIn' fullPage={!!props.fullPage} />;\n }\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Please check if you have the correct link. If you continue to have issues, please contact support.\")}</p>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Your magic link has expired. Please request a new magic link if you need to sign-in.\")}</p>\n </MessageCard>\n );\n\n const alreadyUsedJsx = (\n <MessageCard title={t(\"Magic Link Already Used\")} fullPage={!!props.fullPage}>\n <p>{t(\"The magic link has already been used. The link can only be used once. Please request a new magic link if you need to sign-in again.\")}</p>\n </MessageCard>\n );\n\n if (!props.searchParams?.code) {\n return invalidJsx;\n }\n\n if (!result) {\n return <MessageCard\n title={t(\"Do you want to sign in?\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Sign in\")}\n primaryAction={async () => {\n const result = await stackApp.signInWithMagicLink(props.searchParams?.code || throwErr(\"No magic link provided\"));\n setResult(result);\n }}\n secondaryButtonText={t(\"Cancel\")}\n secondaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n } else {\n if (result.status === 'error') {\n if (result.error
|
|
1
|
+
{"version":3,"sources":["../../../src/components-page/magic-link-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport React from \"react\";\nimport { StackClientApp, useStackApp, useUser } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cacheSignInWithMagicLink = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.signInWithMagicLink(code);\n});\n\nexport function MagicLinkCallback(props: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser();\n const [result, setResult] = React.useState<Awaited<ReturnType<typeof stackApp.signInWithMagicLink>> | null>(null);\n\n if (user) {\n return <PredefinedMessageCard type='signedIn' fullPage={!!props.fullPage} />;\n }\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Please check if you have the correct link. If you continue to have issues, please contact support.\")}</p>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Your magic link has expired. Please request a new magic link if you need to sign-in.\")}</p>\n </MessageCard>\n );\n\n const alreadyUsedJsx = (\n <MessageCard title={t(\"Magic Link Already Used\")} fullPage={!!props.fullPage}>\n <p>{t(\"The magic link has already been used. The link can only be used once. Please request a new magic link if you need to sign-in again.\")}</p>\n </MessageCard>\n );\n\n if (!props.searchParams?.code) {\n return invalidJsx;\n }\n\n if (!result) {\n return <MessageCard\n title={t(\"Do you want to sign in?\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Sign in\")}\n primaryAction={async () => {\n const result = await stackApp.signInWithMagicLink(props.searchParams?.code || throwErr(\"No magic link provided\"));\n setResult(result);\n }}\n secondaryButtonText={t(\"Cancel\")}\n secondaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n } else {\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 alreadyUsedJsx;\n } else {\n throw result.error;\n }\n }\n\n return <MessageCard\n title={t(\"Signed in successfully!\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Go home\")}\n primaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n }\n}\n"],"mappings":";;;AAOA,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAClB,SAAyB,aAAa,eAAe;AACrD,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAgBpB;AAdX,IAAM,2BAA2B,cAAc,OAAO,UAAgC,SAAiB;AACrG,SAAO,MAAM,SAAS,oBAAoB,IAAI;AAChD,CAAC;AAEM,SAAS,kBAAkB,OAG/B;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,WAAW,YAAY;AAC7B,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAA0E,IAAI;AAEhH,MAAI,MAAM;AACR,WAAO,oBAAC,yBAAsB,MAAK,YAAW,UAAU,CAAC,CAAC,MAAM,UAAU;AAAA,EAC5E;AAEA,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,CAAC,MAAM,UAC7D,8BAAC,OAAG,YAAE,oGAAoG,GAAE,GAC9G;AAGF,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,CAAC,MAAM,UAC7D,8BAAC,OAAG,YAAE,sFAAsF,GAAE,GAChG;AAGF,QAAM,iBACJ,oBAAC,eAAY,OAAO,EAAE,yBAAyB,GAAG,UAAU,CAAC,CAAC,MAAM,UAClE,8BAAC,OAAG,YAAE,qIAAqI,GAAE,GAC/I;AAGF,MAAI,CAAC,MAAM,cAAc,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MAAC;AAAA;AAAA,QACN,OAAO,EAAE,yBAAyB;AAAA,QAClC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,SAAS;AAAA,QAC9B,eAAe,YAAY;AACzB,gBAAMA,UAAS,MAAM,SAAS,oBAAoB,MAAM,cAAc,QAAQ,SAAS,wBAAwB,CAAC;AAChH,oBAAUA,OAAM;AAAA,QAClB;AAAA,QACA,qBAAqB,EAAE,QAAQ;AAAA,QAC/B,iBAAiB,YAAY;AAC3B,gBAAM,SAAS,eAAe;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,OAAO,WAAW,SAAS;AAC7B,UAAI,YAAY,yBAAyB,WAAW,OAAO,KAAK,GAAG;AACjE,eAAO;AAAA,MACT,WAAW,YAAY,wBAAwB,WAAW,OAAO,KAAK,GAAG;AACvE,eAAO;AAAA,MACT,WAAW,YAAY,4BAA4B,WAAW,OAAO,KAAK,GAAG;AAC3E,eAAO;AAAA,MACT,OAAO;AACL,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MAAC;AAAA;AAAA,QACN,OAAO,EAAE,yBAAyB;AAAA,QAClC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,SAAS;AAAA,QAC9B,eAAe,YAAY;AACzB,gBAAM,SAAS,eAAe;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,EACF;AACF;","names":["result"]}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
// src/components-page/mfa.tsx
|
|
5
|
+
import { KnownErrors } from "@stackframe/stack-shared";
|
|
6
|
+
import {
|
|
7
|
+
Button,
|
|
8
|
+
InputOTP,
|
|
9
|
+
InputOTPGroup,
|
|
10
|
+
InputOTPSlot,
|
|
11
|
+
Spinner,
|
|
12
|
+
Typography,
|
|
13
|
+
cn
|
|
14
|
+
} from "@stackframe/stack-ui";
|
|
15
|
+
import { CheckIcon } from "lucide-react";
|
|
16
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
17
|
+
import { useStackApp } from "../index.js";
|
|
18
|
+
import { FormWarningText } from "../components/elements/form-warning.js";
|
|
19
|
+
import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
|
|
20
|
+
import { useTranslation } from "../lib/translations.js";
|
|
21
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
|
+
function MfaForm({ onSuccess, onCancel }) {
|
|
23
|
+
const stackApp = useStackApp();
|
|
24
|
+
const { t } = useTranslation();
|
|
25
|
+
const [otp, setOtp] = useState("");
|
|
26
|
+
const formRef = useRef(null);
|
|
27
|
+
const [submitting, setSubmitting] = useState(false);
|
|
28
|
+
const [error, setError] = useState(null);
|
|
29
|
+
const [verified, setVerified] = useState(false);
|
|
30
|
+
const [attemptCode, setAttemptCode] = useState(null);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!attemptCode && typeof window !== "undefined") {
|
|
33
|
+
const code = window.sessionStorage.getItem("stack_mfa_attempt_code");
|
|
34
|
+
if (code) {
|
|
35
|
+
setAttemptCode(code);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}, [attemptCode]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (otp.length === 6 && !submitting) {
|
|
41
|
+
if (document.activeElement instanceof HTMLElement) {
|
|
42
|
+
document.activeElement.blur();
|
|
43
|
+
}
|
|
44
|
+
if (formRef.current) {
|
|
45
|
+
const inputs = formRef.current.querySelectorAll("input");
|
|
46
|
+
for (const input of inputs) {
|
|
47
|
+
input.blur();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
setSubmitting(true);
|
|
51
|
+
setError(null);
|
|
52
|
+
if (attemptCode) {
|
|
53
|
+
stackApp.signInWithMfa(otp, attemptCode, { noRedirect: true }).then(async (result) => {
|
|
54
|
+
if (result.status === "ok") {
|
|
55
|
+
setVerified(true);
|
|
56
|
+
if (typeof window !== "undefined") {
|
|
57
|
+
window.sessionStorage.removeItem("stack_mfa_attempt_code");
|
|
58
|
+
}
|
|
59
|
+
if (onSuccess) {
|
|
60
|
+
onSuccess();
|
|
61
|
+
} else {
|
|
62
|
+
await stackApp.redirectToAfterSignIn();
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
throw result.error;
|
|
66
|
+
}
|
|
67
|
+
}).catch((e) => {
|
|
68
|
+
if (e instanceof KnownErrors.InvalidTotpCode) {
|
|
69
|
+
setError(t("Invalid TOTP code"));
|
|
70
|
+
} else {
|
|
71
|
+
setError(t("Verification failed"));
|
|
72
|
+
}
|
|
73
|
+
}).finally(() => {
|
|
74
|
+
setSubmitting(false);
|
|
75
|
+
if (!verified) {
|
|
76
|
+
setOtp("");
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
} else {
|
|
80
|
+
setSubmitting(false);
|
|
81
|
+
setError(t("Missing verification information"));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (otp.length !== 0 && otp.length !== 6) {
|
|
85
|
+
setError(null);
|
|
86
|
+
}
|
|
87
|
+
}, [otp, submitting, onSuccess, attemptCode, stackApp, t, verified]);
|
|
88
|
+
const inputStyleClass = useMemo(() => {
|
|
89
|
+
if (verified) {
|
|
90
|
+
return "opacity-85 transition-all duration-300";
|
|
91
|
+
}
|
|
92
|
+
if (error) {
|
|
93
|
+
return "ring-red-500 border-red-500";
|
|
94
|
+
}
|
|
95
|
+
return "focus:ring-primary/50";
|
|
96
|
+
}, [error, verified]);
|
|
97
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-stretch stack-scope", children: [
|
|
98
|
+
/* @__PURE__ */ jsxs("form", { ref: formRef, className: "w-full flex flex-col items-center gap-4", children: [
|
|
99
|
+
/* @__PURE__ */ jsx(
|
|
100
|
+
InputOTP,
|
|
101
|
+
{
|
|
102
|
+
maxLength: 6,
|
|
103
|
+
type: "text",
|
|
104
|
+
inputMode: "numeric",
|
|
105
|
+
placeholder: "\xB7\xB7\xB7\xB7\xB7\xB7",
|
|
106
|
+
value: otp,
|
|
107
|
+
onChange: (value) => setOtp(value.toUpperCase()),
|
|
108
|
+
disabled: submitting || verified,
|
|
109
|
+
children: /* @__PURE__ */ jsx(InputOTPGroup, { children: [0, 1, 2, 3, 4, 5].map((index) => /* @__PURE__ */ jsx(
|
|
110
|
+
InputOTPSlot,
|
|
111
|
+
{
|
|
112
|
+
index,
|
|
113
|
+
size: "lg",
|
|
114
|
+
className: cn(
|
|
115
|
+
"border focus:ring-2 transition-all",
|
|
116
|
+
inputStyleClass
|
|
117
|
+
)
|
|
118
|
+
},
|
|
119
|
+
index
|
|
120
|
+
)) })
|
|
121
|
+
}
|
|
122
|
+
),
|
|
123
|
+
/* @__PURE__ */ jsxs("div", { className: "h-8 flex flex-col gap-4 items-center justify-center w-full", children: [
|
|
124
|
+
verified ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 animate-in fade-in duration-300 slide-in-from-bottom-2", children: [
|
|
125
|
+
/* @__PURE__ */ jsx(CheckIcon, { className: "w-5 h-5 text-green-600 animate-in zoom-in duration-300" }),
|
|
126
|
+
/* @__PURE__ */ jsx(Typography, { className: "text-sm font-medium", children: t("Verified! Redirecting...") })
|
|
127
|
+
] }) : submitting ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
128
|
+
/* @__PURE__ */ jsx(Spinner, { className: "text-primary h-4 w-4" }),
|
|
129
|
+
/* @__PURE__ */ jsx(Typography, { className: "text-sm", children: t("Verifying...") })
|
|
130
|
+
] }) : null,
|
|
131
|
+
error !== null && !submitting && !verified ? /* @__PURE__ */ jsx(FormWarningText, { text: error }) : null
|
|
132
|
+
] })
|
|
133
|
+
] }),
|
|
134
|
+
onCancel && !verified && /* @__PURE__ */ jsx(
|
|
135
|
+
Button,
|
|
136
|
+
{
|
|
137
|
+
variant: "link",
|
|
138
|
+
onClick: onCancel,
|
|
139
|
+
className: "underline mt-4 self-center",
|
|
140
|
+
disabled: submitting || verified,
|
|
141
|
+
children: t("Cancel")
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
] });
|
|
145
|
+
}
|
|
146
|
+
function MFA(props) {
|
|
147
|
+
const { t } = useTranslation();
|
|
148
|
+
const headerText = t("Multi-Factor Authentication");
|
|
149
|
+
const instructionText = t("Enter the six-digit code from your authenticator app");
|
|
150
|
+
if (props.fullPage) {
|
|
151
|
+
return /* @__PURE__ */ jsx(MaybeFullPage, { fullPage: true, children: /* @__PURE__ */ jsxs(
|
|
152
|
+
"div",
|
|
153
|
+
{
|
|
154
|
+
className: "stack-scope flex flex-col items-stretch",
|
|
155
|
+
style: { maxWidth: "380px", flexBasis: "380px", padding: "1rem" },
|
|
156
|
+
children: [
|
|
157
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center mb-6", children: [
|
|
158
|
+
/* @__PURE__ */ jsx(Typography, { type: "h2", children: headerText }),
|
|
159
|
+
/* @__PURE__ */ jsx(Typography, { className: "mt-2", children: instructionText })
|
|
160
|
+
] }),
|
|
161
|
+
/* @__PURE__ */ jsx(MfaForm, { onSuccess: props.onSuccess, onCancel: props.onCancel })
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
) });
|
|
165
|
+
}
|
|
166
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-stretch stack-scope", children: [
|
|
167
|
+
/* @__PURE__ */ jsx(Typography, { className: "mb-4 text-center", children: instructionText }),
|
|
168
|
+
/* @__PURE__ */ jsx(MfaForm, { onSuccess: props.onSuccess, onCancel: props.onCancel })
|
|
169
|
+
] });
|
|
170
|
+
}
|
|
171
|
+
export {
|
|
172
|
+
MFA
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=mfa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"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\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 const 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 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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","names":[]}
|
|
@@ -6,10 +6,10 @@ import { captureError } from "@stackframe/stack-shared/dist/utils/errors";
|
|
|
6
6
|
import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
|
|
7
7
|
import { Spinner, cn } from "@stackframe/stack-ui";
|
|
8
8
|
import { useEffect, useRef, useState } from "react";
|
|
9
|
-
import { useStackApp } from "
|
|
10
|
-
import { MaybeFullPage } from "../components/elements/maybe-full-page";
|
|
11
|
-
import { StyledLink } from "../components/link";
|
|
12
|
-
import { useTranslation } from "../lib/translations";
|
|
9
|
+
import { useStackApp } from "../index.js";
|
|
10
|
+
import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
|
|
11
|
+
import { StyledLink } from "../components/link.js";
|
|
12
|
+
import { useTranslation } from "../lib/translations.js";
|
|
13
13
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
14
|
function OAuthCallback({ fullPage }) {
|
|
15
15
|
const { t } = useTranslation();
|
|
@@ -12,12 +12,12 @@ import { Button, Label, PasswordInput, Typography, cn } from "@stackframe/stack-
|
|
|
12
12
|
import React, { useState } from "react";
|
|
13
13
|
import { useForm } from "react-hook-form";
|
|
14
14
|
import * as yup from "yup";
|
|
15
|
-
import { useStackApp } from "
|
|
16
|
-
import { FormWarningText } from "../components/elements/form-warning";
|
|
17
|
-
import { MaybeFullPage } from "../components/elements/maybe-full-page";
|
|
18
|
-
import { MessageCard } from "../components/message-cards/message-card";
|
|
19
|
-
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
|
|
20
|
-
import { useTranslation } from "../lib/translations";
|
|
15
|
+
import { useStackApp } from "../index.js";
|
|
16
|
+
import { FormWarningText } from "../components/elements/form-warning.js";
|
|
17
|
+
import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
|
|
18
|
+
import { MessageCard } from "../components/message-cards/message-card.js";
|
|
19
|
+
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
|
|
20
|
+
import { useTranslation } from "../lib/translations.js";
|
|
21
21
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
22
|
function PasswordResetForm(props) {
|
|
23
23
|
const { t } = useTranslation();
|
|
@@ -126,11 +126,11 @@ function PasswordReset({
|
|
|
126
126
|
}
|
|
127
127
|
const result = React.use(cachedVerifyPasswordResetCode(stackApp, code));
|
|
128
128
|
if (result.status === "error") {
|
|
129
|
-
if (result.error
|
|
129
|
+
if (KnownErrors.VerificationCodeNotFound.isInstance(result.error)) {
|
|
130
130
|
return invalidJsx;
|
|
131
|
-
} else if (result.error
|
|
131
|
+
} else if (KnownErrors.VerificationCodeExpired.isInstance(result.error)) {
|
|
132
132
|
return expiredJsx;
|
|
133
|
-
} else if (result.error
|
|
133
|
+
} else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(result.error)) {
|
|
134
134
|
return usedJsx;
|
|
135
135
|
} else {
|
|
136
136
|
throw result.error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"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\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { getPasswordError } from \"@stackframe/stack-shared/dist/helpers/password\";\nimport { passwordSchema, yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Label, PasswordInput, Typography, cn } from \"@stackframe/stack-ui\";\nimport React, { 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 = React.use(cachedVerifyPasswordResetCode(stackApp, code));\n\n if (result.status === 'error') {\n if (result.error instanceof KnownErrors.VerificationCodeNotFound) {\n return invalidJsx;\n } else if (result.error instanceof KnownErrors.VerificationCodeExpired) {\n return expiredJsx;\n } else if (result.error instanceof KnownErrors.VerificationCodeAlreadyUsed) {\n return usedJsx;\n } else {\n throw result.error;\n }\n }\n\n return <PasswordResetForm code={code} fullPage={fullPage} />;\n}\n"],"mappings":";;;AAOA,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB;AACjC,SAAS,gBAAgB,WAAW,iBAAiB;AACrD,SAAS,qBAAqB;AAC9B,SAAS,kCAAkC;AAC3C,SAAS,QAAQ,OAAO,eAAe,YAAY,UAAU;AAC7D,OAAO,SAAS,gBAAgB;AAChC,SAAS,eAAe;AACxB,YAAY,SAAS;AACrB,SAAyB,mBAAmB;AAC5C,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAgDpB,cAsBH,YAtBG;AA9CI,SAAR,kBAAmC,OAGvC;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,QAAM,SAAS,UAAU;AAAA,IACvB,UAAU,eAAe,QAAQ,EAAE,4BAA4B,CAAC,EAAE,SAAS,EAAE,4BAA4B,CAAC,EAAE,KAAK;AAAA,MAC/G,MAAM;AAAA,MACN,MAAM,CAAC,OAAO,QAAQ;AACpB,cAAM,QAAQ,iBAAiB,KAAK;AACpC,YAAI,OAAO;AACT,iBAAO,IAAI,YAAY,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,QACnD,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,gBAAgB,UAAU,EAAE,SAAS,EAAE,MAAM,CAAK,QAAI,UAAU,GAAG,IAAI,GAAG,EAAE,wBAAwB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,6BAA6B,CAAC;AAAA,EAC5J,CAAC;AAED,QAAM,EAAE,UAAU,cAAc,WAAW,EAAE,OAAO,GAAG,YAAY,IAAI,QAAQ;AAAA,IAC7E,UAAU,YAAY,MAAM;AAAA,EAC9B,CAAC;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,WAAW,OAAO,SAAuC;AAC7D,eAAW,IAAI;AACf,QAAI;AACF,YAAM,EAAE,SAAS,IAAI;AACrB,YAAM,SAAS,MAAM,SAAS,cAAc,EAAE,UAAU,MAAM,MAAM,KAAK,CAAC;AAC1E,UAAI,OAAO,WAAW,SAAS;AAC7B,sBAAc,IAAI;AAClB;AAAA,MACF;AAEA,kBAAY,IAAI;AAAA,IAClB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,WAAO,oBAAC,yBAAsB,MAAK,iBAAgB,UAAU,CAAC,CAAC,MAAM,UAAU;AAAA,EACjF;AAEA,MAAI,YAAY;AACd,WACE,oBAAC,eAAY,OAAO,EAAE,0BAA0B,GAAG,UAAU,CAAC,CAAC,MAAM,UAClE,YAAE,oEAAoE,GACzE;AAAA,EAEJ;AAGA,SACE,oBAAC,iBAAc,UAAU,CAAC,CAAC,MAAM,UAC/B,+BAAC,SAAI,WAAW;AAAA,IACd;AAAA,IACA,MAAM,WAAW,QAAQ;AAAA,EAC3B,GACE;AAAA,wBAAC,SAAI,WAAU,oBACb,8BAAC,cAAW,MAAK,MAAM,YAAE,qBAAqB,GAAE,GAClD;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,OAAK,2BAA2B,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,QACnE,YAAU;AAAA,QAEV;AAAA,8BAAC,SAAM,SAAQ,YAAW,WAAU,QAAQ,YAAE,cAAc,GAAE;AAAA,UAC9D;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,cAAa;AAAA,cACZ,GAAG,SAAS,UAAU;AAAA,cACvB,UAAU,MAAM;AACd,4BAAY,UAAU;AACtB,4BAAY,gBAAgB;AAAA,cAC9B;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,mBAAgB,MAAM,OAAO,UAAU,SAAS,SAAS,GAAG;AAAA,UAE7D,oBAAC,SAAM,SAAQ,mBAAkB,WAAU,aAAa,YAAE,qBAAqB,GAAE;AAAA,UACjF;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,cAAa;AAAA,cACZ,GAAG,SAAS,gBAAgB;AAAA,cAC7B,UAAU,MAAM;AACd,4BAAY,UAAU;AACtB,4BAAY,gBAAgB;AAAA,cAC9B;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,mBAAgB,MAAM,OAAO,gBAAgB,SAAS,SAAS,GAAG;AAAA,UAEnE,oBAAC,UAAO,MAAK,UAAS,WAAU,QAAO,SACpC,YAAE,gBAAgB,GACrB;AAAA;AAAA;AAAA,IACF;AAAA,KACF,GACF;AAEJ;AAGA,IAAM,gCAAgC,cAAc,OAAO,UAAgC,SAAiB;AAC1G,SAAO,MAAM,SAAS,wBAAwB,IAAI;AACpD,CAAC;AAEM,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,WAAW;AACb,GAGG;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,WAAW,YAAY;AAE7B,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,6BAA6B,GAAG,UACpD,8BAAC,cAAY,YAAE,kEAAkE,GAAE,GACrF;AAGF,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,6BAA6B,GAAG,UACpD,8BAAC,cAAY,YAAE,qGAAqG,GAAE,GACxH;AAGF,QAAM,UACJ,oBAAC,eAAY,OAAO,EAAE,0BAA0B,GAAG,UACjD,8BAAC,cAAY,YAAE,yJAAyJ,GAAE,GAC5K;AAGF,QAAM,OAAO,aAAa;AAC1B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,IAAI,8BAA8B,UAAU,IAAI,CAAC;AAEtE,MAAI,OAAO,WAAW,SAAS;AAC7B,QAAI,OAAO,iBAAiB,YAAY,0BAA0B;AAChE,aAAO;AAAA,IACT,WAAW,OAAO,iBAAiB,YAAY,yBAAyB;AACtE,aAAO;AAAA,IACT,WAAW,OAAO,iBAAiB,YAAY,6BAA6B;AAC1E,aAAO;AAAA,IACT,OAAO;AACL,YAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,SAAO,oBAAC,qBAAkB,MAAY,UAAoB;AAC5D;","names":[]}
|
|
1
|
+
{"version":3,"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\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { getPasswordError } from \"@stackframe/stack-shared/dist/helpers/password\";\nimport { passwordSchema, yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Label, PasswordInput, Typography, cn } from \"@stackframe/stack-ui\";\nimport React, { 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 = React.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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","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/components-page/sign-in.tsx
|
|
2
|
-
import { AuthPage } from "./auth-page";
|
|
2
|
+
import { AuthPage } from "./auth-page.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
function SignIn(props) {
|
|
5
5
|
return /* @__PURE__ */ jsx(
|
|
@@ -9,7 +9,8 @@ function SignIn(props) {
|
|
|
9
9
|
type: "sign-in",
|
|
10
10
|
automaticRedirect: !!props.automaticRedirect,
|
|
11
11
|
extraInfo: props.extraInfo,
|
|
12
|
-
firstTab: props.firstTab
|
|
12
|
+
firstTab: props.firstTab,
|
|
13
|
+
mockProject: props.mockProject
|
|
13
14
|
}
|
|
14
15
|
);
|
|
15
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components-page/sign-in.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { AuthPage } from \"./auth-page\";\n\nexport function SignIn(props: {\n fullPage?: boolean,\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\n firstTab?: 'magic-link' | 'password',\n}) {\n return (\n <AuthPage\n fullPage={!!props.fullPage}\n type=\"sign-in\"\n automaticRedirect={!!props.automaticRedirect}\n extraInfo={props.extraInfo}\n firstTab={props.firstTab}\n />\n );\n}\n"],"mappings":";AAIA,SAAS,gBAAgB;
|
|
1
|
+
{"version":3,"sources":["../../../src/components-page/sign-in.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { AuthPage } from \"./auth-page\";\n\nexport function SignIn(props: {\n fullPage?: boolean,\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\n firstTab?: 'magic-link' | 'password',\n mockProject?: {\n config: {\n signUpEnabled: boolean,\n credentialEnabled: boolean,\n passkeyEnabled: boolean,\n magicLinkEnabled: boolean,\n oauthProviders: {\n id: string,\n }[],\n },\n },\n}) {\n return (\n <AuthPage\n fullPage={!!props.fullPage}\n type=\"sign-in\"\n automaticRedirect={!!props.automaticRedirect}\n extraInfo={props.extraInfo}\n firstTab={props.firstTab}\n mockProject={props.mockProject}\n />\n );\n}\n"],"mappings":";AAIA,SAAS,gBAAgB;AAoBrB;AAlBG,SAAS,OAAO,OAgBpB;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAC,CAAC,MAAM;AAAA,MAClB,MAAK;AAAA,MACL,mBAAmB,CAAC,CAAC,MAAM;AAAA,MAC3B,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA;AAAA,EACrB;AAEJ;","names":[]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
// src/components-page/sign-out.tsx
|
|
5
5
|
import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
|
|
6
6
|
import React from "react";
|
|
7
|
-
import { useUser } from "
|
|
8
|
-
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
|
|
7
|
+
import { useUser } from "../index.js";
|
|
8
|
+
import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
|
|
9
9
|
import { jsx } from "react/jsx-runtime";
|
|
10
10
|
var cacheSignOut = cacheFunction(async (user) => {
|
|
11
11
|
return await user.signOut();
|