@joelbarron/react-web-dev-kit 0.1.0

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 (215) hide show
  1. package/README.md +236 -0
  2. package/dist/auth/client.d.ts +44 -0
  3. package/dist/auth/client.d.ts.map +1 -0
  4. package/dist/auth/client.js +354 -0
  5. package/dist/auth/constants/countryCallingCodes.d.ts +9 -0
  6. package/dist/auth/constants/countryCallingCodes.d.ts.map +1 -0
  7. package/dist/auth/constants/countryCallingCodes.js +209 -0
  8. package/dist/auth/constants/gender.d.ts +9 -0
  9. package/dist/auth/constants/gender.d.ts.map +1 -0
  10. package/dist/auth/constants/gender.js +12 -0
  11. package/dist/auth/constants/index.d.ts +3 -0
  12. package/dist/auth/constants/index.d.ts.map +1 -0
  13. package/dist/auth/constants/index.js +2 -0
  14. package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts +18 -0
  15. package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts.map +1 -0
  16. package/dist/auth/forms/account/AuthAccountConfirmationForm.js +166 -0
  17. package/dist/auth/forms/account/index.d.ts +2 -0
  18. package/dist/auth/forms/account/index.d.ts.map +1 -0
  19. package/dist/auth/forms/account/index.js +1 -0
  20. package/dist/auth/forms/errorParser.d.ts +7 -0
  21. package/dist/auth/forms/errorParser.d.ts.map +1 -0
  22. package/dist/auth/forms/errorParser.js +65 -0
  23. package/dist/auth/forms/index.d.ts +6 -0
  24. package/dist/auth/forms/index.d.ts.map +1 -0
  25. package/dist/auth/forms/index.js +5 -0
  26. package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts +12 -0
  27. package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts.map +1 -0
  28. package/dist/auth/forms/password/AuthForgotPasswordForm.js +71 -0
  29. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts +15 -0
  30. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts.map +1 -0
  31. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.js +88 -0
  32. package/dist/auth/forms/password/AuthResetPasswordForm.d.ts +12 -0
  33. package/dist/auth/forms/password/AuthResetPasswordForm.d.ts.map +1 -0
  34. package/dist/auth/forms/password/AuthResetPasswordForm.js +18 -0
  35. package/dist/auth/forms/password/index.d.ts +4 -0
  36. package/dist/auth/forms/password/index.d.ts.map +1 -0
  37. package/dist/auth/forms/password/index.js +3 -0
  38. package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts +24 -0
  39. package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts.map +1 -0
  40. package/dist/auth/forms/sign-in/AuthOtpSignInForm.js +226 -0
  41. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts +21 -0
  42. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts.map +1 -0
  43. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.js +120 -0
  44. package/dist/auth/forms/sign-in/index.d.ts +3 -0
  45. package/dist/auth/forms/sign-in/index.d.ts.map +1 -0
  46. package/dist/auth/forms/sign-in/index.js +2 -0
  47. package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts +36 -0
  48. package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts.map +1 -0
  49. package/dist/auth/forms/sign-up/AuthSignUpForm.js +164 -0
  50. package/dist/auth/forms/sign-up/index.d.ts +2 -0
  51. package/dist/auth/forms/sign-up/index.d.ts.map +1 -0
  52. package/dist/auth/forms/sign-up/index.js +1 -0
  53. package/dist/auth/fuse/createFuseAuthViews.d.ts +24 -0
  54. package/dist/auth/fuse/createFuseAuthViews.d.ts.map +1 -0
  55. package/dist/auth/fuse/createFuseAuthViews.js +360 -0
  56. package/dist/auth/fuse/fuseAdapter.d.ts +40 -0
  57. package/dist/auth/fuse/fuseAdapter.d.ts.map +1 -0
  58. package/dist/auth/fuse/fuseAdapter.js +265 -0
  59. package/dist/auth/fuse/fuseIntegration.d.ts +59 -0
  60. package/dist/auth/fuse/fuseIntegration.d.ts.map +1 -0
  61. package/dist/auth/fuse/fuseIntegration.js +85 -0
  62. package/dist/auth/fuse/index.d.ts +4 -0
  63. package/dist/auth/fuse/index.d.ts.map +1 -0
  64. package/dist/auth/fuse/index.js +3 -0
  65. package/dist/auth/index.d.ts +11 -0
  66. package/dist/auth/index.d.ts.map +1 -0
  67. package/dist/auth/index.js +10 -0
  68. package/dist/auth/provider.d.ts +35 -0
  69. package/dist/auth/provider.d.ts.map +1 -0
  70. package/dist/auth/provider.js +133 -0
  71. package/dist/auth/query.d.ts +23 -0
  72. package/dist/auth/query.d.ts.map +1 -0
  73. package/dist/auth/query.js +103 -0
  74. package/dist/auth/routes.d.ts +37 -0
  75. package/dist/auth/routes.d.ts.map +1 -0
  76. package/dist/auth/routes.js +73 -0
  77. package/dist/auth/social/providerAuth.d.ts +76 -0
  78. package/dist/auth/social/providerAuth.d.ts.map +1 -0
  79. package/dist/auth/social/providerAuth.js +130 -0
  80. package/dist/auth/storage.d.ts +3 -0
  81. package/dist/auth/storage.d.ts.map +1 -0
  82. package/dist/auth/storage.js +20 -0
  83. package/dist/auth/types.d.ts +208 -0
  84. package/dist/auth/types.d.ts.map +1 -0
  85. package/dist/auth/types.js +1 -0
  86. package/dist/auth/ui/AuthPagesMessageSection.d.ts +3 -0
  87. package/dist/auth/ui/AuthPagesMessageSection.d.ts.map +1 -0
  88. package/dist/auth/ui/AuthPagesMessageSection.js +39 -0
  89. package/dist/auth/ui/AuthPrimaryButton.d.ts +9 -0
  90. package/dist/auth/ui/AuthPrimaryButton.d.ts.map +1 -0
  91. package/dist/auth/ui/AuthPrimaryButton.js +19 -0
  92. package/dist/auth/ui/AuthRoleSelectionDialog.d.ts +14 -0
  93. package/dist/auth/ui/AuthRoleSelectionDialog.d.ts.map +1 -0
  94. package/dist/auth/ui/AuthRoleSelectionDialog.js +39 -0
  95. package/dist/auth/ui/AuthRoutePageWrapper.d.ts +12 -0
  96. package/dist/auth/ui/AuthRoutePageWrapper.d.ts.map +1 -0
  97. package/dist/auth/ui/AuthRoutePageWrapper.js +59 -0
  98. package/dist/auth/ui/AuthSecondaryButton.d.ts +7 -0
  99. package/dist/auth/ui/AuthSecondaryButton.d.ts.map +1 -0
  100. package/dist/auth/ui/AuthSecondaryButton.js +18 -0
  101. package/dist/auth/ui/AuthSocialProviderButton.d.ts +11 -0
  102. package/dist/auth/ui/AuthSocialProviderButton.d.ts.map +1 -0
  103. package/dist/auth/ui/AuthSocialProviderButton.js +30 -0
  104. package/dist/auth/ui/SignInPageTitle.d.ts +6 -0
  105. package/dist/auth/ui/SignInPageTitle.d.ts.map +1 -0
  106. package/dist/auth/ui/SignInPageTitle.js +7 -0
  107. package/dist/auth/ui/SignOutPageTitle.d.ts +6 -0
  108. package/dist/auth/ui/SignOutPageTitle.d.ts.map +1 -0
  109. package/dist/auth/ui/SignOutPageTitle.js +7 -0
  110. package/dist/auth/ui/SignUpPageTitle.d.ts +6 -0
  111. package/dist/auth/ui/SignUpPageTitle.d.ts.map +1 -0
  112. package/dist/auth/ui/SignUpPageTitle.js +7 -0
  113. package/dist/auth/ui/index.d.ts +11 -0
  114. package/dist/auth/ui/index.d.ts.map +1 -0
  115. package/dist/auth/ui/index.js +10 -0
  116. package/dist/auth/ui/types.d.ts +15 -0
  117. package/dist/auth/ui/types.d.ts.map +1 -0
  118. package/dist/auth/ui/types.js +1 -0
  119. package/dist/config/createConfig.d.ts +13 -0
  120. package/dist/config/createConfig.d.ts.map +1 -0
  121. package/dist/config/createConfig.js +104 -0
  122. package/dist/config/defaults.d.ts +3 -0
  123. package/dist/config/defaults.d.ts.map +1 -0
  124. package/dist/config/defaults.js +38 -0
  125. package/dist/config/index.d.ts +5 -0
  126. package/dist/config/index.d.ts.map +1 -0
  127. package/dist/config/index.js +4 -0
  128. package/dist/config/merge.d.ts +2 -0
  129. package/dist/config/merge.d.ts.map +1 -0
  130. package/dist/config/merge.js +18 -0
  131. package/dist/config/types.d.ts +46 -0
  132. package/dist/config/types.d.ts.map +1 -0
  133. package/dist/config/types.js +1 -0
  134. package/dist/forms/JBCheckboxField.d.ts +12 -0
  135. package/dist/forms/JBCheckboxField.d.ts.map +1 -0
  136. package/dist/forms/JBCheckboxField.js +36 -0
  137. package/dist/forms/JBDatePickerField.d.ts +12 -0
  138. package/dist/forms/JBDatePickerField.d.ts.map +1 -0
  139. package/dist/forms/JBDatePickerField.js +14 -0
  140. package/dist/forms/JBRadioGroupField.d.ts +10 -0
  141. package/dist/forms/JBRadioGroupField.d.ts.map +1 -0
  142. package/dist/forms/JBRadioGroupField.js +8 -0
  143. package/dist/forms/JBSelectField.d.ts +9 -0
  144. package/dist/forms/JBSelectField.d.ts.map +1 -0
  145. package/dist/forms/JBSelectField.js +8 -0
  146. package/dist/forms/JBSwitchField.d.ts +11 -0
  147. package/dist/forms/JBSwitchField.d.ts.map +1 -0
  148. package/dist/forms/JBSwitchField.js +10 -0
  149. package/dist/forms/JBTextField.d.ts +6 -0
  150. package/dist/forms/JBTextField.d.ts.map +1 -0
  151. package/dist/forms/JBTextField.js +8 -0
  152. package/dist/forms/JBTimePickerField.d.ts +12 -0
  153. package/dist/forms/JBTimePickerField.d.ts.map +1 -0
  154. package/dist/forms/JBTimePickerField.js +14 -0
  155. package/dist/forms/index.d.ts +11 -0
  156. package/dist/forms/index.d.ts.map +1 -0
  157. package/dist/forms/index.js +10 -0
  158. package/dist/forms/rules.d.ts +16 -0
  159. package/dist/forms/rules.d.ts.map +1 -0
  160. package/dist/forms/rules.js +21 -0
  161. package/dist/forms/types.d.ts +12 -0
  162. package/dist/forms/types.d.ts.map +1 -0
  163. package/dist/forms/types.js +1 -0
  164. package/dist/forms/utils.d.ts +5 -0
  165. package/dist/forms/utils.d.ts.map +1 -0
  166. package/dist/forms/utils.js +7 -0
  167. package/dist/grid/JBGrid.d.ts +3 -0
  168. package/dist/grid/JBGrid.d.ts.map +1 -0
  169. package/dist/grid/JBGrid.js +89 -0
  170. package/dist/grid/JBGridHeader.d.ts +3 -0
  171. package/dist/grid/JBGridHeader.d.ts.map +1 -0
  172. package/dist/grid/JBGridHeader.js +22 -0
  173. package/dist/grid/JBGridProviders.d.ts +10 -0
  174. package/dist/grid/JBGridProviders.d.ts.map +1 -0
  175. package/dist/grid/JBGridProviders.js +31 -0
  176. package/dist/grid/index.d.ts +5 -0
  177. package/dist/grid/index.d.ts.map +1 -0
  178. package/dist/grid/index.js +4 -0
  179. package/dist/grid/types.d.ts +81 -0
  180. package/dist/grid/types.d.ts.map +1 -0
  181. package/dist/grid/types.js +1 -0
  182. package/dist/hooks/index.d.ts +3 -0
  183. package/dist/hooks/index.d.ts.map +1 -0
  184. package/dist/hooks/index.js +2 -0
  185. package/dist/hooks/useJBDebouncedValue.d.ts +2 -0
  186. package/dist/hooks/useJBDebouncedValue.d.ts.map +1 -0
  187. package/dist/hooks/useJBDebouncedValue.js +11 -0
  188. package/dist/hooks/useJBRedirect.d.ts +10 -0
  189. package/dist/hooks/useJBRedirect.d.ts.map +1 -0
  190. package/dist/hooks/useJBRedirect.js +11 -0
  191. package/dist/index.d.ts +8 -0
  192. package/dist/index.d.ts.map +1 -0
  193. package/dist/index.js +7 -0
  194. package/dist/query/createQueryClient.d.ts +8 -0
  195. package/dist/query/createQueryClient.d.ts.map +1 -0
  196. package/dist/query/createQueryClient.js +25 -0
  197. package/dist/query/http.d.ts +3 -0
  198. package/dist/query/http.d.ts.map +1 -0
  199. package/dist/query/http.js +12 -0
  200. package/dist/query/index.d.ts +3 -0
  201. package/dist/query/index.d.ts.map +1 -0
  202. package/dist/query/index.js +2 -0
  203. package/dist/utils/format.d.ts +4 -0
  204. package/dist/utils/format.d.ts.map +1 -0
  205. package/dist/utils/format.js +28 -0
  206. package/dist/utils/index.d.ts +4 -0
  207. package/dist/utils/index.d.ts.map +1 -0
  208. package/dist/utils/index.js +3 -0
  209. package/dist/utils/query.d.ts +2 -0
  210. package/dist/utils/query.d.ts.map +1 -0
  211. package/dist/utils/query.js +4 -0
  212. package/dist/utils/regex.d.ts +7 -0
  213. package/dist/utils/regex.d.ts.map +1 -0
  214. package/dist/utils/regex.js +6 -0
  215. package/package.json +85 -0
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import Alert from '@mui/material/Alert';
4
+ import Button from '@mui/material/Button';
5
+ import _ from 'lodash';
6
+ import { useEffect, useState } from 'react';
7
+ import { useForm } from 'react-hook-form';
8
+ import { z } from 'zod';
9
+ import { JBTextField } from '../../../forms';
10
+ import { parseAuthError } from '../errorParser';
11
+ const forgotSchema = z.object({
12
+ email: z.string().email('Debes ingresar un correo válido').nonempty('Debes ingresar un correo')
13
+ });
14
+ export function AuthForgotPasswordForm(props) {
15
+ const { defaultValues, loading = false, submitLabel = 'Enviar enlace de recuperación', successMessage = 'Si la cuenta existe, enviamos un enlace de recuperación a tu correo.', onSubmit } = props;
16
+ const [success, setSuccess] = useState(null);
17
+ const { control, formState, handleSubmit, setError, clearErrors, watch } = useForm({
18
+ mode: 'onChange',
19
+ defaultValues: {
20
+ email: defaultValues?.email ?? ''
21
+ },
22
+ resolver: zodResolver(forgotSchema)
23
+ });
24
+ const { errors, dirtyFields, isSubmitting, isValid } = formState;
25
+ useEffect(() => {
26
+ const subscription = watch((_value, { name }) => {
27
+ if (name) {
28
+ clearErrors(name);
29
+ }
30
+ clearErrors('root');
31
+ });
32
+ return () => {
33
+ subscription.unsubscribe();
34
+ };
35
+ }, [watch, clearErrors]);
36
+ async function onSubmitForm(values) {
37
+ try {
38
+ setSuccess(null);
39
+ await onSubmit(values);
40
+ setSuccess(successMessage);
41
+ }
42
+ catch (error) {
43
+ const parsed = parseAuthError(error);
44
+ Object.entries(parsed.fieldErrors).forEach(([field, message]) => {
45
+ if (field === 'email') {
46
+ setError('email', {
47
+ type: 'manual',
48
+ message
49
+ });
50
+ return;
51
+ }
52
+ setError('root', {
53
+ type: 'manual',
54
+ message
55
+ });
56
+ });
57
+ if (parsed.rootMessage) {
58
+ setError('root', {
59
+ type: 'manual',
60
+ message: parsed.rootMessage
61
+ });
62
+ return;
63
+ }
64
+ setError('root', {
65
+ type: 'manual',
66
+ message: 'No se pudo enviar el correo de recuperación. Inténtalo de nuevo.'
67
+ });
68
+ }
69
+ }
70
+ return (_jsxs("form", { name: "forgotPasswordForm", noValidate: true, style: { display: 'flex', width: '100%', flexDirection: 'column', justifyContent: 'center', paddingTop: 4 }, onSubmit: handleSubmit(onSubmitForm), children: [_jsx(JBTextField, { control: control, name: "email", sx: { mb: 3 }, label: "Correo electr\u00F3nico", autoFocus: true, type: "email", variant: "outlined", required: true, fullWidth: true }), errors.root?.message && (_jsx(Alert, { sx: { mb: 2 }, severity: "error", children: errors.root.message })), success && (_jsx(Alert, { sx: { mb: 2 }, severity: "success", children: success })), _jsx(Button, { variant: "contained", color: "secondary", sx: { width: '100%' }, "aria-label": submitLabel, type: "submit", size: "large", disabled: loading || isSubmitting || _.isEmpty(dirtyFields) || !isValid, children: submitLabel })] }));
71
+ }
@@ -0,0 +1,15 @@
1
+ export type AuthPasswordResetConfirmFormValues = {
2
+ uid: string;
3
+ token: string;
4
+ newPassword: string;
5
+ newPasswordConfirm: string;
6
+ };
7
+ export type AuthPasswordResetConfirmFormProps = {
8
+ defaultValues?: Partial<AuthPasswordResetConfirmFormValues>;
9
+ loading?: boolean;
10
+ submitLabel?: string;
11
+ successMessage?: string;
12
+ onSubmit: (values: AuthPasswordResetConfirmFormValues) => unknown | Promise<unknown>;
13
+ };
14
+ export declare function AuthPasswordResetConfirmForm(props: AuthPasswordResetConfirmFormProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=AuthPasswordResetConfirmForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthPasswordResetConfirmForm.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/password/AuthPasswordResetConfirmForm.tsx"],"names":[],"mappings":"AAWA,MAAM,MAAM,kCAAkC,GAAG;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,kCAAkC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtF,CAAC;AAiBF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,iCAAiC,2CAuJpF"}
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import Alert from '@mui/material/Alert';
4
+ import Button from '@mui/material/Button';
5
+ import _ from 'lodash';
6
+ import { useEffect } from 'react';
7
+ import { useForm } from 'react-hook-form';
8
+ import { z } from 'zod';
9
+ import { JBTextField } from '../../../forms';
10
+ import { parseAuthError } from '../errorParser';
11
+ const resetSchema = z
12
+ .object({
13
+ uid: z.string().nonempty('El uid es obligatorio'),
14
+ token: z.string().nonempty('El token es obligatorio'),
15
+ newPassword: z
16
+ .string()
17
+ .nonempty('Debes ingresar tu nueva contraseña')
18
+ .min(8, 'La contraseña es muy corta - mínimo 8 caracteres.'),
19
+ newPasswordConfirm: z.string().nonempty('La confirmación de contraseña es obligatoria')
20
+ })
21
+ .refine((data) => data.newPassword === data.newPasswordConfirm, {
22
+ message: 'Las contraseñas deben coincidir',
23
+ path: ['newPasswordConfirm']
24
+ });
25
+ export function AuthPasswordResetConfirmForm(props) {
26
+ const { defaultValues, loading = false, submitLabel = 'Restablecer contraseña', successMessage = 'Contraseña restablecida correctamente. Ya puedes iniciar sesión.', onSubmit } = props;
27
+ const { control, formState, handleSubmit, setError, clearErrors, watch } = useForm({
28
+ mode: 'onChange',
29
+ defaultValues: {
30
+ uid: defaultValues?.uid ?? '',
31
+ token: defaultValues?.token ?? '',
32
+ newPassword: defaultValues?.newPassword ?? '',
33
+ newPasswordConfirm: defaultValues?.newPasswordConfirm ?? ''
34
+ },
35
+ resolver: zodResolver(resetSchema)
36
+ });
37
+ const { errors, dirtyFields, isSubmitting, isValid, isSubmitSuccessful } = formState;
38
+ useEffect(() => {
39
+ const subscription = watch((_value, { name }) => {
40
+ if (name) {
41
+ clearErrors(name);
42
+ }
43
+ clearErrors('root');
44
+ });
45
+ return () => {
46
+ subscription.unsubscribe();
47
+ };
48
+ }, [watch, clearErrors]);
49
+ async function onSubmitForm(values) {
50
+ try {
51
+ await onSubmit(values);
52
+ }
53
+ catch (error) {
54
+ const parsed = parseAuthError(error);
55
+ const allowedFields = [
56
+ 'uid',
57
+ 'token',
58
+ 'newPassword',
59
+ 'newPasswordConfirm'
60
+ ];
61
+ Object.entries(parsed.fieldErrors).forEach(([field, message]) => {
62
+ if (allowedFields.includes(field)) {
63
+ setError(field, {
64
+ type: 'manual',
65
+ message
66
+ });
67
+ return;
68
+ }
69
+ setError('root', {
70
+ type: 'manual',
71
+ message
72
+ });
73
+ });
74
+ if (parsed.rootMessage) {
75
+ setError('root', {
76
+ type: 'manual',
77
+ message: parsed.rootMessage
78
+ });
79
+ return;
80
+ }
81
+ setError('root', {
82
+ type: 'manual',
83
+ message: 'No se pudo restablecer la contraseña. Inténtalo de nuevo.'
84
+ });
85
+ }
86
+ }
87
+ return (_jsxs("form", { name: "resetPasswordForm", noValidate: true, style: { display: 'flex', width: '100%', flexDirection: 'column', justifyContent: 'center', paddingTop: 4 }, onSubmit: handleSubmit(onSubmitForm), children: [_jsx(JBTextField, { control: control, name: "uid", sx: { mb: 3 }, label: "UID", type: "text", variant: "outlined", required: true, fullWidth: true }), _jsx(JBTextField, { control: control, name: "token", sx: { mb: 3 }, label: "Token", type: "text", variant: "outlined", required: true, fullWidth: true }), _jsx(JBTextField, { control: control, name: "newPassword", sx: { mb: 3 }, label: "Nueva contrase\u00F1a", type: "password", variant: "outlined", required: true, fullWidth: true }), _jsx(JBTextField, { control: control, name: "newPasswordConfirm", sx: { mb: 3 }, label: "Confirmar nueva contrase\u00F1a", type: "password", variant: "outlined", required: true, fullWidth: true }), errors.root?.message && (_jsx(Alert, { sx: { mb: 2 }, severity: "error", children: errors.root.message })), isSubmitSuccessful && (_jsx(Alert, { sx: { mb: 2 }, severity: "success", children: successMessage })), _jsx(Button, { variant: "contained", color: "secondary", sx: { width: '100%' }, "aria-label": submitLabel, disabled: loading || isSubmitting || _.isEmpty(dirtyFields) || !isValid, type: "submit", size: "large", children: submitLabel })] }));
88
+ }
@@ -0,0 +1,12 @@
1
+ export type AuthResetPasswordFormValues = {
2
+ newPassword: string;
3
+ confirmPassword: string;
4
+ };
5
+ export type AuthResetPasswordFormProps = {
6
+ defaultValues?: Partial<AuthResetPasswordFormValues>;
7
+ loading?: boolean;
8
+ submitLabel?: string;
9
+ onSubmit: (values: AuthResetPasswordFormValues) => void | Promise<void>;
10
+ };
11
+ export declare function AuthResetPasswordForm(props: AuthResetPasswordFormProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=AuthResetPasswordForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthResetPasswordForm.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/password/AuthResetPasswordForm.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CA4CtE"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Stack } from '@mui/material';
3
+ import { useForm } from 'react-hook-form';
4
+ import { JBTextField } from '../../../forms';
5
+ export function AuthResetPasswordForm(props) {
6
+ const { defaultValues, loading = false, submitLabel = 'Restablecer contraseña', onSubmit } = props;
7
+ const { control, handleSubmit, watch } = useForm({
8
+ defaultValues: {
9
+ newPassword: defaultValues?.newPassword ?? '',
10
+ confirmPassword: defaultValues?.confirmPassword ?? ''
11
+ }
12
+ });
13
+ const newPasswordValue = watch('newPassword');
14
+ return (_jsx("form", { style: { paddingTop: 4 }, onSubmit: handleSubmit((values) => onSubmit(values)), children: _jsxs(Stack, { spacing: 2, children: [_jsx(JBTextField, { control: control, name: "newPassword", label: "Nueva contrase\u00F1a", type: "password", fullWidth: true, rules: { required: 'El password es requerido' } }), _jsx(JBTextField, { control: control, name: "confirmPassword", label: "Confirmar contrase\u00F1a", type: "password", fullWidth: true, rules: {
15
+ required: 'La confirmacion es requerida',
16
+ validate: (value) => value === newPasswordValue || 'Las contraseñas no coinciden'
17
+ } }), _jsx(Button, { variant: "contained", type: "submit", disabled: loading, children: submitLabel })] }) }));
18
+ }
@@ -0,0 +1,4 @@
1
+ export * from './AuthForgotPasswordForm';
2
+ export * from './AuthPasswordResetConfirmForm';
3
+ export * from './AuthResetPasswordForm';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/password/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './AuthForgotPasswordForm';
2
+ export * from './AuthPasswordResetConfirmForm';
3
+ export * from './AuthResetPasswordForm';
@@ -0,0 +1,24 @@
1
+ import { SelectOption } from '../../../forms';
2
+ export type AuthOtpSignInFormValues = {
3
+ countryCode: string;
4
+ phone: string;
5
+ code?: string;
6
+ };
7
+ export type AuthOtpSignInFormProps = {
8
+ defaultValues?: Partial<AuthOtpSignInFormValues>;
9
+ countryCodeOptions?: SelectOption<string>[];
10
+ requestRoleSelection?: () => Promise<string | undefined>;
11
+ countryCodes?: string[];
12
+ loading?: boolean;
13
+ onRequestOtp: (values: {
14
+ phone: string;
15
+ }) => unknown | Promise<unknown>;
16
+ onVerifyOtp: (values: {
17
+ phone: string;
18
+ code: string;
19
+ role?: string;
20
+ }) => unknown | Promise<unknown>;
21
+ onBackToPassword?: () => void;
22
+ };
23
+ export declare function AuthOtpSignInForm(props: AuthOtpSignInFormProps): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=AuthOtpSignInForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthOtpSignInForm.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/sign-in/AuthOtpSignInForm.tsx"],"names":[],"mappings":"AAYA,OAAO,EAA8B,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAK1E,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACjD,kBAAkB,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5C,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpG,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAQF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CAsX9D"}
@@ -0,0 +1,226 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import Alert from '@mui/material/Alert';
4
+ import Dialog from '@mui/material/Dialog';
5
+ import DialogActions from '@mui/material/DialogActions';
6
+ import DialogContent from '@mui/material/DialogContent';
7
+ import DialogContentText from '@mui/material/DialogContentText';
8
+ import DialogTitle from '@mui/material/DialogTitle';
9
+ import Stack from '@mui/material/Stack';
10
+ import { useEffect, useState } from 'react';
11
+ import { useForm } from 'react-hook-form';
12
+ import { z } from 'zod';
13
+ import { JBSelectField, JBTextField } from '../../../forms';
14
+ import { COUNTRY_CALLING_CODE_OPTIONS, DEFAULT_OTP_COUNTRY_CODE } from '../../constants';
15
+ import { AuthPrimaryButton, AuthSecondaryButton } from '../../ui';
16
+ import { parseAuthError } from '../errorParser';
17
+ const otpSchema = z.object({
18
+ countryCode: z.string().nonempty('Selecciona la lada'),
19
+ phone: z.string().nonempty('Debes ingresar tu teléfono'),
20
+ code: z.string().optional()
21
+ });
22
+ export function AuthOtpSignInForm(props) {
23
+ const { defaultValues, countryCodeOptions, requestRoleSelection, countryCodes, loading = false, onRequestOtp, onVerifyOtp, onBackToPassword } = props;
24
+ const resolvedCountryCodeOptions = countryCodeOptions ??
25
+ (countryCodes?.length
26
+ ? countryCodes.map((code) => ({ value: code, label: code }))
27
+ : COUNTRY_CALLING_CODE_OPTIONS);
28
+ const defaultCountryCode = resolvedCountryCodeOptions.some((item) => item.value === DEFAULT_OTP_COUNTRY_CODE)
29
+ ? DEFAULT_OTP_COUNTRY_CODE
30
+ : `${resolvedCountryCodeOptions[0]?.value ?? DEFAULT_OTP_COUNTRY_CODE}`;
31
+ const [otpRequested, setOtpRequested] = useState(false);
32
+ const [infoMessage, setInfoMessage] = useState(null);
33
+ const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false);
34
+ const [pendingOtpRequestValues, setPendingOtpRequestValues] = useState(null);
35
+ const [shouldSelectRoleOnVerify, setShouldSelectRoleOnVerify] = useState(false);
36
+ const { control, formState, handleSubmit, setError, clearErrors, watch } = useForm({
37
+ mode: 'onChange',
38
+ defaultValues: {
39
+ countryCode: defaultValues?.countryCode ?? defaultCountryCode,
40
+ phone: defaultValues?.phone ?? '',
41
+ code: defaultValues?.code ?? ''
42
+ },
43
+ resolver: zodResolver(otpSchema)
44
+ });
45
+ const { errors, isSubmitting } = formState;
46
+ const countryCodeValue = watch('countryCode');
47
+ const phoneValue = watch('phone');
48
+ const codeValue = watch('code');
49
+ const isLoading = loading || isSubmitting;
50
+ const isRequestOtpButtonDisabled = isLoading || !countryCodeValue?.trim() || !phoneValue?.trim();
51
+ const isVerifyButtonDisabled = isLoading || !countryCodeValue?.trim() || !phoneValue?.trim() || !codeValue?.trim();
52
+ useEffect(() => {
53
+ const subscription = watch((_value, { name }) => {
54
+ if (name) {
55
+ clearErrors(name);
56
+ }
57
+ clearErrors('root');
58
+ });
59
+ return () => {
60
+ subscription.unsubscribe();
61
+ };
62
+ }, [watch, clearErrors]);
63
+ function parseBooleanLike(value) {
64
+ if (typeof value === 'boolean') {
65
+ return value;
66
+ }
67
+ if (typeof value === 'string') {
68
+ const normalized = value.trim().toLowerCase();
69
+ if (normalized === 'true') {
70
+ return true;
71
+ }
72
+ if (normalized === 'false') {
73
+ return false;
74
+ }
75
+ }
76
+ if (typeof value === 'number') {
77
+ if (value === 1) {
78
+ return true;
79
+ }
80
+ if (value === 0) {
81
+ return false;
82
+ }
83
+ }
84
+ return undefined;
85
+ }
86
+ function getUserExistsFromRecord(record) {
87
+ const direct = parseBooleanLike(record.userExist) ??
88
+ parseBooleanLike(record.userExists) ??
89
+ parseBooleanLike(record.user_exist) ??
90
+ parseBooleanLike(record.user_exists);
91
+ if (typeof direct === 'boolean') {
92
+ return direct;
93
+ }
94
+ const nestedCandidates = [record.data, record.result, record.payload];
95
+ for (const candidate of nestedCandidates) {
96
+ if (candidate && typeof candidate === 'object') {
97
+ const nested = getUserExistsFromRecord(candidate);
98
+ if (typeof nested === 'boolean') {
99
+ return nested;
100
+ }
101
+ }
102
+ }
103
+ return undefined;
104
+ }
105
+ function getUserExistsFromResponse(response) {
106
+ if (!response || typeof response !== 'object') {
107
+ return undefined;
108
+ }
109
+ return getUserExistsFromRecord(response);
110
+ }
111
+ function applySubmitError(error) {
112
+ const parsed = parseAuthError(error);
113
+ const allowedFields = ['countryCode', 'phone', 'code'];
114
+ Object.entries(parsed.fieldErrors).forEach(([field, message]) => {
115
+ if (allowedFields.includes(field)) {
116
+ setError(field, {
117
+ type: 'manual',
118
+ message
119
+ });
120
+ return;
121
+ }
122
+ setError('root', {
123
+ type: 'manual',
124
+ message
125
+ });
126
+ });
127
+ if (parsed.rootMessage) {
128
+ setError('root', {
129
+ type: 'manual',
130
+ message: parsed.rootMessage
131
+ });
132
+ return;
133
+ }
134
+ setError('root', {
135
+ type: 'manual',
136
+ message: otpRequested ? 'Código OTP inválido.' : 'No se pudo solicitar el código OTP.'
137
+ });
138
+ }
139
+ async function verifyOtp(values, selectedRole) {
140
+ const normalizedPhone = `${values.countryCode}${values.phone}`.replace(/\s+/g, '');
141
+ if (!values.code) {
142
+ setError('code', { type: 'manual', message: 'Debes ingresar el código OTP' });
143
+ return;
144
+ }
145
+ await onVerifyOtp({
146
+ phone: normalizedPhone,
147
+ code: values.code,
148
+ role: selectedRole
149
+ });
150
+ }
151
+ async function requestOtp(values) {
152
+ const normalizedPhone = `${values.countryCode}${values.phone}`.replace(/\s+/g, '');
153
+ const response = await onRequestOtp({ phone: normalizedPhone });
154
+ const userExists = getUserExistsFromResponse(response);
155
+ setShouldSelectRoleOnVerify(Boolean(requestRoleSelection) && userExists === false);
156
+ setOtpRequested(true);
157
+ setInfoMessage('Código SMS enviado.');
158
+ }
159
+ async function onSubmit(values) {
160
+ try {
161
+ if (!otpRequested) {
162
+ setPendingOtpRequestValues(values);
163
+ setIsConfirmDialogOpen(true);
164
+ return;
165
+ }
166
+ let selectedRole;
167
+ if (shouldSelectRoleOnVerify && requestRoleSelection) {
168
+ selectedRole = await requestRoleSelection();
169
+ if (!selectedRole) {
170
+ return;
171
+ }
172
+ }
173
+ await verifyOtp(values, selectedRole);
174
+ }
175
+ catch (error) {
176
+ applySubmitError(error);
177
+ }
178
+ }
179
+ async function onConfirmOtpRequest() {
180
+ if (!pendingOtpRequestValues) {
181
+ setIsConfirmDialogOpen(false);
182
+ return;
183
+ }
184
+ try {
185
+ setError('root', {
186
+ type: 'manual',
187
+ message: ''
188
+ });
189
+ await requestOtp(pendingOtpRequestValues);
190
+ setIsConfirmDialogOpen(false);
191
+ setPendingOtpRequestValues(null);
192
+ }
193
+ catch (error) {
194
+ setIsConfirmDialogOpen(false);
195
+ const parsed = parseAuthError(error);
196
+ if (parsed.rootMessage) {
197
+ setError('root', {
198
+ type: 'manual',
199
+ message: parsed.rootMessage
200
+ });
201
+ return;
202
+ }
203
+ setError('root', {
204
+ type: 'manual',
205
+ message: 'No se pudo solicitar el código OTP.'
206
+ });
207
+ }
208
+ }
209
+ function onChangePhoneNumber() {
210
+ setOtpRequested(false);
211
+ setInfoMessage(null);
212
+ setPendingOtpRequestValues(null);
213
+ setIsConfirmDialogOpen(false);
214
+ setShouldSelectRoleOnVerify(false);
215
+ }
216
+ return (_jsxs(_Fragment, { children: [_jsxs("form", { name: "loginFormOtp", noValidate: true, style: { display: 'flex', width: '100%', flexDirection: 'column', justifyContent: 'center', paddingTop: 4 }, onSubmit: handleSubmit(onSubmit), children: [_jsxs(Stack, { direction: "row", spacing: 2, sx: { mb: 3 }, children: [_jsx(JBSelectField, { control: control, name: "countryCode", label: "Lada", variant: "outlined", sx: { width: 184 }, options: resolvedCountryCodeOptions, required: true, disabled: otpRequested }), _jsx(JBTextField, { control: control, name: "phone", label: "Tel\u00E9fono", autoFocus: true, type: "tel", variant: "outlined", required: true, fullWidth: true, disabled: otpRequested })] }), otpRequested ? (_jsx(JBTextField, { control: control, name: "code", sx: { mb: 3 }, label: "C\u00F3digo OTP", type: "text", variant: "outlined", required: true, fullWidth: true })) : null, infoMessage ? (_jsx(Alert, { sx: { mb: 2 }, severity: "info", children: infoMessage })) : null, errors.root?.message ? (_jsx(Alert, { sx: { mb: 2 }, severity: "error", children: errors.root.message })) : null, !otpRequested ? (_jsx(AuthPrimaryButton, { sx: { mt: 2 }, "aria-label": "Solicitar c\u00F3digo OTP", disabled: isRequestOtpButtonDisabled, loading: isLoading, loadingLabel: "Solicitando OTP...", type: "submit", size: "large", children: "Solicitar OTP" })) : null, otpRequested ? (_jsxs(_Fragment, { children: [_jsx(AuthPrimaryButton, { sx: { mt: 2 }, "aria-label": "Verificar c\u00F3digo OTP", disabled: isVerifyButtonDisabled, loading: isLoading, loadingLabel: "Verificando OTP...", type: "submit", size: "large", children: "Verificar OTP" }), _jsx(AuthSecondaryButton, { sx: { mt: 2 }, type: "button", onClick: onChangePhoneNumber, children: "Cambiar n\u00FAmero" })] })) : null, _jsx(AuthSecondaryButton, { sx: { mt: 2 }, type: "button", onClick: onBackToPassword, children: "Usar contrase\u00F1a" })] }), _jsxs(Dialog, { open: isConfirmDialogOpen, onClose: () => {
217
+ setIsConfirmDialogOpen(false);
218
+ }, fullWidth: true, maxWidth: "xs", children: [_jsx(DialogTitle, { children: "Confirmar n\u00FAmero" }), _jsx(DialogContent, { children: _jsx(DialogContentText, { children: `¿Es correcto este número? ${pendingOtpRequestValues
219
+ ? `${pendingOtpRequestValues.countryCode}${pendingOtpRequestValues.phone}`.replace(/\s+/g, '')
220
+ : ''}` }) }), _jsxs(DialogActions, { children: [_jsx(AuthSecondaryButton, { sx: { mt: 0 }, type: "button", onClick: () => {
221
+ setIsConfirmDialogOpen(false);
222
+ setPendingOtpRequestValues(null);
223
+ }, children: "Cancelar" }), _jsx(AuthPrimaryButton, { sx: { mt: 0 }, type: "button", onClick: () => {
224
+ void onConfirmOtpRequest();
225
+ }, children: "Confirmar" })] })] })] }));
226
+ }
@@ -0,0 +1,21 @@
1
+ import type { AuthLinkComponent } from '../../ui';
2
+ export type AuthPasswordSignInFormValues = {
3
+ login: string;
4
+ password: string;
5
+ remember?: boolean;
6
+ };
7
+ export type AuthPasswordSignInFormProps = {
8
+ defaultValues?: Partial<AuthPasswordSignInFormValues>;
9
+ loading?: boolean;
10
+ submitLabel?: string;
11
+ forgotPasswordPath?: string;
12
+ rememberLabel?: string;
13
+ loginLabel?: string;
14
+ passwordLabel?: string;
15
+ accountConfirmationPath?: string;
16
+ verifyAccountLabel?: string;
17
+ LinkComponent?: AuthLinkComponent;
18
+ onSubmit: (values: AuthPasswordSignInFormValues) => unknown | Promise<unknown>;
19
+ };
20
+ export declare function AuthPasswordSignInForm(props: AuthPasswordSignInFormProps): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=AuthPasswordSignInForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthPasswordSignInForm.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/sign-in/AuthPasswordSignInForm.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChF,CAAC;AAWF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,2CAkMxE"}
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import Alert from '@mui/material/Alert';
4
+ import Box from '@mui/material/Box';
5
+ import { useEffect } from 'react';
6
+ import { useForm } from 'react-hook-form';
7
+ import { z } from 'zod';
8
+ import { JBCheckboxField, JBTextField } from '../../../forms';
9
+ import { AuthPrimaryButton, AuthSecondaryButton } from '../../ui';
10
+ import { parseAuthError } from '../errorParser';
11
+ const signInSchema = z.object({
12
+ login: z.string().nonempty('Debes ingresar tu usuario o correo'),
13
+ password: z
14
+ .string()
15
+ .min(4, 'La contraseña es muy corta - mínimo 4 caracteres.')
16
+ .nonempty('Debes ingresar tu contraseña.'),
17
+ remember: z.boolean().optional()
18
+ });
19
+ export function AuthPasswordSignInForm(props) {
20
+ const { defaultValues, loading = false, submitLabel = 'Iniciar sesión', forgotPasswordPath = '/forgot-password', rememberLabel = 'Recuérdame', loginLabel = 'Usuario o correo', passwordLabel = 'Contraseña', accountConfirmationPath = '/verify-email', verifyAccountLabel = 'Ir a verificar cuenta', LinkComponent, onSubmit } = props;
21
+ const { control, formState, handleSubmit, setError, clearErrors, watch } = useForm({
22
+ mode: 'onChange',
23
+ defaultValues: {
24
+ login: defaultValues?.login ?? '',
25
+ password: defaultValues?.password ?? '',
26
+ remember: defaultValues?.remember ?? true
27
+ },
28
+ resolver: zodResolver(signInSchema)
29
+ });
30
+ const { errors, isSubmitting } = formState;
31
+ const loginValue = watch('login');
32
+ const passwordValue = watch('password');
33
+ const isLoading = loading || isSubmitting;
34
+ useEffect(() => {
35
+ const subscription = watch((_value, { name }) => {
36
+ if (name) {
37
+ clearErrors(name);
38
+ }
39
+ clearErrors('root');
40
+ });
41
+ return () => {
42
+ subscription.unsubscribe();
43
+ };
44
+ }, [watch, clearErrors]);
45
+ const normalizeText = (value) => value
46
+ .normalize('NFD')
47
+ .replace(/[\u0300-\u036f]/g, '')
48
+ .toLowerCase();
49
+ const shouldShowVerifyAccountCta = (message) => {
50
+ if (!message) {
51
+ return false;
52
+ }
53
+ const normalizedMessage = normalizeText(message);
54
+ return normalizedMessage.includes('no esta verificada') || normalizedMessage.includes('not verified');
55
+ };
56
+ const getAccountConfirmationTo = () => {
57
+ const login = loginValue?.trim() ?? '';
58
+ const isEmail = login.includes('@');
59
+ if (!isEmail) {
60
+ return accountConfirmationPath;
61
+ }
62
+ return `${accountConfirmationPath}?email=${encodeURIComponent(login)}`;
63
+ };
64
+ async function onSubmitForm(values) {
65
+ try {
66
+ await onSubmit(values);
67
+ }
68
+ catch (error) {
69
+ const parsed = parseAuthError(error, {
70
+ username: 'login'
71
+ });
72
+ const allowedFields = ['login', 'password', 'remember'];
73
+ Object.entries(parsed.fieldErrors).forEach(([field, message]) => {
74
+ if (allowedFields.includes(field)) {
75
+ setError(field, {
76
+ type: 'manual',
77
+ message
78
+ });
79
+ return;
80
+ }
81
+ setError('root', {
82
+ type: 'manual',
83
+ message
84
+ });
85
+ });
86
+ if (parsed.rootMessage) {
87
+ setError('root', {
88
+ type: 'manual',
89
+ message: parsed.rootMessage
90
+ });
91
+ return;
92
+ }
93
+ setError('root', {
94
+ type: 'manual',
95
+ message: 'No se pudo iniciar sesión. Inténtalo de nuevo.'
96
+ });
97
+ }
98
+ }
99
+ return (_jsxs("form", { name: "loginForm", noValidate: true, style: { display: 'flex', width: '100%', flexDirection: 'column', justifyContent: 'center', paddingTop: 4 }, onSubmit: handleSubmit(onSubmitForm), children: [_jsx(JBTextField, { control: control, name: "login", sx: { mb: 3 }, label: loginLabel, autoFocus: true, type: "text", variant: "outlined", required: true, fullWidth: true }), _jsx(JBTextField, { control: control, name: "password", sx: { mb: 3 }, label: passwordLabel, type: "password", variant: "outlined", required: true, fullWidth: true }), _jsxs(Box, { sx: {
100
+ display: 'flex',
101
+ flexDirection: { xs: 'column', sm: 'row' },
102
+ alignItems: 'center',
103
+ justifyContent: { xs: 'center', sm: 'space-between' },
104
+ gap: { xs: 1.5, sm: 0 }
105
+ }, children: [_jsx(JBCheckboxField, { control: control, name: "remember", label: rememberLabel, formControlProps: {
106
+ sx: {
107
+ m: 0
108
+ }
109
+ }, formControlLabelProps: {
110
+ sx: {
111
+ '& .MuiFormControlLabel-label': {
112
+ fontWeight: 500
113
+ }
114
+ }
115
+ }, checkboxSx: {
116
+ '&.Mui-checked .MuiSvgIcon-root': {
117
+ color: 'secondary.main'
118
+ }
119
+ } }), LinkComponent ? _jsx(LinkComponent, { to: forgotPasswordPath, children: "\u00BFOlvidaste tu contrase\u00F1a?" }) : null] }), _jsx(AuthPrimaryButton, { sx: { mt: 2 }, "aria-label": submitLabel, disabled: isLoading || !loginValue?.trim() || !passwordValue, loading: isLoading, loadingLabel: "Iniciando sesi\u00F3n...", type: "submit", size: "large", children: submitLabel }), LinkComponent && shouldShowVerifyAccountCta(errors.root?.message) ? (_jsx(AuthSecondaryButton, { sx: { mt: 1.5 }, component: LinkComponent, to: getAccountConfirmationTo(), children: verifyAccountLabel })) : null, errors.root?.message && (_jsx(Alert, { sx: { mt: 2 }, severity: "error", children: errors.root.message }))] }));
120
+ }
@@ -0,0 +1,3 @@
1
+ export * from './AuthPasswordSignInForm';
2
+ export * from './AuthOtpSignInForm';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/sign-in/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './AuthPasswordSignInForm';
2
+ export * from './AuthOtpSignInForm';