@stackframe/stack 2.5.17 → 2.5.19

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.
Files changed (108) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components/credential-sign-in.js +4 -1
  3. package/dist/components/credential-sign-in.js.map +1 -1
  4. package/dist/components/elements/sidebar-layout.d.mts +21 -0
  5. package/dist/components/elements/sidebar-layout.d.ts +21 -0
  6. package/dist/components/elements/sidebar-layout.js +125 -0
  7. package/dist/components/elements/sidebar-layout.js.map +1 -0
  8. package/dist/components/elements/user-avatar.d.mts +5 -11
  9. package/dist/components/elements/user-avatar.d.ts +5 -11
  10. package/dist/components/elements/user-avatar.js.map +1 -1
  11. package/dist/components/message-cards/predefined-message-card.d.mts +1 -1
  12. package/dist/components/message-cards/predefined-message-card.d.ts +1 -1
  13. package/dist/components/message-cards/predefined-message-card.js +8 -0
  14. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  15. package/dist/components/selected-team-switcher.d.mts +1 -0
  16. package/dist/components/selected-team-switcher.d.ts +1 -0
  17. package/dist/components/selected-team-switcher.js +35 -5
  18. package/dist/components/selected-team-switcher.js.map +1 -1
  19. package/dist/components-page/account-settings.js +123 -31
  20. package/dist/components-page/account-settings.js.map +1 -1
  21. package/dist/components-page/auth-page.d.mts +1 -0
  22. package/dist/components-page/auth-page.d.ts +1 -0
  23. package/dist/components-page/auth-page.js +4 -1
  24. package/dist/components-page/auth-page.js.map +1 -1
  25. package/dist/components-page/forgot-password.d.mts +4 -1
  26. package/dist/components-page/forgot-password.d.ts +4 -1
  27. package/dist/components-page/forgot-password.js +55 -7
  28. package/dist/components-page/forgot-password.js.map +1 -1
  29. package/dist/components-page/password-reset.d.mts +6 -2
  30. package/dist/components-page/password-reset.d.ts +6 -2
  31. package/dist/components-page/password-reset.js +100 -8
  32. package/dist/components-page/password-reset.js.map +1 -1
  33. package/dist/components-page/stack-handler.d.mts +1 -0
  34. package/dist/components-page/stack-handler.d.ts +1 -0
  35. package/dist/components-page/stack-handler.js +32 -6
  36. package/dist/components-page/stack-handler.js.map +1 -1
  37. package/dist/{components/password-reset-form.d.mts → components-page/team-creation.d.mts} +2 -3
  38. package/dist/{components/password-reset-form.d.ts → components-page/team-creation.d.ts} +2 -3
  39. package/dist/components-page/team-creation.js +92 -0
  40. package/dist/components-page/team-creation.js.map +1 -0
  41. package/dist/components-page/team-invitation.d.mts +8 -0
  42. package/dist/components-page/team-invitation.d.ts +8 -0
  43. package/dist/components-page/team-invitation.js +141 -0
  44. package/dist/components-page/team-invitation.js.map +1 -0
  45. package/dist/components-page/team-settings.d.mts +8 -0
  46. package/dist/components-page/team-settings.d.ts +8 -0
  47. package/dist/components-page/team-settings.js +139 -0
  48. package/dist/components-page/team-settings.js.map +1 -0
  49. package/dist/esm/components/credential-sign-in.js +4 -1
  50. package/dist/esm/components/credential-sign-in.js.map +1 -1
  51. package/dist/esm/components/elements/sidebar-layout.js +90 -0
  52. package/dist/esm/components/elements/sidebar-layout.js.map +1 -0
  53. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  54. package/dist/esm/components/message-cards/predefined-message-card.js +8 -0
  55. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  56. package/dist/esm/components/selected-team-switcher.js +39 -7
  57. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  58. package/dist/esm/components-page/account-settings.js +114 -32
  59. package/dist/esm/components-page/account-settings.js.map +1 -1
  60. package/dist/esm/components-page/auth-page.js +4 -1
  61. package/dist/esm/components-page/auth-page.js.map +1 -1
  62. package/dist/esm/components-page/forgot-password.js +52 -5
  63. package/dist/esm/components-page/forgot-password.js.map +1 -1
  64. package/dist/esm/components-page/password-reset.js +101 -9
  65. package/dist/esm/components-page/password-reset.js.map +1 -1
  66. package/dist/esm/components-page/stack-handler.js +32 -6
  67. package/dist/esm/components-page/stack-handler.js.map +1 -1
  68. package/dist/esm/components-page/team-creation.js +68 -0
  69. package/dist/esm/components-page/team-creation.js.map +1 -0
  70. package/dist/esm/components-page/team-invitation.js +107 -0
  71. package/dist/esm/components-page/team-invitation.js.map +1 -0
  72. package/dist/esm/components-page/team-settings.js +115 -0
  73. package/dist/esm/components-page/team-settings.js.map +1 -0
  74. package/dist/esm/generated/global-css.js +1 -1
  75. package/dist/esm/generated/global-css.js.map +1 -1
  76. package/dist/esm/lib/auth.js +5 -1
  77. package/dist/esm/lib/auth.js.map +1 -1
  78. package/dist/esm/lib/stack-app.js +272 -25
  79. package/dist/esm/lib/stack-app.js.map +1 -1
  80. package/dist/generated/global-css.d.mts +1 -1
  81. package/dist/generated/global-css.d.ts +1 -1
  82. package/dist/generated/global-css.js +1 -1
  83. package/dist/generated/global-css.js.map +1 -1
  84. package/dist/index.d.mts +2 -1
  85. package/dist/index.d.ts +2 -1
  86. package/dist/lib/auth.js +5 -1
  87. package/dist/lib/auth.js.map +1 -1
  88. package/dist/lib/hooks.d.mts +1 -0
  89. package/dist/lib/hooks.d.ts +1 -0
  90. package/dist/lib/stack-app.d.mts +64 -5
  91. package/dist/lib/stack-app.d.ts +64 -5
  92. package/dist/lib/stack-app.js +272 -25
  93. package/dist/lib/stack-app.js.map +1 -1
  94. package/dist/providers/stack-provider-client.d.mts +1 -0
  95. package/dist/providers/stack-provider-client.d.ts +1 -0
  96. package/dist/providers/stack-provider.d.mts +1 -0
  97. package/dist/providers/stack-provider.d.ts +1 -0
  98. package/package.json +10 -6
  99. package/dist/components/forgot-password-form.d.mts +0 -7
  100. package/dist/components/forgot-password-form.d.ts +0 -7
  101. package/dist/components/forgot-password-form.js +0 -83
  102. package/dist/components/forgot-password-form.js.map +0 -1
  103. package/dist/components/password-reset-form.js +0 -135
  104. package/dist/components/password-reset-form.js.map +0 -1
  105. package/dist/esm/components/forgot-password-form.js +0 -59
  106. package/dist/esm/components/forgot-password-form.js.map +0 -1
  107. package/dist/esm/components/password-reset-form.js +0 -105
  108. package/dist/esm/components/password-reset-form.js.map +0 -1
@@ -32,17 +32,109 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
32
32
  // src/components-page/password-reset.tsx
33
33
  var password_reset_exports = {};
34
34
  __export(password_reset_exports, {
35
- PasswordReset: () => PasswordReset
35
+ PasswordReset: () => PasswordReset,
36
+ default: () => PasswordResetForm
36
37
  });
37
38
  module.exports = __toCommonJS(password_reset_exports);
38
- var import_message_card = require("../components/message-cards/message-card");
39
- var import__ = require("..");
40
- var import_react = __toESM(require("react"));
41
- var import_password_reset_form = __toESM(require("../components/password-reset-form"));
42
- var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
39
+ var import_yup = require("@hookform/resolvers/yup");
43
40
  var import_stack_shared = require("@stackframe/stack-shared");
41
+ var import_password = require("@stackframe/stack-shared/dist/helpers/password");
42
+ var import_schema_fields = require("@stackframe/stack-shared/dist/schema-fields");
43
+ var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
44
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
44
45
  var import_stack_ui = require("@stackframe/stack-ui");
46
+ var import_react = __toESM(require("react"));
47
+ var import_react_hook_form = require("react-hook-form");
48
+ var yup = __toESM(require("yup"));
49
+ var import__ = require("..");
50
+ var import_form_warning = require("../components/elements/form-warning");
51
+ var import_maybe_full_page = require("../components/elements/maybe-full-page");
52
+ var import_message_card = require("../components/message-cards/message-card");
53
+ var import_predefined_message_card = require("../components/message-cards/predefined-message-card");
45
54
  var import_jsx_runtime = require("react/jsx-runtime");
55
+ var schema = (0, import_schema_fields.yupObject)({
56
+ password: (0, import_schema_fields.yupString)().required("Please enter your password").test({
57
+ name: "is-valid-password",
58
+ test: (value, ctx) => {
59
+ const error = (0, import_password.getPasswordError)(value);
60
+ if (error) {
61
+ return ctx.createError({ message: error.message });
62
+ } else {
63
+ return true;
64
+ }
65
+ }
66
+ }),
67
+ passwordRepeat: (0, import_schema_fields.yupString)().nullable().oneOf([yup.ref("password"), null], "Passwords do not match").required("Please repeat your password")
68
+ });
69
+ function PasswordResetForm({ code, fullPage = false }) {
70
+ const { register, handleSubmit, formState: { errors }, clearErrors } = (0, import_react_hook_form.useForm)({
71
+ resolver: (0, import_yup.yupResolver)(schema)
72
+ });
73
+ const stackApp = (0, import__.useStackApp)();
74
+ const [finished, setFinished] = (0, import_react.useState)(false);
75
+ const [resetError, setResetError] = (0, import_react.useState)(false);
76
+ const [loading, setLoading] = (0, import_react.useState)(false);
77
+ const onSubmit = async (data) => {
78
+ setLoading(true);
79
+ try {
80
+ const { password } = data;
81
+ const errorCode = await stackApp.resetPassword({ password, code });
82
+ if (errorCode) {
83
+ setResetError(true);
84
+ return;
85
+ }
86
+ setFinished(true);
87
+ } finally {
88
+ setLoading(false);
89
+ }
90
+ };
91
+ if (finished) {
92
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_predefined_message_card.PredefinedMessageCard, { type: "passwordReset", fullPage });
93
+ }
94
+ if (resetError) {
95
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_message_card.MessageCard, { title: "Failed to reset password", fullPage, children: "Failed to reset password. Please request a new password reset link" });
96
+ }
97
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_maybe_full_page.MaybeFullPage, { fullPage, children: [
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-center mb-6", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { type: "h2", children: "Reset Your Password" }) }),
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
100
+ "form",
101
+ {
102
+ style: { display: "flex", flexDirection: "column", alignItems: "stretch" },
103
+ onSubmit: (e) => (0, import_promises.runAsynchronouslyWithAlert)(handleSubmit(onSubmit)(e)),
104
+ noValidate: true,
105
+ children: [
106
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Label, { htmlFor: "password", className: "mb-1", children: "New Password" }),
107
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
108
+ import_stack_ui.PasswordInput,
109
+ {
110
+ id: "password",
111
+ ...register("password"),
112
+ onChange: () => {
113
+ clearErrors("password");
114
+ clearErrors("passwordRepeat");
115
+ }
116
+ }
117
+ ),
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.FormWarningText, { text: errors.password?.message?.toString() }),
119
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Label, { htmlFor: "repeat-password", className: "mt-4 mb-1", children: "Repeat New Password" }),
120
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
121
+ import_stack_ui.PasswordInput,
122
+ {
123
+ id: "repeat-password",
124
+ ...register("passwordRepeat"),
125
+ onChange: () => {
126
+ clearErrors("password");
127
+ clearErrors("passwordRepeat");
128
+ }
129
+ }
130
+ ),
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.FormWarningText, { text: errors.passwordRepeat?.message?.toString() }),
132
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Button, { type: "submit", className: "mt-6", loading, children: "Reset Password" })
133
+ ]
134
+ }
135
+ )
136
+ ] });
137
+ }
46
138
  var cachedVerifyPasswordResetCode = (0, import_caches.cacheFunction)(async (stackApp, code) => {
47
139
  return await stackApp.verifyPasswordResetCode(code);
48
140
  });
@@ -54,7 +146,7 @@ function PasswordReset({
54
146
  const invalidJsx = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_message_card.MessageCard, { title: "Invalid Password Reset Link", fullPage, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: "Please double check if you have the correct password reset link." }) });
55
147
  const expiredJsx = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_message_card.MessageCard, { title: "Expired Password Reset Link", fullPage, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: "Your password reset link has expired. Please request a new password reset link from the login page." }) });
56
148
  const usedJsx = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_message_card.MessageCard, { title: "Used Password Reset Link", fullPage, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: "This password reset link has already been used. If you need to reset your password again, please request a new password reset link from the login page." }) });
57
- const code = searchParams?.code;
149
+ const code = searchParams.code;
58
150
  if (!code) {
59
151
  return invalidJsx;
60
152
  }
@@ -68,7 +160,7 @@ function PasswordReset({
68
160
  } else if (error) {
69
161
  throw error;
70
162
  }
71
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_password_reset_form.default, { code, fullPage });
163
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PasswordResetForm, { code, fullPage });
72
164
  }
73
165
  // Annotate the CommonJS export names for ESM import in node:
74
166
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components-page/password-reset.tsx"],"sourcesContent":["'use client';\n\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { StackClientApp, useStackApp } from \"..\";\nimport React from \"react\";\nimport PasswordResetForm from \"../components/password-reset-form\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { Typography } from \"@stackframe/stack-ui\";\n\nconst cachedVerifyPasswordResetCode = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyPasswordResetCode(code);\n});\n\nexport function PasswordReset({\n searchParams,\n fullPage = false,\n}: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title=\"Invalid Password Reset Link\" fullPage={fullPage}>\n <Typography>Please double check if you have the correct password reset link.</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title=\"Expired Password Reset Link\" fullPage={fullPage}>\n <Typography>Your password reset link has expired. Please request a new password reset link from the login page.</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title=\"Used Password Reset Link\" fullPage={fullPage}>\n <Typography>This password reset link has already been used. If you need to reset your password again, please request a new password reset link from the login page.</Typography>\n </MessageCard>\n );\n\n const code = searchParams?.code;\n if (!code) {\n return invalidJsx;\n }\n\n const error = React.use(cachedVerifyPasswordResetCode(stackApp, code));\n\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 if (error) {\n throw error;\n }\n\n return <PasswordResetForm code={code} fullPage={fullPage} />;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAA4B;AAC5B,eAA4C;AAC5C,mBAAkB;AAClB,iCAA8B;AAC9B,oBAA8B;AAC9B,0BAA4B;AAC5B,sBAA2B;AAiBrB;AAfN,IAAM,oCAAgC,6BAAc,OAAO,UAAgC,SAAiB;AAC1G,SAAO,MAAM,SAAS,wBAAwB,IAAI;AACpD,CAAC;AAEM,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,WAAW;AACb,GAGG;AACD,QAAM,eAAW,sBAAY;AAE7B,QAAM,aACJ,4CAAC,mCAAY,OAAM,+BAA8B,UAC/C,sDAAC,8BAAW,8EAAgE,GAC9E;AAGF,QAAM,aACJ,4CAAC,mCAAY,OAAM,+BAA8B,UAC/C,sDAAC,8BAAW,iHAAmG,GACjH;AAGF,QAAM,UACJ,4CAAC,mCAAY,OAAM,4BAA2B,UAC5C,sDAAC,8BAAW,qKAAuJ,GACrK;AAGF,QAAM,OAAO,cAAc;AAC3B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,aAAAA,QAAM,IAAI,8BAA8B,UAAU,IAAI,CAAC;AAErE,MAAI,iBAAiB,gCAAY,0BAA0B;AACzD,WAAO;AAAA,EACT,WAAW,iBAAiB,gCAAY,yBAAyB;AAC/D,WAAO;AAAA,EACT,WAAW,iBAAiB,gCAAY,6BAA6B;AACnE,WAAO;AAAA,EACT,WAAW,OAAO;AAChB,UAAM;AAAA,EACR;AAEA,SAAO,4CAAC,2BAAAC,SAAA,EAAkB,MAAY,UAAoB;AAC5D;","names":["React","PasswordResetForm"]}
1
+ {"version":3,"sources":["../../src/components-page/password-reset.tsx"],"sourcesContent":["'use client';\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { getPasswordError } from \"@stackframe/stack-shared/dist/helpers/password\";\nimport { yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Label, PasswordInput, Typography } from \"@stackframe/stack-ui\";\nimport React, { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { StackClientApp, useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\n\nconst schema = yupObject({\n password: yupString().required('Please enter your password').test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n passwordRepeat: yupString().nullable().oneOf([yup.ref('password'), null], 'Passwords do not match').required('Please repeat your password')\n});\n\nexport default function PasswordResetForm(\n { code, fullPage = false }:\n { code: string, fullPage?: boolean }\n) {\n const { register, handleSubmit, formState: { errors }, clearErrors } = useForm({\n resolver: yupResolver(schema)\n });\n const stackApp = useStackApp();\n const [finished, setFinished] = useState(false);\n const [resetError, setResetError] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n setLoading(true);\n try {\n const { password } = data;\n const errorCode = await stackApp.resetPassword({ password, code });\n if (errorCode) {\n setResetError(true);\n return;\n }\n\n setFinished(true);\n } finally {\n setLoading(false);\n }\n };\n\n if (finished) {\n return <PredefinedMessageCard type='passwordReset' fullPage={fullPage} />;\n }\n\n if (resetError) {\n return (\n <MessageCard title=\"Failed to reset password\" fullPage={fullPage}>\n Failed to reset password. Please request a new password reset link\n </MessageCard>\n );\n }\n\n return (\n <MaybeFullPage fullPage={fullPage}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>Reset Your Password</Typography>\n </div>\n\n <form\n style={{ display: 'flex', flexDirection: 'column', alignItems: 'stretch' }}\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"password\" className=\"mb-1\">New Password</Label>\n <PasswordInput\n id=\"password\"\n {...register('password')}\n onChange={() => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.password?.message?.toString()} />\n\n <Label htmlFor=\"repeat-password\" className=\"mt-4 mb-1\">Repeat New Password</Label>\n <PasswordInput\n id=\"repeat-password\"\n {...register('passwordRepeat')}\n onChange={() => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.passwordRepeat?.message?.toString()} />\n\n <Button type=\"submit\" className=\"mt-6\" loading={loading}>\n Reset Password\n </Button>\n </form>\n </MaybeFullPage>\n );\n}\n\n\nconst cachedVerifyPasswordResetCode = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyPasswordResetCode(code);\n});\n\nexport function PasswordReset({\n searchParams,\n fullPage = false,\n}: {\n searchParams: Record<string, string>,\n fullPage?: boolean,\n}) {\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title=\"Invalid Password Reset Link\" fullPage={fullPage}>\n <Typography>Please double check if you have the correct password reset link.</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title=\"Expired Password Reset Link\" fullPage={fullPage}>\n <Typography>Your password reset link has expired. Please request a new password reset link from the login page.</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title=\"Used Password Reset Link\" fullPage={fullPage}>\n <Typography>This password reset link has already been used. If you need to reset your password again, please request a new password reset link from the login page.</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n const error = React.use(cachedVerifyPasswordResetCode(stackApp, code));\n\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 if (error) {\n throw error;\n }\n\n return <PasswordResetForm code={code} fullPage={fullPage} />;\n}\n"],"mappings":"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","names":["React"]}
@@ -9,6 +9,7 @@ import '@stackframe/stack-shared/dist/interface/crud/team-permissions';
9
9
  import '@stackframe/stack-shared/dist/sessions';
10
10
  import '@stackframe/stack-shared/dist/utils/json';
11
11
  import '@stackframe/stack-shared/dist/utils/oauth';
12
+ import '@stackframe/stack-shared/dist/utils/results';
12
13
 
13
14
  declare function StackHandler<HasTokenStore extends boolean>({ app, params: { stack }, searchParams, fullPage, }: {
14
15
  app: StackServerApp<HasTokenStore>;
@@ -9,6 +9,7 @@ import '@stackframe/stack-shared/dist/interface/crud/team-permissions';
9
9
  import '@stackframe/stack-shared/dist/sessions';
10
10
  import '@stackframe/stack-shared/dist/utils/json';
11
11
  import '@stackframe/stack-shared/dist/utils/oauth';
12
+ import '@stackframe/stack-shared/dist/utils/results';
12
13
 
13
14
  declare function StackHandler<HasTokenStore extends boolean>({ app, params: { stack }, searchParams, fullPage, }: {
14
15
  app: StackServerApp<HasTokenStore>;
@@ -23,18 +23,21 @@ __export(stack_handler_exports, {
23
23
  default: () => StackHandler
24
24
  });
25
25
  module.exports = __toCommonJS(stack_handler_exports);
26
+ var import_urls = require("@stackframe/stack-shared/dist/utils/urls");
26
27
  var import_navigation = require("next/navigation");
27
- var import_email_verification = require("./email-verification");
28
28
  var import__ = require("..");
29
29
  var import_message_card = require("../components/message-cards/message-card");
30
- var import_sign_out = require("./sign-out");
31
- var import_forgot_password = require("./forgot-password");
32
- var import_oauth_callback = require("./oauth-callback");
33
30
  var import_account_settings = require("./account-settings");
34
- var import_magic_link_callback = require("./magic-link-callback");
31
+ var import_email_verification = require("./email-verification");
35
32
  var import_error_page = require("./error-page");
33
+ var import_forgot_password = require("./forgot-password");
34
+ var import_magic_link_callback = require("./magic-link-callback");
35
+ var import_oauth_callback = require("./oauth-callback");
36
36
  var import_password_reset = require("./password-reset");
37
- var import_urls = require("@stackframe/stack-shared/dist/utils/urls");
37
+ var import_sign_out = require("./sign-out");
38
+ var import_team_invitation = require("./team-invitation");
39
+ var import_team_settings = require("./team-settings");
40
+ var import_team_creation = require("./team-creation");
38
41
  var import_jsx_runtime = require("react/jsx-runtime");
39
42
  async function StackHandler({
40
43
  app,
@@ -68,9 +71,20 @@ async function StackHandler({
68
71
  oauthCallback: "oauth-callback",
69
72
  accountSettings: "account-settings",
70
73
  magicLinkCallback: "magic-link-callback",
74
+ teamInvitation: "team-invitation",
75
+ teamCreation: "team-creation",
71
76
  error: "error"
72
77
  };
73
78
  const path = stack.join("/");
79
+ if (/team-settings\/[a-zA-Z0-9-]+/.test(path)) {
80
+ const teamId = path.split("/")[1];
81
+ const user = await app.getUser();
82
+ const team = await user?.getTeam(teamId);
83
+ if (!team) {
84
+ return (0, import_navigation.notFound)();
85
+ }
86
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_team_settings.TeamSettings, { fullPage, teamId });
87
+ }
74
88
  switch (path) {
75
89
  case availablePaths.signIn: {
76
90
  redirectIfNotHandler("signIn");
@@ -108,6 +122,18 @@ async function StackHandler({
108
122
  redirectIfNotHandler("magicLinkCallback");
109
123
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_magic_link_callback.MagicLinkCallback, { searchParams, fullPage });
110
124
  }
125
+ case availablePaths.teamInvitation: {
126
+ redirectIfNotHandler("teamInvitation");
127
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_team_invitation.TeamInvitation, { searchParams, fullPage });
128
+ }
129
+ case availablePaths.teamCreation: {
130
+ const project = await app.getProject();
131
+ if (!project.config.clientTeamCreationEnabled) {
132
+ return (0, import_navigation.notFound)();
133
+ }
134
+ redirectIfNotHandler("teamCreation");
135
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_team_creation.TeamCreation, { fullPage });
136
+ }
111
137
  case availablePaths.error: {
112
138
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_error_page.ErrorPage, { searchParams, fullPage });
113
139
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components-page/stack-handler.tsx"],"sourcesContent":["import { SignUp } from \"./sign-up\";\nimport { SignIn } from \"./sign-in\";\nimport { RedirectType, notFound, redirect } from 'next/navigation';\nimport { EmailVerification } from \"./email-verification\";\nimport { AuthPage, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport { SignOut } from \"./sign-out\";\nimport { ForgotPassword } from \"./forgot-password\";\nimport { OAuthCallback } from \"./oauth-callback\";\nimport { AccountSettings } from \"./account-settings\";\nimport { MagicLinkCallback } from \"./magic-link-callback\";\nimport { ErrorPage } from \"./error-page\";\nimport { PasswordReset } from \"./password-reset\";\nimport { getRelativePart } from \"@stackframe/stack-shared/dist/utils/urls\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>({\n app,\n params: { stack } = {},\n searchParams = {},\n fullPage = false,\n}: {\n app: StackServerApp<HasTokenStore>,\n params?: { stack?: string[] },\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n if (!stack) {\n return (\n <MessageCard title=\"Invalid Stack Handler Setup\" fullPage={fullPage}>\n <p>Can't use Stack handler at this location. Make sure that the file is in a folder called [...stack].</p>\n </MessageCard>\n );\n }\n\n function redirectIfNotHandler(name: keyof HandlerUrls) {\n const url = app.urls[name];\n const handlerUrl = app.urls.handler;\n\n if (url !== handlerUrl && url.startsWith(handlerUrl + \"/\")) {\n // don't redirect if the url is a handler url\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n for (const [key, value] of Object.entries(searchParams)) {\n urlObj.searchParams.set(key, value);\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const availablePaths = {\n signIn: 'sign-in',\n signUp: 'sign-up',\n emailVerification: 'email-verification',\n passwordReset: 'password-reset',\n forgotPassword: 'forgot-password',\n signOut: 'sign-out',\n oauthCallback: 'oauth-callback',\n accountSettings: 'account-settings',\n magicLinkCallback: 'magic-link-callback',\n error: 'error',\n };\n\n const path = stack.join('/');\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler('signIn');\n return <AuthPage fullPage={fullPage} type='sign-in' automaticRedirect />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler('signUp');\n return <AuthPage fullPage={fullPage} type='sign-up' automaticRedirect />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification searchParams={searchParams} fullPage={fullPage} />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset searchParams={searchParams} fullPage={fullPage} />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword fullPage={fullPage} />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler('signOut');\n return <SignOut fullPage={fullPage} />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback fullPage={fullPage} />;\n }\n case availablePaths.accountSettings: {\n redirectIfNotHandler('accountSettings');\n return <AccountSettings fullPage={fullPage} />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback searchParams={searchParams} fullPage={fullPage} />;\n }\n case availablePaths.error: {\n return <ErrorPage searchParams={searchParams} fullPage={fullPage} />;\n }\n default: {\n for (const [key, value] of Object.entries(availablePaths)) {\n if (path === value.replaceAll('-', '')) {\n redirect(`${app.urls.handler}/${value}`, RedirectType.replace);\n }\n }\n return notFound();\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components-page/stack-handler.tsx"],"sourcesContent":["import { getRelativePart } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { RedirectType, notFound, redirect } from 'next/navigation';\nimport { AuthPage, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\nimport { EmailVerification } from \"./email-verification\";\nimport { ErrorPage } from \"./error-page\";\nimport { ForgotPassword } from \"./forgot-password\";\nimport { MagicLinkCallback } from \"./magic-link-callback\";\nimport { OAuthCallback } from \"./oauth-callback\";\nimport { PasswordReset } from \"./password-reset\";\nimport { SignOut } from \"./sign-out\";\nimport { TeamInvitation } from \"./team-invitation\";\nimport { TeamSettings } from \"./team-settings\";\nimport { TeamCreation } from \"./team-creation\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>({\n app,\n params: { stack } = {},\n searchParams = {},\n fullPage = false,\n}: {\n app: StackServerApp<HasTokenStore>,\n params?: { stack?: string[] },\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n if (!stack) {\n return (\n <MessageCard title=\"Invalid Stack Handler Setup\" fullPage={fullPage}>\n <p>Can't use Stack handler at this location. Make sure that the file is in a folder called [...stack].</p>\n </MessageCard>\n );\n }\n\n function redirectIfNotHandler(name: keyof HandlerUrls) {\n const url = app.urls[name];\n const handlerUrl = app.urls.handler;\n\n if (url !== handlerUrl && url.startsWith(handlerUrl + \"/\")) {\n // don't redirect if the url is a handler url\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n for (const [key, value] of Object.entries(searchParams)) {\n urlObj.searchParams.set(key, value);\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const availablePaths = {\n signIn: 'sign-in',\n signUp: 'sign-up',\n emailVerification: 'email-verification',\n passwordReset: 'password-reset',\n forgotPassword: 'forgot-password',\n signOut: 'sign-out',\n oauthCallback: 'oauth-callback',\n accountSettings: 'account-settings',\n magicLinkCallback: 'magic-link-callback',\n teamInvitation: 'team-invitation',\n teamCreation: 'team-creation',\n error: 'error',\n };\n\n const path = stack.join('/');\n\n if (/team-settings\\/[a-zA-Z0-9-]+/.test(path)) {\n const teamId = path.split('/')[1];\n const user = await app.getUser();\n const team = await user?.getTeam(teamId);\n\n if (!team) {\n return notFound();\n }\n\n return <TeamSettings fullPage={fullPage} teamId={teamId} />;\n }\n\n\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler('signIn');\n return <AuthPage fullPage={fullPage} type='sign-in' automaticRedirect />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler('signUp');\n return <AuthPage fullPage={fullPage} type='sign-up' automaticRedirect />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification searchParams={searchParams} fullPage={fullPage} />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset searchParams={searchParams} fullPage={fullPage} />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword fullPage={fullPage} />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler('signOut');\n return <SignOut fullPage={fullPage} />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback fullPage={fullPage} />;\n }\n case availablePaths.accountSettings: {\n redirectIfNotHandler('accountSettings');\n return <AccountSettings fullPage={fullPage} />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback searchParams={searchParams} fullPage={fullPage} />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler('teamInvitation');\n return <TeamInvitation searchParams={searchParams} fullPage={fullPage} />;\n }\n case availablePaths.teamCreation: {\n const project = await app.getProject();\n if (!project.config.clientTeamCreationEnabled) {\n return notFound();\n }\n\n redirectIfNotHandler('teamCreation');\n return <TeamCreation fullPage={fullPage} />;\n }\n case availablePaths.error: {\n return <ErrorPage searchParams={searchParams} fullPage={fullPage} />;\n }\n default: {\n for (const [key, value] of Object.entries(availablePaths)) {\n if (path === value.replaceAll('-', '')) {\n redirect(`${app.urls.handler}/${value}`, RedirectType.replace);\n }\n }\n return notFound();\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,8 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- declare function PasswordResetForm({ code, fullPage }: {
4
- code: string;
3
+ declare function TeamCreation(props: {
5
4
  fullPage?: boolean;
6
5
  }): react_jsx_runtime.JSX.Element;
7
6
 
8
- export { PasswordResetForm as default };
7
+ export { TeamCreation };
@@ -1,8 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
- declare function PasswordResetForm({ code, fullPage }: {
4
- code: string;
3
+ declare function TeamCreation(props: {
5
4
  fullPage?: boolean;
6
5
  }): react_jsx_runtime.JSX.Element;
7
6
 
8
- export { PasswordResetForm as default };
7
+ export { TeamCreation };
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ "use strict";
3
+ "use client";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/components-page/team-creation.tsx
23
+ var team_creation_exports = {};
24
+ __export(team_creation_exports, {
25
+ TeamCreation: () => TeamCreation
26
+ });
27
+ module.exports = __toCommonJS(team_creation_exports);
28
+ var import_yup = require("@hookform/resolvers/yup");
29
+ var import_schema_fields = require("@stackframe/stack-shared/dist/schema-fields");
30
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
31
+ var import_stack_ui = require("@stackframe/stack-ui");
32
+ var import_react = require("react");
33
+ var import_react_hook_form = require("react-hook-form");
34
+ var import__ = require("..");
35
+ var import_form_warning = require("../components/elements/form-warning");
36
+ var import_maybe_full_page = require("../components/elements/maybe-full-page");
37
+ var import_navigation = require("next/navigation");
38
+ var import_jsx_runtime = require("react/jsx-runtime");
39
+ var schema = (0, import_schema_fields.yupObject)({
40
+ displayName: (0, import_schema_fields.yupString)().required("Please enter a team name")
41
+ });
42
+ function TeamCreation(props) {
43
+ const { register, handleSubmit, formState: { errors } } = (0, import_react_hook_form.useForm)({
44
+ resolver: (0, import_yup.yupResolver)(schema)
45
+ });
46
+ const app = (0, import__.useStackApp)();
47
+ const project = app.useProject();
48
+ const user = (0, import__.useUser)({ or: "redirect" });
49
+ const [loading, setLoading] = (0, import_react.useState)(false);
50
+ const router = (0, import_navigation.useRouter)();
51
+ if (!project.config.clientTeamCreationEnabled) {
52
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import__.MessageCard, { title: "Team creation is not enabled" });
53
+ }
54
+ const onSubmit = async (data) => {
55
+ setLoading(true);
56
+ try {
57
+ const team = await user.createTeam({ displayName: data.displayName });
58
+ router.push(`${app.urls.handler}/team-settings/${team.id}`);
59
+ } finally {
60
+ setLoading(false);
61
+ }
62
+ };
63
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_maybe_full_page.MaybeFullPage, { fullPage: props.fullPage, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "stack-scope flex flex-col items-stretch", children: [
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-center mb-6", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { type: "h2", children: "Create a Team" }) }),
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
66
+ "form",
67
+ {
68
+ className: "flex flex-col items-stretch stack-scope",
69
+ onSubmit: (e) => (0, import_promises.runAsynchronously)(handleSubmit(onSubmit)(e)),
70
+ noValidate: true,
71
+ children: [
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Label, { htmlFor: "email", className: "mb-1", children: "Display name" }),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
+ import_stack_ui.Input,
75
+ {
76
+ id: "email",
77
+ type: "email",
78
+ ...register("displayName")
79
+ }
80
+ ),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.FormWarningText, { text: errors.displayName?.message?.toString() }),
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Button, { type: "submit", className: "mt-6", loading, children: "Create" })
83
+ ]
84
+ }
85
+ )
86
+ ] }) });
87
+ }
88
+ // Annotate the CommonJS export names for ESM import in node:
89
+ 0 && (module.exports = {
90
+ TeamCreation
91
+ });
92
+ //# sourceMappingURL=team-creation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components-page/team-creation.tsx"],"sourcesContent":["'use client';\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Input, Label, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { MessageCard, useStackApp, useUser } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useRouter } from \"next/navigation\";\n\nconst schema = yupObject({\n displayName: yupString().required('Please enter a team name'),\n});\n\nexport function TeamCreation(props: { fullPage?: boolean }) {\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(schema)\n });\n const app = useStackApp();\n const project = app.useProject();\n const user = useUser({ or: 'redirect' });\n const [loading, setLoading] = useState(false);\n const router = useRouter();\n\n if (!project.config.clientTeamCreationEnabled) {\n return <MessageCard title='Team creation is not enabled' />;\n }\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n setLoading(true);\n\n try {\n const team = await user.createTeam({ displayName: data.displayName });\n router.push(`${app.urls.handler}/team-settings/${team.id}`);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <MaybeFullPage fullPage={props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch'>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n Create a Team\n </Typography>\n </div>\n <form\n className=\"flex flex-col items-stretch stack-scope\"\n onSubmit={e => runAsynchronously(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"email\" className=\"mb-1\">Display name</Label>\n <Input\n id=\"email\"\n type=\"email\"\n {...register('displayName')}\n />\n <FormWarningText text={errors.displayName?.message?.toString()} />\n\n <Button type=\"submit\" className=\"mt-6\" loading={loading}>\n Create\n </Button>\n </form>\n </div>\n </MaybeFullPage>\n );\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,iBAA4B;AAC5B,2BAAqC;AACrC,sBAAkC;AAClC,sBAAiD;AACjD,mBAAyB;AACzB,6BAAwB;AAExB,eAAkD;AAClD,0BAAgC;AAChC,6BAA8B;AAC9B,wBAA0B;AAiBf;AAfX,IAAM,aAAS,gCAAU;AAAA,EACvB,iBAAa,gCAAU,EAAE,SAAS,0BAA0B;AAC9D,CAAC;AAEM,SAAS,aAAa,OAA+B;AAC1D,QAAM,EAAE,UAAU,cAAc,WAAW,EAAE,OAAO,EAAE,QAAI,gCAAQ;AAAA,IAChE,cAAU,wBAAY,MAAM;AAAA,EAC9B,CAAC;AACD,QAAM,UAAM,sBAAY;AACxB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,WAAO,kBAAQ,EAAE,IAAI,WAAW,CAAC;AACvC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,aAAS,6BAAU;AAEzB,MAAI,CAAC,QAAQ,OAAO,2BAA2B;AAC7C,WAAO,4CAAC,wBAAY,OAAM,gCAA+B;AAAA,EAC3D;AAEA,QAAM,WAAW,OAAO,SAAuC;AAC7D,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,WAAW,EAAE,aAAa,KAAK,YAAY,CAAC;AACpE,aAAO,KAAK,GAAG,IAAI,KAAK,OAAO,kBAAkB,KAAK,EAAE,EAAE;AAAA,IAC5D,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,4CAAC,wCAAc,UAAU,MAAM,UAC7B,uDAAC,SAAI,WAAU,2CACb;AAAA,gDAAC,SAAI,WAAU,oBACb,sDAAC,8BAAW,MAAK,MAAK,2BAEtB,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,WAAK,mCAAkB,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,QAC1D,YAAU;AAAA,QAEV;AAAA,sDAAC,yBAAM,SAAQ,SAAQ,WAAU,QAAO,0BAAY;AAAA,UACpD;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACJ,GAAG,SAAS,aAAa;AAAA;AAAA,UAC5B;AAAA,UACA,4CAAC,uCAAgB,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAAA,UAEhE,4CAAC,0BAAO,MAAK,UAAS,WAAU,QAAO,SAAkB,oBAEzD;AAAA;AAAA;AAAA,IACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function TeamInvitation({ fullPage, searchParams }: {
4
+ fullPage?: boolean;
5
+ searchParams: Record<string, string>;
6
+ }): react_jsx_runtime.JSX.Element;
7
+
8
+ export { TeamInvitation };
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function TeamInvitation({ fullPage, searchParams }: {
4
+ fullPage?: boolean;
5
+ searchParams: Record<string, string>;
6
+ }): react_jsx_runtime.JSX.Element;
7
+
8
+ export { TeamInvitation };
@@ -0,0 +1,141 @@
1
+ "use client";
2
+ "use strict";
3
+ "use client";
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+
32
+ // src/components-page/team-invitation.tsx
33
+ var team_invitation_exports = {};
34
+ __export(team_invitation_exports, {
35
+ TeamInvitation: () => TeamInvitation
36
+ });
37
+ module.exports = __toCommonJS(team_invitation_exports);
38
+ var import_stack_shared = require("@stackframe/stack-shared");
39
+ var import_caches = require("@stackframe/stack-shared/dist/utils/caches");
40
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
41
+ var import_stack_ui = require("@stackframe/stack-ui");
42
+ var import_react = __toESM(require("react"));
43
+ var import__ = require("..");
44
+ var import_predefined_message_card = require("../components/message-cards/predefined-message-card");
45
+ var import_jsx_runtime = require("react/jsx-runtime");
46
+ var cachedVerifyInvitation = (0, import_caches.cacheFunction)(async (stackApp, code) => {
47
+ return await stackApp.verifyTeamInvitationCode(code);
48
+ });
49
+ var cachedGetInvitationDetails = (0, import_caches.cacheFunction)(async (stackApp, code) => {
50
+ return await stackApp.getTeamInvitationDetails(code);
51
+ });
52
+ function TeamInvitationInner(props) {
53
+ const stackApp = (0, import__.useStackApp)();
54
+ const [success, setSuccess] = import_react.default.useState(false);
55
+ const [errorMessage, setErrorMessage] = import_react.default.useState(null);
56
+ const details = import_react.default.use(cachedGetInvitationDetails(stackApp, props.searchParams.code || ""));
57
+ if (errorMessage || details.status === "error") {
58
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_predefined_message_card.PredefinedMessageCard, { type: "unknownError", fullPage: props.fullPage });
59
+ }
60
+ if (success) {
61
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
62
+ import__.MessageCard,
63
+ {
64
+ title: "Team invitation",
65
+ fullPage: props.fullPage,
66
+ primaryButtonText: "Go to home",
67
+ primaryAction: () => stackApp.redirectToHome(),
68
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_stack_ui.Typography, { children: [
69
+ "You have successfully joined ",
70
+ details.data.teamDisplayName
71
+ ] })
72
+ }
73
+ );
74
+ }
75
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
76
+ import__.MessageCard,
77
+ {
78
+ title: "Team invitation",
79
+ fullPage: props.fullPage,
80
+ primaryButtonText: "Join",
81
+ primaryAction: () => (0, import_promises.runAsynchronouslyWithAlert)(async () => {
82
+ const result = await stackApp.acceptTeamInvitation(props.searchParams.code || "");
83
+ if (result.status === "error") {
84
+ setErrorMessage(result.error.message);
85
+ } else {
86
+ setSuccess(true);
87
+ }
88
+ }),
89
+ secondaryButtonText: "Ignore",
90
+ secondaryAction: () => stackApp.redirectToHome(),
91
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_stack_ui.Typography, { children: [
92
+ "You are invited to join ",
93
+ details.data.teamDisplayName
94
+ ] })
95
+ }
96
+ );
97
+ }
98
+ function TeamInvitation({ fullPage = false, searchParams }) {
99
+ const user = (0, import__.useUser)();
100
+ const stackApp = (0, import__.useStackApp)();
101
+ const invalidJsx = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import__.MessageCard, { title: "Invalid Team Invitation Link", fullPage, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: "Please double check if you have the correct team invitation link." }) });
102
+ const expiredJsx = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import__.MessageCard, { title: "Expired Team Invitation Link", fullPage, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: "Your team invitation link has expired. Please request a new team invitation link " }) });
103
+ const usedJsx = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import__.MessageCard, { title: "Used Team Invitation Link", fullPage, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: "This team invitation link has already been used." }) });
104
+ const code = searchParams.code;
105
+ if (!code) {
106
+ return invalidJsx;
107
+ }
108
+ if (!user) {
109
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
110
+ import__.MessageCard,
111
+ {
112
+ title: "Team invitation",
113
+ fullPage,
114
+ primaryButtonText: "Go to sign in",
115
+ primaryAction: () => stackApp.redirectToSignIn(),
116
+ secondaryButtonText: "Cancel",
117
+ secondaryAction: () => stackApp.redirectToHome(),
118
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_stack_ui.Typography, { children: "Sign in or create an account to join the team." })
119
+ }
120
+ );
121
+ }
122
+ const verificationResult = import_react.default.use(cachedVerifyInvitation(stackApp, searchParams.code || ""));
123
+ if (verificationResult.status === "error") {
124
+ const error = verificationResult.error;
125
+ if (error instanceof import_stack_shared.KnownErrors.VerificationCodeNotFound) {
126
+ return invalidJsx;
127
+ } else if (error instanceof import_stack_shared.KnownErrors.VerificationCodeExpired) {
128
+ return expiredJsx;
129
+ } else if (error instanceof import_stack_shared.KnownErrors.VerificationCodeAlreadyUsed) {
130
+ return usedJsx;
131
+ } else {
132
+ throw error;
133
+ }
134
+ }
135
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TeamInvitationInner, { fullPage, searchParams });
136
+ }
137
+ // Annotate the CommonJS export names for ESM import in node:
138
+ 0 && (module.exports = {
139
+ TeamInvitation
140
+ });
141
+ //# sourceMappingURL=team-invitation.js.map
@@ -0,0 +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\";\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 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=\"Team invitation\"\n fullPage={props.fullPage}\n primaryButtonText=\"Go to 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=\"Team invitation\"\n fullPage={props.fullPage}\n primaryButtonText=\"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=\"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 user = useUser();\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title=\"Invalid Team Invitation Link\" fullPage={fullPage}>\n <Typography>Please double check if you have the correct team invitation link.</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title=\"Expired Team Invitation Link\" fullPage={fullPage}>\n <Typography>Your team invitation link has expired. Please request a new team invitation link </Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title=\"Used Team Invitation Link\" fullPage={fullPage}>\n <Typography>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=\"Team invitation\"\n fullPage={fullPage}\n primaryButtonText=\"Go to sign in\"\n primaryAction={() => stackApp.redirectToSignIn()}\n secondaryButtonText=\"Cancel\"\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>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"]}
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function TeamSettings(props: {
4
+ fullPage?: boolean;
5
+ teamId: string;
6
+ }): react_jsx_runtime.JSX.Element;
7
+
8
+ export { TeamSettings };
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function TeamSettings(props: {
4
+ fullPage?: boolean;
5
+ teamId: string;
6
+ }): react_jsx_runtime.JSX.Element;
7
+
8
+ export { TeamSettings };