@stackframe/react 2.7.20

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 (316) hide show
  1. package/CHANGELOG.md +1415 -0
  2. package/LICENSE +7 -0
  3. package/README.md +26 -0
  4. package/dist/components/credential-sign-in.d.mts +5 -0
  5. package/dist/components/credential-sign-in.d.ts +5 -0
  6. package/dist/components/credential-sign-in.js +103 -0
  7. package/dist/components/credential-sign-in.js.map +1 -0
  8. package/dist/components/credential-sign-up.d.mts +7 -0
  9. package/dist/components/credential-sign-up.d.ts +7 -0
  10. package/dist/components/credential-sign-up.js +138 -0
  11. package/dist/components/credential-sign-up.js.map +1 -0
  12. package/dist/components/elements/form-warning.d.mts +7 -0
  13. package/dist/components/elements/form-warning.d.ts +7 -0
  14. package/dist/components/elements/form-warning.js +39 -0
  15. package/dist/components/elements/form-warning.js.map +1 -0
  16. package/dist/components/elements/maybe-full-page.d.mts +11 -0
  17. package/dist/components/elements/maybe-full-page.d.ts +11 -0
  18. package/dist/components/elements/maybe-full-page.js +74 -0
  19. package/dist/components/elements/maybe-full-page.js.map +1 -0
  20. package/dist/components/elements/separator-with-text.d.mts +7 -0
  21. package/dist/components/elements/separator-with-text.d.ts +7 -0
  22. package/dist/components/elements/separator-with-text.js +41 -0
  23. package/dist/components/elements/separator-with-text.js.map +1 -0
  24. package/dist/components/elements/sidebar-layout.d.mts +19 -0
  25. package/dist/components/elements/sidebar-layout.d.ts +19 -0
  26. package/dist/components/elements/sidebar-layout.js +126 -0
  27. package/dist/components/elements/sidebar-layout.js.map +1 -0
  28. package/dist/components/elements/ssr-layout-effect.d.mts +8 -0
  29. package/dist/components/elements/ssr-layout-effect.d.ts +8 -0
  30. package/dist/components/elements/ssr-layout-effect.js +47 -0
  31. package/dist/components/elements/ssr-layout-effect.js.map +1 -0
  32. package/dist/components/elements/user-avatar.d.mts +13 -0
  33. package/dist/components/elements/user-avatar.d.ts +13 -0
  34. package/dist/components/elements/user-avatar.js +41 -0
  35. package/dist/components/elements/user-avatar.js.map +1 -0
  36. package/dist/components/iframe-preventer.d.mts +8 -0
  37. package/dist/components/iframe-preventer.d.ts +8 -0
  38. package/dist/components/iframe-preventer.js +52 -0
  39. package/dist/components/iframe-preventer.js.map +1 -0
  40. package/dist/components/link.d.mts +14 -0
  41. package/dist/components/link.d.ts +14 -0
  42. package/dist/components/link.js +51 -0
  43. package/dist/components/link.js.map +1 -0
  44. package/dist/components/magic-link-sign-in.d.mts +5 -0
  45. package/dist/components/magic-link-sign-in.d.ts +5 -0
  46. package/dist/components/magic-link-sign-in.js +151 -0
  47. package/dist/components/magic-link-sign-in.js.map +1 -0
  48. package/dist/components/message-cards/known-error-message-card.d.mts +9 -0
  49. package/dist/components/message-cards/known-error-message-card.d.ts +9 -0
  50. package/dist/components/message-cards/known-error-message-card.js +61 -0
  51. package/dist/components/message-cards/known-error-message-card.js.map +1 -0
  52. package/dist/components/message-cards/message-card.d.mts +14 -0
  53. package/dist/components/message-cards/message-card.d.ts +14 -0
  54. package/dist/components/message-cards/message-card.js +45 -0
  55. package/dist/components/message-cards/message-card.js.map +1 -0
  56. package/dist/components/message-cards/predefined-message-card.d.mts +8 -0
  57. package/dist/components/message-cards/predefined-message-card.d.ts +8 -0
  58. package/dist/components/message-cards/predefined-message-card.js +107 -0
  59. package/dist/components/message-cards/predefined-message-card.js.map +1 -0
  60. package/dist/components/oauth-button-group.d.mts +14 -0
  61. package/dist/components/oauth-button-group.d.ts +14 -0
  62. package/dist/components/oauth-button-group.js +43 -0
  63. package/dist/components/oauth-button-group.js.map +1 -0
  64. package/dist/components/oauth-button.d.mts +8 -0
  65. package/dist/components/oauth-button.d.ts +8 -0
  66. package/dist/components/oauth-button.js +210 -0
  67. package/dist/components/oauth-button.js.map +1 -0
  68. package/dist/components/passkey-button.d.mts +7 -0
  69. package/dist/components/passkey-button.d.ts +7 -0
  70. package/dist/components/passkey-button.js +58 -0
  71. package/dist/components/passkey-button.js.map +1 -0
  72. package/dist/components/profile-image-editor.d.mts +11 -0
  73. package/dist/components/profile-image-editor.d.ts +11 -0
  74. package/dist/components/profile-image-editor.js +162 -0
  75. package/dist/components/profile-image-editor.js.map +1 -0
  76. package/dist/components/selected-team-switcher.d.mts +21 -0
  77. package/dist/components/selected-team-switcher.d.ts +21 -0
  78. package/dist/components/selected-team-switcher.js +119 -0
  79. package/dist/components/selected-team-switcher.js.map +1 -0
  80. package/dist/components/team-icon.d.mts +18 -0
  81. package/dist/components/team-icon.d.ts +18 -0
  82. package/dist/components/team-icon.js +39 -0
  83. package/dist/components/team-icon.js.map +1 -0
  84. package/dist/components/user-button.d.mts +15 -0
  85. package/dist/components/user-button.d.ts +15 -0
  86. package/dist/components/user-button.js +120 -0
  87. package/dist/components/user-button.js.map +1 -0
  88. package/dist/components-page/account-settings.d.mts +24 -0
  89. package/dist/components-page/account-settings.d.ts +24 -0
  90. package/dist/components-page/account-settings.js +1095 -0
  91. package/dist/components-page/account-settings.js.map +1 -0
  92. package/dist/components-page/auth-page.d.mts +24 -0
  93. package/dist/components-page/auth-page.d.ts +24 -0
  94. package/dist/components-page/auth-page.js +123 -0
  95. package/dist/components-page/auth-page.js.map +1 -0
  96. package/dist/components-page/email-verification.d.mts +8 -0
  97. package/dist/components-page/email-verification.d.ts +8 -0
  98. package/dist/components-page/email-verification.js +100 -0
  99. package/dist/components-page/email-verification.js.map +1 -0
  100. package/dist/components-page/error-page.d.mts +8 -0
  101. package/dist/components-page/error-page.d.ts +8 -0
  102. package/dist/components-page/error-page.js +97 -0
  103. package/dist/components-page/error-page.js.map +1 -0
  104. package/dist/components-page/forgot-password.d.mts +10 -0
  105. package/dist/components-page/forgot-password.d.ts +10 -0
  106. package/dist/components-page/forgot-password.js +117 -0
  107. package/dist/components-page/forgot-password.js.map +1 -0
  108. package/dist/components-page/magic-link-callback.d.mts +8 -0
  109. package/dist/components-page/magic-link-callback.d.ts +8 -0
  110. package/dist/components-page/magic-link-callback.js +110 -0
  111. package/dist/components-page/magic-link-callback.js.map +1 -0
  112. package/dist/components-page/oauth-callback.d.mts +7 -0
  113. package/dist/components-page/oauth-callback.d.ts +7 -0
  114. package/dist/components-page/oauth-callback.js +75 -0
  115. package/dist/components-page/oauth-callback.js.map +1 -0
  116. package/dist/components-page/password-reset.d.mts +12 -0
  117. package/dist/components-page/password-reset.d.ts +12 -0
  118. package/dist/components-page/password-reset.js +179 -0
  119. package/dist/components-page/password-reset.js.map +1 -0
  120. package/dist/components-page/sign-in.d.mts +10 -0
  121. package/dist/components-page/sign-in.d.ts +10 -0
  122. package/dist/components-page/sign-in.js +44 -0
  123. package/dist/components-page/sign-in.js.map +1 -0
  124. package/dist/components-page/sign-out.d.mts +7 -0
  125. package/dist/components-page/sign-out.d.ts +7 -0
  126. package/dist/components-page/sign-out.js +57 -0
  127. package/dist/components-page/sign-out.js.map +1 -0
  128. package/dist/components-page/sign-up.d.mts +11 -0
  129. package/dist/components-page/sign-up.d.ts +11 -0
  130. package/dist/components-page/sign-up.js +47 -0
  131. package/dist/components-page/sign-up.js.map +1 -0
  132. package/dist/components-page/stack-handler.d.mts +51 -0
  133. package/dist/components-page/stack-handler.d.ts +51 -0
  134. package/dist/components-page/stack-handler.js +244 -0
  135. package/dist/components-page/stack-handler.js.map +1 -0
  136. package/dist/components-page/team-creation.d.mts +7 -0
  137. package/dist/components-page/team-creation.d.ts +7 -0
  138. package/dist/components-page/team-creation.js +92 -0
  139. package/dist/components-page/team-creation.js.map +1 -0
  140. package/dist/components-page/team-invitation.d.mts +8 -0
  141. package/dist/components-page/team-invitation.d.ts +8 -0
  142. package/dist/components-page/team-invitation.js +144 -0
  143. package/dist/components-page/team-invitation.js.map +1 -0
  144. package/dist/esm/components/credential-sign-in.js +79 -0
  145. package/dist/esm/components/credential-sign-in.js.map +1 -0
  146. package/dist/esm/components/credential-sign-up.js +104 -0
  147. package/dist/esm/components/credential-sign-up.js.map +1 -0
  148. package/dist/esm/components/elements/form-warning.js +15 -0
  149. package/dist/esm/components/elements/form-warning.js.map +1 -0
  150. package/dist/esm/components/elements/maybe-full-page.js +50 -0
  151. package/dist/esm/components/elements/maybe-full-page.js.map +1 -0
  152. package/dist/esm/components/elements/separator-with-text.js +17 -0
  153. package/dist/esm/components/elements/separator-with-text.js.map +1 -0
  154. package/dist/esm/components/elements/sidebar-layout.js +102 -0
  155. package/dist/esm/components/elements/sidebar-layout.js.map +1 -0
  156. package/dist/esm/components/elements/ssr-layout-effect.js +23 -0
  157. package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -0
  158. package/dist/esm/components/elements/user-avatar.js +16 -0
  159. package/dist/esm/components/elements/user-avatar.js.map +1 -0
  160. package/dist/esm/components/iframe-preventer.js +28 -0
  161. package/dist/esm/components/iframe-preventer.js.map +1 -0
  162. package/dist/esm/components/link.js +26 -0
  163. package/dist/esm/components/link.js.map +1 -0
  164. package/dist/esm/components/magic-link-sign-in.js +127 -0
  165. package/dist/esm/components/magic-link-sign-in.js.map +1 -0
  166. package/dist/esm/components/message-cards/known-error-message-card.js +37 -0
  167. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -0
  168. package/dist/esm/components/message-cards/message-card.js +21 -0
  169. package/dist/esm/components/message-cards/message-card.js.map +1 -0
  170. package/dist/esm/components/message-cards/predefined-message-card.js +83 -0
  171. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -0
  172. package/dist/esm/components/oauth-button-group.js +19 -0
  173. package/dist/esm/components/oauth-button-group.js.map +1 -0
  174. package/dist/esm/components/oauth-button.js +176 -0
  175. package/dist/esm/components/oauth-button.js.map +1 -0
  176. package/dist/esm/components/passkey-button.js +34 -0
  177. package/dist/esm/components/passkey-button.js.map +1 -0
  178. package/dist/esm/components/profile-image-editor.js +126 -0
  179. package/dist/esm/components/profile-image-editor.js.map +1 -0
  180. package/dist/esm/components/selected-team-switcher.js +107 -0
  181. package/dist/esm/components/selected-team-switcher.js.map +1 -0
  182. package/dist/esm/components/team-icon.js +14 -0
  183. package/dist/esm/components/team-icon.js.map +1 -0
  184. package/dist/esm/components/user-button.js +96 -0
  185. package/dist/esm/components/user-button.js.map +1 -0
  186. package/dist/esm/components-page/account-settings.js +1058 -0
  187. package/dist/esm/components-page/account-settings.js.map +1 -0
  188. package/dist/esm/components-page/auth-page.js +99 -0
  189. package/dist/esm/components-page/auth-page.js.map +1 -0
  190. package/dist/esm/components-page/email-verification.js +66 -0
  191. package/dist/esm/components-page/email-verification.js.map +1 -0
  192. package/dist/esm/components-page/error-page.js +73 -0
  193. package/dist/esm/components-page/error-page.js.map +1 -0
  194. package/dist/esm/components-page/forgot-password.js +92 -0
  195. package/dist/esm/components-page/forgot-password.js.map +1 -0
  196. package/dist/esm/components-page/magic-link-callback.js +76 -0
  197. package/dist/esm/components-page/magic-link-callback.js.map +1 -0
  198. package/dist/esm/components-page/oauth-callback.js +51 -0
  199. package/dist/esm/components-page/oauth-callback.js.map +1 -0
  200. package/dist/esm/components-page/password-reset.js +145 -0
  201. package/dist/esm/components-page/password-reset.js.map +1 -0
  202. package/dist/esm/components-page/sign-in.js +19 -0
  203. package/dist/esm/components-page/sign-in.js.map +1 -0
  204. package/dist/esm/components-page/sign-out.js +23 -0
  205. package/dist/esm/components-page/sign-out.js.map +1 -0
  206. package/dist/esm/components-page/sign-up.js +23 -0
  207. package/dist/esm/components-page/sign-up.js.map +1 -0
  208. package/dist/esm/components-page/stack-handler.js +223 -0
  209. package/dist/esm/components-page/stack-handler.js.map +1 -0
  210. package/dist/esm/components-page/team-creation.js +68 -0
  211. package/dist/esm/components-page/team-creation.js.map +1 -0
  212. package/dist/esm/components-page/team-invitation.js +110 -0
  213. package/dist/esm/components-page/team-invitation.js.map +1 -0
  214. package/dist/esm/generated/global-css.js +6 -0
  215. package/dist/esm/generated/global-css.js.map +1 -0
  216. package/dist/esm/generated/quetzal-translations.js +2397 -0
  217. package/dist/esm/generated/quetzal-translations.js.map +1 -0
  218. package/dist/esm/global.d.js +1 -0
  219. package/dist/esm/global.d.js.map +1 -0
  220. package/dist/esm/index.js +46 -0
  221. package/dist/esm/index.js.map +1 -0
  222. package/dist/esm/lib/auth.js +98 -0
  223. package/dist/esm/lib/auth.js.map +1 -0
  224. package/dist/esm/lib/cookie.js +244 -0
  225. package/dist/esm/lib/cookie.js.map +1 -0
  226. package/dist/esm/lib/hooks.js +30 -0
  227. package/dist/esm/lib/hooks.js.map +1 -0
  228. package/dist/esm/lib/stack-app.js +2398 -0
  229. package/dist/esm/lib/stack-app.js.map +1 -0
  230. package/dist/esm/lib/translations.js +23 -0
  231. package/dist/esm/lib/translations.js.map +1 -0
  232. package/dist/esm/providers/stack-provider-client.js +29 -0
  233. package/dist/esm/providers/stack-provider-client.js.map +1 -0
  234. package/dist/esm/providers/stack-provider.js +25 -0
  235. package/dist/esm/providers/stack-provider.js.map +1 -0
  236. package/dist/esm/providers/theme-provider.js +71 -0
  237. package/dist/esm/providers/theme-provider.js.map +1 -0
  238. package/dist/esm/providers/translation-provider-client.js +18 -0
  239. package/dist/esm/providers/translation-provider-client.js.map +1 -0
  240. package/dist/esm/providers/translation-provider.js +18 -0
  241. package/dist/esm/providers/translation-provider.js.map +1 -0
  242. package/dist/esm/utils/browser-script.js +112 -0
  243. package/dist/esm/utils/browser-script.js.map +1 -0
  244. package/dist/esm/utils/constants.js +66 -0
  245. package/dist/esm/utils/constants.js.map +1 -0
  246. package/dist/esm/utils/url.js +30 -0
  247. package/dist/esm/utils/url.js.map +1 -0
  248. package/dist/generated/global-css.d.mts +3 -0
  249. package/dist/generated/global-css.d.ts +3 -0
  250. package/dist/generated/global-css.js +31 -0
  251. package/dist/generated/global-css.js.map +1 -0
  252. package/dist/generated/quetzal-translations.d.mts +4 -0
  253. package/dist/generated/quetzal-translations.d.ts +4 -0
  254. package/dist/generated/quetzal-translations.js +2423 -0
  255. package/dist/generated/quetzal-translations.js.map +1 -0
  256. package/dist/global.d.d.mts +2 -0
  257. package/dist/global.d.d.ts +2 -0
  258. package/dist/global.d.js +2 -0
  259. package/dist/global.d.js.map +1 -0
  260. package/dist/index.d.mts +41 -0
  261. package/dist/index.d.ts +41 -0
  262. package/dist/index.js +103 -0
  263. package/dist/index.js.map +1 -0
  264. package/dist/lib/auth.d.mts +33 -0
  265. package/dist/lib/auth.d.ts +33 -0
  266. package/dist/lib/auth.js +125 -0
  267. package/dist/lib/auth.js.map +1 -0
  268. package/dist/lib/cookie.d.mts +33 -0
  269. package/dist/lib/cookie.d.ts +33 -0
  270. package/dist/lib/cookie.js +291 -0
  271. package/dist/lib/cookie.js.map +1 -0
  272. package/dist/lib/hooks.d.mts +41 -0
  273. package/dist/lib/hooks.d.ts +41 -0
  274. package/dist/lib/hooks.js +56 -0
  275. package/dist/lib/hooks.js.map +1 -0
  276. package/dist/lib/stack-app.d.mts +775 -0
  277. package/dist/lib/stack-app.d.ts +775 -0
  278. package/dist/lib/stack-app.js +2438 -0
  279. package/dist/lib/stack-app.js.map +1 -0
  280. package/dist/lib/translations.d.mts +5 -0
  281. package/dist/lib/translations.d.ts +5 -0
  282. package/dist/lib/translations.js +58 -0
  283. package/dist/lib/translations.js.map +1 -0
  284. package/dist/providers/stack-provider-client.d.mts +27 -0
  285. package/dist/providers/stack-provider-client.d.ts +27 -0
  286. package/dist/providers/stack-provider-client.js +65 -0
  287. package/dist/providers/stack-provider-client.js.map +1 -0
  288. package/dist/providers/stack-provider.d.mts +30 -0
  289. package/dist/providers/stack-provider.d.ts +30 -0
  290. package/dist/providers/stack-provider.js +46 -0
  291. package/dist/providers/stack-provider.js.map +1 -0
  292. package/dist/providers/theme-provider.d.mts +40 -0
  293. package/dist/providers/theme-provider.d.ts +40 -0
  294. package/dist/providers/theme-provider.js +105 -0
  295. package/dist/providers/theme-provider.js.map +1 -0
  296. package/dist/providers/translation-provider-client.d.mts +14 -0
  297. package/dist/providers/translation-provider-client.d.ts +14 -0
  298. package/dist/providers/translation-provider-client.js +43 -0
  299. package/dist/providers/translation-provider-client.js.map +1 -0
  300. package/dist/providers/translation-provider.d.mts +10 -0
  301. package/dist/providers/translation-provider.d.ts +10 -0
  302. package/dist/providers/translation-provider.js +43 -0
  303. package/dist/providers/translation-provider.js.map +1 -0
  304. package/dist/utils/browser-script.d.mts +7 -0
  305. package/dist/utils/browser-script.d.ts +7 -0
  306. package/dist/utils/browser-script.js +137 -0
  307. package/dist/utils/browser-script.js.map +1 -0
  308. package/dist/utils/constants.d.mts +79 -0
  309. package/dist/utils/constants.d.ts +79 -0
  310. package/dist/utils/constants.js +99 -0
  311. package/dist/utils/constants.js.map +1 -0
  312. package/dist/utils/url.d.mts +4 -0
  313. package/dist/utils/url.d.ts +4 -0
  314. package/dist/utils/url.js +56 -0
  315. package/dist/utils/url.js.map +1 -0
  316. package/package.json +96 -0
@@ -0,0 +1,76 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components-page/magic-link-callback.tsx
5
+ import { KnownErrors } from "@stackframe/stack-shared";
6
+ import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
7
+ import { throwErr } from "@stackframe/stack-shared/dist/utils/errors";
8
+ import React from "react";
9
+ import { useStackApp, useUser } from "..";
10
+ import { MessageCard } from "../components/message-cards/message-card";
11
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
12
+ import { useTranslation } from "../lib/translations";
13
+ import { jsx } from "react/jsx-runtime";
14
+ var cacheSignInWithMagicLink = cacheFunction(async (stackApp, code) => {
15
+ return await stackApp.signInWithMagicLink(code);
16
+ });
17
+ function MagicLinkCallback(props) {
18
+ const { t } = useTranslation();
19
+ const stackApp = useStackApp();
20
+ const user = useUser();
21
+ const [result, setResult] = React.useState(null);
22
+ if (user) {
23
+ return /* @__PURE__ */ jsx(PredefinedMessageCard, { type: "signedIn", fullPage: !!props.fullPage });
24
+ }
25
+ const invalidJsx = /* @__PURE__ */ jsx(MessageCard, { title: t("Invalid Magic Link"), fullPage: !!props.fullPage, children: /* @__PURE__ */ jsx("p", { children: t("Please check if you have the correct link. If you continue to have issues, please contact support.") }) });
26
+ const expiredJsx = /* @__PURE__ */ jsx(MessageCard, { title: t("Expired Magic Link"), fullPage: !!props.fullPage, children: /* @__PURE__ */ jsx("p", { children: t("Your magic link has expired. Please request a new magic link if you need to sign-in.") }) });
27
+ const alreadyUsedJsx = /* @__PURE__ */ jsx(MessageCard, { title: t("Magic Link Already Used"), fullPage: !!props.fullPage, children: /* @__PURE__ */ jsx("p", { children: t("The magic link has already been used. The link can only be used once. Please request a new magic link if you need to sign-in again.") }) });
28
+ if (!props.searchParams?.code) {
29
+ return invalidJsx;
30
+ }
31
+ if (!result) {
32
+ return /* @__PURE__ */ jsx(
33
+ MessageCard,
34
+ {
35
+ title: t("Do you want to sign in?"),
36
+ fullPage: !!props.fullPage,
37
+ primaryButtonText: t("Sign in"),
38
+ primaryAction: async () => {
39
+ const result2 = await stackApp.signInWithMagicLink(props.searchParams?.code || throwErr("No magic link provided"));
40
+ setResult(result2);
41
+ },
42
+ secondaryButtonText: t("Cancel"),
43
+ secondaryAction: async () => {
44
+ await stackApp.redirectToHome();
45
+ }
46
+ }
47
+ );
48
+ } else {
49
+ if (result.status === "error") {
50
+ if (result.error instanceof KnownErrors.VerificationCodeNotFound) {
51
+ return invalidJsx;
52
+ } else if (result.error instanceof KnownErrors.VerificationCodeExpired) {
53
+ return expiredJsx;
54
+ } else if (result.error instanceof KnownErrors.VerificationCodeAlreadyUsed) {
55
+ return alreadyUsedJsx;
56
+ } else {
57
+ throw result.error;
58
+ }
59
+ }
60
+ return /* @__PURE__ */ jsx(
61
+ MessageCard,
62
+ {
63
+ title: t("Signed in successfully!"),
64
+ fullPage: !!props.fullPage,
65
+ primaryButtonText: t("Go home"),
66
+ primaryAction: async () => {
67
+ await stackApp.redirectToHome();
68
+ }
69
+ }
70
+ );
71
+ }
72
+ }
73
+ export {
74
+ MagicLinkCallback
75
+ };
76
+ //# sourceMappingURL=magic-link-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/magic-link-callback.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport React from \"react\";\nimport { StackClientApp, useStackApp, useUser } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cacheSignInWithMagicLink = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.signInWithMagicLink(code);\n});\n\nexport function MagicLinkCallback(props: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser();\n const [result, setResult] = React.useState<Awaited<ReturnType<typeof stackApp.signInWithMagicLink>> | null>(null);\n\n if (user) {\n return <PredefinedMessageCard type='signedIn' fullPage={!!props.fullPage} />;\n }\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Please check if you have the correct link. If you continue to have issues, please contact support.\")}</p>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Your magic link has expired. Please request a new magic link if you need to sign-in.\")}</p>\n </MessageCard>\n );\n\n const alreadyUsedJsx = (\n <MessageCard title={t(\"Magic Link Already Used\")} fullPage={!!props.fullPage}>\n <p>{t(\"The magic link has already been used. The link can only be used once. Please request a new magic link if you need to sign-in again.\")}</p>\n </MessageCard>\n );\n\n if (!props.searchParams?.code) {\n return invalidJsx;\n }\n\n if (!result) {\n return <MessageCard\n title={t(\"Do you want to sign in?\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Sign in\")}\n primaryAction={async () => {\n const result = await stackApp.signInWithMagicLink(props.searchParams?.code || throwErr(\"No magic link provided\"));\n setResult(result);\n }}\n secondaryButtonText={t(\"Cancel\")}\n secondaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n } else {\n if (result.status === 'error') {\n if (result.error instanceof KnownErrors.VerificationCodeNotFound) {\n return invalidJsx;\n } else if (result.error instanceof KnownErrors.VerificationCodeExpired) {\n return expiredJsx;\n } else if (result.error instanceof KnownErrors.VerificationCodeAlreadyUsed) {\n return alreadyUsedJsx;\n } else {\n throw result.error;\n }\n }\n\n return <MessageCard\n title={t(\"Signed in successfully!\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Go home\")}\n primaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n }\n}\n"],"mappings":";;;AAOA,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAClB,SAAyB,aAAa,eAAe;AACrD,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAgBpB;AAdX,IAAM,2BAA2B,cAAc,OAAO,UAAgC,SAAiB;AACrG,SAAO,MAAM,SAAS,oBAAoB,IAAI;AAChD,CAAC;AAEM,SAAS,kBAAkB,OAG/B;AACD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,WAAW,YAAY;AAC7B,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAA0E,IAAI;AAEhH,MAAI,MAAM;AACR,WAAO,oBAAC,yBAAsB,MAAK,YAAW,UAAU,CAAC,CAAC,MAAM,UAAU;AAAA,EAC5E;AAEA,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,CAAC,MAAM,UAC7D,8BAAC,OAAG,YAAE,oGAAoG,GAAE,GAC9G;AAGF,QAAM,aACJ,oBAAC,eAAY,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,CAAC,MAAM,UAC7D,8BAAC,OAAG,YAAE,sFAAsF,GAAE,GAChG;AAGF,QAAM,iBACJ,oBAAC,eAAY,OAAO,EAAE,yBAAyB,GAAG,UAAU,CAAC,CAAC,MAAM,UAClE,8BAAC,OAAG,YAAE,qIAAqI,GAAE,GAC/I;AAGF,MAAI,CAAC,MAAM,cAAc,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MAAC;AAAA;AAAA,QACN,OAAO,EAAE,yBAAyB;AAAA,QAClC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,SAAS;AAAA,QAC9B,eAAe,YAAY;AACzB,gBAAMA,UAAS,MAAM,SAAS,oBAAoB,MAAM,cAAc,QAAQ,SAAS,wBAAwB,CAAC;AAChH,oBAAUA,OAAM;AAAA,QAClB;AAAA,QACA,qBAAqB,EAAE,QAAQ;AAAA,QAC/B,iBAAiB,YAAY;AAC3B,gBAAM,SAAS,eAAe;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI,OAAO,WAAW,SAAS;AAC7B,UAAI,OAAO,iBAAiB,YAAY,0BAA0B;AAChE,eAAO;AAAA,MACT,WAAW,OAAO,iBAAiB,YAAY,yBAAyB;AACtE,eAAO;AAAA,MACT,WAAW,OAAO,iBAAiB,YAAY,6BAA6B;AAC1E,eAAO;AAAA,MACT,OAAO;AACL,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MAAC;AAAA;AAAA,QACN,OAAO,EAAE,yBAAyB;AAAA,QAClC,UAAU,CAAC,CAAC,MAAM;AAAA,QAClB,mBAAmB,EAAE,SAAS;AAAA,QAC9B,eAAe,YAAY;AACzB,gBAAM,SAAS,eAAe;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,EACF;AACF;","names":["result"]}
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components-page/oauth-callback.tsx
5
+ import { captureError } from "@stackframe/stack-shared/dist/utils/errors";
6
+ import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
7
+ import { useEffect, useRef, useState } from "react";
8
+ import { useStackApp } from "..";
9
+ import { StyledLink } from "../components/link";
10
+ import { MessageCard } from "../components/message-cards/message-card";
11
+ import { useTranslation } from "../lib/translations";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ function OAuthCallback(props) {
14
+ const { t } = useTranslation();
15
+ const app = useStackApp();
16
+ const called = useRef(false);
17
+ const [error, setError] = useState(null);
18
+ const [showRedirectLink, setShowRedirectLink] = useState(false);
19
+ useEffect(() => runAsynchronously(async () => {
20
+ if (called.current) return;
21
+ called.current = true;
22
+ let hasRedirected = false;
23
+ try {
24
+ hasRedirected = await app.callOAuthCallback();
25
+ } catch (e) {
26
+ captureError("<OAuthCallback />", e);
27
+ setError(e);
28
+ }
29
+ if (!hasRedirected && (!error || process.env.NODE_ENV === "production")) {
30
+ await app.redirectToSignIn({ noRedirectBack: true });
31
+ }
32
+ }), []);
33
+ useEffect(() => {
34
+ setTimeout(() => setShowRedirectLink(true), 3e3);
35
+ }, []);
36
+ return /* @__PURE__ */ jsxs(MessageCard, { title: "Redirecting...", fullPage: props.fullPage, children: [
37
+ showRedirectLink ? /* @__PURE__ */ jsxs("p", { children: [
38
+ t("If you are not redirected automatically, "),
39
+ /* @__PURE__ */ jsx(StyledLink, { href: app.urls.home, children: t("click here") })
40
+ ] }) : null,
41
+ error ? /* @__PURE__ */ jsxs("div", { children: [
42
+ /* @__PURE__ */ jsx("p", { children: t("Something went wrong while processing the OAuth callback:") }),
43
+ /* @__PURE__ */ jsx("pre", { children: JSON.stringify(error, null, 2) }),
44
+ /* @__PURE__ */ jsx("p", { children: t("This is most likely an error in Stack. Please report it.") })
45
+ ] }) : null
46
+ ] });
47
+ }
48
+ export {
49
+ OAuthCallback
50
+ };
51
+ //# sourceMappingURL=oauth-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { StyledLink } from \"../components/link\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback(props: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [error, setError] = useState<unknown>(null);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n let hasRedirected = false;\n try {\n hasRedirected = await app.callOAuthCallback();\n } catch (e: any) {\n captureError(\"<OAuthCallback />\", e);\n setError(e);\n }\n if (!hasRedirected && (!error || process.env.NODE_ENV === 'production')) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n }), []);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return <MessageCard title='Redirecting...' fullPage={props.fullPage}>\n {showRedirectLink ? <p>{t('If you are not redirected automatically, ')}<StyledLink href={app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n {error ? <div>\n <p>{t(\"Something went wrong while processing the OAuth callback:\")}</p>\n <pre>{JSON.stringify(error, null, 2)}</pre>\n <p>{t(\"This is most likely an error in Stack. Please report it.\")}</p>\n </div> : null}\n </MessageCard>;\n}\n"],"mappings":";;;AAOA,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC,SAAS,WAAW,QAAQ,gBAAgB;AAC5C,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AA6BP,SAAmD,KAAnD;AA3BjB,SAAS,cAAc,OAA+B;AAC3D,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,MAAM,YAAY;AACxB,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkB,IAAI;AAChD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAE9D,YAAU,MAAM,kBAAkB,YAAY;AAC5C,QAAI,OAAO,QAAS;AACpB,WAAO,UAAU;AACjB,QAAI,gBAAgB;AACpB,QAAI;AACF,sBAAgB,MAAM,IAAI,kBAAkB;AAAA,IAC9C,SAAS,GAAQ;AACf,mBAAa,qBAAqB,CAAC;AACnC,eAAS,CAAC;AAAA,IACZ;AACA,QAAI,CAAC,kBAAkB,CAAC,SAAS,QAAQ,IAAI,aAAa,eAAe;AACvE,YAAM,IAAI,iBAAiB,EAAE,gBAAgB,KAAK,CAAC;AAAA,IACrD;AAAA,EACF,CAAC,GAAG,CAAC,CAAC;AAEN,YAAU,MAAM;AACd,eAAW,MAAM,oBAAoB,IAAI,GAAG,GAAI;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAC,eAAY,OAAM,kBAAiB,UAAU,MAAM,UACxD;AAAA,uBAAmB,qBAAC,OAAG;AAAA,QAAE,2CAA2C;AAAA,MAAE,oBAAC,cAAW,MAAM,IAAI,KAAK,MAAO,YAAE,YAAY,GAAE;AAAA,OAAa,IAAO;AAAA,IAC5I,QAAQ,qBAAC,SACR;AAAA,0BAAC,OAAG,YAAE,2DAA2D,GAAE;AAAA,MACnE,oBAAC,SAAK,eAAK,UAAU,OAAO,MAAM,CAAC,GAAE;AAAA,MACrC,oBAAC,OAAG,YAAE,0DAA0D,GAAE;AAAA,OACpE,IAAS;AAAA,KACX;AACF;","names":[]}
@@ -0,0 +1,145 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components-page/password-reset.tsx
5
+ import { yupResolver } from "@hookform/resolvers/yup";
6
+ import { KnownErrors } from "@stackframe/stack-shared";
7
+ import { getPasswordError } from "@stackframe/stack-shared/dist/helpers/password";
8
+ import { passwordSchema, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
9
+ import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
10
+ import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises";
11
+ import { Button, Label, PasswordInput, Typography, cn } from "@stackframe/stack-ui";
12
+ import React, { useState } from "react";
13
+ import { useForm } from "react-hook-form";
14
+ import * as yup from "yup";
15
+ import { useStackApp } from "..";
16
+ import { FormWarningText } from "../components/elements/form-warning";
17
+ import { MaybeFullPage } from "../components/elements/maybe-full-page";
18
+ import { MessageCard } from "../components/message-cards/message-card";
19
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
20
+ import { useTranslation } from "../lib/translations";
21
+ import { jsx, jsxs } from "react/jsx-runtime";
22
+ function PasswordResetForm(props) {
23
+ const { t } = useTranslation();
24
+ const schema = yupObject({
25
+ password: passwordSchema.defined(t("Please enter your password")).nonEmpty(t("Please enter your password")).test({
26
+ name: "is-valid-password",
27
+ test: (value, ctx) => {
28
+ const error = getPasswordError(value);
29
+ if (error) {
30
+ return ctx.createError({ message: error.message });
31
+ } else {
32
+ return true;
33
+ }
34
+ }
35
+ }),
36
+ passwordRepeat: yupString().nullable().oneOf([yup.ref("password"), null], t("Passwords do not match")).defined().nonEmpty(t("Please repeat your password"))
37
+ });
38
+ const { register, handleSubmit, formState: { errors }, clearErrors } = useForm({
39
+ resolver: yupResolver(schema)
40
+ });
41
+ const stackApp = useStackApp();
42
+ const [finished, setFinished] = useState(false);
43
+ const [resetError, setResetError] = useState(false);
44
+ const [loading, setLoading] = useState(false);
45
+ const onSubmit = async (data) => {
46
+ setLoading(true);
47
+ try {
48
+ const { password } = data;
49
+ const result = await stackApp.resetPassword({ password, code: props.code });
50
+ if (result.status === "error") {
51
+ setResetError(true);
52
+ return;
53
+ }
54
+ setFinished(true);
55
+ } finally {
56
+ setLoading(false);
57
+ }
58
+ };
59
+ if (finished) {
60
+ return /* @__PURE__ */ jsx(PredefinedMessageCard, { type: "passwordReset", fullPage: !!props.fullPage });
61
+ }
62
+ if (resetError) {
63
+ return /* @__PURE__ */ jsx(MessageCard, { title: t("Failed to reset password"), fullPage: !!props.fullPage, children: t("Failed to reset password. Please request a new password reset link") });
64
+ }
65
+ return /* @__PURE__ */ jsx(MaybeFullPage, { fullPage: !!props.fullPage, children: /* @__PURE__ */ jsxs("div", { className: cn(
66
+ "flex flex-col items-stretch max-w-[380px] flex-basis-[380px]",
67
+ props.fullPage ? "p-4" : "p-0"
68
+ ), children: [
69
+ /* @__PURE__ */ jsx("div", { className: "text-center mb-6", children: /* @__PURE__ */ jsx(Typography, { type: "h2", children: t("Reset Your Password") }) }),
70
+ /* @__PURE__ */ jsxs(
71
+ "form",
72
+ {
73
+ className: "flex flex-col items-stretch",
74
+ onSubmit: (e) => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e)),
75
+ noValidate: true,
76
+ children: [
77
+ /* @__PURE__ */ jsx(Label, { htmlFor: "password", className: "mb-1", children: t("New Password") }),
78
+ /* @__PURE__ */ jsx(
79
+ PasswordInput,
80
+ {
81
+ id: "password",
82
+ autoComplete: "new-password",
83
+ ...register("password"),
84
+ onChange: () => {
85
+ clearErrors("password");
86
+ clearErrors("passwordRepeat");
87
+ }
88
+ }
89
+ ),
90
+ /* @__PURE__ */ jsx(FormWarningText, { text: errors.password?.message?.toString() }),
91
+ /* @__PURE__ */ jsx(Label, { htmlFor: "repeat-password", className: "mt-4 mb-1", children: t("Repeat New Password") }),
92
+ /* @__PURE__ */ jsx(
93
+ PasswordInput,
94
+ {
95
+ id: "repeat-password",
96
+ autoComplete: "new-password",
97
+ ...register("passwordRepeat"),
98
+ onChange: () => {
99
+ clearErrors("password");
100
+ clearErrors("passwordRepeat");
101
+ }
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsx(FormWarningText, { text: errors.passwordRepeat?.message?.toString() }),
105
+ /* @__PURE__ */ jsx(Button, { type: "submit", className: "mt-6", loading, children: t("Reset Password") })
106
+ ]
107
+ }
108
+ )
109
+ ] }) });
110
+ }
111
+ var cachedVerifyPasswordResetCode = cacheFunction(async (stackApp, code) => {
112
+ return await stackApp.verifyPasswordResetCode(code);
113
+ });
114
+ function PasswordReset({
115
+ searchParams,
116
+ fullPage = false
117
+ }) {
118
+ const { t } = useTranslation();
119
+ const stackApp = useStackApp();
120
+ const invalidJsx = /* @__PURE__ */ jsx(MessageCard, { title: t("Invalid Password Reset Link"), fullPage, children: /* @__PURE__ */ jsx(Typography, { children: t("Please double check if you have the correct password reset link.") }) });
121
+ const expiredJsx = /* @__PURE__ */ jsx(MessageCard, { title: t("Expired Password Reset Link"), fullPage, children: /* @__PURE__ */ jsx(Typography, { children: t("Your password reset link has expired. Please request a new password reset link from the login page.") }) });
122
+ const usedJsx = /* @__PURE__ */ jsx(MessageCard, { title: t("Used Password Reset Link"), fullPage, children: /* @__PURE__ */ jsx(Typography, { children: t("This password reset link has already been used. If you need to reset your password again, please request a new password reset link from the login page.") }) });
123
+ const code = searchParams.code;
124
+ if (!code) {
125
+ return invalidJsx;
126
+ }
127
+ const result = React.use(cachedVerifyPasswordResetCode(stackApp, code));
128
+ if (result.status === "error") {
129
+ if (result.error instanceof KnownErrors.VerificationCodeNotFound) {
130
+ return invalidJsx;
131
+ } else if (result.error instanceof KnownErrors.VerificationCodeExpired) {
132
+ return expiredJsx;
133
+ } else if (result.error instanceof KnownErrors.VerificationCodeAlreadyUsed) {
134
+ return usedJsx;
135
+ } else {
136
+ throw result.error;
137
+ }
138
+ }
139
+ return /* @__PURE__ */ jsx(PasswordResetForm, { code, fullPage });
140
+ }
141
+ export {
142
+ PasswordReset,
143
+ PasswordResetForm as default
144
+ };
145
+ //# sourceMappingURL=password-reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/password-reset.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { getPasswordError } from \"@stackframe/stack-shared/dist/helpers/password\";\nimport { passwordSchema, yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Label, PasswordInput, Typography, cn } from \"@stackframe/stack-ui\";\nimport React, { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { StackClientApp, useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport default function PasswordResetForm(props: {\n code: string,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n\n const schema = yupObject({\n password: passwordSchema.defined(t(\"Please enter your password\")).nonEmpty(t(\"Please enter your password\")).test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n passwordRepeat: yupString().nullable().oneOf([yup.ref('password'), null], t(\"Passwords do not match\")).defined().nonEmpty(t(\"Please repeat your password\"))\n });\n\n const { register, handleSubmit, formState: { errors }, clearErrors } = useForm({\n resolver: yupResolver(schema)\n });\n const stackApp = useStackApp();\n const [finished, setFinished] = useState(false);\n const [resetError, setResetError] = useState(false);\n const [loading, setLoading] = useState(false);\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n setLoading(true);\n try {\n const { password } = data;\n const result = await stackApp.resetPassword({ password, code: props.code });\n if (result.status === 'error') {\n setResetError(true);\n return;\n }\n\n setFinished(true);\n } finally {\n setLoading(false);\n }\n };\n\n if (finished) {\n return <PredefinedMessageCard type='passwordReset' fullPage={!!props.fullPage} />;\n }\n\n if (resetError) {\n return (\n <MessageCard title={t(\"Failed to reset password\")} fullPage={!!props.fullPage}>\n {t(\"Failed to reset password. Please request a new password reset link\")}\n </MessageCard>\n );\n }\n\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className={cn(\n \"flex flex-col items-stretch max-w-[380px] flex-basis-[380px]\",\n props.fullPage ? \"p-4\" : \"p-0\"\n )}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>{t(\"Reset Your Password\")}</Typography>\n </div>\n\n <form\n className=\"flex flex-col items-stretch\"\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"password\" className=\"mb-1\">{t(\"New Password\")}</Label>\n <PasswordInput\n id=\"password\"\n autoComplete=\"new-password\"\n {...register('password')}\n onChange={() => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.password?.message?.toString()} />\n\n <Label htmlFor=\"repeat-password\" className=\"mt-4 mb-1\">{t(\"Repeat New Password\")}</Label>\n <PasswordInput\n id=\"repeat-password\"\n autoComplete=\"new-password\"\n {...register('passwordRepeat')}\n onChange={() => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.passwordRepeat?.message?.toString()} />\n\n <Button type=\"submit\" className=\"mt-6\" loading={loading}>\n {t(\"Reset Password\")}\n </Button>\n </form>\n </div>\n </MaybeFullPage>\n );\n}\n\n\nconst cachedVerifyPasswordResetCode = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyPasswordResetCode(code);\n});\n\nexport function PasswordReset({\n searchParams,\n fullPage = false,\n}: {\n searchParams: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Password Reset Link\")} fullPage={fullPage}>\n <Typography>{t(\"Please double check if you have the correct password reset link.\")}</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Password Reset Link\")} fullPage={fullPage}>\n <Typography>{t(\"Your password reset link has expired. Please request a new password reset link from the login page.\")}</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title={t(\"Used Password Reset Link\")} fullPage={fullPage}>\n <Typography>{t(\"This password reset link has already been used. If you need to reset your password again, please request a new password reset link from the login page.\")}</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n const result = React.use(cachedVerifyPasswordResetCode(stackApp, code));\n\n if (result.status === 'error') {\n if (result.error instanceof KnownErrors.VerificationCodeNotFound) {\n return invalidJsx;\n } else if (result.error instanceof KnownErrors.VerificationCodeExpired) {\n return expiredJsx;\n } else if (result.error instanceof KnownErrors.VerificationCodeAlreadyUsed) {\n return usedJsx;\n } else {\n throw result.error;\n }\n }\n\n return <PasswordResetForm code={code} fullPage={fullPage} />;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ // src/components-page/sign-in.tsx
2
+ import { AuthPage } from "./auth-page";
3
+ import { jsx } from "react/jsx-runtime";
4
+ function SignIn(props) {
5
+ return /* @__PURE__ */ jsx(
6
+ AuthPage,
7
+ {
8
+ fullPage: !!props.fullPage,
9
+ type: "sign-in",
10
+ automaticRedirect: !!props.automaticRedirect,
11
+ extraInfo: props.extraInfo,
12
+ firstTab: props.firstTab
13
+ }
14
+ );
15
+ }
16
+ export {
17
+ SignIn
18
+ };
19
+ //# sourceMappingURL=sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/sign-in.tsx"],"sourcesContent":["//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { AuthPage } from \"./auth-page\";\n\nexport function SignIn(props: {\n fullPage?: boolean,\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\n firstTab?: 'magic-link' | 'password',\n}) {\n return (\n <AuthPage\n fullPage={!!props.fullPage}\n type=\"sign-in\"\n automaticRedirect={!!props.automaticRedirect}\n extraInfo={props.extraInfo}\n firstTab={props.firstTab}\n />\n );\n}\n"],"mappings":";AAIA,SAAS,gBAAgB;AASrB;AAPG,SAAS,OAAO,OAKpB;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAC,CAAC,MAAM;AAAA,MAClB,MAAK;AAAA,MACL,mBAAmB,CAAC,CAAC,MAAM;AAAA,MAC3B,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA;AAAA,EAClB;AAEJ;","names":[]}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components-page/sign-out.tsx
5
+ import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
6
+ import React from "react";
7
+ import { useUser } from "..";
8
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
9
+ import { jsx } from "react/jsx-runtime";
10
+ var cacheSignOut = cacheFunction(async (user) => {
11
+ return await user.signOut();
12
+ });
13
+ function SignOut(props) {
14
+ const user = useUser();
15
+ if (user) {
16
+ React.use(cacheSignOut(user));
17
+ }
18
+ return /* @__PURE__ */ jsx(PredefinedMessageCard, { type: "signedOut", fullPage: props.fullPage });
19
+ }
20
+ export {
21
+ SignOut
22
+ };
23
+ //# sourceMappingURL=sign-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/sign-out.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport React from \"react\";\nimport { CurrentUser, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\n\nconst cacheSignOut = cacheFunction(async (user: CurrentUser) => {\n return await user.signOut();\n});\n\nexport function SignOut(props: { fullPage?: boolean }) {\n const user = useUser();\n\n if (user) {\n React.use(cacheSignOut(user));\n }\n\n return <PredefinedMessageCard type='signedOut' fullPage={props.fullPage} />;\n}\n"],"mappings":";;;AAOA,SAAS,qBAAqB;AAC9B,OAAO,WAAW;AAClB,SAAsB,eAAe;AACrC,SAAS,6BAA6B;AAa7B;AAXT,IAAM,eAAe,cAAc,OAAO,SAAsB;AAC9D,SAAO,MAAM,KAAK,QAAQ;AAC5B,CAAC;AAEM,SAAS,QAAQ,OAA+B;AACrD,QAAM,OAAO,QAAQ;AAErB,MAAI,MAAM;AACR,UAAM,IAAI,aAAa,IAAI,CAAC;AAAA,EAC9B;AAEA,SAAO,oBAAC,yBAAsB,MAAK,aAAY,UAAU,MAAM,UAAU;AAC3E;","names":[]}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components-page/sign-up.tsx
5
+ import { AuthPage } from "./auth-page";
6
+ import { jsx } from "react/jsx-runtime";
7
+ function SignUp(props) {
8
+ return /* @__PURE__ */ jsx(
9
+ AuthPage,
10
+ {
11
+ fullPage: !!props.fullPage,
12
+ type: "sign-up",
13
+ automaticRedirect: !!props.automaticRedirect,
14
+ noPasswordRepeat: props.noPasswordRepeat,
15
+ extraInfo: props.extraInfo,
16
+ firstTab: props.firstTab
17
+ }
18
+ );
19
+ }
20
+ export {
21
+ SignUp
22
+ };
23
+ //# sourceMappingURL=sign-up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/sign-up.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { AuthPage } from './auth-page';\n\nexport function SignUp(props: {\n fullPage?: boolean,\n automaticRedirect?: boolean,\n noPasswordRepeat?: boolean,\n extraInfo?: React.ReactNode,\n firstTab?: 'magic-link' | 'password',\n}) {\n return <AuthPage\n fullPage={!!props.fullPage}\n type='sign-up'\n automaticRedirect={!!props.automaticRedirect}\n noPasswordRepeat={props.noPasswordRepeat}\n extraInfo={props.extraInfo}\n firstTab={props.firstTab}\n />;\n}\n"],"mappings":";;;AAMA,SAAS,gBAAgB;AAShB;AAPF,SAAS,OAAO,OAMpB;AACD,SAAO;AAAA,IAAC;AAAA;AAAA,MACN,UAAU,CAAC,CAAC,MAAM;AAAA,MAClB,MAAK;AAAA,MACL,mBAAmB,CAAC,CAAC,MAAM;AAAA,MAC3B,kBAAkB,MAAM;AAAA,MACxB,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA;AAAA,EAClB;AACF;","names":[]}
@@ -0,0 +1,223 @@
1
+ // src/components-page/stack-handler.tsx
2
+ import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
3
+ import { filterUndefined } from "@stackframe/stack-shared/dist/utils/objects";
4
+ import { getRelativePart } from "@stackframe/stack-shared/dist/utils/urls";
5
+ import { useMemo } from "react";
6
+ import { SignIn, SignUp } from "..";
7
+ import { IframePreventer } from "../components/iframe-preventer";
8
+ import { MessageCard } from "../components/message-cards/message-card";
9
+ import { AccountSettings } from "./account-settings";
10
+ import { EmailVerification } from "./email-verification";
11
+ import { ErrorPage } from "./error-page";
12
+ import { ForgotPassword } from "./forgot-password";
13
+ import { MagicLinkCallback } from "./magic-link-callback";
14
+ import { OAuthCallback } from "./oauth-callback";
15
+ import { PasswordReset } from "./password-reset";
16
+ import { SignOut } from "./sign-out";
17
+ import { TeamInvitation } from "./team-invitation";
18
+ import { jsx } from "react/jsx-runtime";
19
+ var availablePaths = {
20
+ signIn: "sign-in",
21
+ signUp: "sign-up",
22
+ emailVerification: "email-verification",
23
+ passwordReset: "password-reset",
24
+ forgotPassword: "forgot-password",
25
+ signOut: "sign-out",
26
+ oauthCallback: "oauth-callback",
27
+ magicLinkCallback: "magic-link-callback",
28
+ teamInvitation: "team-invitation",
29
+ accountSettings: "account-settings",
30
+ error: "error"
31
+ };
32
+ var pathAliases = {
33
+ // also includes the uppercase and non-dashed versions
34
+ ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),
35
+ "log-in": availablePaths.signIn,
36
+ "register": availablePaths.signUp
37
+ };
38
+ function renderComponent(props) {
39
+ const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;
40
+ switch (path) {
41
+ case availablePaths.signIn: {
42
+ redirectIfNotHandler?.("signIn");
43
+ return /* @__PURE__ */ jsx(
44
+ SignIn,
45
+ {
46
+ fullPage,
47
+ automaticRedirect: true,
48
+ ...filterUndefinedINU(componentProps?.SignIn)
49
+ }
50
+ );
51
+ }
52
+ case availablePaths.signUp: {
53
+ redirectIfNotHandler?.("signUp");
54
+ return /* @__PURE__ */ jsx(
55
+ SignUp,
56
+ {
57
+ fullPage,
58
+ automaticRedirect: true,
59
+ ...filterUndefinedINU(componentProps?.SignUp)
60
+ }
61
+ );
62
+ }
63
+ case availablePaths.emailVerification: {
64
+ redirectIfNotHandler?.("emailVerification");
65
+ return /* @__PURE__ */ jsx(
66
+ EmailVerification,
67
+ {
68
+ searchParams,
69
+ fullPage,
70
+ ...filterUndefinedINU(componentProps?.EmailVerification)
71
+ }
72
+ );
73
+ }
74
+ case availablePaths.passwordReset: {
75
+ redirectIfNotHandler?.("passwordReset");
76
+ return /* @__PURE__ */ jsx(
77
+ PasswordReset,
78
+ {
79
+ searchParams,
80
+ fullPage,
81
+ ...filterUndefinedINU(componentProps?.PasswordReset)
82
+ }
83
+ );
84
+ }
85
+ case availablePaths.forgotPassword: {
86
+ redirectIfNotHandler?.("forgotPassword");
87
+ return /* @__PURE__ */ jsx(
88
+ ForgotPassword,
89
+ {
90
+ fullPage,
91
+ ...filterUndefinedINU(componentProps?.ForgotPassword)
92
+ }
93
+ );
94
+ }
95
+ case availablePaths.signOut: {
96
+ redirectIfNotHandler?.("signOut");
97
+ return /* @__PURE__ */ jsx(
98
+ SignOut,
99
+ {
100
+ fullPage,
101
+ ...filterUndefinedINU(componentProps?.SignOut)
102
+ }
103
+ );
104
+ }
105
+ case availablePaths.oauthCallback: {
106
+ redirectIfNotHandler?.("oauthCallback");
107
+ return /* @__PURE__ */ jsx(
108
+ OAuthCallback,
109
+ {
110
+ fullPage,
111
+ ...filterUndefinedINU(componentProps?.OAuthCallback)
112
+ }
113
+ );
114
+ }
115
+ case availablePaths.magicLinkCallback: {
116
+ redirectIfNotHandler?.("magicLinkCallback");
117
+ return /* @__PURE__ */ jsx(
118
+ MagicLinkCallback,
119
+ {
120
+ searchParams,
121
+ fullPage,
122
+ ...filterUndefinedINU(componentProps?.MagicLinkCallback)
123
+ }
124
+ );
125
+ }
126
+ case availablePaths.teamInvitation: {
127
+ redirectIfNotHandler?.("teamInvitation");
128
+ return /* @__PURE__ */ jsx(
129
+ TeamInvitation,
130
+ {
131
+ searchParams,
132
+ fullPage,
133
+ ...filterUndefinedINU(componentProps?.TeamInvitation)
134
+ }
135
+ );
136
+ }
137
+ case availablePaths.accountSettings: {
138
+ return /* @__PURE__ */ jsx(
139
+ AccountSettings,
140
+ {
141
+ fullPage,
142
+ ...filterUndefinedINU(componentProps?.AccountSettings)
143
+ }
144
+ );
145
+ }
146
+ case availablePaths.error: {
147
+ return /* @__PURE__ */ jsx(
148
+ ErrorPage,
149
+ {
150
+ searchParams,
151
+ fullPage,
152
+ ...filterUndefinedINU(componentProps?.ErrorPage)
153
+ }
154
+ );
155
+ }
156
+ default: {
157
+ if (Object.values(availablePaths).includes(path)) {
158
+ throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
159
+ }
160
+ for (const [key, value] of Object.entries(pathAliases)) {
161
+ if (path === key.toLowerCase().replaceAll("-", "")) {
162
+ const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;
163
+ return { redirect: redirectUrl };
164
+ }
165
+ }
166
+ return onNotFound();
167
+ }
168
+ }
169
+ }
170
+ function ReactStackHandler(props) {
171
+ const { path, searchParams } = useMemo(() => {
172
+ const search = window.location.search;
173
+ const handlerPath = new URL(props.app.urls.handler, window.location.origin).pathname;
174
+ const relativePath = props.location.startsWith(handlerPath) ? props.location.slice(handlerPath.length).replace(/^\/+/, "") : props.location.replace(/^\/+/, "");
175
+ return {
176
+ path: relativePath,
177
+ searchParams: Object.fromEntries(new URLSearchParams(search).entries())
178
+ };
179
+ }, [props.location, props.app.urls.handler]);
180
+ const redirectIfNotHandler = (name) => {
181
+ const url = props.app.urls[name];
182
+ const handlerUrl = props.app.urls.handler;
183
+ if (url !== handlerUrl && url.startsWith(handlerUrl + "/")) {
184
+ return;
185
+ }
186
+ const urlObj = new URL(url, window.location.origin);
187
+ for (const [key, value] of Object.entries(searchParams)) {
188
+ urlObj.searchParams.set(key, value);
189
+ }
190
+ window.location.href = getRelativePart(urlObj);
191
+ };
192
+ const result = renderComponent({
193
+ path,
194
+ searchParams,
195
+ fullPage: props.fullPage,
196
+ componentProps: props.componentProps,
197
+ redirectIfNotHandler,
198
+ onNotFound: () => /* @__PURE__ */ jsx(
199
+ MessageCard,
200
+ {
201
+ title: "Page does not exist",
202
+ fullPage: props.fullPage,
203
+ primaryButtonText: "Go to Home",
204
+ primaryAction: () => props.app.redirectToHome(),
205
+ children: "The page you are looking for could not be found. Please check the URL and try again."
206
+ }
207
+ ),
208
+ app: props.app
209
+ });
210
+ if (result && "redirect" in result) {
211
+ window.location.href = result.redirect;
212
+ return null;
213
+ }
214
+ return /* @__PURE__ */ jsx(IframePreventer, { children: result });
215
+ }
216
+ var stack_handler_default = ReactStackHandler;
217
+ function filterUndefinedINU(value) {
218
+ return value === void 0 ? value : filterUndefined(value);
219
+ }
220
+ export {
221
+ stack_handler_default as default
222
+ };
223
+ //# sourceMappingURL=stack-handler.js.map