@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.
- package/dist/auth/client.d.ts +46 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +379 -0
- package/dist/auth/constants/countryCallingCodes.d.ts +9 -0
- package/dist/auth/constants/countryCallingCodes.d.ts.map +1 -0
- package/dist/auth/constants/countryCallingCodes.js +209 -0
- package/dist/auth/constants/gender.d.ts +9 -0
- package/dist/auth/constants/gender.d.ts.map +1 -0
- package/dist/auth/constants/gender.js +12 -0
- package/dist/auth/constants/index.d.ts +3 -0
- package/dist/auth/constants/index.d.ts.map +1 -0
- package/dist/auth/constants/index.js +2 -0
- package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts +18 -0
- package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts.map +1 -0
- package/dist/auth/forms/account/AuthAccountConfirmationForm.js +167 -0
- package/dist/auth/forms/account/index.d.ts +2 -0
- package/dist/auth/forms/account/index.d.ts.map +1 -0
- package/dist/auth/forms/account/index.js +1 -0
- package/dist/auth/forms/errorParser.d.ts +7 -0
- package/dist/auth/forms/errorParser.d.ts.map +1 -0
- package/dist/auth/forms/errorParser.js +65 -0
- package/dist/auth/forms/index.d.ts +6 -0
- package/dist/auth/forms/index.d.ts.map +1 -0
- package/dist/auth/forms/index.js +5 -0
- package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts +16 -0
- package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts.map +1 -0
- package/dist/auth/forms/password/AuthForgotPasswordForm.js +109 -0
- package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts +17 -0
- package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts.map +1 -0
- package/dist/auth/forms/password/AuthPasswordResetConfirmForm.js +163 -0
- package/dist/auth/forms/password/AuthResetPasswordForm.d.ts +12 -0
- package/dist/auth/forms/password/AuthResetPasswordForm.d.ts.map +1 -0
- package/dist/auth/forms/password/AuthResetPasswordForm.js +22 -0
- package/dist/auth/forms/password/index.d.ts +4 -0
- package/dist/auth/forms/password/index.d.ts.map +1 -0
- package/dist/auth/forms/password/index.js +3 -0
- package/dist/auth/forms/password/passwordValidation.d.ts +3 -0
- package/dist/auth/forms/password/passwordValidation.d.ts.map +1 -0
- package/dist/auth/forms/password/passwordValidation.js +45 -0
- package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts +24 -0
- package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts.map +1 -0
- package/dist/auth/forms/sign-in/AuthOtpSignInForm.js +227 -0
- package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts +22 -0
- package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts.map +1 -0
- package/dist/auth/forms/sign-in/AuthPasswordSignInForm.js +148 -0
- package/dist/auth/forms/sign-in/index.d.ts +3 -0
- package/dist/auth/forms/sign-in/index.d.ts.map +1 -0
- package/dist/auth/forms/sign-in/index.js +2 -0
- package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts +37 -0
- package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts.map +1 -0
- package/dist/auth/forms/sign-up/AuthSignUpForm.js +193 -0
- package/dist/auth/forms/sign-up/index.d.ts +2 -0
- package/dist/auth/forms/sign-up/index.d.ts.map +1 -0
- package/dist/auth/forms/sign-up/index.js +1 -0
- package/dist/auth/fuse/createFuseAuthViews.d.ts +25 -0
- package/dist/auth/fuse/createFuseAuthViews.d.ts.map +1 -0
- package/dist/auth/fuse/createFuseAuthViews.js +510 -0
- package/dist/auth/fuse/fuseAdapter.d.ts +42 -0
- package/dist/auth/fuse/fuseAdapter.d.ts.map +1 -0
- package/dist/auth/fuse/fuseAdapter.js +291 -0
- package/dist/auth/fuse/fuseIntegration.d.ts +74 -0
- package/dist/auth/fuse/fuseIntegration.d.ts.map +1 -0
- package/dist/auth/fuse/fuseIntegration.js +121 -0
- package/dist/auth/fuse/index.d.ts +4 -0
- package/dist/auth/fuse/index.d.ts.map +1 -0
- package/dist/auth/fuse/index.js +3 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +10 -0
- package/dist/auth/provider.d.ts +35 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +133 -0
- package/dist/auth/query.d.ts +23 -0
- package/dist/auth/query.d.ts.map +1 -0
- package/dist/auth/query.js +103 -0
- package/dist/auth/routes.d.ts +37 -0
- package/dist/auth/routes.d.ts.map +1 -0
- package/dist/auth/routes.js +75 -0
- package/dist/auth/social/providerAuth.d.ts +101 -0
- package/dist/auth/social/providerAuth.d.ts.map +1 -0
- package/dist/auth/social/providerAuth.js +207 -0
- package/dist/auth/storage.d.ts +3 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +20 -0
- package/dist/auth/types.d.ts +238 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +1 -0
- package/dist/auth/ui/AuthPageTitle.d.ts +7 -0
- package/dist/auth/ui/AuthPageTitle.d.ts.map +1 -0
- package/dist/auth/ui/AuthPageTitle.js +7 -0
- package/dist/auth/ui/AuthPagesMessageSection.d.ts +3 -0
- package/dist/auth/ui/AuthPagesMessageSection.d.ts.map +1 -0
- package/dist/auth/ui/AuthPagesMessageSection.js +39 -0
- package/dist/auth/ui/AuthPrimaryButton.d.ts +9 -0
- package/dist/auth/ui/AuthPrimaryButton.d.ts.map +1 -0
- package/dist/auth/ui/AuthPrimaryButton.js +19 -0
- package/dist/auth/ui/AuthRoleSelectionDialog.d.ts +14 -0
- package/dist/auth/ui/AuthRoleSelectionDialog.d.ts.map +1 -0
- package/dist/auth/ui/AuthRoleSelectionDialog.js +39 -0
- package/dist/auth/ui/AuthRoutePageWrapper.d.ts +12 -0
- package/dist/auth/ui/AuthRoutePageWrapper.d.ts.map +1 -0
- package/dist/auth/ui/AuthRoutePageWrapper.js +61 -0
- package/dist/auth/ui/AuthSecondaryButton.d.ts +7 -0
- package/dist/auth/ui/AuthSecondaryButton.d.ts.map +1 -0
- package/dist/auth/ui/AuthSecondaryButton.js +18 -0
- package/dist/auth/ui/AuthSocialProviderButton.d.ts +11 -0
- package/dist/auth/ui/AuthSocialProviderButton.d.ts.map +1 -0
- package/dist/auth/ui/AuthSocialProviderButton.js +33 -0
- package/dist/auth/ui/index.d.ts +9 -0
- package/dist/auth/ui/index.d.ts.map +1 -0
- package/dist/auth/ui/index.js +8 -0
- package/dist/auth/ui/types.d.ts +15 -0
- package/dist/auth/ui/types.d.ts.map +1 -0
- package/dist/auth/ui/types.js +1 -0
- package/dist/config/createConfig.d.ts +14 -0
- package/dist/config/createConfig.d.ts.map +1 -0
- package/dist/config/createConfig.js +179 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +39 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/merge.d.ts +2 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +18 -0
- package/dist/config/types.d.ts +53 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +1 -0
- package/dist/core/buttons/JBButton.d.ts +8 -0
- package/dist/core/buttons/JBButton.d.ts.map +1 -0
- package/dist/core/buttons/JBButton.js +55 -0
- package/dist/core/buttons/index.d.ts +2 -0
- package/dist/core/buttons/index.d.ts.map +1 -0
- package/dist/core/buttons/index.js +1 -0
- package/dist/core/dialogs/JBConfirmDialog.d.ts +15 -0
- package/dist/core/dialogs/JBConfirmDialog.d.ts.map +1 -0
- package/dist/core/dialogs/JBConfirmDialog.js +6 -0
- package/dist/core/dialogs/index.d.ts +2 -0
- package/dist/core/dialogs/index.d.ts.map +1 -0
- package/dist/core/dialogs/index.js +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/layout/JBContentContainer.d.ts +31 -0
- package/dist/core/layout/JBContentContainer.d.ts.map +1 -0
- package/dist/core/layout/JBContentContainer.js +50 -0
- package/dist/core/layout/JBFormHeader.d.ts +3 -0
- package/dist/core/layout/JBFormHeader.d.ts.map +1 -0
- package/dist/core/layout/JBFormHeader.js +131 -0
- package/dist/core/layout/index.d.ts +3 -0
- package/dist/core/layout/index.d.ts.map +1 -0
- package/dist/core/layout/index.js +2 -0
- package/dist/core/skeletons/JBFormContentSkeleton.d.ts +5 -0
- package/dist/core/skeletons/JBFormContentSkeleton.d.ts.map +1 -0
- package/dist/core/skeletons/JBFormContentSkeleton.js +12 -0
- package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts +6 -0
- package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts.map +1 -0
- package/dist/core/skeletons/JBFormHeaderSkeleton.js +19 -0
- package/dist/core/skeletons/index.d.ts +3 -0
- package/dist/core/skeletons/index.d.ts.map +1 -0
- package/dist/core/skeletons/index.js +2 -0
- package/dist/forms/JBAutocompleteField.d.ts +12 -0
- package/dist/forms/JBAutocompleteField.d.ts.map +1 -0
- package/dist/forms/JBAutocompleteField.js +20 -0
- package/dist/forms/JBCheckboxField.d.ts +12 -0
- package/dist/forms/JBCheckboxField.d.ts.map +1 -0
- package/dist/forms/JBCheckboxField.js +36 -0
- package/dist/forms/JBDatePickerField.d.ts +13 -0
- package/dist/forms/JBDatePickerField.d.ts.map +1 -0
- package/dist/forms/JBDatePickerField.js +67 -0
- package/dist/forms/JBRadioGroupField.d.ts +10 -0
- package/dist/forms/JBRadioGroupField.d.ts.map +1 -0
- package/dist/forms/JBRadioGroupField.js +8 -0
- package/dist/forms/JBSelectField.d.ts +9 -0
- package/dist/forms/JBSelectField.d.ts.map +1 -0
- package/dist/forms/JBSelectField.js +8 -0
- package/dist/forms/JBSwitchField.d.ts +11 -0
- package/dist/forms/JBSwitchField.d.ts.map +1 -0
- package/dist/forms/JBSwitchField.js +10 -0
- package/dist/forms/JBTextField.d.ts +6 -0
- package/dist/forms/JBTextField.d.ts.map +1 -0
- package/dist/forms/JBTextField.js +8 -0
- package/dist/forms/JBTimePickerField.d.ts +12 -0
- package/dist/forms/JBTimePickerField.d.ts.map +1 -0
- package/dist/forms/JBTimePickerField.js +35 -0
- package/dist/forms/index.d.ts +13 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +12 -0
- package/dist/forms/rules.d.ts +16 -0
- package/dist/forms/rules.d.ts.map +1 -0
- package/dist/forms/rules.js +21 -0
- package/dist/forms/types.d.ts +12 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/types.js +1 -0
- package/dist/forms/utils.d.ts +5 -0
- package/dist/forms/utils.d.ts.map +1 -0
- package/dist/forms/utils.js +7 -0
- package/dist/forms/zod.d.ts +4 -0
- package/dist/forms/zod.d.ts.map +1 -0
- package/dist/forms/zod.js +9 -0
- package/dist/grid/JBGrid.d.ts +3 -0
- package/dist/grid/JBGrid.d.ts.map +1 -0
- package/dist/grid/JBGrid.js +338 -0
- package/dist/grid/JBGridHeader.d.ts +3 -0
- package/dist/grid/JBGridHeader.d.ts.map +1 -0
- package/dist/grid/JBGridHeader.js +93 -0
- package/dist/grid/JBGridLoading.d.ts +9 -0
- package/dist/grid/JBGridLoading.d.ts.map +1 -0
- package/dist/grid/JBGridLoading.js +14 -0
- package/dist/grid/JBGridProviders.d.ts +13 -0
- package/dist/grid/JBGridProviders.d.ts.map +1 -0
- package/dist/grid/JBGridProviders.js +54 -0
- package/dist/grid/JBGridSkeleton.d.ts +7 -0
- package/dist/grid/JBGridSkeleton.d.ts.map +1 -0
- package/dist/grid/JBGridSkeleton.js +6 -0
- package/dist/grid/defaults.d.ts +4 -0
- package/dist/grid/defaults.d.ts.map +1 -0
- package/dist/grid/defaults.js +29 -0
- package/dist/grid/index.d.ts +8 -0
- package/dist/grid/index.d.ts.map +1 -0
- package/dist/grid/index.js +7 -0
- package/dist/grid/types.d.ts +197 -0
- package/dist/grid/types.d.ts.map +1 -0
- package/dist/grid/types.js +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/useJBDebouncedValue.d.ts +2 -0
- package/dist/hooks/useJBDebouncedValue.d.ts.map +1 -0
- package/dist/hooks/useJBDebouncedValue.js +11 -0
- package/dist/hooks/useJBEntityFormController.d.ts +54 -0
- package/dist/hooks/useJBEntityFormController.d.ts.map +1 -0
- package/dist/hooks/useJBEntityFormController.js +156 -0
- package/dist/hooks/useJBRedirect.d.ts +10 -0
- package/dist/hooks/useJBRedirect.d.ts.map +1 -0
- package/dist/hooks/useJBRedirect.js +11 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/query/createQueryClient.d.ts +8 -0
- package/dist/query/createQueryClient.d.ts.map +1 -0
- package/dist/query/createQueryClient.js +25 -0
- package/dist/query/http.d.ts +3 -0
- package/dist/query/http.d.ts.map +1 -0
- package/dist/query/http.js +12 -0
- package/dist/query/index.d.ts +4 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +3 -0
- package/dist/query/types.d.ts +7 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +1 -0
- package/dist/utils/errors.d.ts +10 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +55 -0
- package/dist/utils/format.d.ts +4 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +28 -0
- package/dist/utils/geo.d.ts +9 -0
- package/dist/utils/geo.d.ts.map +1 -0
- package/dist/utils/geo.js +186 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/query.d.ts +2 -0
- package/dist/utils/query.d.ts.map +1 -0
- package/dist/utils/query.js +4 -0
- package/dist/utils/regex.d.ts +7 -0
- package/dist/utils/regex.d.ts.map +1 -0
- package/dist/utils/regex.js +6 -0
- package/package.json +3 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
const DEFAULT_MESSAGES = {
|
|
3
|
+
loadError: 'No se pudo cargar el registro.',
|
|
4
|
+
saveError: 'No se pudo guardar el registro.',
|
|
5
|
+
deleteError: 'No se pudo eliminar el registro.',
|
|
6
|
+
createSuccess: 'Registro creado correctamente.',
|
|
7
|
+
updateSuccess: 'Registro actualizado correctamente.',
|
|
8
|
+
deleteSuccess: 'Registro eliminado correctamente.'
|
|
9
|
+
};
|
|
10
|
+
export function useJBEntityFormController(options) {
|
|
11
|
+
const { isNew, itemId, defaultValues, retrieveQuery, reset, mapRetrieveToValues, createItem, updateItem, deleteItem, navigateToList, navigateToEdit, onShowError, onShowSuccess, getCreatedId, messages } = options;
|
|
12
|
+
const mapRetrieveToValuesRef = useRef(mapRetrieveToValues);
|
|
13
|
+
const onShowErrorRef = useRef(onShowError);
|
|
14
|
+
const navigateToListRef = useRef(navigateToList);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
mapRetrieveToValuesRef.current = mapRetrieveToValues;
|
|
17
|
+
}, [mapRetrieveToValues]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
onShowErrorRef.current = onShowError;
|
|
20
|
+
}, [onShowError]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
navigateToListRef.current = navigateToList;
|
|
23
|
+
}, [navigateToList]);
|
|
24
|
+
const resolvedMessages = {
|
|
25
|
+
...DEFAULT_MESSAGES,
|
|
26
|
+
...messages
|
|
27
|
+
};
|
|
28
|
+
const [formDisabled, setFormDisabled] = useState(!isNew);
|
|
29
|
+
const [loadedValues, setLoadedValues] = useState(defaultValues);
|
|
30
|
+
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
|
|
31
|
+
const skipRetrieveErrorAfterDeleteRef = useRef(false);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (isNew) {
|
|
34
|
+
reset(defaultValues);
|
|
35
|
+
setLoadedValues(defaultValues);
|
|
36
|
+
setFormDisabled(false);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (retrieveQuery.isError) {
|
|
40
|
+
if (skipRetrieveErrorAfterDeleteRef.current) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
onShowErrorRef.current(retrieveQuery.error, resolvedMessages.loadError);
|
|
44
|
+
navigateToListRef.current();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!retrieveQuery.data) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const values = mapRetrieveToValuesRef.current(retrieveQuery.data);
|
|
51
|
+
setLoadedValues(values);
|
|
52
|
+
reset(values);
|
|
53
|
+
setFormDisabled(true);
|
|
54
|
+
}, [
|
|
55
|
+
defaultValues,
|
|
56
|
+
isNew,
|
|
57
|
+
reset,
|
|
58
|
+
resolvedMessages.loadError,
|
|
59
|
+
retrieveQuery.data,
|
|
60
|
+
retrieveQuery.error,
|
|
61
|
+
retrieveQuery.isError
|
|
62
|
+
]);
|
|
63
|
+
const handleSave = async (formData) => {
|
|
64
|
+
try {
|
|
65
|
+
if (isNew) {
|
|
66
|
+
const response = await createItem(formData);
|
|
67
|
+
onShowSuccess?.(resolvedMessages.createSuccess);
|
|
68
|
+
const createdId = getCreatedId?.(response) ?? response?.data?.id;
|
|
69
|
+
if (createdId !== undefined && createdId !== null) {
|
|
70
|
+
navigateToEdit(createdId);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (!itemId) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
await updateItem(itemId, formData);
|
|
78
|
+
setLoadedValues(formData);
|
|
79
|
+
setFormDisabled(true);
|
|
80
|
+
onShowSuccess?.(resolvedMessages.updateSuccess);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
onShowError(error, resolvedMessages.saveError);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const handleDelete = async () => {
|
|
87
|
+
if (!itemId) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
skipRetrieveErrorAfterDeleteRef.current = true;
|
|
92
|
+
await deleteItem(itemId);
|
|
93
|
+
setDeleteDialogOpen(false);
|
|
94
|
+
onShowSuccess?.(resolvedMessages.deleteSuccess);
|
|
95
|
+
navigateToList();
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
skipRetrieveErrorAfterDeleteRef.current = false;
|
|
99
|
+
onShowError(error, resolvedMessages.deleteError);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const handleStartEdit = () => {
|
|
103
|
+
setFormDisabled(false);
|
|
104
|
+
};
|
|
105
|
+
const handleCancelEdit = () => {
|
|
106
|
+
if (isNew) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
reset(loadedValues);
|
|
110
|
+
setFormDisabled(true);
|
|
111
|
+
};
|
|
112
|
+
const handleSubmitOnEnter = (event, submit) => {
|
|
113
|
+
if (event.key !== 'Enter') {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (event.defaultPrevented) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (formDisabled || deleteDialogOpen) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const targetElement = event.target;
|
|
126
|
+
if (targetElement instanceof HTMLElement) {
|
|
127
|
+
const tagName = targetElement.tagName.toLowerCase();
|
|
128
|
+
const inputType = targetElement.getAttribute('type')?.toLowerCase();
|
|
129
|
+
const role = targetElement.getAttribute('role')?.toLowerCase();
|
|
130
|
+
const ariaAutocomplete = targetElement.getAttribute('aria-autocomplete')?.toLowerCase();
|
|
131
|
+
if (tagName === 'textarea' ||
|
|
132
|
+
tagName === 'button' ||
|
|
133
|
+
role === 'button' ||
|
|
134
|
+
role === 'combobox' ||
|
|
135
|
+
ariaAutocomplete === 'list' ||
|
|
136
|
+
targetElement.isContentEditable ||
|
|
137
|
+
inputType === 'submit' ||
|
|
138
|
+
inputType === 'button') {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
event.preventDefault();
|
|
143
|
+
submit();
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
formDisabled,
|
|
147
|
+
loadedValues,
|
|
148
|
+
deleteDialogOpen,
|
|
149
|
+
setDeleteDialogOpen,
|
|
150
|
+
handleStartEdit,
|
|
151
|
+
handleCancelEdit,
|
|
152
|
+
handleSave,
|
|
153
|
+
handleDelete,
|
|
154
|
+
handleSubmitOnEnter
|
|
155
|
+
};
|
|
156
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DependencyList } from 'react';
|
|
2
|
+
export type UseJBRedirectOptions = {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
shouldRedirect: () => boolean;
|
|
5
|
+
getTargetPath: () => string;
|
|
6
|
+
navigate: (path: string) => void;
|
|
7
|
+
deps?: DependencyList;
|
|
8
|
+
};
|
|
9
|
+
export declare const useJBRedirect: (options: UseJBRedirectOptions) => void;
|
|
10
|
+
//# sourceMappingURL=useJBRedirect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useJBRedirect.d.ts","sourceRoot":"","sources":["../../src/hooks/useJBRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAa,MAAM,OAAO,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,SAAS,oBAAoB,KAAG,IAc7D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
export const useJBRedirect = (options) => {
|
|
3
|
+
const { enabled = true, shouldRedirect, getTargetPath, navigate, deps = [] } = options;
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
if (!enabled)
|
|
6
|
+
return;
|
|
7
|
+
if (!shouldRedirect())
|
|
8
|
+
return;
|
|
9
|
+
navigate(getTargetPath());
|
|
10
|
+
}, [enabled, getTargetPath, navigate, shouldRedirect, ...deps]);
|
|
11
|
+
};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DefaultOptions, QueryClient, QueryClientConfig } from '@tanstack/react-query';
|
|
2
|
+
export type CreateReactWebQueryClientOptions = {
|
|
3
|
+
onUnauthorized?: (error: unknown) => void;
|
|
4
|
+
defaultOptions?: DefaultOptions;
|
|
5
|
+
config?: Omit<QueryClientConfig, 'defaultOptions' | 'queryCache' | 'mutationCache'>;
|
|
6
|
+
};
|
|
7
|
+
export declare const createReactWebQueryClient: (options?: CreateReactWebQueryClientOptions) => QueryClient;
|
|
8
|
+
//# sourceMappingURL=createQueryClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createQueryClient.d.ts","sourceRoot":"","sources":["../../src/query/createQueryClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAGd,WAAW,EACX,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAI/B,MAAM,MAAM,gCAAgC,GAAG;IAC7C,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,YAAY,GAAG,eAAe,CAAC,CAAC;CACrF,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,UAAU,gCAAgC,KACzC,WAuBF,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MutationCache, QueryCache, QueryClient } from '@tanstack/react-query';
|
|
2
|
+
import { isUnauthorizedError } from './http';
|
|
3
|
+
export const createReactWebQueryClient = (options) => {
|
|
4
|
+
const onError = (error) => {
|
|
5
|
+
if (options?.onUnauthorized && isUnauthorizedError(error)) {
|
|
6
|
+
options.onUnauthorized(error);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
return new QueryClient({
|
|
10
|
+
...(options?.config ?? {}),
|
|
11
|
+
defaultOptions: {
|
|
12
|
+
queries: {
|
|
13
|
+
retry: 1,
|
|
14
|
+
refetchOnWindowFocus: false,
|
|
15
|
+
...(options?.defaultOptions?.queries ?? {})
|
|
16
|
+
},
|
|
17
|
+
mutations: {
|
|
18
|
+
retry: 0,
|
|
19
|
+
...(options?.defaultOptions?.mutations ?? {})
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
queryCache: new QueryCache({ onError }),
|
|
23
|
+
mutationCache: new MutationCache({ onError })
|
|
24
|
+
});
|
|
25
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/query/http.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,IAY/D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,OACf,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const extractHttpStatusCode = (error) => {
|
|
2
|
+
if (!error || typeof error !== 'object') {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
const maybeResponse = error.response;
|
|
6
|
+
if (!maybeResponse || typeof maybeResponse !== 'object') {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const maybeStatus = maybeResponse.status;
|
|
10
|
+
return typeof maybeStatus === 'number' ? maybeStatus : null;
|
|
11
|
+
};
|
|
12
|
+
export const isUnauthorizedError = (error) => extractHttpStatusCode(error) === 401;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,CAAC,EAAE,CAAC;CACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ApiErrorData = {
|
|
2
|
+
detail?: string;
|
|
3
|
+
message?: string;
|
|
4
|
+
nonFieldErrors?: string[];
|
|
5
|
+
non_field_errors?: string[];
|
|
6
|
+
errors?: Record<string, unknown>;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
};
|
|
9
|
+
export declare const getApiErrorMessage: (error: unknown, fallback: string) => string;
|
|
10
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAkBF,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,EAAE,UAAU,MAAM,KAAG,MAgDrE,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const isRecord = (value) => typeof value === 'object' && value !== null;
|
|
2
|
+
const readFirstString = (value) => {
|
|
3
|
+
if (typeof value === 'string' && value.trim())
|
|
4
|
+
return value;
|
|
5
|
+
if (Array.isArray(value)) {
|
|
6
|
+
const firstString = value.find((item) => typeof item === 'string' && item.trim());
|
|
7
|
+
return typeof firstString === 'string' ? firstString : undefined;
|
|
8
|
+
}
|
|
9
|
+
if (isRecord(value)) {
|
|
10
|
+
if (typeof value.detail === 'string' && value.detail.trim())
|
|
11
|
+
return value.detail;
|
|
12
|
+
if (typeof value.message === 'string' && value.message.trim())
|
|
13
|
+
return value.message;
|
|
14
|
+
}
|
|
15
|
+
return undefined;
|
|
16
|
+
};
|
|
17
|
+
export const getApiErrorMessage = (error, fallback) => {
|
|
18
|
+
const raw = error;
|
|
19
|
+
const payload = (raw.response?.data ?? raw.data);
|
|
20
|
+
if (!payload) {
|
|
21
|
+
return fallback;
|
|
22
|
+
}
|
|
23
|
+
if (typeof payload === 'string' && payload.trim()) {
|
|
24
|
+
return payload;
|
|
25
|
+
}
|
|
26
|
+
if (!isRecord(payload)) {
|
|
27
|
+
return raw.message?.trim() || fallback;
|
|
28
|
+
}
|
|
29
|
+
const data = payload;
|
|
30
|
+
const detail = readFirstString(data.detail);
|
|
31
|
+
if (detail)
|
|
32
|
+
return detail;
|
|
33
|
+
const message = readFirstString(data.message);
|
|
34
|
+
if (message)
|
|
35
|
+
return message;
|
|
36
|
+
const nonField = readFirstString(data.nonFieldErrors) ?? readFirstString(data.non_field_errors);
|
|
37
|
+
if (nonField)
|
|
38
|
+
return nonField;
|
|
39
|
+
if (isRecord(data.errors)) {
|
|
40
|
+
for (const value of Object.values(data.errors)) {
|
|
41
|
+
const nestedMessage = readFirstString(value);
|
|
42
|
+
if (nestedMessage)
|
|
43
|
+
return nestedMessage;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const [key, value] of Object.entries(data)) {
|
|
47
|
+
if (['detail', 'message', 'nonFieldErrors', 'non_field_errors', 'errors'].includes(key)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const nestedMessage = readFirstString(value);
|
|
51
|
+
if (nestedMessage)
|
|
52
|
+
return nestedMessage;
|
|
53
|
+
}
|
|
54
|
+
return raw.message?.trim() || fallback;
|
|
55
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const formatCurrency: (value: number, currency?: string, locale?: string) => string;
|
|
2
|
+
export declare const formatDate: (date: string | number | Date | null | undefined, locale?: string) => string;
|
|
3
|
+
export declare const formatDateTime: (date: string | number | Date | null | undefined, locale?: string) => string;
|
|
4
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,iBAAgB,EAAE,eAAgB,KAAG,MAKlF,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,EAC/C,eAAgB,KACf,MAKF,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,EAC/C,eAAgB,KACf,MAWF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const formatCurrency = (value, currency = 'USD', locale = 'en-US') => {
|
|
2
|
+
return new Intl.NumberFormat(locale, {
|
|
3
|
+
style: 'currency',
|
|
4
|
+
currency
|
|
5
|
+
}).format(value || 0);
|
|
6
|
+
};
|
|
7
|
+
export const formatDate = (date, locale = 'en-US') => {
|
|
8
|
+
if (!date)
|
|
9
|
+
return '';
|
|
10
|
+
const parsed = new Date(date);
|
|
11
|
+
if (Number.isNaN(parsed.getTime()))
|
|
12
|
+
return '';
|
|
13
|
+
return new Intl.DateTimeFormat(locale).format(parsed);
|
|
14
|
+
};
|
|
15
|
+
export const formatDateTime = (date, locale = 'en-US') => {
|
|
16
|
+
if (!date)
|
|
17
|
+
return '';
|
|
18
|
+
const parsed = new Date(date);
|
|
19
|
+
if (Number.isNaN(parsed.getTime()))
|
|
20
|
+
return '';
|
|
21
|
+
return new Intl.DateTimeFormat(locale, {
|
|
22
|
+
year: 'numeric',
|
|
23
|
+
month: '2-digit',
|
|
24
|
+
day: '2-digit',
|
|
25
|
+
hour: '2-digit',
|
|
26
|
+
minute: '2-digit'
|
|
27
|
+
}).format(parsed);
|
|
28
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type JBGeoOption = {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare const jbCountryCodeToFlagEmoji: (countryCode: string) => string;
|
|
7
|
+
export declare const getJBCountryOptions: (locale?: string) => JBGeoOption[];
|
|
8
|
+
export declare const getJBStateOptionsByCountry: (countryCode?: string | null) => JBGeoOption[];
|
|
9
|
+
//# sourceMappingURL=geo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.d.ts","sourceRoot":"","sources":["../../src/utils/geo.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AA4KF,eAAO,MAAM,wBAAwB,GAAI,aAAa,MAAM,KAAG,MAQ9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,eAAgB,KAAG,WAAW,EAkBjE,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,cAAc,MAAM,GAAG,IAAI,KAAG,WAAW,EAOnF,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
const COUNTRY_PRIORITY = ['MX', 'US', 'ES', 'AR', 'CO', 'CL', 'PE', 'EC', 'BR', 'CA'];
|
|
2
|
+
const FALLBACK_COUNTRY_CODES = [
|
|
3
|
+
'MX',
|
|
4
|
+
'US',
|
|
5
|
+
'CA',
|
|
6
|
+
'ES',
|
|
7
|
+
'AR',
|
|
8
|
+
'CO',
|
|
9
|
+
'CL',
|
|
10
|
+
'PE',
|
|
11
|
+
'EC',
|
|
12
|
+
'UY',
|
|
13
|
+
'PY',
|
|
14
|
+
'BO',
|
|
15
|
+
'BR',
|
|
16
|
+
'FR',
|
|
17
|
+
'DE',
|
|
18
|
+
'IT',
|
|
19
|
+
'GB',
|
|
20
|
+
'PT'
|
|
21
|
+
];
|
|
22
|
+
const MEXICO_STATES = [
|
|
23
|
+
{ value: 'Aguascalientes', label: 'Aguascalientes' },
|
|
24
|
+
{ value: 'Baja California', label: 'Baja California' },
|
|
25
|
+
{ value: 'Baja California Sur', label: 'Baja California Sur' },
|
|
26
|
+
{ value: 'Campeche', label: 'Campeche' },
|
|
27
|
+
{ value: 'Chiapas', label: 'Chiapas' },
|
|
28
|
+
{ value: 'Chihuahua', label: 'Chihuahua' },
|
|
29
|
+
{ value: 'Ciudad de Mexico', label: 'Ciudad de Mexico' },
|
|
30
|
+
{ value: 'Coahuila', label: 'Coahuila' },
|
|
31
|
+
{ value: 'Colima', label: 'Colima' },
|
|
32
|
+
{ value: 'Durango', label: 'Durango' },
|
|
33
|
+
{ value: 'Estado de Mexico', label: 'Estado de Mexico' },
|
|
34
|
+
{ value: 'Guanajuato', label: 'Guanajuato' },
|
|
35
|
+
{ value: 'Guerrero', label: 'Guerrero' },
|
|
36
|
+
{ value: 'Hidalgo', label: 'Hidalgo' },
|
|
37
|
+
{ value: 'Jalisco', label: 'Jalisco' },
|
|
38
|
+
{ value: 'Michoacan', label: 'Michoacan' },
|
|
39
|
+
{ value: 'Morelos', label: 'Morelos' },
|
|
40
|
+
{ value: 'Nayarit', label: 'Nayarit' },
|
|
41
|
+
{ value: 'Nuevo Leon', label: 'Nuevo Leon' },
|
|
42
|
+
{ value: 'Oaxaca', label: 'Oaxaca' },
|
|
43
|
+
{ value: 'Puebla', label: 'Puebla' },
|
|
44
|
+
{ value: 'Queretaro', label: 'Queretaro' },
|
|
45
|
+
{ value: 'Quintana Roo', label: 'Quintana Roo' },
|
|
46
|
+
{ value: 'San Luis Potosi', label: 'San Luis Potosi' },
|
|
47
|
+
{ value: 'Sinaloa', label: 'Sinaloa' },
|
|
48
|
+
{ value: 'Sonora', label: 'Sonora' },
|
|
49
|
+
{ value: 'Tabasco', label: 'Tabasco' },
|
|
50
|
+
{ value: 'Tamaulipas', label: 'Tamaulipas' },
|
|
51
|
+
{ value: 'Tlaxcala', label: 'Tlaxcala' },
|
|
52
|
+
{ value: 'Veracruz', label: 'Veracruz' },
|
|
53
|
+
{ value: 'Yucatan', label: 'Yucatan' },
|
|
54
|
+
{ value: 'Zacatecas', label: 'Zacatecas' }
|
|
55
|
+
];
|
|
56
|
+
const UNITED_STATES = [
|
|
57
|
+
{ value: 'Alabama', label: 'Alabama' },
|
|
58
|
+
{ value: 'Alaska', label: 'Alaska' },
|
|
59
|
+
{ value: 'Arizona', label: 'Arizona' },
|
|
60
|
+
{ value: 'Arkansas', label: 'Arkansas' },
|
|
61
|
+
{ value: 'California', label: 'California' },
|
|
62
|
+
{ value: 'Colorado', label: 'Colorado' },
|
|
63
|
+
{ value: 'Connecticut', label: 'Connecticut' },
|
|
64
|
+
{ value: 'Delaware', label: 'Delaware' },
|
|
65
|
+
{ value: 'Florida', label: 'Florida' },
|
|
66
|
+
{ value: 'Georgia', label: 'Georgia' },
|
|
67
|
+
{ value: 'Hawaii', label: 'Hawaii' },
|
|
68
|
+
{ value: 'Idaho', label: 'Idaho' },
|
|
69
|
+
{ value: 'Illinois', label: 'Illinois' },
|
|
70
|
+
{ value: 'Indiana', label: 'Indiana' },
|
|
71
|
+
{ value: 'Iowa', label: 'Iowa' },
|
|
72
|
+
{ value: 'Kansas', label: 'Kansas' },
|
|
73
|
+
{ value: 'Kentucky', label: 'Kentucky' },
|
|
74
|
+
{ value: 'Louisiana', label: 'Louisiana' },
|
|
75
|
+
{ value: 'Maine', label: 'Maine' },
|
|
76
|
+
{ value: 'Maryland', label: 'Maryland' },
|
|
77
|
+
{ value: 'Massachusetts', label: 'Massachusetts' },
|
|
78
|
+
{ value: 'Michigan', label: 'Michigan' },
|
|
79
|
+
{ value: 'Minnesota', label: 'Minnesota' },
|
|
80
|
+
{ value: 'Mississippi', label: 'Mississippi' },
|
|
81
|
+
{ value: 'Missouri', label: 'Missouri' },
|
|
82
|
+
{ value: 'Montana', label: 'Montana' },
|
|
83
|
+
{ value: 'Nebraska', label: 'Nebraska' },
|
|
84
|
+
{ value: 'Nevada', label: 'Nevada' },
|
|
85
|
+
{ value: 'New Hampshire', label: 'New Hampshire' },
|
|
86
|
+
{ value: 'New Jersey', label: 'New Jersey' },
|
|
87
|
+
{ value: 'New Mexico', label: 'New Mexico' },
|
|
88
|
+
{ value: 'New York', label: 'New York' },
|
|
89
|
+
{ value: 'North Carolina', label: 'North Carolina' },
|
|
90
|
+
{ value: 'North Dakota', label: 'North Dakota' },
|
|
91
|
+
{ value: 'Ohio', label: 'Ohio' },
|
|
92
|
+
{ value: 'Oklahoma', label: 'Oklahoma' },
|
|
93
|
+
{ value: 'Oregon', label: 'Oregon' },
|
|
94
|
+
{ value: 'Pennsylvania', label: 'Pennsylvania' },
|
|
95
|
+
{ value: 'Rhode Island', label: 'Rhode Island' },
|
|
96
|
+
{ value: 'South Carolina', label: 'South Carolina' },
|
|
97
|
+
{ value: 'South Dakota', label: 'South Dakota' },
|
|
98
|
+
{ value: 'Tennessee', label: 'Tennessee' },
|
|
99
|
+
{ value: 'Texas', label: 'Texas' },
|
|
100
|
+
{ value: 'Utah', label: 'Utah' },
|
|
101
|
+
{ value: 'Vermont', label: 'Vermont' },
|
|
102
|
+
{ value: 'Virginia', label: 'Virginia' },
|
|
103
|
+
{ value: 'Washington', label: 'Washington' },
|
|
104
|
+
{ value: 'West Virginia', label: 'West Virginia' },
|
|
105
|
+
{ value: 'Wisconsin', label: 'Wisconsin' },
|
|
106
|
+
{ value: 'Wyoming', label: 'Wyoming' }
|
|
107
|
+
];
|
|
108
|
+
const STATES_BY_COUNTRY = {
|
|
109
|
+
MX: MEXICO_STATES,
|
|
110
|
+
US: UNITED_STATES
|
|
111
|
+
};
|
|
112
|
+
const countryOptionsCache = new Map();
|
|
113
|
+
const isValidCountryCode = (code) => /^[A-Z]{2}$/.test(code);
|
|
114
|
+
const sortCountryCodes = (countryCodes) => {
|
|
115
|
+
return [...countryCodes].sort((left, right) => {
|
|
116
|
+
const leftIndex = COUNTRY_PRIORITY.indexOf(left);
|
|
117
|
+
const rightIndex = COUNTRY_PRIORITY.indexOf(right);
|
|
118
|
+
if (leftIndex >= 0 && rightIndex >= 0) {
|
|
119
|
+
return leftIndex - rightIndex;
|
|
120
|
+
}
|
|
121
|
+
if (leftIndex >= 0) {
|
|
122
|
+
return -1;
|
|
123
|
+
}
|
|
124
|
+
if (rightIndex >= 0) {
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
return left.localeCompare(right);
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
const resolveCountryCodes = () => {
|
|
131
|
+
const intlValuesOf = Intl.supportedValuesOf;
|
|
132
|
+
if (typeof intlValuesOf === 'function') {
|
|
133
|
+
try {
|
|
134
|
+
// NOTE: "region" is not supported in all runtimes and may throw RangeError.
|
|
135
|
+
const values = intlValuesOf('region')
|
|
136
|
+
.map((value) => value.toUpperCase())
|
|
137
|
+
.filter((value) => isValidCountryCode(value));
|
|
138
|
+
if (values.length > 0) {
|
|
139
|
+
return sortCountryCodes(Array.from(new Set(values)));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (_error) {
|
|
143
|
+
// Fallback list is used when runtime does not support region values.
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return sortCountryCodes(FALLBACK_COUNTRY_CODES);
|
|
147
|
+
};
|
|
148
|
+
const resolveCountryName = (countryCode, locale) => {
|
|
149
|
+
if (typeof Intl.DisplayNames !== 'function') {
|
|
150
|
+
return countryCode;
|
|
151
|
+
}
|
|
152
|
+
const displayNames = new Intl.DisplayNames([locale], { type: 'region' });
|
|
153
|
+
return displayNames.of(countryCode) ?? countryCode;
|
|
154
|
+
};
|
|
155
|
+
export const jbCountryCodeToFlagEmoji = (countryCode) => {
|
|
156
|
+
const normalized = countryCode.trim().toUpperCase();
|
|
157
|
+
if (!isValidCountryCode(normalized)) {
|
|
158
|
+
return '🏳️';
|
|
159
|
+
}
|
|
160
|
+
const points = [...normalized].map((char) => 127397 + char.charCodeAt(0));
|
|
161
|
+
return String.fromCodePoint(...points);
|
|
162
|
+
};
|
|
163
|
+
export const getJBCountryOptions = (locale = 'es-MX') => {
|
|
164
|
+
const cacheKey = locale.toLowerCase();
|
|
165
|
+
const cached = countryOptionsCache.get(cacheKey);
|
|
166
|
+
if (cached) {
|
|
167
|
+
return cached;
|
|
168
|
+
}
|
|
169
|
+
const options = resolveCountryCodes().map((countryCode) => {
|
|
170
|
+
const countryName = resolveCountryName(countryCode, locale);
|
|
171
|
+
const flag = jbCountryCodeToFlagEmoji(countryCode);
|
|
172
|
+
return {
|
|
173
|
+
value: countryCode,
|
|
174
|
+
label: `${flag} ${countryName}`
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
countryOptionsCache.set(cacheKey, options);
|
|
178
|
+
return options;
|
|
179
|
+
};
|
|
180
|
+
export const getJBStateOptionsByCountry = (countryCode) => {
|
|
181
|
+
const normalizedCountry = (countryCode ?? '').trim().toUpperCase();
|
|
182
|
+
if (!normalizedCountry) {
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
return STATES_BY_COUNTRY[normalizedCountry] ?? [];
|
|
186
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/utils/query.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAIrD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const JB_PHONE_REGEX: RegExp;
|
|
2
|
+
export declare const JB_ZIP_CODE_REGEX: RegExp;
|
|
3
|
+
export declare const JB_NUMBER_REGEX: RegExp;
|
|
4
|
+
export declare const JB_DECIMAL_NUMBER_REGEX: RegExp;
|
|
5
|
+
export declare const JB_EMAIL_REGEX: RegExp;
|
|
6
|
+
export declare const JB_PASSWORD_REGEX: RegExp;
|
|
7
|
+
//# sourceMappingURL=regex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../src/utils/regex.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,QACgF,CAAC;AAE5G,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAC3C,eAAO,MAAM,eAAe,QAAa,CAAC;AAC1C,eAAO,MAAM,uBAAuB,QAAoB,CAAC;AACzD,eAAO,MAAM,cAAc,QAAqD,CAAC;AACjF,eAAO,MAAM,iBAAiB,QACiD,CAAC"}
|