@stackframe/stack 2.6.27 → 2.6.29
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 +20 -0
- package/dist/components/message-cards/known-error-message-card.js +2 -2
- package/dist/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js +5 -5
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components-page/account-settings.js +56 -36
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/email-verification.js +3 -3
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.js +6 -6
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/magic-link-callback.js +4 -4
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/team-invitation.js +2 -2
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
- package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js +5 -5
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components-page/account-settings.js +58 -38
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/email-verification.js +3 -3
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.js +6 -6
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js +4 -4
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/team-invitation.js +2 -2
- 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 +1233 -1221
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/lib/auth.js +2 -2
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/stack-app.js +50 -1
- package/dist/esm/lib/stack-app.js.map +1 -1
- package/dist/esm/providers/theme-provider.js +1 -0
- package/dist/esm/providers/theme-provider.js.map +1 -1
- package/dist/generated/global-css.d.mts +1 -1
- package/dist/generated/global-css.d.ts +1 -1
- package/dist/generated/global-css.js +1 -1
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.d.mts +2 -2
- package/dist/generated/quetzal-translations.d.ts +2 -2
- package/dist/generated/quetzal-translations.js +1233 -1221
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/lib/auth.js +1 -1
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/stack-app.d.mts +9 -1
- package/dist/lib/stack-app.d.ts +9 -1
- package/dist/lib/stack-app.js +50 -1
- package/dist/lib/stack-app.js.map +1 -1
- package/dist/providers/theme-provider.js +1 -0
- package/dist/providers/theme-provider.js.map +1 -1
- package/package.json +4 -4
|
@@ -35,12 +35,12 @@ __export(email_verification_exports, {
|
|
|
35
35
|
EmailVerification: () => EmailVerification
|
|
36
36
|
});
|
|
37
37
|
module.exports = __toCommonJS(email_verification_exports);
|
|
38
|
+
var import_stack_shared = require("@stackframe/stack-shared");
|
|
39
|
+
var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
|
|
38
40
|
var import_react = __toESM(require("react"));
|
|
39
41
|
var import__ = require("..");
|
|
40
42
|
var import_message_card = require("../components/message-cards/message-card");
|
|
41
|
-
var import_stack_shared = require("@stackframe/stack-shared");
|
|
42
43
|
var import_translations = require("../lib/translations");
|
|
43
|
-
var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
|
|
44
44
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
45
45
|
function EmailVerification(props) {
|
|
46
46
|
const { t } = (0, import_translations.useTranslation)();
|
|
@@ -85,7 +85,7 @@ function EmailVerification(props) {
|
|
|
85
85
|
{
|
|
86
86
|
title: t("You email has been verified!"),
|
|
87
87
|
fullPage: !!props.fullPage,
|
|
88
|
-
primaryButtonText: t("Go
|
|
88
|
+
primaryButtonText: t("Go home"),
|
|
89
89
|
primaryAction: async () => {
|
|
90
90
|
await stackApp.redirectToHome();
|
|
91
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components-page/email-verification.tsx"],"sourcesContent":["'use client';\n\nimport
|
|
1
|
+
{"version":3,"sources":["../../src/components-page/email-verification.tsx"],"sourcesContent":["'use client';\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 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 // 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAA4B;AAC5B,oBAAyB;AACzB,mBAAkB;AAClB,eAAqC;AACrC,0BAA4B;AAC5B,0BAA+B;AAazB;AAXC,SAAS,kBAAkB,OAG/B;AACD,QAAM,EAAE,EAAE,QAAI,oCAAe;AAC7B,QAAM,eAAW,sBAAY;AAC7B,QAAM,WAAO,kBAAQ;AACrB,QAAM,CAAC,QAAQ,SAAS,IAAI,aAAAA,QAAM,SAAkE,IAAI;AAExG,QAAM,aACJ,4CAAC,mCAAY,OAAO,EAAE,2BAA2B,GAAG,UAAU,CAAC,CAAC,MAAM,UACpE,sDAAC,OAAG,YAAE,oGAAoG,GAAE,GAC9G;AAGF,QAAM,aACJ,4CAAC,mCAAY,OAAO,EAAE,2BAA2B,GAAG,UAAU,CAAC,CAAC,MAAM,UACpE,sDAAC,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,gBAAMC,UAAS,MAAM,SAAS,YAAY,MAAM,cAAc,YAAQ,wBAAS,+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,OAAO,iBAAiB,gCAAY,0BAA0B;AAChE,eAAO;AAAA,MACT,WAAW,OAAO,iBAAiB,gCAAY,yBAAyB;AACtE,eAAO;AAAA,MACT,WAAW,OAAO,iBAAiB,gCAAY,6BAA6B;AAAA,MAE5E,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":["React","result"]}
|
|
@@ -25,12 +25,12 @@ __export(error_page_exports, {
|
|
|
25
25
|
ErrorPage: () => ErrorPage
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(error_page_exports);
|
|
28
|
-
var import__ = require("..");
|
|
29
|
-
var import_predefined_message_card = require("../components/message-cards/predefined-message-card");
|
|
30
28
|
var import_stack_shared = require("@stackframe/stack-shared");
|
|
31
|
-
var import_known_error_message_card = require("../components/message-cards/known-error-message-card");
|
|
32
29
|
var import_stack_ui = require("@stackframe/stack-ui");
|
|
30
|
+
var import__ = require("..");
|
|
31
|
+
var import_known_error_message_card = require("../components/message-cards/known-error-message-card");
|
|
33
32
|
var import_message_card = require("../components/message-cards/message-card");
|
|
33
|
+
var import_predefined_message_card = require("../components/message-cards/predefined-message-card");
|
|
34
34
|
var import_translations = require("../lib/translations");
|
|
35
35
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
36
|
function ErrorPage(props) {
|
|
@@ -56,7 +56,7 @@ function ErrorPage(props) {
|
|
|
56
56
|
{
|
|
57
57
|
title: t("Failed to connect account"),
|
|
58
58
|
fullPage: !!props.fullPage,
|
|
59
|
-
primaryButtonText: t("Go
|
|
59
|
+
primaryButtonText: t("Go Home"),
|
|
60
60
|
primaryAction: () => stackApp.redirectToHome(),
|
|
61
61
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: t("This account is already connected to another user. Please connect a different account.") })
|
|
62
62
|
}
|
|
@@ -68,7 +68,7 @@ function ErrorPage(props) {
|
|
|
68
68
|
{
|
|
69
69
|
title: t("Failed to connect account"),
|
|
70
70
|
fullPage: !!props.fullPage,
|
|
71
|
-
primaryButtonText: t("Go
|
|
71
|
+
primaryButtonText: t("Go Home"),
|
|
72
72
|
primaryAction: () => stackApp.redirectToHome(),
|
|
73
73
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: t("The user is already connected to another OAuth account. Did you maybe selected the wrong account on the OAuth provider page?") })
|
|
74
74
|
}
|
|
@@ -82,7 +82,7 @@ function ErrorPage(props) {
|
|
|
82
82
|
fullPage: !!props.fullPage,
|
|
83
83
|
primaryButtonText: t("Sign in again"),
|
|
84
84
|
primaryAction: () => stackApp.redirectToSignIn(),
|
|
85
|
-
secondaryButtonText: t("Go
|
|
85
|
+
secondaryButtonText: t("Go Home"),
|
|
86
86
|
secondaryAction: () => stackApp.redirectToHome(),
|
|
87
87
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: t("The sign-in operation has been cancelled. Please try again. [access_denied]") })
|
|
88
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components-page/error-page.tsx"],"sourcesContent":["'use client';\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/components-page/error-page.tsx"],"sourcesContent":["'use client';\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 (error instanceof KnownErrors.OAuthConnectionAlreadyConnectedToAnotherUser) {\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 (error instanceof KnownErrors.UserAlreadyConnectedToAnotherOAuthConnection) {\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 (error instanceof KnownErrors.OAuthProviderAccessDenied) {\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. Please try again. [access_denied]\")}\n </Typography>\n </MessageCard>\n );\n }\n\n return <KnownErrorMessageCard error={error} fullPage={!!props.fullPage} />;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAAwC;AACxC,sBAA2B;AAC3B,eAA4B;AAC5B,sCAAsC;AACtC,0BAA4B;AAC5B,qCAAsC;AACtC,0BAA+B;AAUJ;AAPpB,SAAS,UAAU,OAAqE;AAC7F,QAAM,EAAE,EAAE,QAAI,oCAAe;AAC7B,QAAM,eAAW,sBAAY;AAC7B,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,UAAU,MAAM,aAAa;AACnC,QAAM,UAAU,MAAM,aAAa;AAEnC,QAAM,mBAAmB,4CAAC,wDAAsB,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,+BAAW,SAAS,EAAE,MAAM,WAAW,SAAS,SAAS,WAAW,CAAC;AAAA,EAC/E,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,gCAAY,8CAA8C;AAE7E,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,sDAAC,8BACE,YAAE,wFAAwF,GAC7F;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,iBAAiB,gCAAY,8CAA8C;AAE7E,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,sDAAC,8BACE,YAAE,8HAA8H,GACnI;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,iBAAiB,gCAAY,2BAA2B;AAC1D,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,sDAAC,8BACE,YAAE,6EAA6E,GAClF;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO,4CAAC,yDAAsB,OAAc,UAAU,CAAC,CAAC,MAAM,UAAU;AAC1E;","names":[]}
|
|
@@ -35,14 +35,14 @@ __export(magic_link_callback_exports, {
|
|
|
35
35
|
MagicLinkCallback: () => MagicLinkCallback
|
|
36
36
|
});
|
|
37
37
|
module.exports = __toCommonJS(magic_link_callback_exports);
|
|
38
|
+
var import_stack_shared = require("@stackframe/stack-shared");
|
|
39
|
+
var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
|
|
40
|
+
var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
|
|
38
41
|
var import_react = __toESM(require("react"));
|
|
39
42
|
var import__ = require("..");
|
|
40
43
|
var import_message_card = require("../components/message-cards/message-card");
|
|
41
44
|
var import_predefined_message_card = require("../components/message-cards/predefined-message-card");
|
|
42
|
-
var import_stack_shared = require("@stackframe/stack-shared");
|
|
43
|
-
var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
|
|
44
45
|
var import_translations = require("../lib/translations");
|
|
45
|
-
var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
|
|
46
46
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
47
47
|
var cacheSignInWithMagicLink = (0, import_caches.cacheFunction)(async (stackApp, code) => {
|
|
48
48
|
return await stackApp.signInWithMagicLink(code);
|
|
@@ -95,7 +95,7 @@ function MagicLinkCallback(props) {
|
|
|
95
95
|
{
|
|
96
96
|
title: t("Signed in successfully!"),
|
|
97
97
|
fullPage: !!props.fullPage,
|
|
98
|
-
primaryButtonText: t("Go
|
|
98
|
+
primaryButtonText: t("Go home"),
|
|
99
99
|
primaryAction: async () => {
|
|
100
100
|
await stackApp.redirectToHome();
|
|
101
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components-page/magic-link-callback.tsx"],"sourcesContent":["'use client';\n\nimport
|
|
1
|
+
{"version":3,"sources":["../../src/components-page/magic-link-callback.tsx"],"sourcesContent":["'use client';\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 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 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAA4B;AAC5B,oBAA8B;AAC9B,oBAAyB;AACzB,mBAAkB;AAClB,eAAqD;AACrD,0BAA4B;AAC5B,qCAAsC;AACtC,0BAA+B;AAgBpB;AAdX,IAAM,+BAA2B,6BAAc,OAAO,UAAgC,SAAiB;AACrG,SAAO,MAAM,SAAS,oBAAoB,IAAI;AAChD,CAAC;AAEM,SAAS,kBAAkB,OAG/B;AACD,QAAM,EAAE,EAAE,QAAI,oCAAe;AAC7B,QAAM,eAAW,sBAAY;AAC7B,QAAM,WAAO,kBAAQ;AACrB,QAAM,CAAC,QAAQ,SAAS,IAAI,aAAAA,QAAM,SAA0E,IAAI;AAEhH,MAAI,MAAM;AACR,WAAO,4CAAC,wDAAsB,MAAK,YAAW,UAAU,CAAC,CAAC,MAAM,UAAU;AAAA,EAC5E;AAEA,QAAM,aACJ,4CAAC,mCAAY,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,CAAC,MAAM,UAC7D,sDAAC,OAAG,YAAE,oGAAoG,GAAE,GAC9G;AAGF,QAAM,aACJ,4CAAC,mCAAY,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,CAAC,MAAM,UAC7D,sDAAC,OAAG,YAAE,sFAAsF,GAAE,GAChG;AAGF,QAAM,iBACJ,4CAAC,mCAAY,OAAO,EAAE,yBAAyB,GAAG,UAAU,CAAC,CAAC,MAAM,UAClE,sDAAC,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,gBAAMC,UAAS,MAAM,SAAS,oBAAoB,MAAM,cAAc,YAAQ,wBAAS,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,OAAO,iBAAiB,gCAAY,0BAA0B;AAChE,eAAO;AAAA,MACT,WAAW,OAAO,iBAAiB,gCAAY,yBAAyB;AACtE,eAAO;AAAA,MACT,WAAW,OAAO,iBAAiB,gCAAY,6BAA6B;AAC1E,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":["React","result"]}
|
|
@@ -65,7 +65,7 @@ function TeamInvitationInner(props) {
|
|
|
65
65
|
{
|
|
66
66
|
title: t("Team invitation"),
|
|
67
67
|
fullPage: props.fullPage,
|
|
68
|
-
primaryButtonText: "Go
|
|
68
|
+
primaryButtonText: "Go home",
|
|
69
69
|
primaryAction: () => stackApp.redirectToHome(),
|
|
70
70
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_stack_ui.Typography, { children: [
|
|
71
71
|
"You have successfully joined ",
|
|
@@ -114,7 +114,7 @@ function TeamInvitation({ fullPage = false, searchParams }) {
|
|
|
114
114
|
{
|
|
115
115
|
title: t("Team invitation"),
|
|
116
116
|
fullPage,
|
|
117
|
-
primaryButtonText: t("
|
|
117
|
+
primaryButtonText: t("Sign in"),
|
|
118
118
|
primaryAction: () => stackApp.redirectToSignIn(),
|
|
119
119
|
secondaryButtonText: t("Cancel"),
|
|
120
120
|
secondaryAction: () => stackApp.redirectToHome(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components-page/team-invitation.tsx"],"sourcesContent":["'use client';\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Typography } from \"@stackframe/stack-ui\";\nimport React from \"react\";\nimport { MessageCard, StackClientApp, useStackApp, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cachedVerifyInvitation = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyTeamInvitationCode(code);\n});\n\nconst cachedGetInvitationDetails = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.getTeamInvitationDetails(code);\n});\n\nfunction TeamInvitationInner(props: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const [success, setSuccess] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState<string | null>(null);\n const details = React.use(cachedGetInvitationDetails(stackApp, props.searchParams.code || ''));\n\n if (errorMessage || details.status === 'error') {\n return (\n <PredefinedMessageCard type=\"unknownError\" fullPage={props.fullPage} />\n );\n }\n\n if (success) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText=\"Go
|
|
1
|
+
{"version":3,"sources":["../../src/components-page/team-invitation.tsx"],"sourcesContent":["'use client';\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Typography } from \"@stackframe/stack-ui\";\nimport React from \"react\";\nimport { MessageCard, StackClientApp, useStackApp, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cachedVerifyInvitation = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyTeamInvitationCode(code);\n});\n\nconst cachedGetInvitationDetails = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.getTeamInvitationDetails(code);\n});\n\nfunction TeamInvitationInner(props: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const [success, setSuccess] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState<string | null>(null);\n const details = React.use(cachedGetInvitationDetails(stackApp, props.searchParams.code || ''));\n\n if (errorMessage || details.status === 'error') {\n return (\n <PredefinedMessageCard type=\"unknownError\" fullPage={props.fullPage} />\n );\n }\n\n if (success) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText=\"Go home\"\n primaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>You have successfully joined {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n }\n\n\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText={t('Join')}\n primaryAction={() => runAsynchronouslyWithAlert(async () => {\n const result = await stackApp.acceptTeamInvitation(props.searchParams.code || '');\n if (result.status === 'error') {\n setErrorMessage(result.error.message);\n } else {\n setSuccess(true);\n }\n })}\n secondaryButtonText={t('Ignore')}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>You are invited to join {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n}\n\nexport function TeamInvitation({ fullPage=false, searchParams }: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const user = useUser();\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title={t('Invalid Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Please double check if you have the correct team invitation link.')}</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t('Expired Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Your team invitation link has expired. Please request a new team invitation link ')}</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title={t('Used Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('This team invitation link has already been used.')}</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n if (!user) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={fullPage}\n primaryButtonText={t('Sign in')}\n primaryAction={() => stackApp.redirectToSignIn()}\n secondaryButtonText={t('Cancel')}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>{t('Sign in or create an account to join the team.')}</Typography>\n </MessageCard>\n );\n }\n\n const verificationResult = React.use(cachedVerifyInvitation(stackApp, searchParams.code || ''));\n\n if (verificationResult.status === 'error') {\n const error = verificationResult.error;\n if (error instanceof KnownErrors.VerificationCodeNotFound) {\n return invalidJsx;\n } else if (error instanceof KnownErrors.VerificationCodeExpired) {\n return expiredJsx;\n } else if (error instanceof KnownErrors.VerificationCodeAlreadyUsed) {\n return usedJsx;\n } else {\n throw error;\n }\n }\n\n return <TeamInvitationInner fullPage={fullPage} searchParams={searchParams} />;\n};\n"],"mappings":"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","names":["React"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
4
|
// src/components/message-cards/known-error-message-card.tsx
|
|
5
|
-
import { useStackApp } from "../..";
|
|
6
5
|
import { Typography } from "@stackframe/stack-ui";
|
|
6
|
+
import { useStackApp } from "../..";
|
|
7
7
|
import { MessageCard } from "./message-card";
|
|
8
8
|
import { jsxs } from "react/jsx-runtime";
|
|
9
9
|
function KnownErrorMessageCard({
|
|
@@ -16,7 +16,7 @@ function KnownErrorMessageCard({
|
|
|
16
16
|
{
|
|
17
17
|
title: "An error occurred",
|
|
18
18
|
fullPage,
|
|
19
|
-
primaryButtonText: "Go
|
|
19
|
+
primaryButtonText: "Go Home",
|
|
20
20
|
primaryAction: () => stackApp.redirectToHome(),
|
|
21
21
|
children: [
|
|
22
22
|
/* @__PURE__ */ jsxs(Typography, { children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/message-cards/known-error-message-card.tsx"],"sourcesContent":["\"use client\";\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/message-cards/known-error-message-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { KnownError } from \"@stackframe/stack-shared\";\nimport { Typography } from \"@stackframe/stack-ui\";\nimport { useStackApp } from \"../..\";\nimport { MessageCard } from \"./message-card\";\n\nexport function KnownErrorMessageCard({\n error,\n fullPage=false,\n}: {\n error: KnownError,\n fullPage?: boolean,\n}) {\n const stackApp = useStackApp();\n\n return (\n <MessageCard\n title={\"An error occurred\"}\n fullPage={fullPage}\n primaryButtonText={\"Go Home\"}\n primaryAction={() => stackApp.redirectToHome()}\n >\n {<Typography>Error Code: {error.errorCode}</Typography>}\n {<Typography>Error Message: {error.message}</Typography>}\n </MessageCard>\n );\n}\n"],"mappings":";;;AAGA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAkBrB;AAhBA,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,WAAS;AACX,GAGG;AACD,QAAM,WAAW,YAAY;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA,mBAAmB;AAAA,MACnB,eAAe,MAAM,SAAS,eAAe;AAAA,MAE5C;AAAA,6BAAC,cAAW;AAAA;AAAA,UAAa,MAAM;AAAA,WAAU;AAAA,QACzC,qBAAC,cAAW;AAAA;AAAA,UAAgB,MAAM;AAAA,WAAQ;AAAA;AAAA;AAAA,EAC7C;AAEJ;","names":[]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
// src/components/message-cards/predefined-message-card.tsx
|
|
5
5
|
import { Typography } from "@stackframe/stack-ui";
|
|
6
6
|
import { useStackApp } from "../..";
|
|
7
|
-
import { MessageCard } from "./message-card";
|
|
8
7
|
import { useTranslation } from "../../lib/translations";
|
|
8
|
+
import { MessageCard } from "./message-card";
|
|
9
9
|
import { jsx } from "react/jsx-runtime";
|
|
10
10
|
function PredefinedMessageCard({
|
|
11
11
|
type,
|
|
@@ -24,7 +24,7 @@ function PredefinedMessageCard({
|
|
|
24
24
|
title = t("You are already signed in");
|
|
25
25
|
primaryAction = () => stackApp.redirectToHome();
|
|
26
26
|
secondaryAction = () => stackApp.redirectToSignOut();
|
|
27
|
-
primaryButton = t("Go
|
|
27
|
+
primaryButton = t("Go home");
|
|
28
28
|
secondaryButton = t("Sign out");
|
|
29
29
|
break;
|
|
30
30
|
}
|
|
@@ -38,7 +38,7 @@ function PredefinedMessageCard({
|
|
|
38
38
|
title = t("Sign up for new users is not enabled at the moment.");
|
|
39
39
|
primaryAction = () => stackApp.redirectToHome();
|
|
40
40
|
secondaryAction = () => stackApp.redirectToSignIn();
|
|
41
|
-
primaryButton = t("Go
|
|
41
|
+
primaryButton = t("Go home");
|
|
42
42
|
secondaryButton = t("Sign in");
|
|
43
43
|
break;
|
|
44
44
|
}
|
|
@@ -46,7 +46,7 @@ function PredefinedMessageCard({
|
|
|
46
46
|
title = t("Email sent!");
|
|
47
47
|
message = t("If the user with this e-mail address exists, an e-mail was sent to your inbox. Make sure to check your spam folder.");
|
|
48
48
|
primaryAction = () => stackApp.redirectToHome();
|
|
49
|
-
primaryButton = t("Go
|
|
49
|
+
primaryButton = t("Go home");
|
|
50
50
|
break;
|
|
51
51
|
}
|
|
52
52
|
case "passwordReset": {
|
|
@@ -60,7 +60,7 @@ function PredefinedMessageCard({
|
|
|
60
60
|
title = t("An unknown error occurred");
|
|
61
61
|
message = t("Please try again and if the problem persists, contact support.");
|
|
62
62
|
primaryAction = () => stackApp.redirectToHome();
|
|
63
|
-
primaryButton = t("Go
|
|
63
|
+
primaryButton = t("Go home");
|
|
64
64
|
break;
|
|
65
65
|
}
|
|
66
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/message-cards/predefined-message-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { Typography } from \"@stackframe/stack-ui\";\nimport { useStackApp
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/message-cards/predefined-message-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { Typography } from \"@stackframe/stack-ui\";\nimport { useStackApp } from \"../..\";\nimport { useTranslation } from \"../../lib/translations\";\nimport { MessageCard } from \"./message-card\";\n\nexport function PredefinedMessageCard({\n type,\n fullPage=false,\n}: {\n type: 'signedIn' | 'signedOut' | 'emailSent' | 'passwordReset' | 'unknownError' | 'signUpDisabled',\n fullPage?: boolean,\n}) {\n const stackApp = useStackApp();\n const { t } = useTranslation();\n\n let title: string;\n let message: string | null = null;\n let primaryButton: string | null = null;\n let secondaryButton: string | null = null;\n let primaryAction: (() => Promise<void> | void) | null = null;\n let secondaryAction: (() => Promise<void> | void) | null = null;\n\n switch (type) {\n case 'signedIn': {\n title = t(\"You are already signed in\");\n primaryAction = () => stackApp.redirectToHome();\n secondaryAction = () => stackApp.redirectToSignOut();\n primaryButton = t(\"Go home\");\n secondaryButton = t(\"Sign out\");\n break;\n }\n case 'signedOut': {\n title = t(\"You are not currently signed in.\");\n primaryAction = () => stackApp.redirectToSignIn();\n primaryButton = t(\"Sign in\");\n break;\n }\n case 'signUpDisabled': {\n title = t(\"Sign up for new users is not enabled at the moment.\");\n primaryAction = () => stackApp.redirectToHome();\n secondaryAction = () => stackApp.redirectToSignIn();\n primaryButton = t(\"Go home\");\n secondaryButton = t(\"Sign in\");\n break;\n }\n case 'emailSent': {\n title = t(\"Email sent!\");\n message = t(\"If the user with this e-mail address exists, an e-mail was sent to your inbox. Make sure to check your spam folder.\");\n primaryAction = () => stackApp.redirectToHome();\n primaryButton = t(\"Go home\");\n break;\n }\n case 'passwordReset': {\n title = t(\"Password reset successfully!\");\n message = t(\"Your password has been reset. You can now sign in with your new password.\");\n primaryAction = () => stackApp.redirectToSignIn({ noRedirectBack: true });\n primaryButton = t(\"Sign in\");\n break;\n }\n case 'unknownError': {\n title = t(\"An unknown error occurred\");\n message = t(\"Please try again and if the problem persists, contact support.\");\n primaryAction = () => stackApp.redirectToHome();\n primaryButton = t(\"Go home\");\n break;\n }\n }\n\n return (\n <MessageCard\n title={title}\n fullPage={fullPage}\n primaryButtonText={primaryButton}\n primaryAction={primaryAction}\n secondaryButtonText={secondaryButton || undefined}\n secondaryAction={secondaryAction || undefined}\n >\n {message && <Typography>{message}</Typography>}\n </MessageCard>\n );\n}\n"],"mappings":";;;AAEA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AA0EV;AAxEX,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,WAAS;AACX,GAGG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,MAAI;AACJ,MAAI,UAAyB;AAC7B,MAAI,gBAA+B;AACnC,MAAI,kBAAiC;AACrC,MAAI,gBAAqD;AACzD,MAAI,kBAAuD;AAE3D,UAAQ,MAAM;AAAA,IACZ,KAAK,YAAY;AACf,cAAQ,EAAE,2BAA2B;AACrC,sBAAgB,MAAM,SAAS,eAAe;AAC9C,wBAAkB,MAAM,SAAS,kBAAkB;AACnD,sBAAgB,EAAE,SAAS;AAC3B,wBAAkB,EAAE,UAAU;AAC9B;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,cAAQ,EAAE,kCAAkC;AAC5C,sBAAgB,MAAM,SAAS,iBAAiB;AAChD,sBAAgB,EAAE,SAAS;AAC3B;AAAA,IACF;AAAA,IACA,KAAK,kBAAkB;AACrB,cAAQ,EAAE,qDAAqD;AAC/D,sBAAgB,MAAM,SAAS,eAAe;AAC9C,wBAAkB,MAAM,SAAS,iBAAiB;AAClD,sBAAgB,EAAE,SAAS;AAC3B,wBAAkB,EAAE,SAAS;AAC7B;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,cAAQ,EAAE,aAAa;AACvB,gBAAU,EAAE,qHAAqH;AACjI,sBAAgB,MAAM,SAAS,eAAe;AAC9C,sBAAgB,EAAE,SAAS;AAC3B;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,cAAQ,EAAE,8BAA8B;AACxC,gBAAU,EAAE,2EAA2E;AACvF,sBAAgB,MAAM,SAAS,iBAAiB,EAAE,gBAAgB,KAAK,CAAC;AACxE,sBAAgB,EAAE,SAAS;AAC3B;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,cAAQ,EAAE,2BAA2B;AACrC,gBAAU,EAAE,gEAAgE;AAC5E,sBAAgB,MAAM,SAAS,eAAe;AAC9C,sBAAgB,EAAE,SAAS;AAC3B;AAAA,IACF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,MACnB;AAAA,MACA,qBAAqB,mBAAmB;AAAA,MACxC,iBAAiB,mBAAmB;AAAA,MAEnC,qBAAW,oBAAC,cAAY,mBAAQ;AAAA;AAAA,EACnC;AAEJ;","names":[]}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
import { yupResolver } from "@hookform/resolvers/yup";
|
|
6
6
|
import { getPasswordError } from "@stackframe/stack-shared/dist/helpers/password";
|
|
7
7
|
import { useAsyncCallback } from "@stackframe/stack-shared/dist/hooks/use-async-callback";
|
|
8
|
-
import {
|
|
8
|
+
import { passwordSchema as schemaFieldsPasswordSchema, strictEmailSchema, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
|
|
9
9
|
import { generateRandomValues } from "@stackframe/stack-shared/dist/utils/crypto";
|
|
10
10
|
import { throwErr } from "@stackframe/stack-shared/dist/utils/errors";
|
|
11
11
|
import { runAsynchronously, runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises";
|
|
12
12
|
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActionCell, Badge, Button, Input, Label, PasswordInput, Separator, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from "@stackframe/stack-ui";
|
|
13
|
-
import { CirclePlus, Contact, Edit, Settings, ShieldCheck } from "lucide-react";
|
|
13
|
+
import { CirclePlus, Contact, Edit, Settings, ShieldCheck, Trash } from "lucide-react";
|
|
14
14
|
import { useRouter } from "next/navigation";
|
|
15
15
|
import { TOTPController, createTOTPKeyURI } from "oslo/otp";
|
|
16
16
|
import * as QRCode from "qrcode";
|
|
@@ -164,11 +164,11 @@ function EmailsSection() {
|
|
|
164
164
|
});
|
|
165
165
|
}
|
|
166
166
|
}, [contactChannels, addedEmail]);
|
|
167
|
-
const
|
|
167
|
+
const emailSchema = yupObject({
|
|
168
168
|
email: strictEmailSchema(t("Please enter a valid email address")).notOneOf(contactChannels.map((x) => x.value), t("Email already exists")).defined().nonEmpty(t("Email is required"))
|
|
169
169
|
});
|
|
170
170
|
const { register, handleSubmit, formState: { errors }, reset } = useForm({
|
|
171
|
-
resolver: yupResolver(
|
|
171
|
+
resolver: yupResolver(emailSchema)
|
|
172
172
|
});
|
|
173
173
|
const onSubmit = async (data) => {
|
|
174
174
|
setAddingEmailLoading(true);
|
|
@@ -660,8 +660,8 @@ function TeamPage(props) {
|
|
|
660
660
|
const memberListSection = useMemberListSection(props);
|
|
661
661
|
return /* @__PURE__ */ jsxs(PageLayout, { children: [
|
|
662
662
|
teamUserProfileSection,
|
|
663
|
-
memberInvitationSection,
|
|
664
663
|
memberListSection,
|
|
664
|
+
memberInvitationSection,
|
|
665
665
|
teamProfileImageSection,
|
|
666
666
|
teamDisplayNameSection,
|
|
667
667
|
leaveTeamSection
|
|
@@ -780,13 +780,19 @@ function useTeamUserProfileSection(props) {
|
|
|
780
780
|
function useMemberInvitationSection(props) {
|
|
781
781
|
const { t } = useTranslation();
|
|
782
782
|
const invitationSchema = yupObject({
|
|
783
|
-
email:
|
|
783
|
+
email: strictEmailSchema(t("Please enter a valid email address")).defined().nonEmpty(t("Please enter an email address"))
|
|
784
784
|
});
|
|
785
785
|
const user = useUser({ or: "redirect" });
|
|
786
786
|
const inviteMemberPermission = user.usePermission(props.team, "$invite_members");
|
|
787
|
+
const readMemberPermission = user.usePermission(props.team, "$read_members");
|
|
788
|
+
const removeMemberPermission = user.usePermission(props.team, "$remove_members");
|
|
787
789
|
if (!inviteMemberPermission) {
|
|
788
790
|
return null;
|
|
789
791
|
}
|
|
792
|
+
let invitationsToShow = [];
|
|
793
|
+
if (readMemberPermission) {
|
|
794
|
+
invitationsToShow = props.team.useInvitations();
|
|
795
|
+
}
|
|
790
796
|
const { register, handleSubmit, formState: { errors }, watch } = useForm({
|
|
791
797
|
resolver: yupResolver(invitationSchema)
|
|
792
798
|
});
|
|
@@ -804,38 +810,52 @@ function useMemberInvitationSection(props) {
|
|
|
804
810
|
useEffect(() => {
|
|
805
811
|
setInvitedEmail(null);
|
|
806
812
|
}, [watch("email")]);
|
|
807
|
-
return /* @__PURE__ */
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
/* @__PURE__ */
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
"
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
813
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
814
|
+
/* @__PURE__ */ jsx(
|
|
815
|
+
Section,
|
|
816
|
+
{
|
|
817
|
+
title: t("Invite member"),
|
|
818
|
+
description: t("Invite a user to your team through email"),
|
|
819
|
+
children: /* @__PURE__ */ jsxs(
|
|
820
|
+
"form",
|
|
821
|
+
{
|
|
822
|
+
onSubmit: (e) => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e)),
|
|
823
|
+
noValidate: true,
|
|
824
|
+
className: "w-full",
|
|
825
|
+
children: [
|
|
826
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row w-full", children: [
|
|
827
|
+
/* @__PURE__ */ jsx(
|
|
828
|
+
Input,
|
|
829
|
+
{
|
|
830
|
+
placeholder: t("Email"),
|
|
831
|
+
...register("email")
|
|
832
|
+
}
|
|
833
|
+
),
|
|
834
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", loading, children: t("Invite User") })
|
|
835
|
+
] }),
|
|
836
|
+
/* @__PURE__ */ jsx(FormWarningText, { text: errors.email?.message?.toString() }),
|
|
837
|
+
invitedEmail && /* @__PURE__ */ jsxs(Typography, { type: "label", variant: "secondary", children: [
|
|
838
|
+
"Invited ",
|
|
839
|
+
invitedEmail
|
|
840
|
+
] })
|
|
841
|
+
]
|
|
842
|
+
}
|
|
843
|
+
)
|
|
844
|
+
}
|
|
845
|
+
),
|
|
846
|
+
invitationsToShow.length > 0 && /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Table, { className: "mt-6", children: [
|
|
847
|
+
/* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
848
|
+
/* @__PURE__ */ jsx(TableHead, { className: "w-[200px]", children: t("Outstanding invitations") }),
|
|
849
|
+
/* @__PURE__ */ jsx(TableHead, { className: "w-[60px]", children: t("Expires") }),
|
|
850
|
+
/* @__PURE__ */ jsx(TableHead, { className: "w-[36px] max-w-[36px]" })
|
|
851
|
+
] }) }),
|
|
852
|
+
/* @__PURE__ */ jsx(TableBody, { children: invitationsToShow.map((invitation, i) => /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
853
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Typography, { children: invitation.recipientEmail }) }),
|
|
854
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(Typography, { variant: "secondary", children: invitation.expiresAt.toLocaleString() }) }),
|
|
855
|
+
/* @__PURE__ */ jsx(TableCell, { align: "right", className: "max-w-[36px]", children: removeMemberPermission && /* @__PURE__ */ jsx(Button, { onClick: async () => await invitation.revoke(), size: "icon", variant: "ghost", children: /* @__PURE__ */ jsx(Trash, { className: "w-4 h-4" }) }) })
|
|
856
|
+
] }, invitation.id)) })
|
|
857
|
+
] }) })
|
|
858
|
+
] });
|
|
839
859
|
}
|
|
840
860
|
function useMemberListSection(props) {
|
|
841
861
|
const { t } = useTranslation();
|