@joelbarron/react-web-dev-kit 0.1.9 → 0.1.10

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 (271) hide show
  1. package/dist/auth/client.d.ts +46 -0
  2. package/dist/auth/client.d.ts.map +1 -0
  3. package/dist/auth/client.js +379 -0
  4. package/dist/auth/constants/countryCallingCodes.d.ts +9 -0
  5. package/dist/auth/constants/countryCallingCodes.d.ts.map +1 -0
  6. package/dist/auth/constants/countryCallingCodes.js +209 -0
  7. package/dist/auth/constants/gender.d.ts +9 -0
  8. package/dist/auth/constants/gender.d.ts.map +1 -0
  9. package/dist/auth/constants/gender.js +12 -0
  10. package/dist/auth/constants/index.d.ts +3 -0
  11. package/dist/auth/constants/index.d.ts.map +1 -0
  12. package/dist/auth/constants/index.js +2 -0
  13. package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts +18 -0
  14. package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts.map +1 -0
  15. package/dist/auth/forms/account/AuthAccountConfirmationForm.js +167 -0
  16. package/dist/auth/forms/account/index.d.ts +2 -0
  17. package/dist/auth/forms/account/index.d.ts.map +1 -0
  18. package/dist/auth/forms/account/index.js +1 -0
  19. package/dist/auth/forms/errorParser.d.ts +7 -0
  20. package/dist/auth/forms/errorParser.d.ts.map +1 -0
  21. package/dist/auth/forms/errorParser.js +65 -0
  22. package/dist/auth/forms/index.d.ts +6 -0
  23. package/dist/auth/forms/index.d.ts.map +1 -0
  24. package/dist/auth/forms/index.js +5 -0
  25. package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts +16 -0
  26. package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts.map +1 -0
  27. package/dist/auth/forms/password/AuthForgotPasswordForm.js +109 -0
  28. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts +17 -0
  29. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts.map +1 -0
  30. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.js +163 -0
  31. package/dist/auth/forms/password/AuthResetPasswordForm.d.ts +12 -0
  32. package/dist/auth/forms/password/AuthResetPasswordForm.d.ts.map +1 -0
  33. package/dist/auth/forms/password/AuthResetPasswordForm.js +22 -0
  34. package/dist/auth/forms/password/index.d.ts +4 -0
  35. package/dist/auth/forms/password/index.d.ts.map +1 -0
  36. package/dist/auth/forms/password/index.js +3 -0
  37. package/dist/auth/forms/password/passwordValidation.d.ts +3 -0
  38. package/dist/auth/forms/password/passwordValidation.d.ts.map +1 -0
  39. package/dist/auth/forms/password/passwordValidation.js +45 -0
  40. package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts +24 -0
  41. package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts.map +1 -0
  42. package/dist/auth/forms/sign-in/AuthOtpSignInForm.js +227 -0
  43. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts +22 -0
  44. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts.map +1 -0
  45. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.js +148 -0
  46. package/dist/auth/forms/sign-in/index.d.ts +3 -0
  47. package/dist/auth/forms/sign-in/index.d.ts.map +1 -0
  48. package/dist/auth/forms/sign-in/index.js +2 -0
  49. package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts +37 -0
  50. package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts.map +1 -0
  51. package/dist/auth/forms/sign-up/AuthSignUpForm.js +193 -0
  52. package/dist/auth/forms/sign-up/index.d.ts +2 -0
  53. package/dist/auth/forms/sign-up/index.d.ts.map +1 -0
  54. package/dist/auth/forms/sign-up/index.js +1 -0
  55. package/dist/auth/fuse/createFuseAuthViews.d.ts +25 -0
  56. package/dist/auth/fuse/createFuseAuthViews.d.ts.map +1 -0
  57. package/dist/auth/fuse/createFuseAuthViews.js +510 -0
  58. package/dist/auth/fuse/fuseAdapter.d.ts +42 -0
  59. package/dist/auth/fuse/fuseAdapter.d.ts.map +1 -0
  60. package/dist/auth/fuse/fuseAdapter.js +291 -0
  61. package/dist/auth/fuse/fuseIntegration.d.ts +74 -0
  62. package/dist/auth/fuse/fuseIntegration.d.ts.map +1 -0
  63. package/dist/auth/fuse/fuseIntegration.js +121 -0
  64. package/dist/auth/fuse/index.d.ts +4 -0
  65. package/dist/auth/fuse/index.d.ts.map +1 -0
  66. package/dist/auth/fuse/index.js +3 -0
  67. package/dist/auth/index.d.ts +11 -0
  68. package/dist/auth/index.d.ts.map +1 -0
  69. package/dist/auth/index.js +10 -0
  70. package/dist/auth/provider.d.ts +35 -0
  71. package/dist/auth/provider.d.ts.map +1 -0
  72. package/dist/auth/provider.js +133 -0
  73. package/dist/auth/query.d.ts +23 -0
  74. package/dist/auth/query.d.ts.map +1 -0
  75. package/dist/auth/query.js +103 -0
  76. package/dist/auth/routes.d.ts +37 -0
  77. package/dist/auth/routes.d.ts.map +1 -0
  78. package/dist/auth/routes.js +75 -0
  79. package/dist/auth/social/providerAuth.d.ts +101 -0
  80. package/dist/auth/social/providerAuth.d.ts.map +1 -0
  81. package/dist/auth/social/providerAuth.js +207 -0
  82. package/dist/auth/storage.d.ts +3 -0
  83. package/dist/auth/storage.d.ts.map +1 -0
  84. package/dist/auth/storage.js +20 -0
  85. package/dist/auth/types.d.ts +238 -0
  86. package/dist/auth/types.d.ts.map +1 -0
  87. package/dist/auth/types.js +1 -0
  88. package/dist/auth/ui/AuthPageTitle.d.ts +7 -0
  89. package/dist/auth/ui/AuthPageTitle.d.ts.map +1 -0
  90. package/dist/auth/ui/AuthPageTitle.js +7 -0
  91. package/dist/auth/ui/AuthPagesMessageSection.d.ts +3 -0
  92. package/dist/auth/ui/AuthPagesMessageSection.d.ts.map +1 -0
  93. package/dist/auth/ui/AuthPagesMessageSection.js +39 -0
  94. package/dist/auth/ui/AuthPrimaryButton.d.ts +9 -0
  95. package/dist/auth/ui/AuthPrimaryButton.d.ts.map +1 -0
  96. package/dist/auth/ui/AuthPrimaryButton.js +19 -0
  97. package/dist/auth/ui/AuthRoleSelectionDialog.d.ts +14 -0
  98. package/dist/auth/ui/AuthRoleSelectionDialog.d.ts.map +1 -0
  99. package/dist/auth/ui/AuthRoleSelectionDialog.js +39 -0
  100. package/dist/auth/ui/AuthRoutePageWrapper.d.ts +12 -0
  101. package/dist/auth/ui/AuthRoutePageWrapper.d.ts.map +1 -0
  102. package/dist/auth/ui/AuthRoutePageWrapper.js +61 -0
  103. package/dist/auth/ui/AuthSecondaryButton.d.ts +7 -0
  104. package/dist/auth/ui/AuthSecondaryButton.d.ts.map +1 -0
  105. package/dist/auth/ui/AuthSecondaryButton.js +18 -0
  106. package/dist/auth/ui/AuthSocialProviderButton.d.ts +11 -0
  107. package/dist/auth/ui/AuthSocialProviderButton.d.ts.map +1 -0
  108. package/dist/auth/ui/AuthSocialProviderButton.js +33 -0
  109. package/dist/auth/ui/index.d.ts +9 -0
  110. package/dist/auth/ui/index.d.ts.map +1 -0
  111. package/dist/auth/ui/index.js +8 -0
  112. package/dist/auth/ui/types.d.ts +15 -0
  113. package/dist/auth/ui/types.d.ts.map +1 -0
  114. package/dist/auth/ui/types.js +1 -0
  115. package/dist/config/createConfig.d.ts +14 -0
  116. package/dist/config/createConfig.d.ts.map +1 -0
  117. package/dist/config/createConfig.js +179 -0
  118. package/dist/config/defaults.d.ts +3 -0
  119. package/dist/config/defaults.d.ts.map +1 -0
  120. package/dist/config/defaults.js +39 -0
  121. package/dist/config/index.d.ts +5 -0
  122. package/dist/config/index.d.ts.map +1 -0
  123. package/dist/config/index.js +4 -0
  124. package/dist/config/merge.d.ts +2 -0
  125. package/dist/config/merge.d.ts.map +1 -0
  126. package/dist/config/merge.js +18 -0
  127. package/dist/config/types.d.ts +53 -0
  128. package/dist/config/types.d.ts.map +1 -0
  129. package/dist/config/types.js +1 -0
  130. package/dist/core/buttons/JBButton.d.ts +8 -0
  131. package/dist/core/buttons/JBButton.d.ts.map +1 -0
  132. package/dist/core/buttons/JBButton.js +55 -0
  133. package/dist/core/buttons/index.d.ts +2 -0
  134. package/dist/core/buttons/index.d.ts.map +1 -0
  135. package/dist/core/buttons/index.js +1 -0
  136. package/dist/core/dialogs/JBConfirmDialog.d.ts +15 -0
  137. package/dist/core/dialogs/JBConfirmDialog.d.ts.map +1 -0
  138. package/dist/core/dialogs/JBConfirmDialog.js +6 -0
  139. package/dist/core/dialogs/index.d.ts +2 -0
  140. package/dist/core/dialogs/index.d.ts.map +1 -0
  141. package/dist/core/dialogs/index.js +1 -0
  142. package/dist/core/index.d.ts +5 -0
  143. package/dist/core/index.d.ts.map +1 -0
  144. package/dist/core/index.js +4 -0
  145. package/dist/core/layout/JBContentContainer.d.ts +31 -0
  146. package/dist/core/layout/JBContentContainer.d.ts.map +1 -0
  147. package/dist/core/layout/JBContentContainer.js +50 -0
  148. package/dist/core/layout/JBFormHeader.d.ts +3 -0
  149. package/dist/core/layout/JBFormHeader.d.ts.map +1 -0
  150. package/dist/core/layout/JBFormHeader.js +131 -0
  151. package/dist/core/layout/index.d.ts +3 -0
  152. package/dist/core/layout/index.d.ts.map +1 -0
  153. package/dist/core/layout/index.js +2 -0
  154. package/dist/core/skeletons/JBFormContentSkeleton.d.ts +5 -0
  155. package/dist/core/skeletons/JBFormContentSkeleton.d.ts.map +1 -0
  156. package/dist/core/skeletons/JBFormContentSkeleton.js +12 -0
  157. package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts +6 -0
  158. package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts.map +1 -0
  159. package/dist/core/skeletons/JBFormHeaderSkeleton.js +19 -0
  160. package/dist/core/skeletons/index.d.ts +3 -0
  161. package/dist/core/skeletons/index.d.ts.map +1 -0
  162. package/dist/core/skeletons/index.js +2 -0
  163. package/dist/forms/JBAutocompleteField.d.ts +12 -0
  164. package/dist/forms/JBAutocompleteField.d.ts.map +1 -0
  165. package/dist/forms/JBAutocompleteField.js +20 -0
  166. package/dist/forms/JBCheckboxField.d.ts +12 -0
  167. package/dist/forms/JBCheckboxField.d.ts.map +1 -0
  168. package/dist/forms/JBCheckboxField.js +36 -0
  169. package/dist/forms/JBDatePickerField.d.ts +13 -0
  170. package/dist/forms/JBDatePickerField.d.ts.map +1 -0
  171. package/dist/forms/JBDatePickerField.js +67 -0
  172. package/dist/forms/JBRadioGroupField.d.ts +10 -0
  173. package/dist/forms/JBRadioGroupField.d.ts.map +1 -0
  174. package/dist/forms/JBRadioGroupField.js +8 -0
  175. package/dist/forms/JBSelectField.d.ts +9 -0
  176. package/dist/forms/JBSelectField.d.ts.map +1 -0
  177. package/dist/forms/JBSelectField.js +8 -0
  178. package/dist/forms/JBSwitchField.d.ts +11 -0
  179. package/dist/forms/JBSwitchField.d.ts.map +1 -0
  180. package/dist/forms/JBSwitchField.js +10 -0
  181. package/dist/forms/JBTextField.d.ts +6 -0
  182. package/dist/forms/JBTextField.d.ts.map +1 -0
  183. package/dist/forms/JBTextField.js +8 -0
  184. package/dist/forms/JBTimePickerField.d.ts +12 -0
  185. package/dist/forms/JBTimePickerField.d.ts.map +1 -0
  186. package/dist/forms/JBTimePickerField.js +35 -0
  187. package/dist/forms/index.d.ts +13 -0
  188. package/dist/forms/index.d.ts.map +1 -0
  189. package/dist/forms/index.js +12 -0
  190. package/dist/forms/rules.d.ts +16 -0
  191. package/dist/forms/rules.d.ts.map +1 -0
  192. package/dist/forms/rules.js +21 -0
  193. package/dist/forms/types.d.ts +12 -0
  194. package/dist/forms/types.d.ts.map +1 -0
  195. package/dist/forms/types.js +1 -0
  196. package/dist/forms/utils.d.ts +5 -0
  197. package/dist/forms/utils.d.ts.map +1 -0
  198. package/dist/forms/utils.js +7 -0
  199. package/dist/forms/zod.d.ts +4 -0
  200. package/dist/forms/zod.d.ts.map +1 -0
  201. package/dist/forms/zod.js +9 -0
  202. package/dist/grid/JBGrid.d.ts +3 -0
  203. package/dist/grid/JBGrid.d.ts.map +1 -0
  204. package/dist/grid/JBGrid.js +338 -0
  205. package/dist/grid/JBGridHeader.d.ts +3 -0
  206. package/dist/grid/JBGridHeader.d.ts.map +1 -0
  207. package/dist/grid/JBGridHeader.js +93 -0
  208. package/dist/grid/JBGridLoading.d.ts +9 -0
  209. package/dist/grid/JBGridLoading.d.ts.map +1 -0
  210. package/dist/grid/JBGridLoading.js +14 -0
  211. package/dist/grid/JBGridProviders.d.ts +13 -0
  212. package/dist/grid/JBGridProviders.d.ts.map +1 -0
  213. package/dist/grid/JBGridProviders.js +54 -0
  214. package/dist/grid/JBGridSkeleton.d.ts +7 -0
  215. package/dist/grid/JBGridSkeleton.d.ts.map +1 -0
  216. package/dist/grid/JBGridSkeleton.js +6 -0
  217. package/dist/grid/defaults.d.ts +4 -0
  218. package/dist/grid/defaults.d.ts.map +1 -0
  219. package/dist/grid/defaults.js +29 -0
  220. package/dist/grid/index.d.ts +8 -0
  221. package/dist/grid/index.d.ts.map +1 -0
  222. package/dist/grid/index.js +7 -0
  223. package/dist/grid/types.d.ts +197 -0
  224. package/dist/grid/types.d.ts.map +1 -0
  225. package/dist/grid/types.js +1 -0
  226. package/dist/hooks/index.d.ts +4 -0
  227. package/dist/hooks/index.d.ts.map +1 -0
  228. package/dist/hooks/index.js +3 -0
  229. package/dist/hooks/useJBDebouncedValue.d.ts +2 -0
  230. package/dist/hooks/useJBDebouncedValue.d.ts.map +1 -0
  231. package/dist/hooks/useJBDebouncedValue.js +11 -0
  232. package/dist/hooks/useJBEntityFormController.d.ts +54 -0
  233. package/dist/hooks/useJBEntityFormController.d.ts.map +1 -0
  234. package/dist/hooks/useJBEntityFormController.js +156 -0
  235. package/dist/hooks/useJBRedirect.d.ts +10 -0
  236. package/dist/hooks/useJBRedirect.d.ts.map +1 -0
  237. package/dist/hooks/useJBRedirect.js +11 -0
  238. package/dist/index.d.ts +9 -0
  239. package/dist/index.d.ts.map +1 -0
  240. package/dist/index.js +8 -0
  241. package/dist/query/createQueryClient.d.ts +8 -0
  242. package/dist/query/createQueryClient.d.ts.map +1 -0
  243. package/dist/query/createQueryClient.js +25 -0
  244. package/dist/query/http.d.ts +3 -0
  245. package/dist/query/http.d.ts.map +1 -0
  246. package/dist/query/http.js +12 -0
  247. package/dist/query/index.d.ts +4 -0
  248. package/dist/query/index.d.ts.map +1 -0
  249. package/dist/query/index.js +3 -0
  250. package/dist/query/types.d.ts +7 -0
  251. package/dist/query/types.d.ts.map +1 -0
  252. package/dist/query/types.js +1 -0
  253. package/dist/utils/errors.d.ts +10 -0
  254. package/dist/utils/errors.d.ts.map +1 -0
  255. package/dist/utils/errors.js +55 -0
  256. package/dist/utils/format.d.ts +4 -0
  257. package/dist/utils/format.d.ts.map +1 -0
  258. package/dist/utils/format.js +28 -0
  259. package/dist/utils/geo.d.ts +9 -0
  260. package/dist/utils/geo.d.ts.map +1 -0
  261. package/dist/utils/geo.js +186 -0
  262. package/dist/utils/index.d.ts +6 -0
  263. package/dist/utils/index.d.ts.map +1 -0
  264. package/dist/utils/index.js +5 -0
  265. package/dist/utils/query.d.ts +2 -0
  266. package/dist/utils/query.d.ts.map +1 -0
  267. package/dist/utils/query.js +4 -0
  268. package/dist/utils/regex.d.ts +7 -0
  269. package/dist/utils/regex.d.ts.map +1 -0
  270. package/dist/utils/regex.js +6 -0
  271. package/package.json +3 -1
@@ -0,0 +1,227 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import ArrowBackOutlinedIcon from '@mui/icons-material/ArrowBackOutlined';
4
+ import Alert from '@mui/material/Alert';
5
+ import Dialog from '@mui/material/Dialog';
6
+ import DialogActions from '@mui/material/DialogActions';
7
+ import DialogContent from '@mui/material/DialogContent';
8
+ import DialogContentText from '@mui/material/DialogContentText';
9
+ import DialogTitle from '@mui/material/DialogTitle';
10
+ import Stack from '@mui/material/Stack';
11
+ import { useEffect, useState } from 'react';
12
+ import { useForm } from 'react-hook-form';
13
+ import { z } from 'zod';
14
+ import { JBSelectField, JBTextField } from '../../../forms';
15
+ import { COUNTRY_CALLING_CODE_OPTIONS, DEFAULT_OTP_COUNTRY_CODE } from '../../constants';
16
+ import { AuthPrimaryButton, AuthSecondaryButton } from '../../ui';
17
+ import { parseAuthError } from '../errorParser';
18
+ const otpSchema = z.object({
19
+ countryCode: z.string().nonempty('Selecciona la lada'),
20
+ phone: z.string().nonempty('Debes ingresar tu teléfono'),
21
+ code: z.string().optional()
22
+ });
23
+ export function AuthOtpSignInForm(props) {
24
+ const { defaultValues, countryCodeOptions, requestRoleSelection, countryCodes, loading = false, onRequestOtp, onVerifyOtp, onBackToPassword } = props;
25
+ const resolvedCountryCodeOptions = countryCodeOptions ??
26
+ (countryCodes?.length
27
+ ? countryCodes.map((code) => ({ value: code, label: code }))
28
+ : COUNTRY_CALLING_CODE_OPTIONS);
29
+ const defaultCountryCode = resolvedCountryCodeOptions.some((item) => item.value === DEFAULT_OTP_COUNTRY_CODE)
30
+ ? DEFAULT_OTP_COUNTRY_CODE
31
+ : `${resolvedCountryCodeOptions[0]?.value ?? DEFAULT_OTP_COUNTRY_CODE}`;
32
+ const [otpRequested, setOtpRequested] = useState(false);
33
+ const [infoMessage, setInfoMessage] = useState(null);
34
+ const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false);
35
+ const [pendingOtpRequestValues, setPendingOtpRequestValues] = useState(null);
36
+ const [shouldSelectRoleOnVerify, setShouldSelectRoleOnVerify] = useState(false);
37
+ const { control, formState, handleSubmit, setError, clearErrors, watch } = useForm({
38
+ mode: 'onChange',
39
+ defaultValues: {
40
+ countryCode: defaultValues?.countryCode ?? defaultCountryCode,
41
+ phone: defaultValues?.phone ?? '',
42
+ code: defaultValues?.code ?? ''
43
+ },
44
+ resolver: zodResolver(otpSchema)
45
+ });
46
+ const { errors, isSubmitting } = formState;
47
+ const countryCodeValue = watch('countryCode');
48
+ const phoneValue = watch('phone');
49
+ const codeValue = watch('code');
50
+ const isLoading = loading || isSubmitting;
51
+ const isRequestOtpButtonDisabled = isLoading || !countryCodeValue?.trim() || !phoneValue?.trim();
52
+ const isVerifyButtonDisabled = isLoading || !countryCodeValue?.trim() || !phoneValue?.trim() || !codeValue?.trim();
53
+ useEffect(() => {
54
+ const subscription = watch((_value, { name }) => {
55
+ if (name) {
56
+ clearErrors(name);
57
+ }
58
+ clearErrors('root');
59
+ });
60
+ return () => {
61
+ subscription.unsubscribe();
62
+ };
63
+ }, [watch, clearErrors]);
64
+ function parseBooleanLike(value) {
65
+ if (typeof value === 'boolean') {
66
+ return value;
67
+ }
68
+ if (typeof value === 'string') {
69
+ const normalized = value.trim().toLowerCase();
70
+ if (normalized === 'true') {
71
+ return true;
72
+ }
73
+ if (normalized === 'false') {
74
+ return false;
75
+ }
76
+ }
77
+ if (typeof value === 'number') {
78
+ if (value === 1) {
79
+ return true;
80
+ }
81
+ if (value === 0) {
82
+ return false;
83
+ }
84
+ }
85
+ return undefined;
86
+ }
87
+ function getUserExistsFromRecord(record) {
88
+ const direct = parseBooleanLike(record.userExist) ??
89
+ parseBooleanLike(record.userExists) ??
90
+ parseBooleanLike(record.user_exist) ??
91
+ parseBooleanLike(record.user_exists);
92
+ if (typeof direct === 'boolean') {
93
+ return direct;
94
+ }
95
+ const nestedCandidates = [record.data, record.result, record.payload];
96
+ for (const candidate of nestedCandidates) {
97
+ if (candidate && typeof candidate === 'object') {
98
+ const nested = getUserExistsFromRecord(candidate);
99
+ if (typeof nested === 'boolean') {
100
+ return nested;
101
+ }
102
+ }
103
+ }
104
+ return undefined;
105
+ }
106
+ function getUserExistsFromResponse(response) {
107
+ if (!response || typeof response !== 'object') {
108
+ return undefined;
109
+ }
110
+ return getUserExistsFromRecord(response);
111
+ }
112
+ function applySubmitError(error) {
113
+ const parsed = parseAuthError(error);
114
+ const allowedFields = ['countryCode', 'phone', 'code'];
115
+ Object.entries(parsed.fieldErrors).forEach(([field, message]) => {
116
+ if (allowedFields.includes(field)) {
117
+ setError(field, {
118
+ type: 'manual',
119
+ message
120
+ });
121
+ return;
122
+ }
123
+ setError('root', {
124
+ type: 'manual',
125
+ message
126
+ });
127
+ });
128
+ if (parsed.rootMessage) {
129
+ setError('root', {
130
+ type: 'manual',
131
+ message: parsed.rootMessage
132
+ });
133
+ return;
134
+ }
135
+ setError('root', {
136
+ type: 'manual',
137
+ message: otpRequested ? 'Código OTP inválido.' : 'No se pudo solicitar el código OTP.'
138
+ });
139
+ }
140
+ async function verifyOtp(values, selectedRole) {
141
+ const normalizedPhone = `${values.countryCode}${values.phone}`.replace(/\s+/g, '');
142
+ if (!values.code) {
143
+ setError('code', { type: 'manual', message: 'Debes ingresar el código OTP' });
144
+ return;
145
+ }
146
+ await onVerifyOtp({
147
+ phone: normalizedPhone,
148
+ code: values.code,
149
+ role: selectedRole
150
+ });
151
+ }
152
+ async function requestOtp(values) {
153
+ const normalizedPhone = `${values.countryCode}${values.phone}`.replace(/\s+/g, '');
154
+ const response = await onRequestOtp({ phone: normalizedPhone });
155
+ const userExists = getUserExistsFromResponse(response);
156
+ setShouldSelectRoleOnVerify(Boolean(requestRoleSelection) && userExists === false);
157
+ setOtpRequested(true);
158
+ setInfoMessage('Código SMS enviado.');
159
+ }
160
+ async function onSubmit(values) {
161
+ try {
162
+ if (!otpRequested) {
163
+ setPendingOtpRequestValues(values);
164
+ setIsConfirmDialogOpen(true);
165
+ return;
166
+ }
167
+ let selectedRole;
168
+ if (shouldSelectRoleOnVerify && requestRoleSelection) {
169
+ selectedRole = await requestRoleSelection();
170
+ if (!selectedRole) {
171
+ return;
172
+ }
173
+ }
174
+ await verifyOtp(values, selectedRole);
175
+ }
176
+ catch (error) {
177
+ applySubmitError(error);
178
+ }
179
+ }
180
+ async function onConfirmOtpRequest() {
181
+ if (!pendingOtpRequestValues) {
182
+ setIsConfirmDialogOpen(false);
183
+ return;
184
+ }
185
+ try {
186
+ setError('root', {
187
+ type: 'manual',
188
+ message: ''
189
+ });
190
+ await requestOtp(pendingOtpRequestValues);
191
+ setIsConfirmDialogOpen(false);
192
+ setPendingOtpRequestValues(null);
193
+ }
194
+ catch (error) {
195
+ setIsConfirmDialogOpen(false);
196
+ const parsed = parseAuthError(error);
197
+ if (parsed.rootMessage) {
198
+ setError('root', {
199
+ type: 'manual',
200
+ message: parsed.rootMessage
201
+ });
202
+ return;
203
+ }
204
+ setError('root', {
205
+ type: 'manual',
206
+ message: 'No se pudo solicitar el código OTP.'
207
+ });
208
+ }
209
+ }
210
+ function onChangePhoneNumber() {
211
+ setOtpRequested(false);
212
+ setInfoMessage(null);
213
+ setPendingOtpRequestValues(null);
214
+ setIsConfirmDialogOpen(false);
215
+ setShouldSelectRoleOnVerify(false);
216
+ }
217
+ 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", startIcon: _jsx(ArrowBackOutlinedIcon, { fontSize: "small" }), onClick: onBackToPassword, children: "Regresar a iniciar sesi\u00F3n" })] }), _jsxs(Dialog, { open: isConfirmDialogOpen, onClose: () => {
218
+ setIsConfirmDialogOpen(false);
219
+ }, fullWidth: true, maxWidth: "xs", children: [_jsx(DialogTitle, { children: "Confirmar n\u00FAmero" }), _jsx(DialogContent, { children: _jsx(DialogContentText, { children: `¿Es correcto este número? ${pendingOtpRequestValues
220
+ ? `${pendingOtpRequestValues.countryCode}${pendingOtpRequestValues.phone}`.replace(/\s+/g, '')
221
+ : ''}` }) }), _jsxs(DialogActions, { children: [_jsx(AuthSecondaryButton, { sx: { mt: 0 }, type: "button", onClick: () => {
222
+ setIsConfirmDialogOpen(false);
223
+ setPendingOtpRequestValues(null);
224
+ }, children: "Cancelar" }), _jsx(AuthPrimaryButton, { sx: { mt: 0 }, type: "button", onClick: () => {
225
+ void onConfirmOtpRequest();
226
+ }, children: "Confirmar" })] })] })] }));
227
+ }
@@ -0,0 +1,22 @@
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
+ disabled?: boolean;
11
+ submitLabel?: string;
12
+ forgotPasswordPath?: string;
13
+ rememberLabel?: string;
14
+ loginLabel?: string;
15
+ passwordLabel?: string;
16
+ accountConfirmationPath?: string;
17
+ verifyAccountLabel?: string;
18
+ LinkComponent?: AuthLinkComponent;
19
+ onSubmit: (values: AuthPasswordSignInFormValues) => unknown | Promise<unknown>;
20
+ };
21
+ export declare function AuthPasswordSignInForm(props: AuthPasswordSignInFormProps): import("react/jsx-runtime").JSX.Element;
22
+ //# 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":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKlD,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,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,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;AAwBF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,2CA0OxE"}
@@ -0,0 +1,148 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import EmailOutlinedIcon from '@mui/icons-material/EmailOutlined';
4
+ import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined';
5
+ import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';
6
+ import Alert from '@mui/material/Alert';
7
+ import Box from '@mui/material/Box';
8
+ import IconButton from '@mui/material/IconButton';
9
+ import InputAdornment from '@mui/material/InputAdornment';
10
+ import { useEffect, useState } from 'react';
11
+ import { useForm } from 'react-hook-form';
12
+ import { z } from 'zod';
13
+ import { JBCheckboxField, JBTextField } from '../../../forms';
14
+ import { AuthPrimaryButton, AuthSecondaryButton } from '../../ui';
15
+ import { getDjangoLikePasswordError } from '../password/passwordValidation';
16
+ import { parseAuthError } from '../errorParser';
17
+ const signInSchema = z.object({
18
+ login: z.string().nonempty('Debes ingresar tu usuario o correo'),
19
+ password: z.string().superRefine((value, ctx) => {
20
+ if (!value) {
21
+ ctx.addIssue({
22
+ code: z.ZodIssueCode.custom,
23
+ message: 'Debes ingresar tu contraseña.'
24
+ });
25
+ return;
26
+ }
27
+ const passwordError = getDjangoLikePasswordError(value);
28
+ if (passwordError) {
29
+ ctx.addIssue({
30
+ code: z.ZodIssueCode.custom,
31
+ message: passwordError
32
+ });
33
+ }
34
+ }),
35
+ remember: z.boolean().optional()
36
+ });
37
+ export function AuthPasswordSignInForm(props) {
38
+ const { defaultValues, loading = false, disabled = 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;
39
+ const { control, formState, handleSubmit, setError, clearErrors, watch } = useForm({
40
+ mode: 'onChange',
41
+ defaultValues: {
42
+ login: defaultValues?.login ?? '',
43
+ password: defaultValues?.password ?? '',
44
+ remember: defaultValues?.remember ?? true
45
+ },
46
+ resolver: zodResolver(signInSchema)
47
+ });
48
+ const { errors, isSubmitting } = formState;
49
+ const loginValue = watch('login');
50
+ const passwordValue = watch('password');
51
+ const isLoading = loading || isSubmitting;
52
+ const [showPassword, setShowPassword] = useState(false);
53
+ useEffect(() => {
54
+ const subscription = watch((_value, { name }) => {
55
+ if (name) {
56
+ clearErrors(name);
57
+ }
58
+ clearErrors('root');
59
+ });
60
+ return () => {
61
+ subscription.unsubscribe();
62
+ };
63
+ }, [watch, clearErrors]);
64
+ const normalizeText = (value) => value
65
+ .normalize('NFD')
66
+ .replace(/[\u0300-\u036f]/g, '')
67
+ .toLowerCase();
68
+ const shouldShowVerifyAccountCta = (message) => {
69
+ if (!message) {
70
+ return false;
71
+ }
72
+ const normalizedMessage = normalizeText(message);
73
+ return normalizedMessage.includes('no esta verificada') || normalizedMessage.includes('not verified');
74
+ };
75
+ const getAccountConfirmationTo = () => {
76
+ const login = loginValue?.trim() ?? '';
77
+ const isEmail = login.includes('@');
78
+ if (!isEmail) {
79
+ return accountConfirmationPath;
80
+ }
81
+ return `${accountConfirmationPath}?email=${encodeURIComponent(login)}`;
82
+ };
83
+ async function onSubmitForm(values) {
84
+ try {
85
+ await onSubmit(values);
86
+ }
87
+ catch (error) {
88
+ const parsed = parseAuthError(error, {
89
+ username: 'login'
90
+ });
91
+ const allowedFields = ['login', 'password', 'remember'];
92
+ Object.entries(parsed.fieldErrors).forEach(([field, message]) => {
93
+ if (allowedFields.includes(field)) {
94
+ setError(field, {
95
+ type: 'manual',
96
+ message
97
+ });
98
+ return;
99
+ }
100
+ setError('root', {
101
+ type: 'manual',
102
+ message
103
+ });
104
+ });
105
+ if (parsed.rootMessage) {
106
+ setError('root', {
107
+ type: 'manual',
108
+ message: parsed.rootMessage
109
+ });
110
+ return;
111
+ }
112
+ setError('root', {
113
+ type: 'manual',
114
+ message: 'No se pudo iniciar sesión. Inténtalo de nuevo.'
115
+ });
116
+ }
117
+ }
118
+ 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, disabled: disabled }), _jsx(JBTextField, { control: control, name: "password", sx: { mb: 3 }, label: passwordLabel, type: showPassword ? 'text' : 'password', InputProps: {
119
+ endAdornment: (_jsx(InputAdornment, { position: "end", children: _jsx(IconButton, { edge: "end", "aria-label": showPassword ? 'Ocultar contraseña' : 'Mostrar contraseña', onClick: () => setShowPassword((prev) => !prev), children: showPassword ? _jsx(VisibilityOffOutlinedIcon, {}) : _jsx(VisibilityOutlinedIcon, {}) }) }))
120
+ }, variant: "outlined", required: true, fullWidth: true, disabled: disabled }), _jsxs(Box, { sx: {
121
+ display: 'flex',
122
+ flexDirection: { xs: 'column', sm: 'row' },
123
+ alignItems: 'center',
124
+ justifyContent: { xs: 'center', sm: 'space-between' },
125
+ gap: { xs: 1.5, sm: 0 }
126
+ }, children: [_jsx(JBCheckboxField, { control: control, name: "remember", label: rememberLabel, formControlProps: {
127
+ sx: {
128
+ m: 0
129
+ }
130
+ }, formControlLabelProps: {
131
+ sx: {
132
+ '& .MuiFormControlLabel-label': {
133
+ fontWeight: 500
134
+ }
135
+ }
136
+ }, checkboxSx: {
137
+ '&.Mui-checked .MuiSvgIcon-root': {
138
+ color: 'secondary.main'
139
+ }
140
+ }, disabled: disabled }), LinkComponent ? (disabled ? (_jsx(Box, { component: 'span', sx: { color: 'text.disabled' }, children: "\u00BFOlvidaste tu contrase\u00F1a?" })) : (_jsx(Box, { component: LinkComponent, to: forgotPasswordPath, sx: {
141
+ color: 'primary.main',
142
+ fontWeight: 500,
143
+ textDecoration: 'none',
144
+ '&:hover': {
145
+ textDecoration: 'underline'
146
+ }
147
+ }, children: "\u00BFOlvidaste tu contrase\u00F1a?" }))) : null] }), _jsx(AuthPrimaryButton, { sx: { mt: 2 }, "aria-label": submitLabel, disabled: disabled || isLoading || !loginValue?.trim() || !passwordValue, loading: isLoading, loadingLabel: "Iniciando sesi\u00F3n...", startIcon: _jsx(EmailOutlinedIcon, { fontSize: "small" }), 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 }))] }));
148
+ }
@@ -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';
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ import { SelectOption } from '../../../forms';
3
+ import { RegisterPayload } from '../../types';
4
+ declare const signUpSchema: z.ZodObject<{
5
+ firstName: z.ZodString;
6
+ lastName1: z.ZodString;
7
+ lastName2: z.ZodOptional<z.ZodString>;
8
+ email: z.ZodString;
9
+ birthday: z.ZodOptional<z.ZodString>;
10
+ gender: z.ZodOptional<z.ZodEnum<{
11
+ MALE: "MALE";
12
+ FEMALE: "FEMALE";
13
+ OTHER: "OTHER";
14
+ PREFER_NOT_TO_SAY: "PREFER_NOT_TO_SAY";
15
+ }>>;
16
+ role: z.ZodOptional<z.ZodString>;
17
+ password: z.ZodString;
18
+ passwordConfirm: z.ZodString;
19
+ acceptTermsConditions: z.ZodBoolean;
20
+ }, z.core.$strip>;
21
+ export type AuthSignUpFormValues = z.infer<typeof signUpSchema>;
22
+ export type AuthSignUpFormProps = {
23
+ defaultValues?: Partial<AuthSignUpFormValues>;
24
+ loading?: boolean;
25
+ disabled?: boolean;
26
+ submitLabel?: string;
27
+ fieldsScrollable?: boolean;
28
+ formMaxHeight?: string | number;
29
+ roleOptions?: Array<SelectOption<string> & {
30
+ allowSignup?: boolean;
31
+ }>;
32
+ defaultRole?: string;
33
+ onSubmit: (values: RegisterPayload) => unknown | Promise<unknown>;
34
+ };
35
+ export declare function AuthSignUpForm(props: AuthSignUpFormProps): import("react/jsx-runtime").JSX.Element;
36
+ export {};
37
+ //# sourceMappingURL=AuthSignUpForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthSignUpForm.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/sign-up/AuthSignUpForm.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAkE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9G,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;iBAkCd,CAAC;AAEL,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEhE,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnE,CAAC;AAeF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAyTxD"}
@@ -0,0 +1,193 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import PersonAddAlt1OutlinedIcon from '@mui/icons-material/PersonAddAlt1Outlined';
4
+ import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined';
5
+ import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';
6
+ import Alert from '@mui/material/Alert';
7
+ import Box from '@mui/material/Box';
8
+ import IconButton from '@mui/material/IconButton';
9
+ import InputAdornment from '@mui/material/InputAdornment';
10
+ import _ from 'lodash';
11
+ import { useEffect, useState } from 'react';
12
+ import { useForm, useWatch } from 'react-hook-form';
13
+ import { z } from 'zod';
14
+ import { JBCheckboxField, JBDatePickerField, JBSelectField, JBTextField } from '../../../forms';
15
+ import { DEFAULT_GENDER, GENDERS, GENDER_SELECT_OPTIONS } from '../../constants';
16
+ import { AuthPrimaryButton } from '../../ui';
17
+ import { getDjangoLikePasswordError, isPasswordTooSimilar } from '../password/passwordValidation';
18
+ import { parseAuthError } from '../errorParser';
19
+ const signUpSchema = z
20
+ .object({
21
+ firstName: z.string().nonempty('Debes ingresar el nombre'),
22
+ lastName1: z.string().nonempty('Debes ingresar el primer apellido'),
23
+ lastName2: z.string().optional(),
24
+ email: z.string().email('Debes ingresar un correo válido').nonempty('Debes ingresar un correo'),
25
+ birthday: z.string().optional(),
26
+ gender: z.enum(GENDERS).optional(),
27
+ role: z.string().optional(),
28
+ password: z.string().nonempty('Debes ingresar la contraseña.'),
29
+ passwordConfirm: z.string().nonempty('La confirmación de contraseña es obligatoria'),
30
+ acceptTermsConditions: z.boolean().refine((val) => val === true, 'Debes aceptar los términos y condiciones.')
31
+ })
32
+ .refine((data) => data.password === data.passwordConfirm, {
33
+ message: 'Las contraseñas deben coincidir',
34
+ path: ['passwordConfirm']
35
+ })
36
+ .superRefine((data, ctx) => {
37
+ const passwordError = getDjangoLikePasswordError(data.password);
38
+ if (passwordError) {
39
+ ctx.addIssue({
40
+ code: z.ZodIssueCode.custom,
41
+ message: passwordError,
42
+ path: ['password']
43
+ });
44
+ }
45
+ if (isPasswordTooSimilar(data.password, [data.email, data.firstName, data.lastName1, data.lastName2])) {
46
+ ctx.addIssue({
47
+ code: z.ZodIssueCode.custom,
48
+ message: 'La contraseña es demasiado similar a tus datos personales.',
49
+ path: ['password']
50
+ });
51
+ }
52
+ });
53
+ const defaultValues = {
54
+ firstName: '',
55
+ lastName1: '',
56
+ lastName2: '',
57
+ email: '',
58
+ birthday: '',
59
+ gender: DEFAULT_GENDER,
60
+ role: '',
61
+ password: '',
62
+ passwordConfirm: '',
63
+ acceptTermsConditions: false
64
+ };
65
+ export function AuthSignUpForm(props) {
66
+ const { defaultValues: valuesFromProps, loading = false, disabled = false, submitLabel = 'Crear cuenta', fieldsScrollable = false, formMaxHeight = 'min(72dvh, 620px)', roleOptions, defaultRole, onSubmit } = props;
67
+ const signupRoleOptions = (roleOptions ?? []).filter((roleOption) => roleOption.allowSignup !== false);
68
+ const resolvedDefaultRole = valuesFromProps?.role ??
69
+ defaultRole ??
70
+ signupRoleOptions[0]?.value ??
71
+ defaultValues.role;
72
+ const { control, formState, handleSubmit, setError, clearErrors, trigger, watch } = useForm({
73
+ mode: 'onChange',
74
+ defaultValues: {
75
+ ...defaultValues,
76
+ role: resolvedDefaultRole,
77
+ ...(valuesFromProps ?? {})
78
+ },
79
+ resolver: zodResolver(signUpSchema)
80
+ });
81
+ const { isValid, dirtyFields, errors, isSubmitting } = formState;
82
+ const isLoading = loading || isSubmitting;
83
+ const passwordValue = useWatch({ control, name: 'password' });
84
+ const passwordConfirmValue = useWatch({ control, name: 'passwordConfirm' });
85
+ const [showPassword, setShowPassword] = useState(false);
86
+ const [showPasswordConfirm, setShowPasswordConfirm] = useState(false);
87
+ useEffect(() => {
88
+ if (!passwordConfirmValue) {
89
+ return;
90
+ }
91
+ void trigger('passwordConfirm');
92
+ }, [passwordValue, passwordConfirmValue, trigger]);
93
+ useEffect(() => {
94
+ const subscription = watch((_value, { name }) => {
95
+ if (name) {
96
+ clearErrors(name);
97
+ }
98
+ clearErrors('root');
99
+ });
100
+ return () => {
101
+ subscription.unsubscribe();
102
+ };
103
+ }, [watch, clearErrors]);
104
+ async function onSubmitForm(values) {
105
+ try {
106
+ await onSubmit({
107
+ firstName: values.firstName,
108
+ lastName1: values.lastName1,
109
+ lastName2: values.lastName2 || undefined,
110
+ username: null,
111
+ email: values.email,
112
+ birthday: values.birthday || undefined,
113
+ gender: values.gender || undefined,
114
+ password: values.password,
115
+ passwordConfirm: values.passwordConfirm,
116
+ role: values.role || defaultRole || undefined,
117
+ termsAndConditionsAccepted: values.acceptTermsConditions
118
+ });
119
+ }
120
+ catch (error) {
121
+ const parsed = parseAuthError(error, {
122
+ username: 'email'
123
+ });
124
+ const allowedFields = [
125
+ 'firstName',
126
+ 'lastName1',
127
+ 'lastName2',
128
+ 'email',
129
+ 'birthday',
130
+ 'gender',
131
+ 'role',
132
+ 'password',
133
+ 'passwordConfirm',
134
+ 'acceptTermsConditions'
135
+ ];
136
+ Object.entries(parsed.fieldErrors).forEach(([field, message]) => {
137
+ if (allowedFields.includes(field)) {
138
+ setError(field, { type: 'manual', message });
139
+ return;
140
+ }
141
+ setError('root', {
142
+ type: 'manual',
143
+ message
144
+ });
145
+ });
146
+ if (parsed.rootMessage) {
147
+ setError('root', {
148
+ type: 'manual',
149
+ message: parsed.rootMessage
150
+ });
151
+ return;
152
+ }
153
+ setError('root', {
154
+ type: 'manual',
155
+ message: 'No se pudo crear la cuenta. Inténtalo de nuevo.'
156
+ });
157
+ }
158
+ }
159
+ return (_jsxs("form", { name: "registerForm", noValidate: true, style: {
160
+ display: 'flex',
161
+ width: '100%',
162
+ flexDirection: 'column',
163
+ justifyContent: 'flex-start',
164
+ paddingTop: 4,
165
+ ...(fieldsScrollable
166
+ ? {
167
+ height: '100%',
168
+ maxHeight: typeof formMaxHeight === 'number' ? `${formMaxHeight}px` : formMaxHeight,
169
+ minHeight: 0,
170
+ overflow: 'hidden'
171
+ }
172
+ : null)
173
+ }, onSubmit: handleSubmit(onSubmitForm), children: [_jsxs(Box, { sx: {
174
+ ...(fieldsScrollable
175
+ ? {
176
+ display: 'flex',
177
+ flexDirection: 'column',
178
+ flex: 1,
179
+ minHeight: 0,
180
+ overflowY: 'auto',
181
+ pr: 0.5,
182
+ pb: 1
183
+ }
184
+ : null)
185
+ }, children: [_jsx(JBTextField, { control: control, name: "firstName", sx: { mb: 3 }, label: "Nombre(s)", autoFocus: true, type: "text", variant: "outlined", required: true, fullWidth: true, disabled: disabled }), _jsx(JBTextField, { control: control, name: "lastName1", sx: { mb: 3 }, label: "Primer apellido", type: "text", variant: "outlined", required: true, fullWidth: true, disabled: disabled }), _jsx(JBTextField, { control: control, name: "lastName2", sx: { mb: 3 }, label: "Segundo apellido", type: "text", variant: "outlined", fullWidth: true, disabled: disabled }), _jsx(JBTextField, { control: control, name: "email", sx: { mb: 3 }, label: "Correo electr\u00F3nico", type: "email", variant: "outlined", required: true, fullWidth: true, disabled: disabled }), _jsx(JBDatePickerField, { control: control, name: "birthday", sx: { mb: 3 }, label: "Fecha de nacimiento", disableFuture: true, storeAsDateString: true, textFieldProps: {
186
+ variant: 'outlined',
187
+ fullWidth: true
188
+ }, disabled: disabled }), _jsx(JBSelectField, { control: control, name: "gender", sx: { mb: 3 }, label: "G\u00E9nero", variant: "outlined", fullWidth: true, options: GENDER_SELECT_OPTIONS, disabled: disabled }), signupRoleOptions.length > 0 ? (_jsx(JBSelectField, { control: control, name: "role", sx: { mb: 3 }, label: "Rol de perfil", variant: "outlined", fullWidth: true, options: signupRoleOptions, required: true, disabled: disabled })) : null, _jsx(JBTextField, { control: control, name: "password", sx: { mb: 3 }, label: "Contrase\u00F1a", type: showPassword ? 'text' : 'password', InputProps: {
189
+ endAdornment: (_jsx(InputAdornment, { position: "end", children: _jsx(IconButton, { edge: "end", "aria-label": showPassword ? 'Ocultar contraseña' : 'Mostrar contraseña', onClick: () => setShowPassword((prev) => !prev), children: showPassword ? _jsx(VisibilityOffOutlinedIcon, {}) : _jsx(VisibilityOutlinedIcon, {}) }) }))
190
+ }, variant: "outlined", required: true, fullWidth: true, disabled: disabled }), _jsx(JBTextField, { control: control, name: "passwordConfirm", sx: { mb: 3 }, label: "Confirmar contrase\u00F1a", type: showPasswordConfirm ? 'text' : 'password', InputProps: {
191
+ endAdornment: (_jsx(InputAdornment, { position: "end", children: _jsx(IconButton, { edge: "end", "aria-label": showPasswordConfirm ? 'Ocultar confirmación de contraseña' : 'Mostrar confirmación de contraseña', onClick: () => setShowPasswordConfirm((prev) => !prev), children: showPasswordConfirm ? _jsx(VisibilityOffOutlinedIcon, {}) : _jsx(VisibilityOutlinedIcon, {}) }) }))
192
+ }, variant: "outlined", required: true, fullWidth: true, disabled: disabled }), _jsx(JBCheckboxField, { control: control, name: "acceptTermsConditions", size: "small", label: "Acepto t\u00E9rminos y pol\u00EDticas de privacidad", disabled: disabled })] }), errors.root?.message ? (_jsx(Alert, { sx: { mt: 2 }, severity: "error", children: errors.root.message })) : null, _jsx(AuthPrimaryButton, { sx: { mt: 3 }, "aria-label": submitLabel, disabled: disabled || isLoading || _.isEmpty(dirtyFields) || !isValid, loading: isLoading, loadingLabel: "Creando cuenta...", startIcon: _jsx(PersonAddAlt1OutlinedIcon, { fontSize: "small" }), type: "submit", size: "large", children: submitLabel })] }));
193
+ }
@@ -0,0 +1,2 @@
1
+ export * from './AuthSignUpForm';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/auth/forms/sign-up/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}