@stackframe/stack 2.4.13 → 2.4.15

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 (104) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/components/credential-sign-in.js +45 -65
  3. package/dist/components/credential-sign-in.js.map +1 -1
  4. package/dist/components/credential-sign-up.js +74 -98
  5. package/dist/components/credential-sign-up.js.map +1 -1
  6. package/dist/components/forgot-password.js +41 -38
  7. package/dist/components/forgot-password.js.map +1 -1
  8. package/dist/components/magic-link-sign-in.js +37 -41
  9. package/dist/components/magic-link-sign-in.js.map +1 -1
  10. package/dist/components/oauth-button.js +47 -53
  11. package/dist/components/oauth-button.js.map +1 -1
  12. package/dist/components/password-field.js +6 -8
  13. package/dist/components/password-field.js.map +1 -1
  14. package/dist/components/password-reset-inner.js +61 -56
  15. package/dist/components/password-reset-inner.js.map +1 -1
  16. package/dist/components/redirect-message-card.js +1 -2
  17. package/dist/components/redirect-message-card.js.map +1 -1
  18. package/dist/components/user-avatar.d.mts +1 -0
  19. package/dist/components/user-avatar.d.ts +1 -0
  20. package/dist/components/user-avatar.js +7 -5
  21. package/dist/components/user-avatar.js.map +1 -1
  22. package/dist/components/user-button.js +14 -18
  23. package/dist/components/user-button.js.map +1 -1
  24. package/dist/components-core/button.d.mts +1 -0
  25. package/dist/components-core/button.d.ts +1 -0
  26. package/dist/components-core/button.js +31 -14
  27. package/dist/components-core/button.js.map +1 -1
  28. package/dist/components-core/card.js +3 -3
  29. package/dist/components-core/card.js.map +1 -1
  30. package/dist/components-core/input.js +10 -6
  31. package/dist/components-core/input.js.map +1 -1
  32. package/dist/components-core/label.js +2 -3
  33. package/dist/components-core/label.js.map +1 -1
  34. package/dist/components-core/tabs.js +9 -5
  35. package/dist/components-core/tabs.js.map +1 -1
  36. package/dist/components-page/account-settings.js +8 -8
  37. package/dist/components-page/account-settings.js.map +1 -1
  38. package/dist/components-page/auth-page.js +1 -1
  39. package/dist/components-page/auth-page.js.map +1 -1
  40. package/dist/components-page/password-reset.js.map +1 -1
  41. package/dist/components-page/stack-handler.d.mts +1 -0
  42. package/dist/components-page/stack-handler.d.ts +1 -0
  43. package/dist/esm/components/credential-sign-in.js +45 -65
  44. package/dist/esm/components/credential-sign-in.js.map +1 -1
  45. package/dist/esm/components/credential-sign-up.js +74 -98
  46. package/dist/esm/components/credential-sign-up.js.map +1 -1
  47. package/dist/esm/components/forgot-password.js +41 -38
  48. package/dist/esm/components/forgot-password.js.map +1 -1
  49. package/dist/esm/components/magic-link-sign-in.js +37 -41
  50. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  51. package/dist/esm/components/oauth-button.js +47 -53
  52. package/dist/esm/components/oauth-button.js.map +1 -1
  53. package/dist/esm/components/password-field.js +6 -8
  54. package/dist/esm/components/password-field.js.map +1 -1
  55. package/dist/esm/components/password-reset-inner.js +61 -56
  56. package/dist/esm/components/password-reset-inner.js.map +1 -1
  57. package/dist/esm/components/redirect-message-card.js +1 -2
  58. package/dist/esm/components/redirect-message-card.js.map +1 -1
  59. package/dist/esm/components/user-avatar.js +7 -5
  60. package/dist/esm/components/user-avatar.js.map +1 -1
  61. package/dist/esm/components/user-button.js +26 -19
  62. package/dist/esm/components/user-button.js.map +1 -1
  63. package/dist/esm/components-core/button.js +33 -16
  64. package/dist/esm/components-core/button.js.map +1 -1
  65. package/dist/esm/components-core/card.js +3 -3
  66. package/dist/esm/components-core/card.js.map +1 -1
  67. package/dist/esm/components-core/input.js +11 -7
  68. package/dist/esm/components-core/input.js.map +1 -1
  69. package/dist/esm/components-core/label.js +2 -3
  70. package/dist/esm/components-core/label.js.map +1 -1
  71. package/dist/esm/components-core/tabs.js +10 -6
  72. package/dist/esm/components-core/tabs.js.map +1 -1
  73. package/dist/esm/components-page/account-settings.js +8 -8
  74. package/dist/esm/components-page/account-settings.js.map +1 -1
  75. package/dist/esm/components-page/auth-page.js +1 -1
  76. package/dist/esm/components-page/auth-page.js.map +1 -1
  77. package/dist/esm/components-page/password-reset.js.map +1 -1
  78. package/dist/esm/lib/stack-app.js +18 -1
  79. package/dist/esm/lib/stack-app.js.map +1 -1
  80. package/dist/esm/utils/constants.js +10 -10
  81. package/dist/esm/utils/constants.js.map +1 -1
  82. package/dist/index.d.mts +1 -0
  83. package/dist/index.d.ts +1 -0
  84. package/dist/lib/hooks.d.mts +1 -0
  85. package/dist/lib/hooks.d.ts +1 -0
  86. package/dist/lib/stack-app.d.mts +6 -1
  87. package/dist/lib/stack-app.d.ts +6 -1
  88. package/dist/lib/stack-app.js +18 -1
  89. package/dist/lib/stack-app.js.map +1 -1
  90. package/dist/providers/stack-provider-client.d.mts +1 -0
  91. package/dist/providers/stack-provider-client.d.ts +1 -0
  92. package/dist/providers/stack-provider.d.mts +1 -0
  93. package/dist/providers/stack-provider.d.ts +1 -0
  94. package/dist/utils/constants.d.mts +26 -26
  95. package/dist/utils/constants.d.ts +26 -26
  96. package/dist/utils/constants.js +12 -12
  97. package/dist/utils/constants.js.map +1 -1
  98. package/package.json +9 -6
  99. package/dist/components-core/loading-indicator.d.mts +0 -11
  100. package/dist/components-core/loading-indicator.d.ts +0 -11
  101. package/dist/components-core/loading-indicator.js +0 -62
  102. package/dist/components-core/loading-indicator.js.map +0 -1
  103. package/dist/esm/components-core/loading-indicator.js +0 -31
  104. package/dist/esm/components-core/loading-indicator.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @stackframe/stack
2
2
 
3
+ ## 2.4.15
4
+
5
+ ### Patch Changes
6
+
7
+ - Improved client styling, added login form, added spotify oauth
8
+ - Updated dependencies
9
+ - @stackframe/stack-shared@2.4.12
10
+
11
+ ## 2.4.14
12
+
13
+ ### Patch Changes
14
+
15
+ - Added email editor
16
+ - Updated dependencies
17
+ - @stackframe/stack-shared@2.4.11
18
+
3
19
  ## 2.4.13
4
20
 
5
21
  ### Patch Changes
@@ -35,79 +35,59 @@ __export(credential_sign_in_exports, {
35
35
  default: () => CredentialSignIn
36
36
  });
37
37
  module.exports = __toCommonJS(credential_sign_in_exports);
38
- var import_react = require("react");
38
+ var import_react_hook_form = require("react-hook-form");
39
+ var import_yup = require("@hookform/resolvers/yup");
40
+ var yup = __toESM(require("yup"));
39
41
  var import_form_warning = __toESM(require("./form-warning"));
40
42
  var import_password_field = __toESM(require("./password-field"));
41
- var import_email = require("../utils/email");
42
43
  var import__ = require("..");
43
44
  var import_components_core = require("../components-core");
44
- var import_stack_shared = require("@stackframe/stack-shared");
45
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
45
46
  var import_jsx_runtime = require("react/jsx-runtime");
47
+ var schema = yup.object().shape({
48
+ email: yup.string().email("Please enter a valid email").required("Please enter your email"),
49
+ password: yup.string().required("Please enter your password")
50
+ });
46
51
  function CredentialSignIn() {
47
- const [email, setEmail] = (0, import_react.useState)("");
48
- const [emailError, setEmailError] = (0, import_react.useState)("");
49
- const [password, setPassword] = (0, import_react.useState)("");
50
- const [passwordError, setPasswordError] = (0, import_react.useState)("");
52
+ const { register, handleSubmit, setError, formState: { errors }, clearErrors } = (0, import_react_hook_form.useForm)({
53
+ resolver: (0, import_yup.yupResolver)(schema)
54
+ });
51
55
  const app = (0, import__.useStackApp)();
52
- const onSubmit = async () => {
53
- if (!email) {
54
- setEmailError("Please enter your email");
55
- return;
56
- }
57
- if (!(0, import_email.validateEmail)(email)) {
58
- setEmailError("Please enter a valid email");
59
- return;
60
- }
61
- if (!password) {
62
- setPasswordError("Please enter your password");
63
- return;
64
- }
56
+ const onSubmit = async (data) => {
57
+ const { email, password } = data;
65
58
  const error = await app.signInWithCredential({ email, password });
66
- if (error instanceof import_stack_shared.KnownErrors.EmailPasswordMismatch) {
67
- setPasswordError("Wrong email or password");
68
- } else if (error) {
69
- setEmailError(`An error occurred. ${error.message}`);
70
- }
59
+ setError("email", { type: "manual", message: error?.message });
71
60
  };
72
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", alignItems: "stretch" }, children: [
73
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Email" }),
74
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
75
- import_components_core.Input,
76
- {
77
- id: "email",
78
- type: "email",
79
- name: "email",
80
- value: email,
81
- onChange: (e) => {
82
- setEmail(e.target.value);
83
- setEmailError("");
84
- }
85
- }
86
- ),
87
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: emailError }),
88
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "password", style: { marginTop: "1rem" }, children: "Password" }),
89
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
90
- import_password_field.default,
91
- {
92
- id: "password",
93
- name: "password",
94
- value: password,
95
- onChange: (e) => {
96
- setPassword(e.target.value);
97
- setPasswordError("");
98
- }
99
- }
100
- ),
101
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: passwordError }),
102
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Link, { href: app.urls.forgotPassword, size: "sm", style: { marginTop: "0.5rem" }, children: "Forgot password?" }),
103
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
104
- import_components_core.Button,
105
- {
106
- style: { marginTop: "1.5rem" },
107
- onClick: onSubmit,
108
- children: "Sign In"
109
- }
110
- )
111
- ] });
61
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
62
+ "form",
63
+ {
64
+ style: { display: "flex", flexDirection: "column", alignItems: "stretch" },
65
+ onSubmit: (e) => (0, import_promises.runAsynchronously)(handleSubmit(onSubmit)(e)),
66
+ noValidate: true,
67
+ children: [
68
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Email" }),
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
70
+ import_components_core.Input,
71
+ {
72
+ id: "email",
73
+ type: "email",
74
+ ...register("email")
75
+ }
76
+ ),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: errors.email?.message?.toString() }),
78
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "password", style: { marginTop: "1rem" }, children: "Password" }),
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
80
+ import_password_field.default,
81
+ {
82
+ id: "password",
83
+ ...register("password")
84
+ }
85
+ ),
86
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: errors.password?.message?.toString() }),
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Link, { href: app.urls.forgotPassword, size: "sm", style: { marginTop: "0.5rem" }, children: "Forgot password?" }),
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Button, { type: "submit", style: { marginTop: "1.5rem" }, children: "Sign In" })
89
+ ]
90
+ }
91
+ );
112
92
  }
113
93
  //# sourceMappingURL=credential-sign-in.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/credential-sign-in.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from \"react\";\nimport FormWarningText from \"./form-warning\";\nimport PasswordField from \"./password-field\";\nimport { validateEmail } from \"../utils/email\";\nimport { useStackApp } from \"..\";\nimport { Button, Input, Label, Link } from \"../components-core\";\nimport { KnownErrors } from \"@stackframe/stack-shared\";\n\nexport default function CredentialSignIn() {\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState('');\n const [password, setPassword] = useState('');\n const [passwordError, setPasswordError] = useState('');\n const app = useStackApp();\n \n const onSubmit = async () => {\n if (!email) {\n setEmailError('Please enter your email');\n return;\n }\n if (!validateEmail(email)) {\n setEmailError('Please enter a valid email');\n return;\n }\n if (!password) {\n setPasswordError('Please enter your password');\n return;\n }\n \n const error = await app.signInWithCredential({ email, password });\n\n if (error instanceof KnownErrors.EmailPasswordMismatch) {\n setPasswordError('Wrong email or password');\n } else if (error) {\n setEmailError(`An error occurred. ${error.message}`);\n }\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'stretch' }}>\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n name=\"email\"\n value={email}\n onChange={(e) => {\n setEmail(e.target.value);\n setEmailError('');\n }}\n />\n <FormWarningText text={emailError} />\n\n <Label htmlFor=\"password\" style={{ marginTop: '1rem' }}>Password</Label>\n <PasswordField\n id=\"password\"\n name=\"password\"\n value={password}\n onChange={(e) => {\n setPassword(e.target.value);\n setPasswordError('');\n }}\n />\n <FormWarningText text={passwordError} />\n\n <Link href={app.urls.forgotPassword} size='sm' style={{ marginTop: '0.5rem' }}>\n Forgot password?\n </Link>\n\n <Button\n style={{ marginTop: '1.5rem' }}\n onClick={onSubmit}\n >\n Sign In\n </Button>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAyB;AACzB,0BAA4B;AAC5B,4BAA0B;AAC1B,mBAA8B;AAC9B,eAA4B;AAC5B,6BAA2C;AAC3C,0BAA4B;AAiCxB;AA/BW,SAAR,mBAAoC;AACzC,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,EAAE;AACrC,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAC/C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,EAAE;AAC3C,QAAM,CAAC,eAAe,gBAAgB,QAAI,uBAAS,EAAE;AACrD,QAAM,UAAM,sBAAY;AAExB,QAAM,WAAW,YAAY;AAC3B,QAAI,CAAC,OAAO;AACV,oBAAc,yBAAyB;AACvC;AAAA,IACF;AACA,QAAI,KAAC,4BAAc,KAAK,GAAG;AACzB,oBAAc,4BAA4B;AAC1C;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AACb,uBAAiB,4BAA4B;AAC7C;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,IAAI,qBAAqB,EAAE,OAAO,SAAS,CAAC;AAEhE,QAAI,iBAAiB,gCAAY,uBAAuB;AACtD,uBAAiB,yBAAyB;AAAA,IAC5C,WAAW,OAAO;AAChB,oBAAc,sBAAsB,MAAM,OAAO,EAAE;AAAA,IACrD;AAAA,EACF;AAEA,SACE,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,GAC5E;AAAA,gDAAC,gCAAM,SAAQ,SAAQ,mBAAK;AAAA,IAC5B;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,MAAK;AAAA,QACL,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM;AACf,mBAAS,EAAE,OAAO,KAAK;AACvB,wBAAc,EAAE;AAAA,QAClB;AAAA;AAAA,IACF;AAAA,IACA,4CAAC,oBAAAA,SAAA,EAAgB,MAAM,YAAY;AAAA,IAEnC,4CAAC,gCAAM,SAAQ,YAAW,OAAO,EAAE,WAAW,OAAO,GAAG,sBAAQ;AAAA,IAChE;AAAA,MAAC,sBAAAC;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM;AACf,sBAAY,EAAE,OAAO,KAAK;AAC1B,2BAAiB,EAAE;AAAA,QACrB;AAAA;AAAA,IACF;AAAA,IACA,4CAAC,oBAAAD,SAAA,EAAgB,MAAM,eAAe;AAAA,IAEtC,4CAAC,+BAAK,MAAM,IAAI,KAAK,gBAAgB,MAAK,MAAK,OAAO,EAAE,WAAW,SAAS,GAAG,8BAE/E;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,WAAW,SAAS;AAAA,QAC7B,SAAS;AAAA,QACV;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;","names":["FormWarningText","PasswordField"]}
1
+ {"version":3,"sources":["../../src/components/credential-sign-in.tsx"],"sourcesContent":["'use client';\n\nimport { useForm } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\nimport FormWarningText from \"./form-warning\";\nimport PasswordField from \"./password-field\";\nimport { useStackApp } from \"..\";\nimport { Button, Input, Label, Link } from \"../components-core\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\n\nconst schema = yup.object().shape({\n email: yup.string().email('Please enter a valid email').required('Please enter your email'),\n password: yup.string().required('Please enter your password')\n});\n\nexport default function CredentialSignIn() {\n const { register, handleSubmit, setError, formState: { errors }, clearErrors } = useForm({\n resolver: yupResolver(schema)\n });\n const app = useStackApp();\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n const { email, password } = data;\n\n const error = await app.signInWithCredential({ email, password });\n setError('email', { type: 'manual', message: error?.message });\n };\n\n return (\n <form \n style={{ display: 'flex', flexDirection: 'column', alignItems: 'stretch' }} \n onSubmit={e => runAsynchronously(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n {...register('email')}\n />\n <FormWarningText text={errors.email?.message?.toString()} />\n\n <Label htmlFor=\"password\" style={{ marginTop: '1rem' }}>Password</Label>\n <PasswordField\n id=\"password\"\n {...register('password')}\n />\n <FormWarningText text={errors.password?.message?.toString()} />\n\n <Link href={app.urls.forgotPassword} size='sm' style={{ marginTop: '0.5rem' }}>\n Forgot password?\n </Link>\n\n <Button type=\"submit\" style={{ marginTop: '1.5rem' }}>\n Sign In\n </Button>\n </form>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,6BAAwB;AACxB,iBAA4B;AAC5B,UAAqB;AACrB,0BAA4B;AAC5B,4BAA0B;AAC1B,eAA4B;AAC5B,6BAA2C;AAC3C,sBAAkC;AAqB9B;AAnBJ,IAAM,SAAa,WAAO,EAAE,MAAM;AAAA,EAChC,OAAW,WAAO,EAAE,MAAM,4BAA4B,EAAE,SAAS,yBAAyB;AAAA,EAC1F,UAAc,WAAO,EAAE,SAAS,4BAA4B;AAC9D,CAAC;AAEc,SAAR,mBAAoC;AACzC,QAAM,EAAE,UAAU,cAAc,UAAU,WAAW,EAAE,OAAO,GAAG,YAAY,QAAI,gCAAQ;AAAA,IACvF,cAAU,wBAAY,MAAM;AAAA,EAC9B,CAAC;AACD,QAAM,UAAM,sBAAY;AAExB,QAAM,WAAW,OAAO,SAAuC;AAC7D,UAAM,EAAE,OAAO,SAAS,IAAI;AAE5B,UAAM,QAAQ,MAAM,IAAI,qBAAqB,EAAE,OAAO,SAAS,CAAC;AAChE,aAAS,SAAS,EAAE,MAAM,UAAU,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC/D;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU;AAAA,MACzE,UAAU,WAAK,mCAAkB,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,MAC1D,YAAU;AAAA,MAEV;AAAA,oDAAC,gCAAM,SAAQ,SAAQ,mBAAK;AAAA,QAC5B;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACJ,GAAG,SAAS,OAAO;AAAA;AAAA,QACtB;AAAA,QACA,4CAAC,oBAAAA,SAAA,EAAgB,MAAM,OAAO,OAAO,SAAS,SAAS,GAAG;AAAA,QAE1D,4CAAC,gCAAM,SAAQ,YAAW,OAAO,EAAE,WAAW,OAAO,GAAG,sBAAQ;AAAA,QAChE;AAAA,UAAC,sBAAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACF,GAAG,SAAS,UAAU;AAAA;AAAA,QACzB;AAAA,QACA,4CAAC,oBAAAD,SAAA,EAAgB,MAAM,OAAO,UAAU,SAAS,SAAS,GAAG;AAAA,QAE7D,4CAAC,+BAAK,MAAM,IAAI,KAAK,gBAAgB,MAAK,MAAK,OAAO,EAAE,WAAW,SAAS,GAAG,8BAE/E;AAAA,QAEA,4CAAC,iCAAO,MAAK,UAAS,OAAO,EAAE,WAAW,SAAS,GAAG,qBAEtD;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["FormWarningText","PasswordField"]}
@@ -35,111 +35,87 @@ __export(credential_sign_up_exports, {
35
35
  default: () => CredentialSignUp
36
36
  });
37
37
  module.exports = __toCommonJS(credential_sign_up_exports);
38
- var import_react = require("react");
38
+ var import_react_hook_form = require("react-hook-form");
39
+ var import_yup = require("@hookform/resolvers/yup");
40
+ var yup = __toESM(require("yup"));
39
41
  var import_password_field = __toESM(require("./password-field"));
40
42
  var import_form_warning = __toESM(require("./form-warning"));
41
- var import_email = require("../utils/email");
42
- var import_password = require("@stackframe/stack-shared/dist/helpers/password");
43
43
  var import__ = require("..");
44
44
  var import_components_core = require("../components-core");
45
- var import_stack_shared = require("@stackframe/stack-shared");
45
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
46
+ var import_password = require("@stackframe/stack-shared/dist/helpers/password");
46
47
  var import_jsx_runtime = require("react/jsx-runtime");
48
+ var schema = yup.object().shape({
49
+ email: yup.string().email("Please enter a valid email").required("Please enter your email"),
50
+ password: yup.string().required("Please enter your password").test({
51
+ name: "is-valid-password",
52
+ test: (value, ctx) => {
53
+ const error = (0, import_password.getPasswordError)(value);
54
+ if (error) {
55
+ return ctx.createError({ message: error.message });
56
+ } else {
57
+ return true;
58
+ }
59
+ }
60
+ }),
61
+ passwordRepeat: yup.string().nullable().oneOf([yup.ref("password"), null], "Passwords do not match").required("Please repeat your password")
62
+ });
47
63
  function CredentialSignUp() {
48
- const [email, setEmail] = (0, import_react.useState)("");
49
- const [emailError, setEmailError] = (0, import_react.useState)("");
50
- const [password, setPassword] = (0, import_react.useState)("");
51
- const [passwordError, setPasswordError] = (0, import_react.useState)("");
52
- const [passwordRepeat, setPasswordRepeat] = (0, import_react.useState)("");
53
- const [passwordRepeatError, setPasswordRepeatError] = (0, import_react.useState)("");
64
+ const { register, handleSubmit, setError, formState: { errors }, clearErrors } = (0, import_react_hook_form.useForm)({
65
+ resolver: (0, import_yup.yupResolver)(schema)
66
+ });
54
67
  const app = (0, import__.useStackApp)();
55
- const onSubmit = async () => {
56
- if (!email) {
57
- setEmailError("Please enter your email");
58
- return;
59
- }
60
- if (!(0, import_email.validateEmail)(email)) {
61
- setEmailError("Please enter a valid email");
62
- return;
63
- }
64
- if (!password) {
65
- setPasswordError("Please enter your password");
66
- return;
67
- }
68
- if (!passwordRepeat) {
69
- setPasswordRepeatError("Please repeat your password");
70
- return;
71
- }
72
- if (password !== passwordRepeat) {
73
- setPasswordRepeatError("Passwords do not match");
74
- return;
75
- }
76
- const passwordError2 = (0, import_password.getPasswordError)(password);
77
- if (passwordError2) {
78
- setPasswordError(passwordError2.message);
79
- return;
80
- }
81
- let error;
82
- error = await app.signUpWithCredential({ email, password });
83
- if (error instanceof import_stack_shared.KnownErrors.UserEmailAlreadyExists) {
84
- setEmailError("User already exists");
85
- } else if (error) {
86
- setEmailError(`An error occurred. ${error.message}`);
87
- }
68
+ const onSubmit = async (data) => {
69
+ const { email, password } = data;
70
+ const error = await app.signUpWithCredential({ email, password });
71
+ setError("email", { type: "manual", message: error?.message });
88
72
  };
89
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", alignItems: "stretch" }, children: [
90
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Email" }),
91
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
92
- import_components_core.Input,
93
- {
94
- id: "email",
95
- type: "email",
96
- name: "email",
97
- value: email,
98
- onChange: (e) => {
99
- setEmail(e.target.value);
100
- setEmailError("");
101
- }
102
- }
103
- ),
104
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: emailError }),
105
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "password", style: { marginTop: "1rem" }, children: "Password" }),
106
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
107
- import_password_field.default,
108
- {
109
- id: "password",
110
- name: "password",
111
- value: password,
112
- onChange: (e) => {
113
- setPassword(e.target.value);
114
- setPasswordError("");
115
- setPasswordRepeatError("");
116
- }
117
- }
118
- ),
119
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: passwordError }),
120
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "repeat-password", style: { marginTop: "1rem" }, children: "Repeat Password" }),
121
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
122
- import_password_field.default,
123
- {
124
- id: "repeat-password",
125
- name: "repeat-password",
126
- value: passwordRepeat,
127
- onChange: (e) => {
128
- setPasswordRepeat(e.target.value);
129
- setPasswordError("");
130
- setPasswordRepeatError("");
131
- }
132
- }
133
- ),
134
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: passwordRepeatError }),
135
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
136
- import_components_core.Button,
137
- {
138
- style: { marginTop: "1.5rem" },
139
- onClick: onSubmit,
140
- children: "Sign Up"
141
- }
142
- )
143
- ] });
73
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
74
+ "form",
75
+ {
76
+ style: { display: "flex", flexDirection: "column", alignItems: "stretch" },
77
+ onSubmit: (e) => (0, import_promises.runAsynchronously)(handleSubmit(onSubmit)(e)),
78
+ noValidate: true,
79
+ children: [
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Email" }),
81
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
82
+ import_components_core.Input,
83
+ {
84
+ id: "email",
85
+ type: "email",
86
+ ...register("email")
87
+ }
88
+ ),
89
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: errors.email?.message?.toString() }),
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "password", style: { marginTop: "1rem" }, children: "Password" }),
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
92
+ import_password_field.default,
93
+ {
94
+ id: "password",
95
+ ...register("password"),
96
+ onChange: (e) => {
97
+ clearErrors("password");
98
+ clearErrors("passwordRepeat");
99
+ }
100
+ }
101
+ ),
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: errors.password?.message?.toString() }),
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "repeat-password", style: { marginTop: "1rem" }, children: "Repeat Password" }),
104
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
105
+ import_password_field.default,
106
+ {
107
+ id: "repeat-password",
108
+ ...register("passwordRepeat"),
109
+ onChange: (e) => {
110
+ clearErrors("password");
111
+ clearErrors("passwordRepeat");
112
+ }
113
+ }
114
+ ),
115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: errors.passwordRepeat?.message?.toString() }),
116
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Button, { type: "submit", style: { marginTop: "1.5rem" }, children: "Sign Up" })
117
+ ]
118
+ }
119
+ );
144
120
  }
145
121
  //# sourceMappingURL=credential-sign-up.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/credential-sign-up.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from \"react\";\nimport PasswordField from \"./password-field\";\nimport FormWarningText from \"./form-warning\";\nimport { validateEmail } from \"../utils/email\";\nimport { getPasswordError } from \"@stackframe/stack-shared/dist/helpers/password\";\nimport { useStackApp } from \"..\";\nimport { Label, Input, Button } from \"../components-core\";\nimport { KnownErrors } from \"@stackframe/stack-shared\";\n\nexport default function CredentialSignUp() {\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState('');\n const [password, setPassword] = useState('');\n const [passwordError, setPasswordError] = useState('');\n const [passwordRepeat, setPasswordRepeat] = useState('');\n const [passwordRepeatError, setPasswordRepeatError] = useState('');\n const app = useStackApp();\n\n const onSubmit = async () => {\n if (!email) {\n setEmailError('Please enter your email');\n return;\n }\n if (!validateEmail(email)) {\n setEmailError('Please enter a valid email');\n return;\n }\n if (!password) {\n setPasswordError('Please enter your password');\n return;\n }\n if (!passwordRepeat) {\n setPasswordRepeatError('Please repeat your password');\n return;\n }\n if (password !== passwordRepeat) {\n setPasswordRepeatError('Passwords do not match');\n return;\n }\n\n const passwordError = getPasswordError(password);\n if (passwordError) {\n setPasswordError(passwordError.message);\n return;\n }\n\n let error;\n error = await app.signUpWithCredential({ email, password });\n \n if (error instanceof KnownErrors.UserEmailAlreadyExists) {\n setEmailError('User already exists');\n } else if (error) {\n setEmailError(`An error occurred. ${error.message}`);\n }\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'stretch' }}>\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n name=\"email\"\n value={email}\n onChange={(e) => {\n setEmail(e.target.value);\n setEmailError('');\n }}\n />\n <FormWarningText text={emailError} />\n\n <Label htmlFor=\"password\" style={{ marginTop: '1rem' }}>Password</Label>\n <PasswordField\n id=\"password\"\n name=\"password\"\n value={password}\n onChange={(e) => {\n setPassword(e.target.value);\n setPasswordError('');\n setPasswordRepeatError('');\n }}\n />\n <FormWarningText text={passwordError} />\n \n <Label htmlFor=\"repeat-password\" style={{ marginTop: '1rem' }}>Repeat Password</Label>\n <PasswordField\n id=\"repeat-password\"\n name=\"repeat-password\"\n value={passwordRepeat}\n onChange={(e) => {\n setPasswordRepeat(e.target.value);\n setPasswordError('');\n setPasswordRepeatError('');\n }}\n />\n <FormWarningText text={passwordRepeatError} />\n\n <Button \n style={{ marginTop: '1.5rem' }}\n onClick={onSubmit}\n >\n Sign Up\n </Button>\n </div>\n );\n}\n"],"mappings":"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","names":["passwordError","FormWarningText","PasswordField"]}
1
+ {"version":3,"sources":["../../src/components/credential-sign-up.tsx"],"sourcesContent":["'use client';\n\nimport { useForm } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\nimport PasswordField from \"./password-field\";\nimport FormWarningText from \"./form-warning\";\nimport { useStackApp } from \"..\";\nimport { Label, Input, Button } from \"../components-core\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { getPasswordError } from \"@stackframe/stack-shared/dist/helpers/password\";\n\nconst schema = yup.object().shape({\n email: yup.string().email('Please enter a valid email').required('Please enter your email'),\n password: yup.string().required('Please enter your password').test({\n name: 'is-valid-password',\n test: (value, ctx) => {\n const error = getPasswordError(value);\n if (error) {\n return ctx.createError({ message: error.message });\n } else {\n return true;\n }\n }\n }),\n passwordRepeat: yup.string().nullable().oneOf([yup.ref('password'), null], 'Passwords do not match').required('Please repeat your password')\n});\n\nexport default function CredentialSignUp() {\n const { register, handleSubmit, setError, formState: { errors }, clearErrors } = useForm({\n resolver: yupResolver(schema)\n });\n const app = useStackApp();\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n const { email, password } = data;\n const error = await app.signUpWithCredential({ email, password });\n setError('email', { type: 'manual', message: error?.message });\n };\n\n return (\n <form \n style={{ display: 'flex', flexDirection: 'column', alignItems: 'stretch' }} \n onSubmit={e => runAsynchronously(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n {...register('email')}\n />\n <FormWarningText text={errors.email?.message?.toString()} />\n\n <Label htmlFor=\"password\" style={{ marginTop: '1rem' }}>Password</Label>\n <PasswordField\n id=\"password\"\n {...register('password')}\n onChange={(e) => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.password?.message?.toString()} />\n \n <Label htmlFor=\"repeat-password\" style={{ marginTop: '1rem' }}>Repeat Password</Label>\n <PasswordField\n id=\"repeat-password\"\n {...register('passwordRepeat')}\n onChange={(e) => {\n clearErrors('password');\n clearErrors('passwordRepeat');\n }}\n />\n <FormWarningText text={errors.passwordRepeat?.message?.toString()} />\n\n <Button type=\"submit\" style={{ marginTop: '1.5rem' }}>\n Sign Up\n </Button>\n </form>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,6BAAwB;AACxB,iBAA4B;AAC5B,UAAqB;AACrB,4BAA0B;AAC1B,0BAA4B;AAC5B,eAA4B;AAC5B,6BAAqC;AACrC,sBAAkC;AAClC,sBAAiC;AA+B7B;AA7BJ,IAAM,SAAa,WAAO,EAAE,MAAM;AAAA,EAChC,OAAW,WAAO,EAAE,MAAM,4BAA4B,EAAE,SAAS,yBAAyB;AAAA,EAC1F,UAAc,WAAO,EAAE,SAAS,4BAA4B,EAAE,KAAK;AAAA,IACjE,MAAM;AAAA,IACN,MAAM,CAAC,OAAO,QAAQ;AACpB,YAAM,YAAQ,kCAAiB,KAAK;AACpC,UAAI,OAAO;AACT,eAAO,IAAI,YAAY,EAAE,SAAS,MAAM,QAAQ,CAAC;AAAA,MACnD,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EACD,gBAAoB,WAAO,EAAE,SAAS,EAAE,MAAM,CAAK,QAAI,UAAU,GAAG,IAAI,GAAG,wBAAwB,EAAE,SAAS,6BAA6B;AAC7I,CAAC;AAEc,SAAR,mBAAoC;AACzC,QAAM,EAAE,UAAU,cAAc,UAAU,WAAW,EAAE,OAAO,GAAG,YAAY,QAAI,gCAAQ;AAAA,IACvF,cAAU,wBAAY,MAAM;AAAA,EAC9B,CAAC;AACD,QAAM,UAAM,sBAAY;AAExB,QAAM,WAAW,OAAO,SAAuC;AAC7D,UAAM,EAAE,OAAO,SAAS,IAAI;AAC5B,UAAM,QAAQ,MAAM,IAAI,qBAAqB,EAAE,OAAO,SAAS,CAAC;AAChE,aAAS,SAAS,EAAE,MAAM,UAAU,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC/D;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU;AAAA,MACzE,UAAU,WAAK,mCAAkB,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,MAC1D,YAAU;AAAA,MAEV;AAAA,oDAAC,gCAAM,SAAQ,SAAQ,mBAAK;AAAA,QAC5B;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACJ,GAAG,SAAS,OAAO;AAAA;AAAA,QACtB;AAAA,QACA,4CAAC,oBAAAA,SAAA,EAAgB,MAAM,OAAO,OAAO,SAAS,SAAS,GAAG;AAAA,QAE1D,4CAAC,gCAAM,SAAQ,YAAW,OAAO,EAAE,WAAW,OAAO,GAAG,sBAAQ;AAAA,QAChE;AAAA,UAAC,sBAAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACF,GAAG,SAAS,UAAU;AAAA,YACvB,UAAU,CAAC,MAAM;AACf,0BAAY,UAAU;AACtB,0BAAY,gBAAgB;AAAA,YAC9B;AAAA;AAAA,QACF;AAAA,QACA,4CAAC,oBAAAD,SAAA,EAAgB,MAAM,OAAO,UAAU,SAAS,SAAS,GAAG;AAAA,QAE7D,4CAAC,gCAAM,SAAQ,mBAAkB,OAAO,EAAE,WAAW,OAAO,GAAG,6BAAe;AAAA,QAC9E;AAAA,UAAC,sBAAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACF,GAAG,SAAS,gBAAgB;AAAA,YAC7B,UAAU,CAAC,MAAM;AACf,0BAAY,UAAU;AACtB,0BAAY,gBAAgB;AAAA,YAC9B;AAAA;AAAA,QACF;AAAA,QACA,4CAAC,oBAAAD,SAAA,EAAgB,MAAM,OAAO,gBAAgB,SAAS,SAAS,GAAG;AAAA,QAEnE,4CAAC,iCAAO,MAAK,UAAS,OAAO,EAAE,WAAW,SAAS,GAAG,qBAEtD;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["FormWarningText","PasswordField"]}
@@ -35,52 +35,55 @@ __export(forgot_password_exports, {
35
35
  default: () => ForgotPassword
36
36
  });
37
37
  module.exports = __toCommonJS(forgot_password_exports);
38
- var import_react = require("react");
38
+ var import_react_hook_form = require("react-hook-form");
39
+ var import_yup = require("@hookform/resolvers/yup");
40
+ var yup = __toESM(require("yup"));
39
41
  var import_form_warning = __toESM(require("./form-warning"));
40
- var import_email = require("../utils/email");
41
42
  var import__ = require("..");
42
43
  var import_components_core = require("../components-core");
44
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
43
45
  var import_jsx_runtime = require("react/jsx-runtime");
46
+ var schema = yup.object().shape({
47
+ email: yup.string().email("Please enter a valid email").required("Please enter your email")
48
+ });
44
49
  function ForgotPassword({ onSent }) {
45
- const [email, setEmail] = (0, import_react.useState)("");
46
- const [emailError, setEmailError] = (0, import_react.useState)("");
50
+ const { register, handleSubmit, formState: { errors }, clearErrors } = (0, import_react_hook_form.useForm)({
51
+ resolver: (0, import_yup.yupResolver)(schema)
52
+ });
47
53
  const stackApp = (0, import__.useStackApp)();
48
- const onSubmit = async () => {
49
- if (!email) {
50
- setEmailError("Please enter your email");
51
- return;
52
- }
53
- if (!(0, import_email.validateEmail)(email)) {
54
- setEmailError("Please enter a valid email");
55
- return;
56
- }
54
+ const onSubmit = async (data) => {
55
+ const { email } = data;
57
56
  await stackApp.sendForgotPasswordEmail(email);
58
57
  onSent?.();
59
58
  };
60
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", alignItems: "stretch" }, children: [
61
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Your Email" }),
62
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
63
- import_components_core.Input,
64
- {
65
- id: "email",
66
- type: "email",
67
- name: "email",
68
- value: email,
69
- onChange: (e) => {
70
- setEmail(e.target.value);
71
- setEmailError("");
72
- }
73
- }
74
- ),
75
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: emailError }),
76
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
77
- import_components_core.Button,
78
- {
79
- style: { marginTop: "1.5rem" },
80
- onClick: onSubmit,
81
- children: "Send Email"
82
- }
83
- )
84
- ] });
59
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
60
+ "form",
61
+ {
62
+ style: { display: "flex", flexDirection: "column", alignItems: "stretch" },
63
+ onSubmit: (e) => (0, import_promises.runAsynchronously)(handleSubmit(onSubmit)(e)),
64
+ noValidate: true,
65
+ children: [
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Your Email" }),
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
68
+ import_components_core.Input,
69
+ {
70
+ id: "email",
71
+ type: "email",
72
+ ...register("email"),
73
+ onChange: () => clearErrors("email")
74
+ }
75
+ ),
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: errors.email?.message?.toString() }),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
78
+ import_components_core.Button,
79
+ {
80
+ type: "submit",
81
+ style: { marginTop: "1.5rem" },
82
+ children: "Send Email"
83
+ }
84
+ )
85
+ ]
86
+ }
87
+ );
85
88
  }
86
89
  //# sourceMappingURL=forgot-password.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/forgot-password.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from \"react\";\nimport FormWarningText from \"./form-warning\";\nimport { validateEmail } from \"../utils/email\";\nimport { useStackApp } from \"..\";\nimport { Button, Input, Label } from \"../components-core\";\n\n\nexport default function ForgotPassword({ onSent }: { onSent?: () => void }) {\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState('');\n const stackApp = useStackApp();\n \n const onSubmit = async () => {\n if (!email) {\n setEmailError('Please enter your email');\n return;\n }\n if (!validateEmail(email)) {\n setEmailError('Please enter a valid email');\n return;\n }\n await stackApp.sendForgotPasswordEmail(email);\n\n onSent?.();\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'stretch' }}>\n <Label htmlFor=\"email\">Your Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n name=\"email\"\n value={email}\n onChange={(e) => {\n setEmail(e.target.value);\n setEmailError('');\n }}\n />\n <FormWarningText text={emailError} />\n\n <Button\n style={{ marginTop: '1.5rem'}}\n onClick={onSubmit}\n >\n Send Email\n </Button>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAyB;AACzB,0BAA4B;AAC5B,mBAA8B;AAC9B,eAA4B;AAC5B,6BAAqC;AAuBjC;AApBW,SAAR,eAAgC,EAAE,OAAO,GAA4B;AAC1E,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,EAAE;AACrC,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAC/C,QAAM,eAAW,sBAAY;AAE7B,QAAM,WAAW,YAAY;AAC3B,QAAI,CAAC,OAAO;AACV,oBAAc,yBAAyB;AACvC;AAAA,IACF;AACA,QAAI,KAAC,4BAAc,KAAK,GAAG;AACzB,oBAAc,4BAA4B;AAC1C;AAAA,IACF;AACA,UAAM,SAAS,wBAAwB,KAAK;AAE5C,aAAS;AAAA,EACX;AAEA,SACE,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,GAC5E;AAAA,gDAAC,gCAAM,SAAQ,SAAQ,wBAAU;AAAA,IACjC;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,MAAK;AAAA,QACL,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM;AACf,mBAAS,EAAE,OAAO,KAAK;AACvB,wBAAc,EAAE;AAAA,QAClB;AAAA;AAAA,IACF;AAAA,IACA,4CAAC,oBAAAA,SAAA,EAAgB,MAAM,YAAY;AAAA,IAEnC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,WAAW,SAAQ;AAAA,QAC5B,SAAS;AAAA,QACV;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;","names":["FormWarningText"]}
1
+ {"version":3,"sources":["../../src/components/forgot-password.tsx"],"sourcesContent":["'use client';\n\nimport { useForm } from \"react-hook-form\";\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport * as yup from \"yup\";\nimport FormWarningText from \"./form-warning\";\nimport { useStackApp } from \"..\";\nimport { Button, Input, Label } from \"../components-core\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\n\nconst schema = yup.object().shape({\n email: yup.string().email('Please enter a valid email').required('Please enter your email')\n});\n\nexport default function ForgotPassword({ onSent }: { onSent?: () => void }) {\n const { register, handleSubmit, formState: { errors }, clearErrors } = useForm({\n resolver: yupResolver(schema)\n });\n const stackApp = useStackApp();\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n const { email } = data;\n await stackApp.sendForgotPasswordEmail(email);\n onSent?.();\n };\n\n return (\n <form\n style={{ display: 'flex', flexDirection: 'column', alignItems: 'stretch' }} \n onSubmit={e => runAsynchronously(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"email\">Your Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n {...register('email')}\n onChange={() => clearErrors('email')}\n />\n <FormWarningText text={errors.email?.message?.toString()} />\n\n <Button\n type=\"submit\"\n style={{ marginTop: '1.5rem' }}\n >\n Send Email\n </Button>\n </form>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,6BAAwB;AACxB,iBAA4B;AAC5B,UAAqB;AACrB,0BAA4B;AAC5B,eAA4B;AAC5B,6BAAqC;AACrC,sBAAkC;AAmB9B;AAjBJ,IAAM,SAAa,WAAO,EAAE,MAAM;AAAA,EAChC,OAAW,WAAO,EAAE,MAAM,4BAA4B,EAAE,SAAS,yBAAyB;AAC5F,CAAC;AAEc,SAAR,eAAgC,EAAE,OAAO,GAA4B;AAC1E,QAAM,EAAE,UAAU,cAAc,WAAW,EAAE,OAAO,GAAG,YAAY,QAAI,gCAAQ;AAAA,IAC7E,cAAU,wBAAY,MAAM;AAAA,EAC9B,CAAC;AACD,QAAM,eAAW,sBAAY;AAE7B,QAAM,WAAW,OAAO,SAAuC;AAC7D,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,SAAS,wBAAwB,KAAK;AAC5C,aAAS;AAAA,EACX;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU;AAAA,MACzE,UAAU,WAAK,mCAAkB,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,MAC1D,YAAU;AAAA,MAEV;AAAA,oDAAC,gCAAM,SAAQ,SAAQ,wBAAU;AAAA,QACjC;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACJ,GAAG,SAAS,OAAO;AAAA,YACpB,UAAU,MAAM,YAAY,OAAO;AAAA;AAAA,QACrC;AAAA,QACA,4CAAC,oBAAAA,SAAA,EAAgB,MAAM,OAAO,OAAO,SAAS,SAAS,GAAG;AAAA,QAE1D;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,EAAE,WAAW,SAAS;AAAA,YAC9B;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["FormWarningText"]}
@@ -36,57 +36,53 @@ __export(magic_link_sign_in_exports, {
36
36
  });
37
37
  module.exports = __toCommonJS(magic_link_sign_in_exports);
38
38
  var import_react = require("react");
39
+ var import_react_hook_form = require("react-hook-form");
40
+ var import_yup = require("@hookform/resolvers/yup");
41
+ var yup = __toESM(require("yup"));
39
42
  var import_form_warning = __toESM(require("./form-warning"));
40
- var import_email = require("../utils/email");
41
43
  var import__ = require("..");
42
44
  var import_components_core = require("../components-core");
45
+ var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
43
46
  var import_jsx_runtime = require("react/jsx-runtime");
47
+ var schema = yup.object().shape({
48
+ email: yup.string().email("Please enter a valid email").required("Please enter your email")
49
+ });
44
50
  function MagicLinkSignIn() {
45
- const [email, setEmail] = (0, import_react.useState)("");
51
+ const { register, handleSubmit, setError, formState: { errors }, clearErrors } = (0, import_react_hook_form.useForm)({
52
+ resolver: (0, import_yup.yupResolver)(schema)
53
+ });
46
54
  const [sent, setSent] = (0, import_react.useState)(false);
47
- const [error, setError] = (0, import_react.useState)("");
48
55
  const app = (0, import__.useStackApp)();
49
- const onSubmit = async () => {
50
- if (!email) {
51
- setError("Please enter your email");
52
- return;
53
- }
54
- if (!(0, import_email.validateEmail)(email)) {
55
- setError("Please enter a valid email");
56
- return;
57
- }
58
- const error2 = await app.sendMagicLinkEmail(email);
59
- if (error2) {
60
- setError(error2.message);
56
+ const onSubmit = async (data) => {
57
+ const { email } = data;
58
+ const error = await app.sendMagicLinkEmail(email);
59
+ if (error) {
60
+ setError("email", { type: "manual", message: error.message });
61
61
  return;
62
62
  }
63
63
  setSent(true);
64
64
  };
65
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", alignItems: "stretch" }, children: [
66
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Email" }),
67
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
68
- import_components_core.Input,
69
- {
70
- id: "email",
71
- type: "email",
72
- name: "email",
73
- value: email,
74
- onChange: (e) => {
75
- setEmail(e.target.value);
76
- setError("");
77
- }
78
- }
79
- ),
80
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: error }),
81
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
82
- import_components_core.Button,
83
- {
84
- disabled: sent,
85
- style: { marginTop: "1.5rem" },
86
- onClick: onSubmit,
87
- children: sent ? "Email sent" : "Send magic link"
88
- }
89
- )
90
- ] });
65
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
66
+ "form",
67
+ {
68
+ style: { display: "flex", flexDirection: "column", alignItems: "stretch" },
69
+ onSubmit: (e) => (0, import_promises.runAsynchronously)(handleSubmit(onSubmit)(e)),
70
+ noValidate: true,
71
+ children: [
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Label, { htmlFor: "email", children: "Email" }),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
+ import_components_core.Input,
75
+ {
76
+ id: "email",
77
+ type: "email",
78
+ ...register("email"),
79
+ disabled: sent
80
+ }
81
+ ),
82
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_form_warning.default, { text: errors.email?.message?.toString() }),
83
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components_core.Button, { disabled: sent, style: { marginTop: "1.5rem" }, type: "submit", children: sent ? "Email sent" : "Send magic link" })
84
+ ]
85
+ }
86
+ );
91
87
  }
92
88
  //# sourceMappingURL=magic-link-sign-in.js.map