@stackframe/stack 2.8.12 → 2.8.17

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 (248) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/components/api-key-dialogs.js +5 -4
  3. package/dist/components/api-key-dialogs.js.map +1 -1
  4. package/dist/components/credential-sign-in.js +4 -4
  5. package/dist/components/credential-sign-up.js +3 -3
  6. package/dist/components/elements/maybe-full-page.js +1 -1
  7. package/dist/components/elements/sidebar-layout.js +1 -1
  8. package/dist/components/magic-link-sign-in.js +3 -3
  9. package/dist/components/message-cards/known-error-message-card.js +2 -2
  10. package/dist/components/message-cards/message-card.js +1 -1
  11. package/dist/components/message-cards/predefined-message-card.js +3 -3
  12. package/dist/components/oauth-button-group.js +2 -2
  13. package/dist/components/oauth-button.js +27 -16
  14. package/dist/components/oauth-button.js.map +1 -1
  15. package/dist/components/passkey-button.js +2 -2
  16. package/dist/components/profile-image-editor.js +87 -34
  17. package/dist/components/profile-image-editor.js.map +1 -1
  18. package/dist/components/selected-team-switcher.js +60 -14
  19. package/dist/components/selected-team-switcher.js.map +1 -1
  20. package/dist/components/team-icon.js +4 -0
  21. package/dist/components/team-icon.js.map +1 -1
  22. package/dist/components/{iframe-preventer.js → use-in-iframe.js} +9 -19
  23. package/dist/components/use-in-iframe.js.map +1 -0
  24. package/dist/components/user-button.js +41 -8
  25. package/dist/components/user-button.js.map +1 -1
  26. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +57 -12
  27. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  28. package/dist/components-page/account-settings/api-keys/api-keys-page.js +100 -12
  29. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  30. package/dist/components-page/account-settings/editable-text.js +1 -1
  31. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js +12 -12
  32. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  33. package/dist/components-page/account-settings/email-and-auth/emails-section.js +14 -5
  34. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  35. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +18 -5
  36. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  37. package/dist/components-page/account-settings/email-and-auth/otp-section.js +18 -5
  38. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  39. package/dist/components-page/account-settings/email-and-auth/passkey-section.js +19 -6
  40. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  41. package/dist/components-page/account-settings/email-and-auth/password-section.js +20 -7
  42. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  43. package/dist/components-page/account-settings/notifications/notifications-page.js +59 -0
  44. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -0
  45. package/dist/components-page/account-settings/profile-page/profile-page.js +18 -8
  46. package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  47. package/dist/components-page/account-settings/settings/delete-account-section.js +19 -10
  48. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  49. package/dist/components-page/account-settings/settings/settings-page.js +6 -6
  50. package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
  51. package/dist/components-page/account-settings/settings/sign-out-section.js +15 -6
  52. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  53. package/dist/components-page/account-settings/teams/leave-team-section.js +3 -3
  54. package/dist/components-page/account-settings/teams/team-api-keys-section.js +5 -5
  55. package/dist/components-page/account-settings/teams/team-creation-page.js +19 -10
  56. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  57. package/dist/components-page/account-settings/teams/team-display-name-section.js +4 -4
  58. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  59. package/dist/components-page/account-settings/teams/team-member-list-section.js +3 -3
  60. package/dist/components-page/account-settings/teams/team-page.js +8 -8
  61. package/dist/components-page/account-settings/teams/team-profile-image-section.js +4 -4
  62. package/dist/components-page/account-settings/teams/team-profile-user-section.js +4 -4
  63. package/dist/components-page/account-settings.js +43 -21
  64. package/dist/components-page/account-settings.js.map +1 -1
  65. package/dist/components-page/auth-page.js +11 -12
  66. package/dist/components-page/auth-page.js.map +1 -1
  67. package/dist/components-page/cli-auth-confirm.js +3 -3
  68. package/dist/components-page/email-verification.js +3 -3
  69. package/dist/components-page/error-page.js +6 -6
  70. package/dist/components-page/error-page.js.map +1 -1
  71. package/dist/components-page/forgot-password.js +6 -6
  72. package/dist/components-page/magic-link-callback.js +4 -4
  73. package/dist/components-page/mfa.js +190 -0
  74. package/dist/components-page/mfa.js.map +1 -0
  75. package/dist/components-page/oauth-callback.js +4 -4
  76. package/dist/components-page/password-reset.js +6 -6
  77. package/dist/components-page/sign-in.js +3 -2
  78. package/dist/components-page/sign-in.js.map +1 -1
  79. package/dist/components-page/sign-out.js +2 -2
  80. package/dist/components-page/sign-up.js +1 -1
  81. package/dist/components-page/stack-handler.js +25 -14
  82. package/dist/components-page/stack-handler.js.map +1 -1
  83. package/dist/components-page/team-creation.js +4 -4
  84. package/dist/components-page/team-invitation.js +3 -3
  85. package/dist/esm/components/api-key-dialogs.js +5 -4
  86. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  87. package/dist/esm/components/credential-sign-in.js +4 -4
  88. package/dist/esm/components/credential-sign-up.js +3 -3
  89. package/dist/esm/components/elements/maybe-full-page.js +1 -1
  90. package/dist/esm/components/elements/sidebar-layout.js +1 -1
  91. package/dist/esm/components/magic-link-sign-in.js +3 -3
  92. package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
  93. package/dist/esm/components/message-cards/message-card.js +1 -1
  94. package/dist/esm/components/message-cards/predefined-message-card.js +3 -3
  95. package/dist/esm/components/oauth-button-group.js +2 -2
  96. package/dist/esm/components/oauth-button.js +28 -17
  97. package/dist/esm/components/oauth-button.js.map +1 -1
  98. package/dist/esm/components/passkey-button.js +2 -2
  99. package/dist/esm/components/profile-image-editor.js +86 -34
  100. package/dist/esm/components/profile-image-editor.js.map +1 -1
  101. package/dist/esm/components/selected-team-switcher.js +60 -14
  102. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  103. package/dist/esm/components/team-icon.js +4 -0
  104. package/dist/esm/components/team-icon.js.map +1 -1
  105. package/dist/esm/components/use-in-iframe.js +18 -0
  106. package/dist/esm/components/use-in-iframe.js.map +1 -0
  107. package/dist/esm/components/user-button.js +41 -8
  108. package/dist/esm/components/user-button.js.map +1 -1
  109. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +57 -12
  110. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  111. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js +100 -12
  112. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  113. package/dist/esm/components-page/account-settings/editable-text.js +1 -1
  114. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js +12 -12
  115. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  116. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +14 -5
  117. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  118. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +18 -5
  119. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  120. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js +18 -5
  121. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  122. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js +19 -6
  123. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  124. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +20 -7
  125. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  126. package/dist/esm/components-page/account-settings/notifications/notifications-page.js +34 -0
  127. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -0
  128. package/dist/esm/components-page/account-settings/profile-page/profile-page.js +18 -8
  129. package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  130. package/dist/esm/components-page/account-settings/settings/delete-account-section.js +19 -10
  131. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  132. package/dist/esm/components-page/account-settings/settings/settings-page.js +6 -6
  133. package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
  134. package/dist/esm/components-page/account-settings/settings/sign-out-section.js +15 -6
  135. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  136. package/dist/esm/components-page/account-settings/teams/leave-team-section.js +3 -3
  137. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +5 -5
  138. package/dist/esm/components-page/account-settings/teams/team-creation-page.js +19 -10
  139. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  140. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js +4 -4
  141. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  142. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js +3 -3
  143. package/dist/esm/components-page/account-settings/teams/team-page.js +8 -8
  144. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js +4 -4
  145. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js +4 -4
  146. package/dist/esm/components-page/account-settings.js +43 -21
  147. package/dist/esm/components-page/account-settings.js.map +1 -1
  148. package/dist/esm/components-page/auth-page.js +11 -12
  149. package/dist/esm/components-page/auth-page.js.map +1 -1
  150. package/dist/esm/components-page/cli-auth-confirm.js +3 -3
  151. package/dist/esm/components-page/email-verification.js +3 -3
  152. package/dist/esm/components-page/error-page.js +6 -6
  153. package/dist/esm/components-page/error-page.js.map +1 -1
  154. package/dist/esm/components-page/forgot-password.js +6 -6
  155. package/dist/esm/components-page/magic-link-callback.js +4 -4
  156. package/dist/esm/components-page/mfa.js +174 -0
  157. package/dist/esm/components-page/mfa.js.map +1 -0
  158. package/dist/esm/components-page/oauth-callback.js +4 -4
  159. package/dist/esm/components-page/password-reset.js +6 -6
  160. package/dist/esm/components-page/sign-in.js +3 -2
  161. package/dist/esm/components-page/sign-in.js.map +1 -1
  162. package/dist/esm/components-page/sign-out.js +2 -2
  163. package/dist/esm/components-page/sign-up.js +1 -1
  164. package/dist/esm/components-page/stack-handler.js +25 -14
  165. package/dist/esm/components-page/stack-handler.js.map +1 -1
  166. package/dist/esm/components-page/team-creation.js +4 -4
  167. package/dist/esm/components-page/team-invitation.js +3 -3
  168. package/dist/esm/generated/global-css.js +1 -1
  169. package/dist/esm/generated/global-css.js.map +1 -1
  170. package/dist/esm/generated/quetzal-translations.js +3616 -2364
  171. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  172. package/dist/esm/index.js +22 -22
  173. package/dist/esm/lib/auth.js +2 -2
  174. package/dist/esm/lib/cookie.js +1 -129
  175. package/dist/esm/lib/cookie.js.map +1 -1
  176. package/dist/esm/lib/hooks.js +1 -1
  177. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +11 -8
  178. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  179. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +79 -21
  180. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  181. package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
  182. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  183. package/dist/esm/lib/stack-app/apps/implementations/index.js +3 -3
  184. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +34 -8
  185. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  186. package/dist/esm/lib/stack-app/apps/index.js +3 -3
  187. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +1 -1
  188. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  189. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +1 -1
  190. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  191. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +1 -1
  192. package/dist/esm/lib/stack-app/common.js.map +1 -1
  193. package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -1
  194. package/dist/esm/lib/stack-app/index.js +2 -2
  195. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
  196. package/dist/esm/lib/stack-app/notification-categories/index.js +1 -0
  197. package/dist/esm/lib/stack-app/notification-categories/index.js.map +1 -0
  198. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  199. package/dist/esm/lib/translations.js +1 -1
  200. package/dist/esm/providers/stack-provider-client.js +2 -2
  201. package/dist/esm/providers/stack-provider.js +3 -3
  202. package/dist/esm/providers/theme-provider.js +3 -3
  203. package/dist/esm/providers/translation-provider.js +2 -2
  204. package/dist/esm/utils/browser-script.js +1 -1
  205. package/dist/generated/global-css.js +1 -1
  206. package/dist/generated/global-css.js.map +1 -1
  207. package/dist/generated/quetzal-translations.js +3616 -2364
  208. package/dist/generated/quetzal-translations.js.map +1 -1
  209. package/dist/index.d.mts +91 -6
  210. package/dist/index.d.ts +91 -6
  211. package/dist/index.js +23 -23
  212. package/dist/index.js.map +1 -1
  213. package/dist/lib/auth.js +2 -2
  214. package/dist/lib/cookie.js +4 -132
  215. package/dist/lib/cookie.js.map +1 -1
  216. package/dist/lib/hooks.js +1 -1
  217. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +11 -8
  218. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  219. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +79 -21
  220. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  221. package/dist/lib/stack-app/apps/implementations/common.js +2 -1
  222. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  223. package/dist/lib/stack-app/apps/implementations/index.js +3 -3
  224. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +34 -8
  225. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  226. package/dist/lib/stack-app/apps/index.js +3 -3
  227. package/dist/lib/stack-app/apps/interfaces/admin-app.js +1 -1
  228. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  229. package/dist/lib/stack-app/apps/interfaces/client-app.js +1 -1
  230. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  231. package/dist/lib/stack-app/apps/interfaces/server-app.js +1 -1
  232. package/dist/lib/stack-app/common.js.map +1 -1
  233. package/dist/lib/stack-app/contact-channels/index.js.map +1 -1
  234. package/dist/lib/stack-app/index.js +2 -2
  235. package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
  236. package/dist/lib/stack-app/notification-categories/index.js +19 -0
  237. package/dist/lib/stack-app/notification-categories/index.js.map +1 -0
  238. package/dist/lib/stack-app/users/index.js.map +1 -1
  239. package/dist/lib/translations.js +1 -1
  240. package/dist/providers/stack-provider-client.js +2 -2
  241. package/dist/providers/stack-provider.js +3 -3
  242. package/dist/providers/theme-provider.js +3 -3
  243. package/dist/providers/translation-provider.js +2 -2
  244. package/dist/utils/browser-script.js +1 -1
  245. package/package.json +5 -5
  246. package/dist/components/iframe-preventer.js.map +0 -1
  247. package/dist/esm/components/iframe-preventer.js +0 -28
  248. package/dist/esm/components/iframe-preventer.js.map +0 -1
@@ -1,14 +1,27 @@
1
1
  // src/components-page/account-settings/email-and-auth/passkey-section.tsx
2
2
  import { Button, Typography } from "@stackframe/stack-ui";
3
3
  import { useState } from "react";
4
- import { useStackApp } from "../../..";
5
- import { useUser } from "../../../lib/hooks";
6
- import { useTranslation } from "../../../lib/translations";
7
- import { Section } from "../section";
4
+ import { useStackApp } from "../../../index.js";
5
+ import { useUser } from "../../../lib/hooks.js";
6
+ import { useTranslation } from "../../../lib/translations.js";
7
+ import { Section } from "../section.js";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
- function PasskeySection() {
9
+ function PasskeySection(props) {
10
10
  const { t } = useTranslation();
11
- const user = useUser({ or: "throw" });
11
+ const user = useUser({ or: props?.mockMode ? "return-null" : "throw" });
12
+ if (props?.mockMode && !user) {
13
+ return /* @__PURE__ */ jsx(
14
+ Section,
15
+ {
16
+ title: t("Passkey"),
17
+ description: t("Passkey management is not available in demo mode."),
18
+ children: /* @__PURE__ */ jsx(Typography, { variant: "secondary", children: t("Passkey management is not available in demo mode.") })
19
+ }
20
+ );
21
+ }
22
+ if (!user) {
23
+ return null;
24
+ }
12
25
  const stackApp = useStackApp();
13
26
  const project = stackApp.useProject();
14
27
  const contactChannels = user.useContactChannels();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components-page/account-settings/email-and-auth/passkey-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { Button, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useStackApp } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function PasskeySection() {\n const { t } = useTranslation();\n const user = useUser({ or: \"throw\" });\n const stackApp = useStackApp();\n const project = stackApp.useProject();\n const contactChannels = user.useContactChannels();\n\n\n // passkey is enabled if there is a passkey\n const hasPasskey = user.passkeyAuthEnabled;\n\n const isLastAuth = user.passkeyAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.otpAuthEnabled;\n const [showConfirmationModal, setShowConfirmationModal] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.passkeyEnabled) {\n return null;\n }\n\n const handleDeletePasskey = async () => {\n await user.update({ passkeyAuthEnabled: false });\n setShowConfirmationModal(false);\n };\n\n\n const handleAddNewPasskey = async () => {\n await user.registerPasskey();\n };\n\n return (\n <>\n <Section title={t(\"Passkey\")} description={hasPasskey ? t(\"Passkey registered\") : t(\"Register a passkey\")}>\n <div className='flex md:justify-end gap-2'>\n {!hasValidEmail && (\n <Typography variant='secondary' type='label'>{t(\"To enable Passkey sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n {hasValidEmail && hasPasskey && isLastAuth && (\n <Typography variant='secondary' type='label'>{t(\"Passkey sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )}\n {!hasPasskey && hasValidEmail && (\n <div>\n <Button onClick={handleAddNewPasskey} variant='secondary'>{t(\"Add new passkey\")}</Button>\n </div>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && !showConfirmationModal && (\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(true)}\n >\n {t(\"Delete Passkey\")}\n </Button>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && showConfirmationModal && (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable Passkey sign-in? You will not be able to sign in with your passkey anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeletePasskey}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n\n </>\n\n );\n}\n"],"mappings":";AAIA,SAAS,QAAQ,kBAAkB;AACnC,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAkCpB,mBAIQ,KAuBE,YA3BV;AAhCG,SAAS,iBAAiB;AAC/B,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,QAAQ,CAAC;AACpC,QAAM,WAAW,YAAY;AAC7B,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,kBAAkB,KAAK,mBAAmB;AAIhD,QAAM,aAAa,KAAK;AAExB,QAAM,aAAa,KAAK,sBAAsB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;AAC7G,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAS,KAAK;AAGxE,QAAM,gBAAgB,gBAAgB,OAAO,OAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS;AAEhH,MAAI,CAAC,QAAQ,OAAO,gBAAgB;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,YAAY;AACtC,UAAM,KAAK,OAAO,EAAE,oBAAoB,MAAM,CAAC;AAC/C,6BAAyB,KAAK;AAAA,EAChC;AAGA,QAAM,sBAAsB,YAAY;AACtC,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAEA,SACE,gCACE,8BAAC,WAAQ,OAAO,EAAE,SAAS,GAAG,aAAa,aAAa,EAAE,oBAAoB,IAAI,EAAE,oBAAoB,GACtG,+BAAC,SAAI,WAAU,6BACZ;AAAA,KAAC,iBACA,oBAAC,cAAW,SAAQ,aAAY,MAAK,SAAS,YAAE,iEAAiE,GAAE;AAAA,IAEpH,iBAAiB,cAAc,cAC9B,oBAAC,cAAW,SAAQ,aAAY,MAAK,SAAS,YAAE,8FAA8F,GAAE;AAAA,IAEjJ,CAAC,cAAc,iBACd,oBAAC,SACC,8BAAC,UAAO,SAAS,qBAAqB,SAAQ,aAAa,YAAE,iBAAiB,GAAE,GAClF;AAAA,IAED,iBAAiB,cAAc,CAAC,cAAc,CAAC,yBAC9C;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,SAAS,MAAM,yBAAyB,IAAI;AAAA,QAE3C,YAAE,gBAAgB;AAAA;AAAA,IACrB;AAAA,IAED,iBAAiB,cAAc,CAAC,cAAc,yBAC7C,qBAAC,SAAI,WAAU,uBACb;AAAA,0BAAC,cAAW,SAAQ,eACjB,YAAE,8GAA8G,GACnH;AAAA,MACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS;AAAA,YAER,YAAE,SAAS;AAAA;AAAA,QACd;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM,yBAAyB,KAAK;AAAA,YAE5C,YAAE,QAAQ;AAAA;AAAA,QACb;AAAA,SACF;AAAA,OACF;AAAA,KAEJ,GACF,GAGF;AAGJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/email-and-auth/passkey-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { Button, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useStackApp } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function PasskeySection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Passkey\")}\n description={t(\"Passkey management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"Passkey management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const stackApp = useStackApp();\n const project = stackApp.useProject();\n const contactChannels = user.useContactChannels();\n\n\n // passkey is enabled if there is a passkey\n const hasPasskey = user.passkeyAuthEnabled;\n\n const isLastAuth = user.passkeyAuthEnabled && !user.hasPassword && user.oauthProviders.length === 0 && !user.otpAuthEnabled;\n const [showConfirmationModal, setShowConfirmationModal] = useState(false);\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.isVerified && x.usedForAuth).length > 0;\n\n if (!project.config.passkeyEnabled) {\n return null;\n }\n\n const handleDeletePasskey = async () => {\n await user.update({ passkeyAuthEnabled: false });\n setShowConfirmationModal(false);\n };\n\n\n const handleAddNewPasskey = async () => {\n await user.registerPasskey();\n };\n\n return (\n <>\n <Section title={t(\"Passkey\")} description={hasPasskey ? t(\"Passkey registered\") : t(\"Register a passkey\")}>\n <div className='flex md:justify-end gap-2'>\n {!hasValidEmail && (\n <Typography variant='secondary' type='label'>{t(\"To enable Passkey sign-in, please add a verified sign-in email.\")}</Typography>\n )}\n {hasValidEmail && hasPasskey && isLastAuth && (\n <Typography variant='secondary' type='label'>{t(\"Passkey sign-in is enabled and cannot be disabled as it is currently the only sign-in method\")}</Typography>\n )}\n {!hasPasskey && hasValidEmail && (\n <div>\n <Button onClick={handleAddNewPasskey} variant='secondary'>{t(\"Add new passkey\")}</Button>\n </div>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && !showConfirmationModal && (\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(true)}\n >\n {t(\"Delete Passkey\")}\n </Button>\n )}\n {hasValidEmail && hasPasskey && !isLastAuth && showConfirmationModal && (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to disable Passkey sign-in? You will not be able to sign in with your passkey anymore.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeletePasskey}\n >\n {t(\"Disable\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setShowConfirmationModal(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </div>\n </Section>\n\n\n </>\n\n );\n}\n"],"mappings":";AAIA,SAAS,QAAQ,kBAAkB;AACnC,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAehB,SAqCJ,UArCI,KAgEM,YAhEN;AAbD,SAAS,eAAe,OAE5B;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,OAAO,WAAW,gBAAgB,QAAQ,CAAC;AAGtE,MAAI,OAAO,YAAY,CAAC,MAAM;AAC5B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,SAAS;AAAA,QAClB,aAAa,EAAE,mDAAmD;AAAA,QAElE,8BAAC,cAAW,SAAQ,aAAa,YAAE,mDAAmD,GAAE;AAAA;AAAA,IAC1F;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,WAAW,YAAY;AAC7B,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,kBAAkB,KAAK,mBAAmB;AAIhD,QAAM,aAAa,KAAK;AAExB,QAAM,aAAa,KAAK,sBAAsB,CAAC,KAAK,eAAe,KAAK,eAAe,WAAW,KAAK,CAAC,KAAK;AAC7G,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAS,KAAK;AAGxE,QAAM,gBAAgB,gBAAgB,OAAO,OAAK,EAAE,SAAS,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS;AAEhH,MAAI,CAAC,QAAQ,OAAO,gBAAgB;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,YAAY;AACtC,UAAM,KAAK,OAAO,EAAE,oBAAoB,MAAM,CAAC;AAC/C,6BAAyB,KAAK;AAAA,EAChC;AAGA,QAAM,sBAAsB,YAAY;AACtC,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAEA,SACE,gCACE,8BAAC,WAAQ,OAAO,EAAE,SAAS,GAAG,aAAa,aAAa,EAAE,oBAAoB,IAAI,EAAE,oBAAoB,GACtG,+BAAC,SAAI,WAAU,6BACZ;AAAA,KAAC,iBACA,oBAAC,cAAW,SAAQ,aAAY,MAAK,SAAS,YAAE,iEAAiE,GAAE;AAAA,IAEpH,iBAAiB,cAAc,cAC9B,oBAAC,cAAW,SAAQ,aAAY,MAAK,SAAS,YAAE,8FAA8F,GAAE;AAAA,IAEjJ,CAAC,cAAc,iBACd,oBAAC,SACC,8BAAC,UAAO,SAAS,qBAAqB,SAAQ,aAAa,YAAE,iBAAiB,GAAE,GAClF;AAAA,IAED,iBAAiB,cAAc,CAAC,cAAc,CAAC,yBAC9C;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,SAAS,MAAM,yBAAyB,IAAI;AAAA,QAE3C,YAAE,gBAAgB;AAAA;AAAA,IACrB;AAAA,IAED,iBAAiB,cAAc,CAAC,cAAc,yBAC7C,qBAAC,SAAI,WAAU,uBACb;AAAA,0BAAC,cAAW,SAAQ,eACjB,YAAE,8GAA8G,GACnH;AAAA,MACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS;AAAA,YAER,YAAE,SAAS;AAAA;AAAA,QACd;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM,yBAAyB,KAAK;AAAA,YAE5C,YAAE,QAAQ;AAAA;AAAA,QACb;AAAA,SACF;AAAA,OACF;AAAA,KAEJ,GACF,GAGF;AAGJ;","names":[]}
@@ -7,15 +7,28 @@ import { Button, Input, Label, PasswordInput, Typography } from "@stackframe/sta
7
7
  import { useState } from "react";
8
8
  import { useForm } from "react-hook-form";
9
9
  import * as yup from "yup";
10
- import { useStackApp } from "../../..";
11
- import { FormWarningText } from "../../../components/elements/form-warning";
12
- import { useUser } from "../../../lib/hooks";
13
- import { useTranslation } from "../../../lib/translations";
14
- import { Section } from "../section";
10
+ import { useStackApp } from "../../../index.js";
11
+ import { FormWarningText } from "../../../components/elements/form-warning.js";
12
+ import { useUser } from "../../../lib/hooks.js";
13
+ import { useTranslation } from "../../../lib/translations.js";
14
+ import { Section } from "../section.js";
15
15
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
- function PasswordSection() {
16
+ function PasswordSection(props) {
17
17
  const { t } = useTranslation();
18
- const user = useUser({ or: "throw" });
18
+ const user = useUser({ or: props?.mockMode ? "return-null" : "throw" });
19
+ if (props?.mockMode && !user) {
20
+ return /* @__PURE__ */ jsx(
21
+ Section,
22
+ {
23
+ title: t("Password"),
24
+ description: t("Password management is not available in demo mode."),
25
+ children: /* @__PURE__ */ jsx(Typography, { variant: "secondary", children: t("Password management is not available in demo mode.") })
26
+ }
27
+ );
28
+ }
29
+ if (!user) {
30
+ return null;
31
+ }
19
32
  const contactChannels = user.useContactChannels();
20
33
  const [changingPassword, setChangingPassword] = useState(false);
21
34
  const [loading, setLoading] = useState(false);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components-page/account-settings/email-and-auth/password-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { getPasswordError } from '@stackframe/stack-shared/dist/helpers/password';\nimport { passwordSchema as schemaFieldsPasswordSchema, yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronously, runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Input, Label, PasswordInput, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { useStackApp } from '../../..';\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\n\nexport function PasswordSection() {\n const { t } = useTranslation();\n const user = useUser({ or: \"throw\" });\n const contactChannels = user.useContactChannels();\n const [changingPassword, setChangingPassword] = useState(false);\n const [loading, setLoading] = useState(false);\n const project = useStackApp().useProject();\n\n const passwordSchema = yupObject({\n oldPassword: user.hasPassword ? schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your old password')) : yupString(),\n newPassword: schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your password')).test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n newPasswordRepeat: yupString().nullable().oneOf([yup.ref('newPassword'), \"\", null], t('Passwords do not match')).defined().nonEmpty(t('Please repeat your password'))\n });\n\n const { register, handleSubmit, setError, formState: { errors }, clearErrors, reset } = useForm({\n resolver: yupResolver(passwordSchema)\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.usedForAuth).length > 0;\n\n const onSubmit = async (data: yup.InferType<typeof passwordSchema>) => {\n setLoading(true);\n try {\n const { oldPassword, newPassword } = data;\n const error = user.hasPassword\n ? await user.updatePassword({ oldPassword: oldPassword!, newPassword })\n : await user.setPassword({ password: newPassword! });\n if (error) {\n setError('oldPassword', { type: 'manual', message: t('Incorrect password') });\n } else {\n reset();\n setChangingPassword(false);\n }\n } finally {\n setLoading(false);\n }\n };\n\n const registerPassword = register('newPassword');\n const registerPasswordRepeat = register('newPasswordRepeat');\n\n if (!project.config.credentialEnabled) {\n return null;\n }\n\n return (\n <Section\n title={t(\"Password\")}\n description={user.hasPassword ? t(\"Update your password\") : t(\"Set a password for your account\")}\n >\n <div className='flex flex-col gap-4'>\n {!changingPassword ? (\n hasValidEmail ? (\n <Button\n variant='secondary'\n onClick={() => setChangingPassword(true)}\n >\n {user.hasPassword ? t(\"Update password\") : t(\"Set password\")}\n </Button>\n ) : (\n <Typography variant='secondary' type='label'>{t(\"To set a password, please add a sign-in email.\")}</Typography>\n )\n ) : (\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n >\n {user.hasPassword && (\n <>\n <Label htmlFor=\"old-password\" className=\"mb-1\">{t(\"Old password\")}</Label>\n <Input\n id=\"old-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n {...register(\"oldPassword\")}\n />\n <FormWarningText text={errors.oldPassword?.message?.toString()} />\n </>\n )}\n\n <Label htmlFor=\"new-password\" className=\"mt-4 mb-1\">{t(\"New password\")}</Label>\n <PasswordInput\n id=\"new-password\"\n autoComplete=\"new-password\"\n {...registerPassword}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPassword.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPassword?.message?.toString()} />\n\n <Label htmlFor=\"repeat-password\" className=\"mt-4 mb-1\">{t(\"Repeat new password\")}</Label>\n <PasswordInput\n id=\"repeat-password\"\n autoComplete=\"new-password\"\n {...registerPasswordRepeat}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPasswordRepeat.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPasswordRepeat?.message?.toString()} />\n\n <div className=\"mt-6 flex gap-4\">\n <Button type=\"submit\" loading={loading}>\n {user.hasPassword ? t(\"Update Password\") : t(\"Set Password\")}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setChangingPassword(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </form>\n )}\n </div>\n </Section>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/email-and-auth/password-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { getPasswordError } from '@stackframe/stack-shared/dist/helpers/password';\nimport { passwordSchema as schemaFieldsPasswordSchema, yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronously, runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Input, Label, PasswordInput, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { useStackApp } from '../../..';\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\n\nexport function PasswordSection(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : \"throw\" });\n\n // In mock mode, show a placeholder message\n if (props?.mockMode && !user) {\n return (\n <Section\n title={t(\"Password\")}\n description={t(\"Password management is not available in demo mode.\")}\n >\n <Typography variant='secondary'>{t(\"Password management is not available in demo mode.\")}</Typography>\n </Section>\n );\n }\n\n if (!user) {\n return null; // This shouldn't happen in non-mock mode due to throw\n }\n const contactChannels = user.useContactChannels();\n const [changingPassword, setChangingPassword] = useState(false);\n const [loading, setLoading] = useState(false);\n const project = useStackApp().useProject();\n\n const passwordSchema = yupObject({\n oldPassword: user.hasPassword ? schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your old password')) : yupString(),\n newPassword: schemaFieldsPasswordSchema.defined().nonEmpty(t('Please enter your password')).test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n newPasswordRepeat: yupString().nullable().oneOf([yup.ref('newPassword'), \"\", null], t('Passwords do not match')).defined().nonEmpty(t('Please repeat your password'))\n });\n\n const { register, handleSubmit, setError, formState: { errors }, clearErrors, reset } = useForm({\n resolver: yupResolver(passwordSchema)\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const hasValidEmail = contactChannels.filter(x => x.type === 'email' && x.usedForAuth).length > 0;\n\n const onSubmit = async (data: yup.InferType<typeof passwordSchema>) => {\n setLoading(true);\n try {\n const { oldPassword, newPassword } = data;\n const error = user.hasPassword\n ? await user.updatePassword({ oldPassword: oldPassword!, newPassword })\n : await user.setPassword({ password: newPassword! });\n if (error) {\n setError('oldPassword', { type: 'manual', message: t('Incorrect password') });\n } else {\n reset();\n setChangingPassword(false);\n }\n } finally {\n setLoading(false);\n }\n };\n\n const registerPassword = register('newPassword');\n const registerPasswordRepeat = register('newPasswordRepeat');\n\n if (!project.config.credentialEnabled) {\n return null;\n }\n\n return (\n <Section\n title={t(\"Password\")}\n description={user.hasPassword ? t(\"Update your password\") : t(\"Set a password for your account\")}\n >\n <div className='flex flex-col gap-4'>\n {!changingPassword ? (\n hasValidEmail ? (\n <Button\n variant='secondary'\n onClick={() => setChangingPassword(true)}\n >\n {user.hasPassword ? t(\"Update password\") : t(\"Set password\")}\n </Button>\n ) : (\n <Typography variant='secondary' type='label'>{t(\"To set a password, please add a sign-in email.\")}</Typography>\n )\n ) : (\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n >\n {user.hasPassword && (\n <>\n <Label htmlFor=\"old-password\" className=\"mb-1\">{t(\"Old password\")}</Label>\n <Input\n id=\"old-password\"\n type=\"password\"\n autoComplete=\"current-password\"\n {...register(\"oldPassword\")}\n />\n <FormWarningText text={errors.oldPassword?.message?.toString()} />\n </>\n )}\n\n <Label htmlFor=\"new-password\" className=\"mt-4 mb-1\">{t(\"New password\")}</Label>\n <PasswordInput\n id=\"new-password\"\n autoComplete=\"new-password\"\n {...registerPassword}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPassword.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPassword?.message?.toString()} />\n\n <Label htmlFor=\"repeat-password\" className=\"mt-4 mb-1\">{t(\"Repeat new password\")}</Label>\n <PasswordInput\n id=\"repeat-password\"\n autoComplete=\"new-password\"\n {...registerPasswordRepeat}\n onChange={(e) => {\n clearErrors('newPassword');\n clearErrors('newPasswordRepeat');\n runAsynchronously(registerPasswordRepeat.onChange(e));\n }}\n />\n <FormWarningText text={errors.newPasswordRepeat?.message?.toString()} />\n\n <div className=\"mt-6 flex gap-4\">\n <Button type=\"submit\" loading={loading}>\n {user.hasPassword ? t(\"Update Password\") : t(\"Set Password\")}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setChangingPassword(false);\n reset();\n }}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </form>\n )}\n </div>\n </Section>\n );\n}\n"],"mappings":";AAIA,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB;AACjC,SAAS,kBAAkB,4BAA4B,WAAW,iBAAiB;AACnF,SAAS,mBAAmB,kCAAkC;AAC9D,SAAS,QAAQ,OAAO,OAAO,eAAe,kBAAkB;AAChE,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,YAAY,SAAS;AACrB,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAgBhB,SAoFM,UApFN,KAoFM,YApFN;AAbD,SAAS,gBAAgB,OAE7B;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,OAAO,WAAW,gBAAgB,QAAQ,CAAC;AAGtE,MAAI,OAAO,YAAY,CAAC,MAAM;AAC5B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,UAAU;AAAA,QACnB,aAAa,EAAE,oDAAoD;AAAA,QAEnE,8BAAC,cAAW,SAAQ,aAAa,YAAE,oDAAoD,GAAE;AAAA;AAAA,IAC3F;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,kBAAkB,KAAK,mBAAmB;AAChD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,UAAU,YAAY,EAAE,WAAW;AAEzC,QAAM,iBAAiB,UAAU;AAAA,IAC/B,aAAa,KAAK,cAAc,2BAA2B,QAAQ,EAAE,SAAS,EAAE,gCAAgC,CAAC,IAAI,UAAU;AAAA,IAC/H,aAAa,2BAA2B,QAAQ,EAAE,SAAS,EAAE,4BAA4B,CAAC,EAAE,KAAK;AAAA,MAC/F,MAAM;AAAA,MACN,MAAM,CAAC,OAAO,QAAQ;AACpB,cAAM,QAAQ,iBAAiB,KAAK;AACpC,YAAI,OAAO;AACT,iBAAO,IAAI,YAAY,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,QACnD,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,mBAAmB,UAAU,EAAE,SAAS,EAAE,MAAM,CAAK,QAAI,aAAa,GAAG,IAAI,IAAI,GAAG,EAAE,wBAAwB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,6BAA6B,CAAC;AAAA,EACtK,CAAC;AAED,QAAM,EAAE,UAAU,cAAc,UAAU,WAAW,EAAE,OAAO,GAAG,aAAa,MAAM,IAAI,QAAQ;AAAA,IAC9F,UAAU,YAAY,cAAc;AAAA,EACtC,CAAC;AAGD,QAAM,gBAAgB,gBAAgB,OAAO,OAAK,EAAE,SAAS,WAAW,EAAE,WAAW,EAAE,SAAS;AAEhG,QAAM,WAAW,OAAO,SAA+C;AACrE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,EAAE,aAAa,YAAY,IAAI;AACrC,YAAM,QAAQ,KAAK,cACf,MAAM,KAAK,eAAe,EAAE,aAA2B,YAAY,CAAC,IACpE,MAAM,KAAK,YAAY,EAAE,UAAU,YAAa,CAAC;AACrD,UAAI,OAAO;AACT,iBAAS,eAAe,EAAE,MAAM,UAAU,SAAS,EAAE,oBAAoB,EAAE,CAAC;AAAA,MAC9E,OAAO;AACL,cAAM;AACN,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,mBAAmB,SAAS,aAAa;AAC/C,QAAM,yBAAyB,SAAS,mBAAmB;AAE3D,MAAI,CAAC,QAAQ,OAAO,mBAAmB;AACrC,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,UAAU;AAAA,MACnB,aAAa,KAAK,cAAc,EAAE,sBAAsB,IAAI,EAAE,iCAAiC;AAAA,MAE/F,8BAAC,SAAI,WAAU,uBACZ,WAAC,mBACA,gBACE;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM,oBAAoB,IAAI;AAAA,UAEtC,eAAK,cAAc,EAAE,iBAAiB,IAAI,EAAE,cAAc;AAAA;AAAA,MAC7D,IAEA,oBAAC,cAAW,SAAQ,aAAY,MAAK,SAAS,YAAE,gDAAgD,GAAE,IAGpG;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,OAAK,2BAA2B,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,UACnE,YAAU;AAAA,UAET;AAAA,iBAAK,eACJ,iCACE;AAAA,kCAAC,SAAM,SAAQ,gBAAe,WAAU,QAAQ,YAAE,cAAc,GAAE;AAAA,cAClE;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAK;AAAA,kBACL,cAAa;AAAA,kBACZ,GAAG,SAAS,aAAa;AAAA;AAAA,cAC5B;AAAA,cACA,oBAAC,mBAAgB,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAAA,eAClE;AAAA,YAGF,oBAAC,SAAM,SAAQ,gBAAe,WAAU,aAAa,YAAE,cAAc,GAAE;AAAA,YACvE;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,cAAa;AAAA,gBACZ,GAAG;AAAA,gBACJ,UAAU,CAAC,MAAM;AACf,8BAAY,aAAa;AACzB,8BAAY,mBAAmB;AAC/B,oCAAkB,iBAAiB,SAAS,CAAC,CAAC;AAAA,gBAChD;AAAA;AAAA,YACF;AAAA,YACA,oBAAC,mBAAgB,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAAA,YAEhE,oBAAC,SAAM,SAAQ,mBAAkB,WAAU,aAAa,YAAE,qBAAqB,GAAE;AAAA,YACjF;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,cAAa;AAAA,gBACZ,GAAG;AAAA,gBACJ,UAAU,CAAC,MAAM;AACf,8BAAY,aAAa;AACzB,8BAAY,mBAAmB;AAC/B,oCAAkB,uBAAuB,SAAS,CAAC,CAAC;AAAA,gBACtD;AAAA;AAAA,YACF;AAAA,YACA,oBAAC,mBAAgB,MAAM,OAAO,mBAAmB,SAAS,SAAS,GAAG;AAAA,YAEtE,qBAAC,SAAI,WAAU,mBACb;AAAA,kCAAC,UAAO,MAAK,UAAS,SACnB,eAAK,cAAc,EAAE,iBAAiB,IAAI,EAAE,cAAc,GAC7D;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,SAAS,MAAM;AACb,wCAAoB,KAAK;AACzB,0BAAM;AAAA,kBACR;AAAA,kBAEC,YAAE,QAAQ;AAAA;AAAA,cACb;AAAA,eACF;AAAA;AAAA;AAAA,MACF,GAEJ;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,34 @@
1
+ // src/components-page/account-settings/notifications/notifications-page.tsx
2
+ import { useUser } from "../../../lib/hooks.js";
3
+ import { useTranslation } from "../../../lib/translations.js";
4
+ import { PageLayout } from "../page-layout.js";
5
+ import { Switch } from "@stackframe/stack-ui";
6
+ import { Separator, Typography } from "@stackframe/stack-ui";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ function NotificationsPage() {
9
+ const { t } = useTranslation();
10
+ const user = useUser({ or: "redirect" });
11
+ const notificationCategories = user.useNotificationCategories();
12
+ return /* @__PURE__ */ jsxs(PageLayout, { children: [
13
+ /* @__PURE__ */ jsx(Separator, {}),
14
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
15
+ /* @__PURE__ */ jsx("div", { className: "sm:flex-1 flex flex-col justify-center pb-2", children: /* @__PURE__ */ jsx(Typography, { className: "font-medium", children: t("Choose which emails you want to receive") }) }),
16
+ notificationCategories.map((category) => /* @__PURE__ */ jsxs("div", { className: "flex justify-start gap-4 items-center", children: [
17
+ /* @__PURE__ */ jsx(
18
+ Switch,
19
+ {
20
+ checked: category.enabled,
21
+ onCheckedChange: (value) => void category.setEnabled(value),
22
+ disabled: !category.canDisable
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx(Typography, { children: category.name }),
26
+ !category.canDisable && /* @__PURE__ */ jsx(Typography, { variant: "secondary", type: "footnote", children: "(cannot be disabled)" })
27
+ ] }, category.id))
28
+ ] })
29
+ ] });
30
+ }
31
+ export {
32
+ NotificationsPage
33
+ };
34
+ //# sourceMappingURL=notifications-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/notifications/notifications-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\nimport { Switch } from \"@stackframe/stack-ui\";\nimport { Separator, Typography } from \"@stackframe/stack-ui\";\n\n\nexport function NotificationsPage() {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const notificationCategories = user.useNotificationCategories();\n\n return (\n <PageLayout>\n <Separator />\n <div className='flex flex-col gap-2'>\n <div className='sm:flex-1 flex flex-col justify-center pb-2'>\n <Typography className=\"font-medium\">\n {t('Choose which emails you want to receive')}\n </Typography>\n </div>\n {notificationCategories.map((category) => (\n <div key={category.id} className=\"flex justify-start gap-4 items-center\">\n <Switch\n checked={category.enabled}\n onCheckedChange={(value) => void category.setEnabled(value)}\n disabled={!category.canDisable}\n />\n <Typography>{category.name}</Typography>\n {!category.canDisable && (\n <Typography variant='secondary' type='footnote'>\n (cannot be disabled)\n </Typography>\n )}\n </div>\n ))}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";AAIA,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,WAAW,kBAAkB;AAUhC,cAQI,YARJ;AAPC,SAAS,oBAAoB;AAClC,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,WAAW,CAAC;AACvC,QAAM,yBAAyB,KAAK,0BAA0B;AAE9D,SACE,qBAAC,cACC;AAAA,wBAAC,aAAU;AAAA,IACX,qBAAC,SAAI,WAAU,uBACb;AAAA,0BAAC,SAAI,WAAU,+CACb,8BAAC,cAAW,WAAU,eACnB,YAAE,yCAAyC,GAC9C,GACF;AAAA,MACC,uBAAuB,IAAI,CAAC,aAC3B,qBAAC,SAAsB,WAAU,yCAC/B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,SAAS;AAAA,YAClB,iBAAiB,CAAC,UAAU,KAAK,SAAS,WAAW,KAAK;AAAA,YAC1D,UAAU,CAAC,SAAS;AAAA;AAAA,QACtB;AAAA,QACA,oBAAC,cAAY,mBAAS,MAAK;AAAA,QAC1B,CAAC,SAAS,cACT,oBAAC,cAAW,SAAQ,aAAY,MAAK,YAAW,kCAEhD;AAAA,WAVM,SAAS,EAYnB,CACD;AAAA,OACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1,14 +1,24 @@
1
1
  // src/components-page/account-settings/profile-page/profile-page.tsx
2
- import { ProfileImageEditor } from "../../../components/profile-image-editor";
3
- import { useUser } from "../../../lib/hooks";
4
- import { useTranslation } from "../../../lib/translations";
5
- import { EditableText } from "../editable-text";
6
- import { PageLayout } from "../page-layout";
7
- import { Section } from "../section";
2
+ import { ProfileImageEditor } from "../../../components/profile-image-editor.js";
3
+ import { useUser } from "../../../lib/hooks.js";
4
+ import { useTranslation } from "../../../lib/translations.js";
5
+ import { EditableText } from "../editable-text.js";
6
+ import { PageLayout } from "../page-layout.js";
7
+ import { Section } from "../section.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
- function ProfilePage() {
9
+ function ProfilePage(props) {
10
10
  const { t } = useTranslation();
11
- const user = useUser({ or: "redirect" });
11
+ const userFromHook = useUser({ or: props?.mockUser ? "return-null" : "redirect" });
12
+ const user = props?.mockUser ? {
13
+ displayName: props.mockUser.displayName || "John Doe",
14
+ profileImageUrl: props.mockUser.profileImageUrl || null,
15
+ update: async () => {
16
+ console.log("Mock update called");
17
+ }
18
+ } : userFromHook;
19
+ if (!user) {
20
+ return null;
21
+ }
12
22
  return /* @__PURE__ */ jsxs(PageLayout, { children: [
13
23
  /* @__PURE__ */ jsx(
14
24
  Section,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components-page/account-settings/profile-page/profile-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { ProfileImageEditor } from \"../../../components/profile-image-editor\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { EditableText } from \"../editable-text\";\nimport { PageLayout } from \"../page-layout\";\nimport { Section } from \"../section\";\n\nexport function ProfilePage() {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n\n return (\n <PageLayout>\n <Section\n title={t(\"User name\")}\n description={t(\"This is a display name and is not used for authentication\")}\n >\n <EditableText\n value={user.displayName || ''}\n onSave={async (newDisplayName) => {\n await user.update({ displayName: newDisplayName });\n }}/>\n </Section>\n\n <Section\n title={t(\"Profile image\")}\n description={t(\"Upload your own image as your avatar\")}\n >\n <ProfileImageEditor\n user={user}\n onProfileImageUrlChange={async (profileImageUrl) => {\n await user.update({ profileImageUrl });\n }}\n />\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":";AAIA,SAAS,0BAA0B;AACnC,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAOpB,SAKI,KALJ;AALG,SAAS,cAAc;AAC5B,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,WAAW,CAAC;AAEvC,SACE,qBAAC,cACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,WAAW;AAAA,QACpB,aAAa,EAAE,2DAA2D;AAAA,QAE1E;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK,eAAe;AAAA,YAC3B,QAAQ,OAAO,mBAAmB;AAChC,oBAAM,KAAK,OAAO,EAAE,aAAa,eAAe,CAAC;AAAA,YACnD;AAAA;AAAA,QAAE;AAAA;AAAA,IACN;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,eAAe;AAAA,QACxB,aAAa,EAAE,sCAAsC;AAAA,QAErD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,yBAAyB,OAAO,oBAAoB;AAClD,oBAAM,KAAK,OAAO,EAAE,gBAAgB,CAAC;AAAA,YACvC;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/profile-page/profile-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { ProfileImageEditor } from \"../../../components/profile-image-editor\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { EditableText } from \"../editable-text\";\nimport { PageLayout } from \"../page-layout\";\nimport { Section } from \"../section\";\n\nexport function ProfilePage(props?: {\n mockUser?: {\n displayName?: string,\n profileImageUrl?: string,\n },\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: props?.mockUser ? 'return-null' : 'redirect' });\n\n // Use mock data if provided, otherwise use real user\n const user = props?.mockUser ? {\n displayName: props.mockUser.displayName || 'John Doe',\n profileImageUrl: props.mockUser.profileImageUrl || null,\n update: async () => {\n // Mock update - do nothing in demo mode\n console.log('Mock update called');\n }\n } : userFromHook;\n\n if (!user) {\n return null; // This shouldn't happen in practice\n }\n\n return (\n <PageLayout>\n <Section\n title={t(\"User name\")}\n description={t(\"This is a display name and is not used for authentication\")}\n >\n <EditableText\n value={user.displayName || ''}\n onSave={async (newDisplayName) => {\n await user.update({ displayName: newDisplayName });\n }}/>\n </Section>\n\n <Section\n title={t(\"Profile image\")}\n description={t(\"Upload your own image as your avatar\")}\n >\n <ProfileImageEditor\n user={user as any}\n onProfileImageUrlChange={async (profileImageUrl: string | null) => {\n await user.update({ profileImageUrl });\n }}\n />\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":";AAIA,SAAS,0BAA0B;AACnC,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AA0BpB,SAKI,KALJ;AAxBG,SAAS,YAAY,OAKzB;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,eAAe,QAAQ,EAAE,IAAI,OAAO,WAAW,gBAAgB,WAAW,CAAC;AAGjF,QAAM,OAAO,OAAO,WAAW;AAAA,IAC7B,aAAa,MAAM,SAAS,eAAe;AAAA,IAC3C,iBAAiB,MAAM,SAAS,mBAAmB;AAAA,IACnD,QAAQ,YAAY;AAElB,cAAQ,IAAI,oBAAoB;AAAA,IAClC;AAAA,EACF,IAAI;AAEJ,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SACE,qBAAC,cACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,WAAW;AAAA,QACpB,aAAa,EAAE,2DAA2D;AAAA,QAE1E;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK,eAAe;AAAA,YAC3B,QAAQ,OAAO,mBAAmB;AAChC,oBAAM,KAAK,OAAO,EAAE,aAAa,eAAe,CAAC;AAAA,YACnD;AAAA;AAAA,QAAE;AAAA;AAAA,IACN;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,eAAe;AAAA,QACxB,aAAa,EAAE,sCAAsC;AAAA,QAErD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,yBAAyB,OAAO,oBAAmC;AACjE,oBAAM,KAAK,OAAO,EAAE,gBAAgB,CAAC;AAAA,YACvC;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1,19 +1,31 @@
1
1
  // src/components-page/account-settings/settings/delete-account-section.tsx
2
2
  import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Button, Typography } from "@stackframe/stack-ui";
3
3
  import { useState } from "react";
4
- import { useStackApp, useUser } from "../../../lib/hooks";
5
- import { useTranslation } from "../../../lib/translations";
6
- import { Section } from "../section";
4
+ import { useStackApp, useUser } from "../../../lib/hooks.js";
5
+ import { useTranslation } from "../../../lib/translations.js";
6
+ import { Section } from "../section.js";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
- function DeleteAccountSection() {
8
+ function DeleteAccountSection(props) {
9
9
  const { t } = useTranslation();
10
- const user = useUser({ or: "redirect" });
10
+ const user = useUser({ or: props?.mockMode ? "return-null" : "redirect" });
11
11
  const app = useStackApp();
12
12
  const project = app.useProject();
13
13
  const [deleting, setDeleting] = useState(false);
14
- if (!project.config.clientUserDeletionEnabled) {
14
+ const showDeleteSection = props?.mockMode || project.config.clientUserDeletionEnabled;
15
+ if (!showDeleteSection) {
15
16
  return null;
16
17
  }
18
+ const handleDeleteAccount = async () => {
19
+ if (props?.mockMode) {
20
+ alert("Mock mode: Account deletion clicked");
21
+ setDeleting(false);
22
+ return;
23
+ }
24
+ if (user) {
25
+ await user.delete();
26
+ await app.redirectToHome();
27
+ }
28
+ };
17
29
  return /* @__PURE__ */ jsx(
18
30
  Section,
19
31
  {
@@ -35,10 +47,7 @@ function DeleteAccountSection() {
35
47
  Button,
36
48
  {
37
49
  variant: "destructive",
38
- onClick: async () => {
39
- await user.delete();
40
- await app.redirectToHome();
41
- },
50
+ onClick: handleDeleteAccount,
42
51
  children: t("Delete Account")
43
52
  }
44
53
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components-page/account-settings/settings/delete-account-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Button, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function DeleteAccountSection() {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const app = useStackApp();\n const project = app.useProject();\n const [deleting, setDeleting] = useState(false);\n if (!project.config.clientUserDeletionEnabled) {\n return null;\n }\n\n return (\n <Section\n title={t(\"Delete Account\")}\n description={t(\"Permanently remove your account and all associated data\")}\n >\n <div className='stack-scope flex flex-col items-stretch'>\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>{t(\"Danger zone\")}</AccordionTrigger>\n <AccordionContent>\n {!deleting ? (\n <div>\n <Button\n variant='destructive'\n onClick={() => setDeleting(true)}\n >\n {t(\"Delete account\")}\n </Button>\n </div>\n ) : (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to delete your account? This action is IRREVERSIBLE and will delete ALL associated data.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={async () => {\n await user.delete();\n await app.redirectToHome();\n }}\n >\n {t(\"Delete Account\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setDeleting(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n </Section>\n );\n}\n"],"mappings":";AAIA,SAAS,WAAW,kBAAkB,eAAe,kBAAkB,QAAQ,kBAAkB;AACjG,SAAS,gBAAgB;AACzB,SAAS,aAAa,eAAe;AACrC,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAoBZ,cAgBM,YAhBN;AAlBL,SAAS,uBAAuB;AACrC,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,WAAW,CAAC;AACvC,QAAM,MAAM,YAAY;AACxB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,MAAI,CAAC,QAAQ,OAAO,2BAA2B;AAC7C,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,gBAAgB;AAAA,MACzB,aAAa,EAAE,yDAAyD;AAAA,MAExE,8BAAC,SAAI,WAAU,2CACb,8BAAC,aAAU,MAAK,UAAS,aAAW,MAAC,WAAU,UAC7C,+BAAC,iBAAc,OAAM,UACnB;AAAA,4BAAC,oBAAkB,YAAE,aAAa,GAAE;AAAA,QACpC,oBAAC,oBACE,WAAC,WACA,oBAAC,SACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM,YAAY,IAAI;AAAA,YAE9B,YAAE,gBAAgB;AAAA;AAAA,QACrB,GACF,IAEA,qBAAC,SAAI,WAAU,uBACb;AAAA,8BAAC,cAAW,SAAQ,eACjB,YAAE,gHAAgH,GACrH;AAAA,UACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS,YAAY;AACnB,wBAAM,KAAK,OAAO;AAClB,wBAAM,IAAI,eAAe;AAAA,gBAC3B;AAAA,gBAEC,YAAE,gBAAgB;AAAA;AAAA,YACrB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS,MAAM,YAAY,KAAK;AAAA,gBAE/B,YAAE,QAAQ;AAAA;AAAA,YACb;AAAA,aACF;AAAA,WACF,GAEJ;AAAA,SACF,GACF,GACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/settings/delete-account-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Button, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function DeleteAccountSection(props?: { mockMode?: boolean }) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n const app = useStackApp();\n const project = app.useProject();\n const [deleting, setDeleting] = useState(false);\n\n // In mock mode, always show the delete section\n const showDeleteSection = props?.mockMode || project.config.clientUserDeletionEnabled;\n\n if (!showDeleteSection) {\n return null;\n }\n\n const handleDeleteAccount = async () => {\n if (props?.mockMode) {\n // Mock mode - just show an alert\n alert(\"Mock mode: Account deletion clicked\");\n setDeleting(false);\n return;\n }\n\n if (user) {\n await user.delete();\n await app.redirectToHome();\n }\n };\n\n return (\n <Section\n title={t(\"Delete Account\")}\n description={t(\"Permanently remove your account and all associated data\")}\n >\n <div className='stack-scope flex flex-col items-stretch'>\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>{t(\"Danger zone\")}</AccordionTrigger>\n <AccordionContent>\n {!deleting ? (\n <div>\n <Button\n variant='destructive'\n onClick={() => setDeleting(true)}\n >\n {t(\"Delete account\")}\n </Button>\n </div>\n ) : (\n <div className='flex flex-col gap-2'>\n <Typography variant='destructive'>\n {t(\"Are you sure you want to delete your account? This action is IRREVERSIBLE and will delete ALL associated data.\")}\n </Typography>\n <div className='flex gap-2'>\n <Button\n variant='destructive'\n onClick={handleDeleteAccount}\n >\n {t(\"Delete Account\")}\n </Button>\n <Button\n variant='secondary'\n onClick={() => setDeleting(false)}\n >\n {t(\"Cancel\")}\n </Button>\n </div>\n </div>\n )}\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n </Section>\n );\n}\n"],"mappings":";AAIA,SAAS,WAAW,kBAAkB,eAAe,kBAAkB,QAAQ,kBAAkB;AACjG,SAAS,gBAAgB;AACzB,SAAS,aAAa,eAAe;AACrC,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAsCZ,cAgBM,YAhBN;AApCL,SAAS,qBAAqB,OAAgC;AACnE,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,OAAO,WAAW,gBAAgB,WAAW,CAAC;AACzE,QAAM,MAAM,YAAY;AACxB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAG9C,QAAM,oBAAoB,OAAO,YAAY,QAAQ,OAAO;AAE5D,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,YAAY;AACtC,QAAI,OAAO,UAAU;AAEnB,YAAM,qCAAqC;AAC3C,kBAAY,KAAK;AACjB;AAAA,IACF;AAEA,QAAI,MAAM;AACR,YAAM,KAAK,OAAO;AAClB,YAAM,IAAI,eAAe;AAAA,IAC3B;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,gBAAgB;AAAA,MACzB,aAAa,EAAE,yDAAyD;AAAA,MAExE,8BAAC,SAAI,WAAU,2CACb,8BAAC,aAAU,MAAK,UAAS,aAAW,MAAC,WAAU,UAC7C,+BAAC,iBAAc,OAAM,UACnB;AAAA,4BAAC,oBAAkB,YAAE,aAAa,GAAE;AAAA,QACpC,oBAAC,oBACE,WAAC,WACA,oBAAC,SACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM,YAAY,IAAI;AAAA,YAE9B,YAAE,gBAAgB;AAAA;AAAA,QACrB,GACF,IAEA,qBAAC,SAAI,WAAU,uBACb;AAAA,8BAAC,cAAW,SAAQ,eACjB,YAAE,gHAAgH,GACrH;AAAA,UACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS;AAAA,gBAER,YAAE,gBAAgB;AAAA;AAAA,YACrB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS,MAAM,YAAY,KAAK;AAAA,gBAE/B,YAAE,QAAQ;AAAA;AAAA,YACb;AAAA,aACF;AAAA,WACF,GAEJ;AAAA,SACF,GACF,GACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1,12 +1,12 @@
1
1
  // src/components-page/account-settings/settings/settings-page.tsx
2
- import { PageLayout } from "../page-layout";
3
- import { DeleteAccountSection } from "./delete-account-section";
4
- import { SignOutSection } from "./sign-out-section";
2
+ import { PageLayout } from "../page-layout.js";
3
+ import { DeleteAccountSection } from "./delete-account-section.js";
4
+ import { SignOutSection } from "./sign-out-section.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
- function SettingsPage() {
6
+ function SettingsPage(props) {
7
7
  return /* @__PURE__ */ jsxs(PageLayout, { children: [
8
- /* @__PURE__ */ jsx(DeleteAccountSection, {}),
9
- /* @__PURE__ */ jsx(SignOutSection, {})
8
+ /* @__PURE__ */ jsx(DeleteAccountSection, { mockMode: props?.mockMode }),
9
+ /* @__PURE__ */ jsx(SignOutSection, { mockMode: props?.mockMode })
10
10
  ] });
11
11
  }
12
12
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components-page/account-settings/settings/settings-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { PageLayout } from \"../page-layout\";\nimport { DeleteAccountSection } from \"./delete-account-section\";\nimport { SignOutSection } from \"./sign-out-section\";\n\n\nexport function SettingsPage() {\n return (\n <PageLayout>\n <DeleteAccountSection />\n <SignOutSection />\n </PageLayout>\n );\n}\n"],"mappings":";AAIA,SAAS,kBAAkB;AAC3B,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAK3B,SACE,KADF;AAFG,SAAS,eAAe;AAC7B,SACE,qBAAC,cACC;AAAA,wBAAC,wBAAqB;AAAA,IACtB,oBAAC,kBAAe;AAAA,KAClB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/settings/settings-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { PageLayout } from \"../page-layout\";\nimport { DeleteAccountSection } from \"./delete-account-section\";\nimport { SignOutSection } from \"./sign-out-section\";\n\n\nexport function SettingsPage(props?: {\n mockMode?: boolean,\n}) {\n return (\n <PageLayout>\n <DeleteAccountSection mockMode={props?.mockMode} />\n <SignOutSection mockMode={props?.mockMode} />\n </PageLayout>\n );\n}\n"],"mappings":";AAIA,SAAS,kBAAkB;AAC3B,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAO3B,SACE,KADF;AAJG,SAAS,aAAa,OAE1B;AACD,SACE,qBAAC,cACC;AAAA,wBAAC,wBAAqB,UAAU,OAAO,UAAU;AAAA,IACjD,oBAAC,kBAAe,UAAU,OAAO,UAAU;AAAA,KAC7C;AAEJ;","names":[]}
@@ -1,12 +1,21 @@
1
1
  // src/components-page/account-settings/settings/sign-out-section.tsx
2
2
  import { Button } from "@stackframe/stack-ui";
3
- import { useUser } from "../../../lib/hooks";
4
- import { useTranslation } from "../../../lib/translations";
5
- import { Section } from "../section";
3
+ import { useUser } from "../../../lib/hooks.js";
4
+ import { useTranslation } from "../../../lib/translations.js";
5
+ import { Section } from "../section.js";
6
6
  import { jsx } from "react/jsx-runtime";
7
- function SignOutSection() {
7
+ function SignOutSection(props) {
8
8
  const { t } = useTranslation();
9
- const user = useUser({ or: "throw" });
9
+ const user = useUser({ or: props?.mockMode ? "return-null" : "throw" });
10
+ const handleSignOut = async () => {
11
+ if (props?.mockMode) {
12
+ alert("Mock mode: Sign out clicked");
13
+ return;
14
+ }
15
+ if (user) {
16
+ await user.signOut();
17
+ }
18
+ };
10
19
  return /* @__PURE__ */ jsx(
11
20
  Section,
12
21
  {
@@ -16,7 +25,7 @@ function SignOutSection() {
16
25
  Button,
17
26
  {
18
27
  variant: "secondary",
19
- onClick: () => user.signOut(),
28
+ onClick: handleSignOut,
20
29
  children: t("Sign out")
21
30
  }
22
31
  ) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components-page/account-settings/settings/sign-out-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { Button } from \"@stackframe/stack-ui\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function SignOutSection() {\n const { t } = useTranslation();\n const user = useUser({ or: \"throw\" });\n\n return (\n <Section\n title={t(\"Sign out\")}\n description={t(\"End your current session\")}\n >\n <div>\n <Button\n variant='secondary'\n onClick={() => user.signOut()}\n >\n {t(\"Sign out\")}\n </Button>\n </div>\n </Section>\n );\n}\n"],"mappings":";AAIA,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAYhB;AAVD,SAAS,iBAAiB;AAC/B,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,QAAQ,CAAC;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,UAAU;AAAA,MACnB,aAAa,EAAE,0BAA0B;AAAA,MAEzC,8BAAC,SACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM,KAAK,QAAQ;AAAA,UAE3B,YAAE,UAAU;AAAA;AAAA,MACf,GACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/settings/sign-out-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { Button } from \"@stackframe/stack-ui\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function SignOutSection(props?: { mockMode?: boolean }) {\n const { t } = useTranslation();\n const user = useUser({ or: props?.mockMode ? \"return-null\" : \"throw\" });\n\n const handleSignOut = async () => {\n if (props?.mockMode) {\n // Mock mode - just show an alert or do nothing\n alert(\"Mock mode: Sign out clicked\");\n return;\n }\n if (user) {\n await user.signOut();\n }\n };\n\n return (\n <Section\n title={t(\"Sign out\")}\n description={t(\"End your current session\")}\n >\n <div>\n <Button\n variant='secondary'\n onClick={handleSignOut}\n >\n {t(\"Sign out\")}\n </Button>\n </div>\n </Section>\n );\n}\n"],"mappings":";AAIA,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAuBhB;AArBD,SAAS,eAAe,OAAgC;AAC7D,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,OAAO,QAAQ,EAAE,IAAI,OAAO,WAAW,gBAAgB,QAAQ,CAAC;AAEtE,QAAM,gBAAgB,YAAY;AAChC,QAAI,OAAO,UAAU;AAEnB,YAAM,6BAA6B;AACnC;AAAA,IACF;AACA,QAAI,MAAM;AACR,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,UAAU;AAAA,MACnB,aAAa,EAAE,0BAA0B;AAAA,MAEzC,8BAAC,SACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS;AAAA,UAER,YAAE,UAAU;AAAA;AAAA,MACf,GACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1,9 +1,9 @@
1
1
  // src/components-page/account-settings/teams/leave-team-section.tsx
2
2
  import { Button, Typography } from "@stackframe/stack-ui";
3
3
  import { useState } from "react";
4
- import { useUser } from "../../../lib/hooks";
5
- import { useTranslation } from "../../../lib/translations";
6
- import { Section } from "../section";
4
+ import { useUser } from "../../../lib/hooks.js";
5
+ import { useTranslation } from "../../../lib/translations.js";
6
+ import { Section } from "../section.js";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  function LeaveTeamSection(props) {
9
9
  const { t } = useTranslation();
@@ -2,11 +2,11 @@
2
2
  import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
3
3
  import { Button } from "@stackframe/stack-ui";
4
4
  import { useState } from "react";
5
- import { CreateApiKeyDialog, ShowApiKeyDialog } from "../../../components/api-key-dialogs";
6
- import { ApiKeyTable } from "../../../components/api-key-table";
7
- import { useStackApp, useUser } from "../../../lib/hooks";
8
- import { useTranslation } from "../../../lib/translations";
9
- import { Section } from "../section";
5
+ import { CreateApiKeyDialog, ShowApiKeyDialog } from "../../../components/api-key-dialogs.js";
6
+ import { ApiKeyTable } from "../../../components/api-key-table.js";
7
+ import { useStackApp, useUser } from "../../../lib/hooks.js";
8
+ import { useTranslation } from "../../../lib/translations.js";
9
+ import { Section } from "../section.js";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
11
  function TeamApiKeysSection(props) {
12
12
  const user = useUser({ or: "redirect" });
@@ -5,14 +5,14 @@ import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/
5
5
  import { Button, Input } from "@stackframe/stack-ui";
6
6
  import { useState } from "react";
7
7
  import { useForm } from "react-hook-form";
8
- import { FormWarningText } from "../../../components/elements/form-warning";
9
- import { MessageCard } from "../../../components/message-cards/message-card";
10
- import { useStackApp, useUser } from "../../../lib/hooks";
11
- import { useTranslation } from "../../../lib/translations";
12
- import { PageLayout } from "../page-layout";
13
- import { Section } from "../section";
8
+ import { FormWarningText } from "../../../components/elements/form-warning.js";
9
+ import { MessageCard } from "../../../components/message-cards/message-card.js";
10
+ import { useStackApp, useUser } from "../../../lib/hooks.js";
11
+ import { useTranslation } from "../../../lib/translations.js";
12
+ import { PageLayout } from "../page-layout.js";
13
+ import { Section } from "../section.js";
14
14
  import { jsx, jsxs } from "react/jsx-runtime";
15
- function TeamCreationPage() {
15
+ function TeamCreationPage(props) {
16
16
  const { t } = useTranslation();
17
17
  const teamCreationSchema = yupObject({
18
18
  displayName: yupString().defined().nonEmpty(t("Please enter a team name"))
@@ -22,21 +22,30 @@ function TeamCreationPage() {
22
22
  });
23
23
  const app = useStackApp();
24
24
  const project = app.useProject();
25
- const user = useUser({ or: "redirect" });
25
+ const user = useUser({ or: props?.mockMode ? "return-null" : "redirect" });
26
26
  const navigate = app.useNavigate();
27
27
  const [loading, setLoading] = useState(false);
28
+ if (props?.mockMode) {
29
+ return /* @__PURE__ */ jsx(PageLayout, { children: /* @__PURE__ */ jsx(MessageCard, { title: t("Team creation is disabled in demo mode") }) });
30
+ }
28
31
  if (!project.config.clientTeamCreationEnabled) {
29
32
  return /* @__PURE__ */ jsx(MessageCard, { title: t("Team creation is not enabled") });
30
33
  }
31
34
  const onSubmit = async (data) => {
35
+ if (props?.mockMode) {
36
+ alert("Mock mode: Team creation clicked");
37
+ return;
38
+ }
32
39
  setLoading(true);
33
40
  let team;
34
41
  try {
35
- team = await user.createTeam({ displayName: data.displayName });
42
+ team = await user?.createTeam({ displayName: data.displayName });
36
43
  } finally {
37
44
  setLoading(false);
38
45
  }
39
- navigate(`#team-${team.id}`);
46
+ if (team) {
47
+ navigate(`#team-${team.id}`);
48
+ }
40
49
  };
41
50
  return /* @__PURE__ */ jsx(PageLayout, { children: /* @__PURE__ */ jsx(Section, { title: t("Create a Team"), description: t("Enter a display name for your new team"), children: /* @__PURE__ */ jsxs(
42
51
  "form",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/components-page/account-settings/teams/team-creation-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Input } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { MessageCard } from \"../../../components/message-cards/message-card\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\nimport { Section } from \"../section\";\n\nexport function TeamCreationPage() {\n const { t } = useTranslation();\n\n const teamCreationSchema = yupObject({\n displayName: yupString().defined().nonEmpty(t(\"Please enter a team name\")),\n });\n\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(teamCreationSchema)\n });\n const app = useStackApp();\n const project = app.useProject();\n const user = useUser({ or: 'redirect' });\n const navigate = app.useNavigate();\n const [loading, setLoading] = useState(false);\n\n if (!project.config.clientTeamCreationEnabled) {\n return <MessageCard title={t(\"Team creation is not enabled\")} />;\n }\n\n const onSubmit = async (data: yup.InferType<typeof teamCreationSchema>) => {\n setLoading(true);\n\n let team;\n try {\n team = await user.createTeam({ displayName: data.displayName });\n } finally {\n setLoading(false);\n }\n\n navigate(`#team-${team.id}`);\n };\n\n return (\n <PageLayout>\n <Section title={t(\"Create a Team\")} description={t(\"Enter a display name for your new team\")}>\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n className='flex gap-2 flex-col sm:flex-row'\n >\n <div className='flex flex-col flex-1'>\n <Input\n id=\"displayName\"\n type=\"text\"\n {...register(\"displayName\")}\n />\n <FormWarningText text={errors.displayName?.message?.toString()} />\n </div>\n <Button type=\"submit\" loading={loading}>{t(\"Create\")}</Button>\n </form>\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":";AAIA,SAAS,mBAAmB;AAC5B,SAAS,WAAW,iBAAiB;AACrC,SAAS,kCAAkC;AAC3C,SAAS,QAAQ,aAAa;AAC9B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,aAAa,eAAe;AACrC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAmBb,cAwBD,YAxBC;AAjBJ,SAAS,mBAAmB;AACjC,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,QAAM,qBAAqB,UAAU;AAAA,IACnC,aAAa,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,0BAA0B,CAAC;AAAA,EAC3E,CAAC;AAED,QAAM,EAAE,UAAU,cAAc,WAAW,EAAE,OAAO,EAAE,IAAI,QAAQ;AAAA,IAChE,UAAU,YAAY,kBAAkB;AAAA,EAC1C,CAAC;AACD,QAAM,MAAM,YAAY;AACxB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,OAAO,QAAQ,EAAE,IAAI,WAAW,CAAC;AACvC,QAAM,WAAW,IAAI,YAAY;AACjC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,MAAI,CAAC,QAAQ,OAAO,2BAA2B;AAC7C,WAAO,oBAAC,eAAY,OAAO,EAAE,8BAA8B,GAAG;AAAA,EAChE;AAEA,QAAM,WAAW,OAAO,SAAmD;AACzE,eAAW,IAAI;AAEf,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,KAAK,WAAW,EAAE,aAAa,KAAK,YAAY,CAAC;AAAA,IAChE,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAEA,aAAS,SAAS,KAAK,EAAE,EAAE;AAAA,EAC7B;AAEA,SACE,oBAAC,cACC,8BAAC,WAAQ,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,wCAAwC,GACzF;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,OAAK,2BAA2B,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,MACnE,YAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,6BAAC,SAAI,WAAU,wBACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACJ,GAAG,SAAS,aAAa;AAAA;AAAA,UAC5B;AAAA,UACA,oBAAC,mBAAgB,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAAA,WAClE;AAAA,QACA,oBAAC,UAAO,MAAK,UAAS,SAAmB,YAAE,QAAQ,GAAE;AAAA;AAAA;AAAA,EACvD,GACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/components-page/account-settings/teams/team-creation-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Input } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { MessageCard } from \"../../../components/message-cards/message-card\";\nimport { useStackApp, useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { PageLayout } from \"../page-layout\";\nimport { Section } from \"../section\";\n\nexport function TeamCreationPage(props?: {\n mockMode?: boolean,\n}) {\n const { t } = useTranslation();\n\n const teamCreationSchema = yupObject({\n displayName: yupString().defined().nonEmpty(t(\"Please enter a team name\")),\n });\n\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(teamCreationSchema)\n });\n const app = useStackApp();\n const project = app.useProject();\n const user = useUser({ or: props?.mockMode ? 'return-null' : 'redirect' });\n const navigate = app.useNavigate();\n const [loading, setLoading] = useState(false);\n\n // In mock mode, show that team creation is disabled\n if (props?.mockMode) {\n return (\n <PageLayout>\n <MessageCard title={t(\"Team creation is disabled in demo mode\")} />\n </PageLayout>\n );\n }\n\n if (!project.config.clientTeamCreationEnabled) {\n return <MessageCard title={t(\"Team creation is not enabled\")} />;\n }\n\n const onSubmit = async (data: yup.InferType<typeof teamCreationSchema>) => {\n if (props?.mockMode) {\n // Mock mode - just show an alert\n alert(\"Mock mode: Team creation clicked\");\n return;\n }\n\n setLoading(true);\n\n let team;\n try {\n team = await user?.createTeam({ displayName: data.displayName });\n } finally {\n setLoading(false);\n }\n\n if (team) {\n navigate(`#team-${team.id}`);\n }\n };\n\n return (\n <PageLayout>\n <Section title={t(\"Create a Team\")} description={t(\"Enter a display name for your new team\")}>\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n className='flex gap-2 flex-col sm:flex-row'\n >\n <div className='flex flex-col flex-1'>\n <Input\n id=\"displayName\"\n type=\"text\"\n {...register(\"displayName\")}\n />\n <FormWarningText text={errors.displayName?.message?.toString()} />\n </div>\n <Button type=\"submit\" loading={loading}>{t(\"Create\")}</Button>\n </form>\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":";AAIA,SAAS,mBAAmB;AAC5B,SAAS,WAAW,iBAAiB;AACrC,SAAS,kCAAkC;AAC3C,SAAS,QAAQ,aAAa;AAC9B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,aAAa,eAAe;AACrC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAwBhB,cAsCE,YAtCF;AAtBD,SAAS,iBAAiB,OAE9B;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,QAAM,qBAAqB,UAAU;AAAA,IACnC,aAAa,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,0BAA0B,CAAC;AAAA,EAC3E,CAAC;AAED,QAAM,EAAE,UAAU,cAAc,WAAW,EAAE,OAAO,EAAE,IAAI,QAAQ;AAAA,IAChE,UAAU,YAAY,kBAAkB;AAAA,EAC1C,CAAC;AACD,QAAM,MAAM,YAAY;AACxB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,OAAO,QAAQ,EAAE,IAAI,OAAO,WAAW,gBAAgB,WAAW,CAAC;AACzE,QAAM,WAAW,IAAI,YAAY;AACjC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAG5C,MAAI,OAAO,UAAU;AACnB,WACE,oBAAC,cACC,8BAAC,eAAY,OAAO,EAAE,wCAAwC,GAAG,GACnE;AAAA,EAEJ;AAEA,MAAI,CAAC,QAAQ,OAAO,2BAA2B;AAC7C,WAAO,oBAAC,eAAY,OAAO,EAAE,8BAA8B,GAAG;AAAA,EAChE;AAEA,QAAM,WAAW,OAAO,SAAmD;AACzE,QAAI,OAAO,UAAU;AAEnB,YAAM,kCAAkC;AACxC;AAAA,IACF;AAEA,eAAW,IAAI;AAEf,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,MAAM,WAAW,EAAE,aAAa,KAAK,YAAY,CAAC;AAAA,IACjE,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAEA,QAAI,MAAM;AACR,eAAS,SAAS,KAAK,EAAE,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,SACE,oBAAC,cACC,8BAAC,WAAQ,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,wCAAwC,GACzF;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,OAAK,2BAA2B,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,MACnE,YAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,6BAAC,SAAI,WAAU,wBACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACJ,GAAG,SAAS,aAAa;AAAA;AAAA,UAC5B;AAAA,UACA,oBAAC,mBAAgB,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAAA,WAClE;AAAA,QACA,oBAAC,UAAO,MAAK,UAAS,SAAmB,YAAE,QAAQ,GAAE;AAAA;AAAA;AAAA,EACvD,GACF,GACF;AAEJ;","names":[]}
@@ -1,8 +1,8 @@
1
1
  // src/components-page/account-settings/teams/team-display-name-section.tsx
2
- import { useUser } from "../../../lib/hooks";
3
- import { useTranslation } from "../../../lib/translations";
4
- import { EditableText } from "../editable-text";
5
- import { Section } from "../section";
2
+ import { useUser } from "../../../lib/hooks.js";
3
+ import { useTranslation } from "../../../lib/translations.js";
4
+ import { EditableText } from "../editable-text.js";
5
+ import { Section } from "../section.js";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  function TeamDisplayNameSection(props) {
8
8
  const { t } = useTranslation();
@@ -6,10 +6,10 @@ import { Button, Input, Table, TableBody, TableCell, TableHead, TableHeader, Tab
6
6
  import { Trash } from "lucide-react";
7
7
  import { useEffect, useState } from "react";
8
8
  import { useForm } from "react-hook-form";
9
- import { FormWarningText } from "../../../components/elements/form-warning";
10
- import { useUser } from "../../../lib/hooks";
11
- import { useTranslation } from "../../../lib/translations";
12
- import { Section } from "../section";
9
+ import { FormWarningText } from "../../../components/elements/form-warning.js";
10
+ import { useUser } from "../../../lib/hooks.js";
11
+ import { useTranslation } from "../../../lib/translations.js";
12
+ import { Section } from "../section.js";
13
13
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
14
  function TeamMemberInvitationSection(props) {
15
15
  const user = useUser({ or: "redirect" });
@@ -1,8 +1,8 @@
1
1
  // src/components-page/account-settings/teams/team-member-list-section.tsx
2
2
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from "@stackframe/stack-ui";
3
- import { UserAvatar } from "../../../components/elements/user-avatar";
4
- import { useUser } from "../../../lib/hooks";
5
- import { useTranslation } from "../../../lib/translations";
3
+ import { UserAvatar } from "../../../components/elements/user-avatar.js";
4
+ import { useUser } from "../../../lib/hooks.js";
5
+ import { useTranslation } from "../../../lib/translations.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  function TeamMemberListSection(props) {
8
8
  const user = useUser({ or: "redirect" });
@@ -1,12 +1,12 @@
1
1
  // src/components-page/account-settings/teams/team-page.tsx
2
- import { PageLayout } from "../page-layout";
3
- import { LeaveTeamSection } from "./leave-team-section";
4
- import { TeamApiKeysSection } from "./team-api-keys-section";
5
- import { TeamDisplayNameSection } from "./team-display-name-section";
6
- import { TeamMemberInvitationSection } from "./team-member-invitation-section";
7
- import { TeamMemberListSection } from "./team-member-list-section";
8
- import { TeamProfileImageSection } from "./team-profile-image-section";
9
- import { TeamUserProfileSection } from "./team-profile-user-section";
2
+ import { PageLayout } from "../page-layout.js";
3
+ import { LeaveTeamSection } from "./leave-team-section.js";
4
+ import { TeamApiKeysSection } from "./team-api-keys-section.js";
5
+ import { TeamDisplayNameSection } from "./team-display-name-section.js";
6
+ import { TeamMemberInvitationSection } from "./team-member-invitation-section.js";
7
+ import { TeamMemberListSection } from "./team-member-list-section.js";
8
+ import { TeamProfileImageSection } from "./team-profile-image-section.js";
9
+ import { TeamUserProfileSection } from "./team-profile-user-section.js";
10
10
  import { jsx, jsxs } from "react/jsx-runtime";
11
11
  function TeamPage(props) {
12
12
  return /* @__PURE__ */ jsxs(PageLayout, { children: [
@@ -1,8 +1,8 @@
1
1
  // src/components-page/account-settings/teams/team-profile-image-section.tsx
2
- import { ProfileImageEditor } from "../../../components/profile-image-editor";
3
- import { useUser } from "../../../lib/hooks";
4
- import { useTranslation } from "../../../lib/translations";
5
- import { Section } from "../section";
2
+ import { ProfileImageEditor } from "../../../components/profile-image-editor.js";
3
+ import { useUser } from "../../../lib/hooks.js";
4
+ import { useTranslation } from "../../../lib/translations.js";
5
+ import { Section } from "../section.js";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  function TeamProfileImageSection(props) {
8
8
  const { t } = useTranslation();