@stackframe/react 2.8.80 → 2.8.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/api-key-dialogs.d.ts +1 -1
- package/dist/components-page/auth-page.js +5 -9
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/error-page.js +9 -0
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/oauth-callback.js +19 -24
- package/dist/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/components/api-key-dialogs.d.ts +1 -1
- package/dist/esm/components-page/auth-page.js +6 -10
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/error-page.js +9 -0
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.js +19 -24
- package/dist/esm/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.d.ts +2 -2
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/lib/auth.d.ts.map +1 -1
- package/dist/esm/lib/auth.js +34 -5
- package/dist/esm/lib/auth.js.map +1 -1
- 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 +16 -12
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts +2 -0
- 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 +54 -13
- 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 +5 -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 +30 -4
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js +4 -5
- 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.d.ts +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js +91 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +29 -12
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/teams/index.d.ts +12 -1
- package/dist/esm/lib/stack-app/teams/index.d.ts.map +1 -1
- package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
- package/dist/generated/quetzal-translations.d.ts +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.js +7 -0
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +34 -5
- package/dist/lib/auth.js.map +1 -1
- 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 +15 -11
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +2 -0
- 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 +52 -11
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.d.ts +5 -1
- package/dist/lib/stack-app/apps/implementations/common.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +28 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.js +4 -5
- package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.d.ts +1 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.js +91 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +28 -11
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/teams/index.d.ts +12 -1
- package/dist/lib/stack-app/teams/index.d.ts.map +1 -1
- package/dist/lib/stack-app/teams/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -4,7 +4,7 @@ import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
|
4
4
|
//#region src/components/api-key-dialogs.d.ts
|
|
5
5
|
declare const neverInMs: number;
|
|
6
6
|
declare const expiresInOptions: {
|
|
7
|
-
readonly [x: number]: "
|
|
7
|
+
readonly [x: number]: "1 day" | "7 days" | "30 days" | "90 days" | "1 year" | "Never";
|
|
8
8
|
};
|
|
9
9
|
/**
|
|
10
10
|
* Dialog for creating a new API key
|
|
@@ -51,18 +51,14 @@ function Fallback(props) {
|
|
|
51
51
|
}
|
|
52
52
|
function Inner(props) {
|
|
53
53
|
const stackApp = (0, ___index_js.useStackApp)();
|
|
54
|
-
const user = (0, ___index_js.useUser)();
|
|
54
|
+
const user = (0, ___index_js.useUser)({ includeRestricted: true });
|
|
55
55
|
const projectFromHook = stackApp.useProject();
|
|
56
56
|
const project = props.mockProject || projectFromHook;
|
|
57
57
|
const { t } = (0, ___lib_translations_js.useTranslation)();
|
|
58
|
-
(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
props.mockProject,
|
|
63
|
-
stackApp,
|
|
64
|
-
props.automaticRedirect
|
|
65
|
-
]);
|
|
58
|
+
if (props.automaticRedirect && user && !props.mockProject) {
|
|
59
|
+
(0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(user.isRestricted ? stackApp.redirectToOnboarding({ replace: true }) : props.type === "sign-in" ? stackApp.redirectToAfterSignIn({ replace: true }) : stackApp.redirectToAfterSignUp({ replace: true }));
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
66
62
|
if (user && !props.mockProject && !props.automaticRedirect) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_predefined_message_card_js.PredefinedMessageCard, {
|
|
67
63
|
type: "signedIn",
|
|
68
64
|
fullPage: props.fullPage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-page.js","names":["Suspense","MaybeFullPage","Skeleton","PredefinedMessageCard","Typography","StyledLink","OAuthButtonGroup","PasskeyButton","SeparatorWithText","Tabs","TabsList","TabsTrigger","TabsContent","MagicLinkSignIn","CredentialSignUp","CredentialSignIn"],"sources":["../../src/components-page/auth-page.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 { runAsynchronously } from '@stackframe/stack-shared/dist/utils/promises';\nimport { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui';\nimport { Suspense, useEffect } from 'react';\nimport { useStackApp, useUser } from '..';\nimport { CredentialSignIn } from '../components/credential-sign-in';\nimport { CredentialSignUp } from '../components/credential-sign-up';\nimport { MaybeFullPage } from '../components/elements/maybe-full-page';\nimport { SeparatorWithText } from '../components/elements/separator-with-text';\nimport { StyledLink } from '../components/link';\nimport { MagicLinkSignIn } from '../components/magic-link-sign-in';\nimport { PredefinedMessageCard } from '../components/message-cards/predefined-message-card';\nimport { OAuthButtonGroup } from '../components/oauth-button-group';\nimport { PasskeyButton } from '../components/passkey-button';\nimport { useTranslation } from '../lib/translations';\n\ntype Props = {\n noPasswordRepeat?: boolean,\n firstTab?: 'magic-link' | 'password',\n fullPage?: boolean,\n type: 'sign-in' | 'sign-up',\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\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\nexport function AuthPage(props: Props) {\n return <Suspense fallback={<Fallback {...props} />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback(props: Props) {\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6 flex flex-col\">\n <Skeleton className='h-9 w-2/3 self-center' />\n\n <Skeleton className='h-3 w-16 mt-8' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-3 w-24 mt-2' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-9 w-full mt-6' />\n </div>\n </div>\n </MaybeFullPage>\n );\n}\n\nfunction Inner(props: Props) {\n const stackApp = useStackApp();\n const user = useUser();\n const projectFromHook = stackApp.useProject();\n const project = props.mockProject || projectFromHook;\n const { t } = useTranslation();\n\n useEffect(() => {\n if (props.automaticRedirect && user && !props.mockProject) {\n runAsynchronously(props.type === 'sign-in'\n ? stackApp.redirectToAfterSignIn({ replace: true })\n : stackApp.redirectToAfterSignUp({ replace: true })\n );\n }\n }, [user, props.mockProject, stackApp, props.automaticRedirect]);\n\n if (user && !props.mockProject && !props.automaticRedirect) {\n return <PredefinedMessageCard type='signedIn' fullPage={props.fullPage} />;\n }\n\n if (props.type === 'sign-up' && !project.config.signUpEnabled) {\n return <PredefinedMessageCard type='signUpDisabled' fullPage={props.fullPage} />;\n }\n\n const hasOAuthProviders = project.config.oauthProviders.length > 0;\n const hasPasskey = (project.config.passkeyEnabled === true && props.type === \"sign-in\");\n const enableSeparator = (project.config.credentialEnabled || project.config.magicLinkEnabled) && (hasOAuthProviders || hasPasskey);\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n {props.type === 'sign-in' ? t(\"Sign in to your account\") : t(\"Create a new account\")}\n </Typography>\n {props.type === 'sign-in' ? (\n project.config.signUpEnabled && (\n <Typography>\n {t(\"Don't have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signUp} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignUp());\n e.preventDefault();\n }}>{t(\"Sign up\")}</StyledLink>\n </Typography>\n )\n ) : (\n <Typography>\n {t(\"Already have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signIn} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignIn());\n e.preventDefault();\n }}>{t(\"Sign in\")}</StyledLink>\n </Typography>\n )}\n </div>\n {(hasOAuthProviders || hasPasskey) && (\n <div className='gap-4 flex flex-col items-stretch stack-scope'>\n {hasOAuthProviders && <OAuthButtonGroup type={props.type} mockProject={props.mockProject} />}\n {hasPasskey && <PasskeyButton type={props.type} />}\n </div>\n )}\n\n {enableSeparator && <SeparatorWithText text={t('Or continue with')} />}\n {project.config.credentialEnabled && project.config.magicLinkEnabled ? (\n <Tabs defaultValue={props.firstTab || 'magic-link'}>\n <TabsList className={cn('w-full mb-2', {\n 'flex-row-reverse': props.firstTab === 'password'\n })}>\n <TabsTrigger value='magic-link' className='flex-1'>{t(\"Email\")}</TabsTrigger>\n <TabsTrigger value='password' className='flex-1'>{t(\"Email & Password\")}</TabsTrigger>\n </TabsList>\n <TabsContent value='magic-link'>\n <MagicLinkSignIn />\n </TabsContent>\n <TabsContent value='password'>\n {props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />}\n </TabsContent>\n </Tabs>\n ) : project.config.credentialEnabled ? (\n props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />\n ) : project.config.magicLinkEnabled ? (\n <MagicLinkSignIn />\n ) : !(hasOAuthProviders || hasPasskey) ? <Typography variant={\"destructive\"} className=\"text-center\">{t(\"No authentication method enabled.\")}</Typography> : null}\n {props.extraInfo && (\n <div className={cn('flex flex-col items-center text-center text-sm text-gray-500', {\n 'mt-2': project.config.credentialEnabled || project.config.magicLinkEnabled,\n 'mt-6': !(project.config.credentialEnabled || project.config.magicLinkEnabled),\n })}>\n <div>{props.extraInfo}</div>\n </div>\n )}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth-page.js","names":["Suspense","MaybeFullPage","Skeleton","PredefinedMessageCard","Typography","StyledLink","OAuthButtonGroup","PasskeyButton","SeparatorWithText","Tabs","TabsList","TabsTrigger","TabsContent","MagicLinkSignIn","CredentialSignUp","CredentialSignIn"],"sources":["../../src/components-page/auth-page.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 { runAsynchronously } from '@stackframe/stack-shared/dist/utils/promises';\nimport { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui';\nimport { Suspense } from 'react';\nimport { useStackApp, useUser } from '..';\nimport { CredentialSignIn } from '../components/credential-sign-in';\nimport { CredentialSignUp } from '../components/credential-sign-up';\nimport { MaybeFullPage } from '../components/elements/maybe-full-page';\nimport { SeparatorWithText } from '../components/elements/separator-with-text';\nimport { StyledLink } from '../components/link';\nimport { MagicLinkSignIn } from '../components/magic-link-sign-in';\nimport { PredefinedMessageCard } from '../components/message-cards/predefined-message-card';\nimport { OAuthButtonGroup } from '../components/oauth-button-group';\nimport { PasskeyButton } from '../components/passkey-button';\nimport { useTranslation } from '../lib/translations';\n\ntype Props = {\n noPasswordRepeat?: boolean,\n firstTab?: 'magic-link' | 'password',\n fullPage?: boolean,\n type: 'sign-in' | 'sign-up',\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\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\nexport function AuthPage(props: Props) {\n return <Suspense fallback={<Fallback {...props} />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback(props: Props) {\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6 flex flex-col\">\n <Skeleton className='h-9 w-2/3 self-center' />\n\n <Skeleton className='h-3 w-16 mt-8' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-3 w-24 mt-2' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-9 w-full mt-6' />\n </div>\n </div>\n </MaybeFullPage>\n );\n}\n\nfunction Inner(props: Props) {\n const stackApp = useStackApp();\n const user = useUser({ includeRestricted: true });\n const projectFromHook = stackApp.useProject();\n const project = props.mockProject || projectFromHook;\n const { t } = useTranslation();\n\n if (props.automaticRedirect && user && !props.mockProject) {\n runAsynchronously(\n user.isRestricted\n ? stackApp.redirectToOnboarding({ replace: true })\n : props.type === 'sign-in'\n ? stackApp.redirectToAfterSignIn({ replace: true })\n : stackApp.redirectToAfterSignUp({ replace: true })\n );\n return null;\n }\n\n if (user && !props.mockProject && !props.automaticRedirect) {\n return <PredefinedMessageCard type='signedIn' fullPage={props.fullPage} />;\n }\n\n if (props.type === 'sign-up' && !project.config.signUpEnabled) {\n return <PredefinedMessageCard type='signUpDisabled' fullPage={props.fullPage} />;\n }\n\n const hasOAuthProviders = project.config.oauthProviders.length > 0;\n const hasPasskey = (project.config.passkeyEnabled === true && props.type === \"sign-in\");\n const enableSeparator = (project.config.credentialEnabled || project.config.magicLinkEnabled) && (hasOAuthProviders || hasPasskey);\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n {props.type === 'sign-in' ? t(\"Sign in to your account\") : t(\"Create a new account\")}\n </Typography>\n {props.type === 'sign-in' ? (\n project.config.signUpEnabled && (\n <Typography>\n {t(\"Don't have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signUp} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignUp());\n e.preventDefault();\n }}>{t(\"Sign up\")}</StyledLink>\n </Typography>\n )\n ) : (\n <Typography>\n {t(\"Already have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signIn} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignIn());\n e.preventDefault();\n }}>{t(\"Sign in\")}</StyledLink>\n </Typography>\n )}\n </div>\n {(hasOAuthProviders || hasPasskey) && (\n <div className='gap-4 flex flex-col items-stretch stack-scope'>\n {hasOAuthProviders && <OAuthButtonGroup type={props.type} mockProject={props.mockProject} />}\n {hasPasskey && <PasskeyButton type={props.type} />}\n </div>\n )}\n\n {enableSeparator && <SeparatorWithText text={t('Or continue with')} />}\n {project.config.credentialEnabled && project.config.magicLinkEnabled ? (\n <Tabs defaultValue={props.firstTab || 'magic-link'}>\n <TabsList className={cn('w-full mb-2', {\n 'flex-row-reverse': props.firstTab === 'password'\n })}>\n <TabsTrigger value='magic-link' className='flex-1'>{t(\"Email\")}</TabsTrigger>\n <TabsTrigger value='password' className='flex-1'>{t(\"Email & Password\")}</TabsTrigger>\n </TabsList>\n <TabsContent value='magic-link'>\n <MagicLinkSignIn />\n </TabsContent>\n <TabsContent value='password'>\n {props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />}\n </TabsContent>\n </Tabs>\n ) : project.config.credentialEnabled ? (\n props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />\n ) : project.config.magicLinkEnabled ? (\n <MagicLinkSignIn />\n ) : !(hasOAuthProviders || hasPasskey) ? <Typography variant={\"destructive\"} className=\"text-center\">{t(\"No authentication method enabled.\")}</Typography> : null}\n {props.extraInfo && (\n <div className={cn('flex flex-col items-center text-center text-sm text-gray-500', {\n 'mt-2': project.config.credentialEnabled || project.config.magicLinkEnabled,\n 'mt-6': !(project.config.credentialEnabled || project.config.magicLinkEnabled),\n })}>\n <div>{props.extraInfo}</div>\n </div>\n )}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":"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"}
|
|
@@ -57,6 +57,15 @@ function ErrorPage(props) {
|
|
|
57
57
|
secondaryAction: () => stackApp.redirectToHome(),
|
|
58
58
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: t("The sign-in operation has been cancelled or denied. Please try again.") })
|
|
59
59
|
});
|
|
60
|
+
if (_stackframe_stack_shared.KnownErrors.OAuthProviderTemporarilyUnavailable.isInstance(error)) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_message_card_js.MessageCard, {
|
|
61
|
+
title: t("OAuth provider is temporarily unavailable"),
|
|
62
|
+
fullPage: !!props.fullPage,
|
|
63
|
+
primaryButtonText: t("Try sign-in again"),
|
|
64
|
+
primaryAction: () => stackApp.redirectToSignIn(),
|
|
65
|
+
secondaryButtonText: t("Go Home"),
|
|
66
|
+
secondaryAction: () => stackApp.redirectToHome(),
|
|
67
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Typography, { children: t("The OAuth provider could not complete sign-in right now. Please try again in a moment.") })
|
|
68
|
+
});
|
|
60
69
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_message_cards_known_error_message_card_js.KnownErrorMessageCard, {
|
|
61
70
|
error,
|
|
62
71
|
fullPage: !!props.fullPage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-page.js","names":["PredefinedMessageCard","KnownError","KnownErrors","MessageCard","Typography","KnownErrorMessageCard"],"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, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\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":";;;;;;;;;;;;;;AAgBA,SAAgB,UAAU,OAAqE;CAC7F,MAAM,EAAE,kDAAsB;CAC9B,MAAM,yCAAwB;CAC9B,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,UAAU,MAAM,aAAa;CACnC,MAAM,UAAU,MAAM,aAAa;CAEnC,MAAM,mBAAmB,2CAACA;EAAsB,MAAK;EAAe,UAAU,CAAC,CAAC,MAAM;GAAY;AAElG,KAAI,CAAC,aAAa,CAAC,QACjB,QAAO;CAGT,IAAI;AACJ,KAAI;EACF,MAAM,aAAa,UAAU,KAAK,MAAM,QAAQ,GAAG,EAAE;AACrD,UAAQC,oCAAW,SAAS;GAAE,MAAM;GAAW;GAAS,SAAS;GAAY,CAAC;UACvE,GAAG;AACV,SAAO;;AAGT,KAAIC,qCAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,2CAACC;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,2CAACC,6CACE,EAAE,yFAAyF,GACjF;GACD;AAIlB,KAAIF,qCAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,2CAACC;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,2CAACC,6CACE,EAAE,+HAA+H,GACvH;GACD;AAIlB,KAAIF,qCAAY,0BAA0B,WAAW,MAAM,CACzD,QACE,2CAACC;EACC,OAAO,EAAE,+BAA+B;EACxC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,gBAAgB;EACrC,qBAAqB,SAAS,kBAAkB;EAChD,qBAAqB,EAAE,UAAU;EACjC,uBAAuB,SAAS,gBAAgB;YAEhD,2CAACC,6CACE,EAAE,wEAAwE,GAChE;GACD;AAIlB,QAAO,2CAACC;EAA6B;EAAO,UAAU,CAAC,CAAC,MAAM;GAAY"}
|
|
1
|
+
{"version":3,"file":"error-page.js","names":["PredefinedMessageCard","KnownError","KnownErrors","MessageCard","Typography","KnownErrorMessageCard"],"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, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\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 if (KnownErrors.OAuthProviderTemporarilyUnavailable.isInstance(error)) {\n return (\n <MessageCard\n title={t(\"OAuth provider is temporarily unavailable\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Try sign-in again\")}\n primaryAction={() => stackApp.redirectToSignIn()}\n secondaryButtonText={t(\"Go Home\")}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>\n {t(\"The OAuth provider could not complete sign-in right now. Please try again in a moment.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n return <KnownErrorMessageCard error={error} fullPage={!!props.fullPage} />;\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,UAAU,OAAqE;CAC7F,MAAM,EAAE,kDAAsB;CAC9B,MAAM,yCAAwB;CAC9B,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,UAAU,MAAM,aAAa;CACnC,MAAM,UAAU,MAAM,aAAa;CAEnC,MAAM,mBAAmB,2CAACA;EAAsB,MAAK;EAAe,UAAU,CAAC,CAAC,MAAM;GAAY;AAElG,KAAI,CAAC,aAAa,CAAC,QACjB,QAAO;CAGT,IAAI;AACJ,KAAI;EACF,MAAM,aAAa,UAAU,KAAK,MAAM,QAAQ,GAAG,EAAE;AACrD,UAAQC,oCAAW,SAAS;GAAE,MAAM;GAAW;GAAS,SAAS;GAAY,CAAC;UACvE,GAAG;AACV,SAAO;;AAGT,KAAIC,qCAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,2CAACC;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,2CAACC,6CACE,EAAE,yFAAyF,GACjF;GACD;AAIlB,KAAIF,qCAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,2CAACC;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,2CAACC,6CACE,EAAE,+HAA+H,GACvH;GACD;AAIlB,KAAIF,qCAAY,0BAA0B,WAAW,MAAM,CACzD,QACE,2CAACC;EACC,OAAO,EAAE,+BAA+B;EACxC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,gBAAgB;EACrC,qBAAqB,SAAS,kBAAkB;EAChD,qBAAqB,EAAE,UAAU;EACjC,uBAAuB,SAAS,gBAAgB;YAEhD,2CAACC,6CACE,EAAE,wEAAwE,GAChE;GACD;AAIlB,KAAIF,qCAAY,oCAAoC,WAAW,MAAM,CACnE,QACE,2CAACC;EACC,OAAO,EAAE,4CAA4C;EACrD,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,oBAAoB;EACzC,qBAAqB,SAAS,kBAAkB;EAChD,qBAAqB,EAAE,UAAU;EACjC,uBAAuB,SAAS,gBAAgB;YAEhD,2CAACC,6CACE,EAAE,yFAAyF,GACjF;GACD;AAIlB,QAAO,2CAACC;EAA6B;EAAO,UAAU,CAAC,CAAC,MAAM;GAAY"}
|
|
@@ -9,30 +9,33 @@ let react = require("react");
|
|
|
9
9
|
let ___index_js = require("../index.js");
|
|
10
10
|
let ___lib_translations_js = require("../lib/translations.js");
|
|
11
11
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
12
|
+
let _stackframe_stack_shared = require("@stackframe/stack-shared");
|
|
12
13
|
let ___components_elements_maybe_full_page_js = require("../components/elements/maybe-full-page.js");
|
|
13
14
|
let ___components_link_js = require("../components/link.js");
|
|
14
|
-
let ___lib_env_js = require("../lib/env.js");
|
|
15
15
|
|
|
16
16
|
//#region src/components-page/oauth-callback.tsx
|
|
17
17
|
function OAuthCallback({ fullPage }) {
|
|
18
18
|
const { t } = (0, ___lib_translations_js.useTranslation)();
|
|
19
19
|
const app = (0, ___index_js.useStackApp)();
|
|
20
20
|
const called = (0, react.useRef)(false);
|
|
21
|
-
const [error, setError] = (0, react.useState)(null);
|
|
22
21
|
const [showRedirectLink, setShowRedirectLink] = (0, react.useState)(false);
|
|
23
22
|
(0, react.useEffect)(() => (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(async () => {
|
|
24
23
|
if (called.current) return;
|
|
25
24
|
called.current = true;
|
|
26
|
-
let hasRedirected = false;
|
|
27
|
-
let callbackError = null;
|
|
28
25
|
try {
|
|
29
|
-
|
|
26
|
+
if (!await app.callOAuthCallback()) await app.redirectToSignIn({ noRedirectBack: true });
|
|
30
27
|
} catch (e) {
|
|
31
|
-
|
|
28
|
+
if (_stackframe_stack_shared.KnownError.isKnownError(e)) {
|
|
29
|
+
const errorUrl = new URL(app.urls.error, window.location.href);
|
|
30
|
+
errorUrl.searchParams.set("errorCode", e.errorCode);
|
|
31
|
+
errorUrl.searchParams.set("message", e.message);
|
|
32
|
+
errorUrl.searchParams.set("details", JSON.stringify(e.details ?? {}));
|
|
33
|
+
window.location.replace(errorUrl.toString());
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
32
36
|
(0, _stackframe_stack_shared_dist_utils_errors.captureError)("<OAuthCallback />", e);
|
|
33
|
-
|
|
37
|
+
window.location.replace(new URL(app.urls.error, window.location.href).toString());
|
|
34
38
|
}
|
|
35
|
-
if (!hasRedirected && (callbackError == null || ___lib_env_js.envVars.NODE_ENV === "production")) await app.redirectToSignIn({ noRedirectBack: true });
|
|
36
39
|
}), []);
|
|
37
40
|
(0, react.useEffect)(() => {
|
|
38
41
|
setTimeout(() => setShowRedirectLink(true), 3e3);
|
|
@@ -42,22 +45,14 @@ function OAuthCallback({ fullPage }) {
|
|
|
42
45
|
containerClassName: "flex items-center justify-center",
|
|
43
46
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
44
47
|
className: (0, _stackframe_stack_ui.cn)("text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]", fullPage ? "p-4" : "p-0"),
|
|
45
|
-
children: [
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
children: t("click here")
|
|
54
|
-
})] }) : null,
|
|
55
|
-
error ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
|
|
56
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: t("Something went wrong while processing the OAuth callback:") }),
|
|
57
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", { children: JSON.stringify(error, null, 2) }),
|
|
58
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: t("This is most likely an error in Stack. Please report it.") })
|
|
59
|
-
] }) : null
|
|
60
|
-
]
|
|
48
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
49
|
+
className: "flex flex-col justify-center items-center gap-4",
|
|
50
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_stackframe_stack_ui.Spinner, { size: 20 })
|
|
51
|
+
}), showRedirectLink ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", { children: [t("If you are not redirected automatically, "), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(___components_link_js.StyledLink, {
|
|
52
|
+
className: "whitespace-nowrap",
|
|
53
|
+
href: app.urls.home,
|
|
54
|
+
children: t("click here")
|
|
55
|
+
})] }) : null]
|
|
61
56
|
})
|
|
62
57
|
});
|
|
63
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-callback.js","names":["
|
|
1
|
+
{"version":3,"file":"oauth-callback.js","names":["KnownError","MaybeFullPage","Spinner","StyledLink"],"sources":["../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownError } from \"@stackframe/stack-shared\";\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Spinner, cn } from \"@stackframe/stack-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { StyledLink } from \"../components/link\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback({ fullPage }: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n try {\n const hasRedirected = await app.callOAuthCallback();\n if (!hasRedirected) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n const errorUrl = new URL(app.urls.error, window.location.href);\n errorUrl.searchParams.set(\"errorCode\", e.errorCode);\n errorUrl.searchParams.set(\"message\", e.message);\n errorUrl.searchParams.set(\"details\", JSON.stringify(e.details ?? {}));\n window.location.replace(errorUrl.toString());\n return;\n }\n captureError(\"<OAuthCallback />\", e);\n window.location.replace(new URL(app.urls.error, window.location.href).toString());\n }\n }), []);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return (\n <MaybeFullPage\n fullPage={fullPage ?? false}\n containerClassName=\"flex items-center justify-center\"\n >\n <div\n className={cn(\n \"text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]\",\n fullPage ? \"p-4\" : \"p-0\"\n )}\n >\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Spinner size={20} />\n </div>\n {showRedirectLink ? <p>{t('If you are not redirected automatically, ')}<StyledLink className=\"whitespace-nowrap\" href={app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,cAAc,EAAE,YAAoC;CAClE,MAAM,EAAE,kDAAsB;CAC9B,MAAM,oCAAmB;CACzB,MAAM,2BAAgB,MAAM;CAC5B,MAAM,CAAC,kBAAkB,2CAAgC,MAAM;AAE/D,gGAAkC,YAAY;AAC5C,MAAI,OAAO,QAAS;AACpB,SAAO,UAAU;AACjB,MAAI;AAEF,OAAI,CADkB,MAAM,IAAI,mBAAmB,CAEjD,OAAM,IAAI,iBAAiB,EAAE,gBAAgB,MAAM,CAAC;WAE/C,GAAG;AACV,OAAIA,oCAAW,aAAa,EAAE,EAAE;IAC9B,MAAM,WAAW,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK;AAC9D,aAAS,aAAa,IAAI,aAAa,EAAE,UAAU;AACnD,aAAS,aAAa,IAAI,WAAW,EAAE,QAAQ;AAC/C,aAAS,aAAa,IAAI,WAAW,KAAK,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AACrE,WAAO,SAAS,QAAQ,SAAS,UAAU,CAAC;AAC5C;;AAEF,gEAAa,qBAAqB,EAAE;AACpC,UAAO,SAAS,QAAQ,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK,CAAC,UAAU,CAAC;;GAEnF,EAAE,EAAE,CAAC;AAEP,4BAAgB;AACd,mBAAiB,oBAAoB,KAAK,EAAE,IAAK;IAChD,EAAE,CAAC;AAEN,QACE,2CAACC;EACC,UAAU,YAAY;EACtB,oBAAmB;YAEnB,4CAAC;GACC,wCACE,yFACA,WAAW,QAAQ,MACpB;cAED,2CAAC;IAAI,WAAU;cACb,2CAACC,gCAAQ,MAAM,KAAM;KACjB,EACL,mBAAmB,4CAAC,kBAAG,EAAE,4CAA4C,EAAC,2CAACC;IAAW,WAAU;IAAoB,MAAM,IAAI,KAAK;cAAO,EAAE,aAAa;KAAc,IAAI,GAAG;IACvK;GACQ"}
|
|
@@ -4,7 +4,7 @@ import { ApiKey, ApiKeyCreationOptions, ApiKeyType } from "../lib/stack-app/api-
|
|
|
4
4
|
//#region src/components/api-key-dialogs.d.ts
|
|
5
5
|
declare const neverInMs: number;
|
|
6
6
|
declare const expiresInOptions: {
|
|
7
|
-
readonly [x: number]: "
|
|
7
|
+
readonly [x: number]: "1 day" | "7 days" | "30 days" | "90 days" | "1 year" | "Never";
|
|
8
8
|
};
|
|
9
9
|
/**
|
|
10
10
|
* Dialog for creating a new API key
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
|
|
4
4
|
import { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from "@stackframe/stack-ui";
|
|
5
|
-
import { Suspense
|
|
5
|
+
import { Suspense } from "react";
|
|
6
6
|
import { useStackApp, useUser } from "../index.js";
|
|
7
7
|
import { useTranslation } from "../lib/translations.js";
|
|
8
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -49,18 +49,14 @@ function Fallback(props) {
|
|
|
49
49
|
}
|
|
50
50
|
function Inner(props) {
|
|
51
51
|
const stackApp = useStackApp();
|
|
52
|
-
const user = useUser();
|
|
52
|
+
const user = useUser({ includeRestricted: true });
|
|
53
53
|
const projectFromHook = stackApp.useProject();
|
|
54
54
|
const project = props.mockProject || projectFromHook;
|
|
55
55
|
const { t } = useTranslation();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
props.mockProject,
|
|
61
|
-
stackApp,
|
|
62
|
-
props.automaticRedirect
|
|
63
|
-
]);
|
|
56
|
+
if (props.automaticRedirect && user && !props.mockProject) {
|
|
57
|
+
runAsynchronously(user.isRestricted ? stackApp.redirectToOnboarding({ replace: true }) : props.type === "sign-in" ? stackApp.redirectToAfterSignIn({ replace: true }) : stackApp.redirectToAfterSignUp({ replace: true }));
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
64
60
|
if (user && !props.mockProject && !props.automaticRedirect) return /* @__PURE__ */ jsx(PredefinedMessageCard, {
|
|
65
61
|
type: "signedIn",
|
|
66
62
|
fullPage: props.fullPage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-page.js","names":[],"sources":["../../../src/components-page/auth-page.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 { runAsynchronously } from '@stackframe/stack-shared/dist/utils/promises';\nimport { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui';\nimport { Suspense
|
|
1
|
+
{"version":3,"file":"auth-page.js","names":[],"sources":["../../../src/components-page/auth-page.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 { runAsynchronously } from '@stackframe/stack-shared/dist/utils/promises';\nimport { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@stackframe/stack-ui';\nimport { Suspense } from 'react';\nimport { useStackApp, useUser } from '..';\nimport { CredentialSignIn } from '../components/credential-sign-in';\nimport { CredentialSignUp } from '../components/credential-sign-up';\nimport { MaybeFullPage } from '../components/elements/maybe-full-page';\nimport { SeparatorWithText } from '../components/elements/separator-with-text';\nimport { StyledLink } from '../components/link';\nimport { MagicLinkSignIn } from '../components/magic-link-sign-in';\nimport { PredefinedMessageCard } from '../components/message-cards/predefined-message-card';\nimport { OAuthButtonGroup } from '../components/oauth-button-group';\nimport { PasskeyButton } from '../components/passkey-button';\nimport { useTranslation } from '../lib/translations';\n\ntype Props = {\n noPasswordRepeat?: boolean,\n firstTab?: 'magic-link' | 'password',\n fullPage?: boolean,\n type: 'sign-in' | 'sign-up',\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\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\nexport function AuthPage(props: Props) {\n return <Suspense fallback={<Fallback {...props} />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback(props: Props) {\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6 flex flex-col\">\n <Skeleton className='h-9 w-2/3 self-center' />\n\n <Skeleton className='h-3 w-16 mt-8' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-3 w-24 mt-2' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-9 w-full mt-6' />\n </div>\n </div>\n </MaybeFullPage>\n );\n}\n\nfunction Inner(props: Props) {\n const stackApp = useStackApp();\n const user = useUser({ includeRestricted: true });\n const projectFromHook = stackApp.useProject();\n const project = props.mockProject || projectFromHook;\n const { t } = useTranslation();\n\n if (props.automaticRedirect && user && !props.mockProject) {\n runAsynchronously(\n user.isRestricted\n ? stackApp.redirectToOnboarding({ replace: true })\n : props.type === 'sign-in'\n ? stackApp.redirectToAfterSignIn({ replace: true })\n : stackApp.redirectToAfterSignUp({ replace: true })\n );\n return null;\n }\n\n if (user && !props.mockProject && !props.automaticRedirect) {\n return <PredefinedMessageCard type='signedIn' fullPage={props.fullPage} />;\n }\n\n if (props.type === 'sign-up' && !project.config.signUpEnabled) {\n return <PredefinedMessageCard type='signUpDisabled' fullPage={props.fullPage} />;\n }\n\n const hasOAuthProviders = project.config.oauthProviders.length > 0;\n const hasPasskey = (project.config.passkeyEnabled === true && props.type === \"sign-in\");\n const enableSeparator = (project.config.credentialEnabled || project.config.magicLinkEnabled) && (hasOAuthProviders || hasPasskey);\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n {props.type === 'sign-in' ? t(\"Sign in to your account\") : t(\"Create a new account\")}\n </Typography>\n {props.type === 'sign-in' ? (\n project.config.signUpEnabled && (\n <Typography>\n {t(\"Don't have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signUp} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignUp());\n e.preventDefault();\n }}>{t(\"Sign up\")}</StyledLink>\n </Typography>\n )\n ) : (\n <Typography>\n {t(\"Already have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signIn} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignIn());\n e.preventDefault();\n }}>{t(\"Sign in\")}</StyledLink>\n </Typography>\n )}\n </div>\n {(hasOAuthProviders || hasPasskey) && (\n <div className='gap-4 flex flex-col items-stretch stack-scope'>\n {hasOAuthProviders && <OAuthButtonGroup type={props.type} mockProject={props.mockProject} />}\n {hasPasskey && <PasskeyButton type={props.type} />}\n </div>\n )}\n\n {enableSeparator && <SeparatorWithText text={t('Or continue with')} />}\n {project.config.credentialEnabled && project.config.magicLinkEnabled ? (\n <Tabs defaultValue={props.firstTab || 'magic-link'}>\n <TabsList className={cn('w-full mb-2', {\n 'flex-row-reverse': props.firstTab === 'password'\n })}>\n <TabsTrigger value='magic-link' className='flex-1'>{t(\"Email\")}</TabsTrigger>\n <TabsTrigger value='password' className='flex-1'>{t(\"Email & Password\")}</TabsTrigger>\n </TabsList>\n <TabsContent value='magic-link'>\n <MagicLinkSignIn />\n </TabsContent>\n <TabsContent value='password'>\n {props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />}\n </TabsContent>\n </Tabs>\n ) : project.config.credentialEnabled ? (\n props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />\n ) : project.config.magicLinkEnabled ? (\n <MagicLinkSignIn />\n ) : !(hasOAuthProviders || hasPasskey) ? <Typography variant={\"destructive\"} className=\"text-center\">{t(\"No authentication method enabled.\")}</Typography> : null}\n {props.extraInfo && (\n <div className={cn('flex flex-col items-center text-center text-sm text-gray-500', {\n 'mt-2': project.config.credentialEnabled || project.config.magicLinkEnabled,\n 'mt-6': !(project.config.credentialEnabled || project.config.magicLinkEnabled),\n })}>\n <div>{props.extraInfo}</div>\n </div>\n )}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":"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"}
|
|
@@ -55,6 +55,15 @@ function ErrorPage(props) {
|
|
|
55
55
|
secondaryAction: () => stackApp.redirectToHome(),
|
|
56
56
|
children: /* @__PURE__ */ jsx(Typography, { children: t("The sign-in operation has been cancelled or denied. Please try again.") })
|
|
57
57
|
});
|
|
58
|
+
if (KnownErrors.OAuthProviderTemporarilyUnavailable.isInstance(error)) return /* @__PURE__ */ jsx(MessageCard$1, {
|
|
59
|
+
title: t("OAuth provider is temporarily unavailable"),
|
|
60
|
+
fullPage: !!props.fullPage,
|
|
61
|
+
primaryButtonText: t("Try sign-in again"),
|
|
62
|
+
primaryAction: () => stackApp.redirectToSignIn(),
|
|
63
|
+
secondaryButtonText: t("Go Home"),
|
|
64
|
+
secondaryAction: () => stackApp.redirectToHome(),
|
|
65
|
+
children: /* @__PURE__ */ jsx(Typography, { children: t("The OAuth provider could not complete sign-in right now. Please try again in a moment.") })
|
|
66
|
+
});
|
|
58
67
|
return /* @__PURE__ */ jsx(KnownErrorMessageCard, {
|
|
59
68
|
error,
|
|
60
69
|
fullPage: !!props.fullPage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-page.js","names":["MessageCard"],"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, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\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":";;;;;;;;;;;;AAgBA,SAAgB,UAAU,OAAqE;CAC7F,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,UAAU,MAAM,aAAa;CACnC,MAAM,UAAU,MAAM,aAAa;CAEnC,MAAM,mBAAmB,oBAAC;EAAsB,MAAK;EAAe,UAAU,CAAC,CAAC,MAAM;GAAY;AAElG,KAAI,CAAC,aAAa,CAAC,QACjB,QAAO;CAGT,IAAI;AACJ,KAAI;EACF,MAAM,aAAa,UAAU,KAAK,MAAM,QAAQ,GAAG,EAAE;AACrD,UAAQ,WAAW,SAAS;GAAE,MAAM;GAAW;GAAS,SAAS;GAAY,CAAC;UACvE,GAAG;AACV,SAAO;;AAGT,KAAI,YAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,oBAACA;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,oBAAC,wBACE,EAAE,yFAAyF,GACjF;GACD;AAIlB,KAAI,YAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,oBAACA;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,oBAAC,wBACE,EAAE,+HAA+H,GACvH;GACD;AAIlB,KAAI,YAAY,0BAA0B,WAAW,MAAM,CACzD,QACE,oBAACA;EACC,OAAO,EAAE,+BAA+B;EACxC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,gBAAgB;EACrC,qBAAqB,SAAS,kBAAkB;EAChD,qBAAqB,EAAE,UAAU;EACjC,uBAAuB,SAAS,gBAAgB;YAEhD,oBAAC,wBACE,EAAE,wEAAwE,GAChE;GACD;AAIlB,QAAO,oBAAC;EAA6B;EAAO,UAAU,CAAC,CAAC,MAAM;GAAY"}
|
|
1
|
+
{"version":3,"file":"error-page.js","names":["MessageCard"],"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, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\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 if (KnownErrors.OAuthProviderTemporarilyUnavailable.isInstance(error)) {\n return (\n <MessageCard\n title={t(\"OAuth provider is temporarily unavailable\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Try sign-in again\")}\n primaryAction={() => stackApp.redirectToSignIn()}\n secondaryButtonText={t(\"Go Home\")}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>\n {t(\"The OAuth provider could not complete sign-in right now. Please try again in a moment.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n return <KnownErrorMessageCard error={error} fullPage={!!props.fullPage} />;\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,SAAgB,UAAU,OAAqE;CAC7F,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,UAAU,MAAM,aAAa;CACnC,MAAM,UAAU,MAAM,aAAa;CAEnC,MAAM,mBAAmB,oBAAC;EAAsB,MAAK;EAAe,UAAU,CAAC,CAAC,MAAM;GAAY;AAElG,KAAI,CAAC,aAAa,CAAC,QACjB,QAAO;CAGT,IAAI;AACJ,KAAI;EACF,MAAM,aAAa,UAAU,KAAK,MAAM,QAAQ,GAAG,EAAE;AACrD,UAAQ,WAAW,SAAS;GAAE,MAAM;GAAW;GAAS,SAAS;GAAY,CAAC;UACvE,GAAG;AACV,SAAO;;AAGT,KAAI,YAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,oBAACA;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,oBAAC,wBACE,EAAE,yFAAyF,GACjF;GACD;AAIlB,KAAI,YAAY,6CAA6C,WAAW,MAAM,CAE5E,QACE,oBAACA;EACC,OAAO,EAAE,4BAA4B;EACrC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,qBAAqB,SAAS,gBAAgB;YAE9C,oBAAC,wBACE,EAAE,+HAA+H,GACvH;GACD;AAIlB,KAAI,YAAY,0BAA0B,WAAW,MAAM,CACzD,QACE,oBAACA;EACC,OAAO,EAAE,+BAA+B;EACxC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,gBAAgB;EACrC,qBAAqB,SAAS,kBAAkB;EAChD,qBAAqB,EAAE,UAAU;EACjC,uBAAuB,SAAS,gBAAgB;YAEhD,oBAAC,wBACE,EAAE,wEAAwE,GAChE;GACD;AAIlB,KAAI,YAAY,oCAAoC,WAAW,MAAM,CACnE,QACE,oBAACA;EACC,OAAO,EAAE,4CAA4C;EACrD,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,oBAAoB;EACzC,qBAAqB,SAAS,kBAAkB;EAChD,qBAAqB,EAAE,UAAU;EACjC,uBAAuB,SAAS,gBAAgB;YAEhD,oBAAC,wBACE,EAAE,yFAAyF,GACjF;GACD;AAIlB,QAAO,oBAAC;EAA6B;EAAO,UAAU,CAAC,CAAC,MAAM;GAAY"}
|
|
@@ -7,30 +7,33 @@ import { useEffect, useRef, useState } from "react";
|
|
|
7
7
|
import { useStackApp } from "../index.js";
|
|
8
8
|
import { useTranslation } from "../lib/translations.js";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { KnownError } from "@stackframe/stack-shared";
|
|
10
11
|
import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
|
|
11
12
|
import { StyledLink } from "../components/link.js";
|
|
12
|
-
import { envVars } from "../lib/env.js";
|
|
13
13
|
|
|
14
14
|
//#region src/components-page/oauth-callback.tsx
|
|
15
15
|
function OAuthCallback({ fullPage }) {
|
|
16
16
|
const { t } = useTranslation();
|
|
17
17
|
const app = useStackApp();
|
|
18
18
|
const called = useRef(false);
|
|
19
|
-
const [error, setError] = useState(null);
|
|
20
19
|
const [showRedirectLink, setShowRedirectLink] = useState(false);
|
|
21
20
|
useEffect(() => runAsynchronously(async () => {
|
|
22
21
|
if (called.current) return;
|
|
23
22
|
called.current = true;
|
|
24
|
-
let hasRedirected = false;
|
|
25
|
-
let callbackError = null;
|
|
26
23
|
try {
|
|
27
|
-
|
|
24
|
+
if (!await app.callOAuthCallback()) await app.redirectToSignIn({ noRedirectBack: true });
|
|
28
25
|
} catch (e) {
|
|
29
|
-
|
|
26
|
+
if (KnownError.isKnownError(e)) {
|
|
27
|
+
const errorUrl = new URL(app.urls.error, window.location.href);
|
|
28
|
+
errorUrl.searchParams.set("errorCode", e.errorCode);
|
|
29
|
+
errorUrl.searchParams.set("message", e.message);
|
|
30
|
+
errorUrl.searchParams.set("details", JSON.stringify(e.details ?? {}));
|
|
31
|
+
window.location.replace(errorUrl.toString());
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
30
34
|
captureError("<OAuthCallback />", e);
|
|
31
|
-
|
|
35
|
+
window.location.replace(new URL(app.urls.error, window.location.href).toString());
|
|
32
36
|
}
|
|
33
|
-
if (!hasRedirected && (callbackError == null || envVars.NODE_ENV === "production")) await app.redirectToSignIn({ noRedirectBack: true });
|
|
34
37
|
}), []);
|
|
35
38
|
useEffect(() => {
|
|
36
39
|
setTimeout(() => setShowRedirectLink(true), 3e3);
|
|
@@ -40,22 +43,14 @@ function OAuthCallback({ fullPage }) {
|
|
|
40
43
|
containerClassName: "flex items-center justify-center",
|
|
41
44
|
children: /* @__PURE__ */ jsxs("div", {
|
|
42
45
|
className: cn("text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]", fullPage ? "p-4" : "p-0"),
|
|
43
|
-
children: [
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
children: t("click here")
|
|
52
|
-
})] }) : null,
|
|
53
|
-
error ? /* @__PURE__ */ jsxs("div", { children: [
|
|
54
|
-
/* @__PURE__ */ jsx("p", { children: t("Something went wrong while processing the OAuth callback:") }),
|
|
55
|
-
/* @__PURE__ */ jsx("pre", { children: JSON.stringify(error, null, 2) }),
|
|
56
|
-
/* @__PURE__ */ jsx("p", { children: t("This is most likely an error in Stack. Please report it.") })
|
|
57
|
-
] }) : null
|
|
58
|
-
]
|
|
46
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
47
|
+
className: "flex flex-col justify-center items-center gap-4",
|
|
48
|
+
children: /* @__PURE__ */ jsx(Spinner, { size: 20 })
|
|
49
|
+
}), showRedirectLink ? /* @__PURE__ */ jsxs("p", { children: [t("If you are not redirected automatically, "), /* @__PURE__ */ jsx(StyledLink, {
|
|
50
|
+
className: "whitespace-nowrap",
|
|
51
|
+
href: app.urls.home,
|
|
52
|
+
children: t("click here")
|
|
53
|
+
})] }) : null]
|
|
59
54
|
})
|
|
60
55
|
});
|
|
61
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-callback.js","names":[],"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Spinner, cn } from \"@stackframe/stack-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { StyledLink } from \"../components/link\";\nimport {
|
|
1
|
+
{"version":3,"file":"oauth-callback.js","names":[],"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownError } from \"@stackframe/stack-shared\";\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Spinner, cn } from \"@stackframe/stack-ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { StyledLink } from \"../components/link\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback({ fullPage }: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n try {\n const hasRedirected = await app.callOAuthCallback();\n if (!hasRedirected) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n const errorUrl = new URL(app.urls.error, window.location.href);\n errorUrl.searchParams.set(\"errorCode\", e.errorCode);\n errorUrl.searchParams.set(\"message\", e.message);\n errorUrl.searchParams.set(\"details\", JSON.stringify(e.details ?? {}));\n window.location.replace(errorUrl.toString());\n return;\n }\n captureError(\"<OAuthCallback />\", e);\n window.location.replace(new URL(app.urls.error, window.location.href).toString());\n }\n }), []);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return (\n <MaybeFullPage\n fullPage={fullPage ?? false}\n containerClassName=\"flex items-center justify-center\"\n >\n <div\n className={cn(\n \"text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]\",\n fullPage ? \"p-4\" : \"p-0\"\n )}\n >\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Spinner size={20} />\n </div>\n {showRedirectLink ? <p>{t('If you are not redirected automatically, ')}<StyledLink className=\"whitespace-nowrap\" href={app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAiBA,SAAgB,cAAc,EAAE,YAAoC;CAClE,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,MAAM,aAAa;CACzB,MAAM,SAAS,OAAO,MAAM;CAC5B,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,MAAM;AAE/D,iBAAgB,kBAAkB,YAAY;AAC5C,MAAI,OAAO,QAAS;AACpB,SAAO,UAAU;AACjB,MAAI;AAEF,OAAI,CADkB,MAAM,IAAI,mBAAmB,CAEjD,OAAM,IAAI,iBAAiB,EAAE,gBAAgB,MAAM,CAAC;WAE/C,GAAG;AACV,OAAI,WAAW,aAAa,EAAE,EAAE;IAC9B,MAAM,WAAW,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK;AAC9D,aAAS,aAAa,IAAI,aAAa,EAAE,UAAU;AACnD,aAAS,aAAa,IAAI,WAAW,EAAE,QAAQ;AAC/C,aAAS,aAAa,IAAI,WAAW,KAAK,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AACrE,WAAO,SAAS,QAAQ,SAAS,UAAU,CAAC;AAC5C;;AAEF,gBAAa,qBAAqB,EAAE;AACpC,UAAO,SAAS,QAAQ,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK,CAAC,UAAU,CAAC;;GAEnF,EAAE,EAAE,CAAC;AAEP,iBAAgB;AACd,mBAAiB,oBAAoB,KAAK,EAAE,IAAK;IAChD,EAAE,CAAC;AAEN,QACE,oBAAC;EACC,UAAU,YAAY;EACtB,oBAAmB;YAEnB,qBAAC;GACC,WAAW,GACT,yFACA,WAAW,QAAQ,MACpB;cAED,oBAAC;IAAI,WAAU;cACb,oBAAC,WAAQ,MAAM,KAAM;KACjB,EACL,mBAAmB,qBAAC,kBAAG,EAAE,4CAA4C,EAAC,oBAAC;IAAW,WAAU;IAAoB,MAAM,IAAI,KAAK;cAAO,EAAE,aAAa;KAAc,IAAI,GAAG;IACvK;GACQ"}
|