flysoft-react-ui 0.5.0 → 0.5.3

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 (206) hide show
  1. package/dist/App.d.ts.map +1 -1
  2. package/dist/App.js +19 -7
  3. package/dist/components/form-controls/AutocompleteInput.d.ts +11 -3
  4. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
  5. package/dist/components/form-controls/AutocompleteInput.js +411 -31
  6. package/dist/components/form-controls/Button.d.ts +3 -0
  7. package/dist/components/form-controls/Button.d.ts.map +1 -1
  8. package/dist/components/form-controls/Button.js +160 -19
  9. package/dist/components/form-controls/Checkbox.d.ts +14 -0
  10. package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
  11. package/dist/components/form-controls/Checkbox.js +79 -0
  12. package/dist/components/form-controls/DateInput.d.ts +24 -4
  13. package/dist/components/form-controls/DateInput.d.ts.map +1 -1
  14. package/dist/components/form-controls/DateInput.js +492 -70
  15. package/dist/components/form-controls/DatePicker.d.ts +4 -3
  16. package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
  17. package/dist/components/form-controls/DatePicker.js +26 -30
  18. package/dist/components/form-controls/Input.d.ts +10 -1
  19. package/dist/components/form-controls/Input.d.ts.map +1 -1
  20. package/dist/components/form-controls/Input.js +17 -10
  21. package/dist/components/form-controls/LinkButton.d.ts +15 -0
  22. package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
  23. package/dist/components/form-controls/LinkButton.js +248 -0
  24. package/dist/components/form-controls/Pagination.d.ts +1 -0
  25. package/dist/components/form-controls/Pagination.d.ts.map +1 -1
  26. package/dist/components/form-controls/Pagination.js +3 -40
  27. package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
  28. package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
  29. package/dist/components/form-controls/RadioButtonGroup.js +220 -0
  30. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
  31. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
  32. package/dist/components/form-controls/SearchSelectInput-OLD.js +963 -0
  33. package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
  34. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
  35. package/dist/components/form-controls/SearchSelectInput.js +336 -0
  36. package/dist/components/form-controls/index.d.ts +9 -1
  37. package/dist/components/form-controls/index.d.ts.map +1 -1
  38. package/dist/components/form-controls/index.js +4 -0
  39. package/dist/components/layout/Accordion.d.ts +13 -0
  40. package/dist/components/layout/Accordion.d.ts.map +1 -0
  41. package/dist/components/layout/Accordion.js +67 -0
  42. package/dist/components/layout/AppLayout.d.ts +3 -2
  43. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  44. package/dist/components/layout/AppLayout.js +104 -31
  45. package/dist/components/layout/Card.d.ts +8 -3
  46. package/dist/components/layout/Card.d.ts.map +1 -1
  47. package/dist/components/layout/Card.js +18 -19
  48. package/dist/components/layout/Collection.js +1 -1
  49. package/dist/components/layout/DataTable.d.ts +3 -1
  50. package/dist/components/layout/DataTable.d.ts.map +1 -1
  51. package/dist/components/layout/DataTable.js +34 -29
  52. package/dist/components/layout/index.d.ts +2 -0
  53. package/dist/components/layout/index.d.ts.map +1 -1
  54. package/dist/components/layout/index.js +1 -0
  55. package/dist/components/utils/Avatar.d.ts +49 -0
  56. package/dist/components/utils/Avatar.d.ts.map +1 -0
  57. package/dist/components/utils/Avatar.js +93 -0
  58. package/dist/components/utils/Badge.d.ts +3 -0
  59. package/dist/components/utils/Badge.d.ts.map +1 -1
  60. package/dist/components/utils/Badge.js +131 -26
  61. package/dist/components/utils/Dialog.d.ts.map +1 -1
  62. package/dist/components/utils/Dialog.js +6 -1
  63. package/dist/components/utils/Filter.d.ts +57 -0
  64. package/dist/components/utils/Filter.d.ts.map +1 -0
  65. package/dist/components/utils/Filter.js +581 -0
  66. package/dist/components/utils/FiltersDialog.d.ts +21 -0
  67. package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
  68. package/dist/components/utils/FiltersDialog.js +104 -0
  69. package/dist/components/utils/Loader.js +2 -2
  70. package/dist/components/utils/RoadMap.d.ts +59 -0
  71. package/dist/components/utils/RoadMap.d.ts.map +1 -0
  72. package/dist/components/utils/RoadMap.js +139 -0
  73. package/dist/components/utils/Snackbar.d.ts +13 -0
  74. package/dist/components/utils/Snackbar.d.ts.map +1 -0
  75. package/dist/components/utils/Snackbar.js +122 -0
  76. package/dist/components/utils/SnackbarContainer.d.ts +7 -0
  77. package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
  78. package/dist/components/utils/SnackbarContainer.js +25 -0
  79. package/dist/components/utils/iconUtils.d.ts +16 -0
  80. package/dist/components/utils/iconUtils.d.ts.map +1 -0
  81. package/dist/components/utils/iconUtils.js +40 -0
  82. package/dist/components/utils/index.d.ts +12 -0
  83. package/dist/components/utils/index.d.ts.map +1 -1
  84. package/dist/components/utils/index.js +6 -0
  85. package/dist/contexts/AppLayoutContext.d.ts +40 -0
  86. package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
  87. package/dist/contexts/AppLayoutContext.js +98 -0
  88. package/dist/contexts/ListCrudContext.d.ts +50 -0
  89. package/dist/contexts/ListCrudContext.d.ts.map +1 -0
  90. package/dist/contexts/ListCrudContext.js +253 -0
  91. package/dist/contexts/SnackbarContext.d.ts +26 -0
  92. package/dist/contexts/SnackbarContext.d.ts.map +1 -0
  93. package/dist/contexts/SnackbarContext.js +34 -0
  94. package/dist/contexts/index.d.ts +6 -0
  95. package/dist/contexts/index.d.ts.map +1 -1
  96. package/dist/contexts/index.js +6 -0
  97. package/dist/contexts/presets.js +6 -6
  98. package/dist/docs/AccordionDocs.d.ts +4 -0
  99. package/dist/docs/AccordionDocs.d.ts.map +1 -0
  100. package/dist/docs/AccordionDocs.js +21 -0
  101. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
  102. package/dist/docs/AutocompleteInputDocs.js +1 -1
  103. package/dist/docs/AvatarDocs.d.ts +4 -0
  104. package/dist/docs/AvatarDocs.d.ts.map +1 -0
  105. package/dist/docs/AvatarDocs.js +7 -0
  106. package/dist/docs/BadgeDocs.d.ts.map +1 -1
  107. package/dist/docs/BadgeDocs.js +4 -2
  108. package/dist/docs/ButtonDocs.d.ts.map +1 -1
  109. package/dist/docs/ButtonDocs.js +1 -1
  110. package/dist/docs/CardDocs.d.ts.map +1 -1
  111. package/dist/docs/CardDocs.js +17 -8
  112. package/dist/docs/CheckboxDocs.d.ts +4 -0
  113. package/dist/docs/CheckboxDocs.d.ts.map +1 -0
  114. package/dist/docs/CheckboxDocs.js +7 -0
  115. package/dist/docs/DataTableDocs.d.ts.map +1 -1
  116. package/dist/docs/DataTableDocs.js +9 -5
  117. package/dist/docs/DateInputDocs.d.ts +1 -0
  118. package/dist/docs/DateInputDocs.d.ts.map +1 -1
  119. package/dist/docs/DateInputDocs.js +7 -9
  120. package/dist/docs/DatePickerDocs.d.ts +1 -0
  121. package/dist/docs/DatePickerDocs.d.ts.map +1 -1
  122. package/dist/docs/DatePickerDocs.js +6 -8
  123. package/dist/docs/DialogDocs.js +1 -1
  124. package/dist/docs/DocAdmin.d.ts +4 -0
  125. package/dist/docs/DocAdmin.d.ts.map +1 -0
  126. package/dist/docs/DocAdmin.js +68 -0
  127. package/dist/docs/DocsMenu.d.ts.map +1 -1
  128. package/dist/docs/DocsMenu.js +3 -3
  129. package/dist/docs/DocsRouter.d.ts.map +1 -1
  130. package/dist/docs/DocsRouter.js +13 -1
  131. package/dist/docs/DropdownMenuDocs.js +1 -1
  132. package/dist/docs/ExampleFormDocs.d.ts +4 -0
  133. package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
  134. package/dist/docs/ExampleFormDocs.js +148 -0
  135. package/dist/docs/FilterDocs.d.ts +4 -0
  136. package/dist/docs/FilterDocs.d.ts.map +1 -0
  137. package/dist/docs/FilterDocs.js +112 -0
  138. package/dist/docs/InputDocs.d.ts.map +1 -1
  139. package/dist/docs/InputDocs.js +11 -1
  140. package/dist/docs/LinkButtonDocs.d.ts +4 -0
  141. package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
  142. package/dist/docs/LinkButtonDocs.js +7 -0
  143. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +2 -0
  144. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
  145. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +29 -0
  146. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
  147. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
  148. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
  149. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
  150. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
  151. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +57 -0
  152. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
  153. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
  154. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
  155. package/dist/docs/PaginationDocs.js +6 -6
  156. package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
  157. package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
  158. package/dist/docs/RadioButtonGroupDocs.js +46 -0
  159. package/dist/docs/RoadMapDocs.d.ts +4 -0
  160. package/dist/docs/RoadMapDocs.d.ts.map +1 -0
  161. package/dist/docs/RoadMapDocs.js +171 -0
  162. package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
  163. package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
  164. package/dist/docs/SearchSelectInputDocs.js +168 -0
  165. package/dist/docs/SnackbarDocs.d.ts +4 -0
  166. package/dist/docs/SnackbarDocs.d.ts.map +1 -0
  167. package/dist/docs/SnackbarDocs.js +50 -0
  168. package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
  169. package/dist/docs/TabsGroupDocs.js +12 -1
  170. package/dist/docs/docMockServices/empresaService.d.ts +38 -0
  171. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
  172. package/dist/docs/docMockServices/empresaService.js +117 -0
  173. package/dist/docs/docMockServices/index.d.ts +9 -0
  174. package/dist/docs/docMockServices/index.d.ts.map +1 -0
  175. package/dist/docs/docMockServices/index.js +8 -0
  176. package/dist/docs/docMockServices/initialData.d.ts +6 -0
  177. package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
  178. package/dist/docs/docMockServices/initialData.js +132 -0
  179. package/dist/docs/docMockServices/interfaces.d.ts +26 -0
  180. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
  181. package/dist/docs/docMockServices/interfaces.js +1 -0
  182. package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
  183. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
  184. package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
  185. package/dist/docs/docMockServices/personaService.d.ts +39 -0
  186. package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
  187. package/dist/docs/docMockServices/personaService.js +181 -0
  188. package/dist/hooks/index.d.ts +2 -0
  189. package/dist/hooks/index.d.ts.map +1 -1
  190. package/dist/hooks/index.js +1 -0
  191. package/dist/hooks/useAsyncRequest.d.ts +17 -0
  192. package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
  193. package/dist/hooks/useAsyncRequest.js +70 -0
  194. package/dist/index.css +1 -1
  195. package/dist/index.d.ts +23 -1
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +11 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/templates/forms/ContactForm.js +2 -2
  200. package/dist/templates/forms/LoginForm.js +1 -1
  201. package/dist/templates/forms/RegistrationForm.js +1 -1
  202. package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
  203. package/dist/templates/layouts/SidebarLayout.js +3 -2
  204. package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
  205. package/dist/templates/patterns/FormPattern.js +4 -3
  206. package/package.json +5 -2
@@ -0,0 +1,181 @@
1
+ import dayjs from "dayjs";
2
+ import { personaEmpresaService } from "./personaEmpresaService";
3
+ import { empresaService } from "./empresaService";
4
+ const STORAGE_KEY = "docMockServices_personas";
5
+ /**
6
+ * Simula un delay de red para hacer más realista el mock
7
+ */
8
+ const simulateNetworkDelay = (ms = 500) => {
9
+ return new Promise((resolve) => setTimeout(resolve, ms));
10
+ };
11
+ /**
12
+ * Obtiene todas las personas del almacenamiento (función helper interna)
13
+ * Convierte las fechas de string ISO a dayjs
14
+ */
15
+ const _obtenerTodas = () => {
16
+ const data = localStorage.getItem(STORAGE_KEY);
17
+ if (!data)
18
+ return [];
19
+ const personas = JSON.parse(data);
20
+ // Convertir fechaNacimiento de string ISO a dayjs
21
+ return personas.map((persona) => ({
22
+ ...persona,
23
+ fechaNacimiento: dayjs(persona.fechaNacimiento),
24
+ }));
25
+ };
26
+ /**
27
+ * Enriquece una persona con sus empresas relacionadas
28
+ * Optimizado para obtener todas las empresas de una vez
29
+ */
30
+ const _enriquecerConEmpresas = async (persona, todasLasEmpresas) => {
31
+ const relaciones = await personaEmpresaService.buscarPorPersona(persona.id);
32
+ const empresasIds = relaciones.map((rel) => rel.idEmpresa);
33
+ let empresas = [];
34
+ if (todasLasEmpresas) {
35
+ // Si ya tenemos todas las empresas, filtrar por IDs
36
+ empresas = todasLasEmpresas.filter((emp) => empresasIds.includes(emp.id));
37
+ }
38
+ else {
39
+ // Si no, obtener cada empresa individualmente
40
+ for (const idEmpresa of empresasIds) {
41
+ const empresa = await empresaService.buscarPorId(idEmpresa);
42
+ if (empresa) {
43
+ empresas.push(empresa);
44
+ }
45
+ }
46
+ }
47
+ return {
48
+ ...persona,
49
+ empresas,
50
+ };
51
+ };
52
+ /**
53
+ * Servicio mock para gestionar Personas en localStorage
54
+ */
55
+ export const personaService = {
56
+ /**
57
+ * Obtiene personas opcionalmente filtradas por nombre, con sus empresas relacionadas
58
+ */
59
+ async listar(params) {
60
+ await simulateNetworkDelay();
61
+ const todas = _obtenerTodas();
62
+ let personasFiltradas = todas;
63
+ if (params?.filtro) {
64
+ const filtroLower = params.filtro.toLowerCase();
65
+ personasFiltradas = todas.filter((per) => per.nombre.toLowerCase().includes(filtroLower));
66
+ }
67
+ // Obtener todas las empresas de una vez para optimizar
68
+ const todasLasEmpresas = await empresaService.listar();
69
+ // Enriquecer cada persona con sus empresas
70
+ const personasConEmpresas = await Promise.all(personasFiltradas.map((p) => _enriquecerConEmpresas(p, todasLasEmpresas)));
71
+ return personasConEmpresas;
72
+ },
73
+ /**
74
+ * Obtiene personas paginadas opcionalmente filtradas por nombre y/o idEmpresa, con sus empresas relacionadas
75
+ */
76
+ async listarPaginados(params) {
77
+ await simulateNetworkDelay();
78
+ const pagina = params?.pagina ?? 1;
79
+ const limit = params?.limit ?? 20;
80
+ const todas = _obtenerTodas();
81
+ let todasFiltradas = todas;
82
+ // Filtro por nombre
83
+ if (params?.filtro) {
84
+ const filtroLower = params.filtro.toLowerCase();
85
+ todasFiltradas = todasFiltradas.filter((per) => per.nombre.toLowerCase().includes(filtroLower));
86
+ }
87
+ // Filtro por idEmpresa: obtener todas las relaciones de esa empresa
88
+ // y filtrar las personas que tienen esa relación
89
+ if (params?.idEmpresa !== undefined) {
90
+ const relaciones = await personaEmpresaService.buscarPorEmpresa(Number(params.idEmpresa));
91
+ const personasIdsConEmpresa = new Set(relaciones.map((rel) => rel.idPersona));
92
+ todasFiltradas = todasFiltradas.filter((per) => personasIdsConEmpresa.has(per.id));
93
+ }
94
+ const total = todasFiltradas.length;
95
+ // Obtener todas las empresas de una vez para optimizar
96
+ const todasLasEmpresas = await empresaService.listar();
97
+ // Enriquecer cada persona con sus empresas antes de paginar
98
+ const personasConEmpresas = await Promise.all(todasFiltradas.map((p) => _enriquecerConEmpresas(p, todasLasEmpresas)));
99
+ const limitNumber = parseInt(limit.toString(), 10);
100
+ const paginaNumber = parseInt(pagina.toString(), 10);
101
+ const totalNumber = parseInt(total.toString(), 10);
102
+ // Si limit es 0, devolver todos los elementos sin paginar
103
+ if (limitNumber === 0) {
104
+ return {
105
+ list: personasConEmpresas,
106
+ limit: 0,
107
+ page: 1,
108
+ pages: 1,
109
+ total,
110
+ };
111
+ }
112
+ const pages = Math.ceil(totalNumber / limitNumber);
113
+ const inicio = (paginaNumber - 1) * limitNumber;
114
+ const fin = inicio + limitNumber;
115
+ const list = personasConEmpresas.slice(inicio, fin);
116
+ return {
117
+ list,
118
+ limit: limitNumber,
119
+ page: paginaNumber,
120
+ pages,
121
+ total,
122
+ };
123
+ },
124
+ /**
125
+ * Busca una persona por ID
126
+ */
127
+ async buscarPorId(id) {
128
+ await simulateNetworkDelay();
129
+ const personas = _obtenerTodas();
130
+ return personas.find((per) => per.id === id);
131
+ },
132
+ /**
133
+ * Agrega una nueva persona
134
+ */
135
+ async agregar(persona) {
136
+ await simulateNetworkDelay();
137
+ const personas = _obtenerTodas();
138
+ const nuevoId = personas.length > 0 ? Math.max(...personas.map((p) => p.id)) + 1 : 1;
139
+ // Crear nueva persona: el id generado siempre sobrescribe cualquier id que venga
140
+ const nuevaPersona = {
141
+ ...persona,
142
+ id: nuevoId, // El id siempre se asigna después para sobrescribir cualquier id existente
143
+ };
144
+ personas.push(nuevaPersona);
145
+ // Guardar convirtiendo fechaNacimiento a string ISO
146
+ const personasParaGuardar = personas.map((p) => ({
147
+ ...p,
148
+ fechaNacimiento: p.fechaNacimiento.toISOString(),
149
+ }));
150
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(personasParaGuardar));
151
+ return nuevaPersona;
152
+ },
153
+ /**
154
+ * Edita una persona existente
155
+ */
156
+ async editar(id, datos) {
157
+ await simulateNetworkDelay();
158
+ const personas = _obtenerTodas();
159
+ const index = personas.findIndex((per) => per.id === id);
160
+ if (index === -1)
161
+ return undefined;
162
+ personas[index] = { ...personas[index], ...datos };
163
+ // Guardar convirtiendo fechaNacimiento a string ISO
164
+ const personasParaGuardar = personas.map((p) => ({
165
+ ...p,
166
+ fechaNacimiento: p.fechaNacimiento.toISOString(),
167
+ }));
168
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(personasParaGuardar));
169
+ return personas[index];
170
+ },
171
+ /**
172
+ * Elimina una persona por ID
173
+ */
174
+ async eliminar(persona) {
175
+ await simulateNetworkDelay();
176
+ const personas = _obtenerTodas();
177
+ const index = personas.findIndex((per) => per.id === persona.id);
178
+ personas.splice(index, 1);
179
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(personas));
180
+ },
181
+ };
@@ -2,5 +2,7 @@ export { useThemeOverride, useTemporaryOverride } from "./useThemeOverride";
2
2
  export { useGlobalThemeStyles } from "./useGlobalThemeStyles";
3
3
  export { useBreakpoint } from "./useBreakpoint";
4
4
  export { useElementScroll } from "./useElementScroll";
5
+ export { useAsyncRequest } from "./useAsyncRequest";
5
6
  export type { Breakpoint, WindowSize, BreakpointInfo } from "./useBreakpoint";
7
+ export type { AsyncRequestOptions, UseAsyncRequestReturn } from "./useAsyncRequest";
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -2,3 +2,4 @@ export { useThemeOverride, useTemporaryOverride } from "./useThemeOverride";
2
2
  export { useGlobalThemeStyles } from "./useGlobalThemeStyles";
3
3
  export { useBreakpoint } from "./useBreakpoint";
4
4
  export { useElementScroll } from "./useElementScroll";
5
+ export { useAsyncRequest } from "./useAsyncRequest";
@@ -0,0 +1,17 @@
1
+ import type { SnackbarVariant } from "../contexts/SnackbarContext";
2
+ export interface AsyncRequestOptions {
3
+ successMessage?: string;
4
+ errorMessage?: string;
5
+ successVariant?: SnackbarVariant;
6
+ errorVariant?: SnackbarVariant;
7
+ onSuccess?: (data: any) => void;
8
+ onError?: (error: any) => void;
9
+ onFinally?: () => void;
10
+ }
11
+ export interface UseAsyncRequestReturn {
12
+ isLoading: boolean;
13
+ execute: <T>(requestFn: () => Promise<T>) => Promise<T | undefined>;
14
+ setLoading: (loading: boolean) => void;
15
+ }
16
+ export declare function useAsyncRequest(options?: AsyncRequestOptions): UseAsyncRequestReturn;
17
+ //# sourceMappingURL=useAsyncRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncRequest.d.ts","sourceRoot":"","sources":["../../src/hooks/useAsyncRequest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACpE,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,eAAe,CAC7B,OAAO,GAAE,mBAAwB,GAChC,qBAAqB,CAqFvB"}
@@ -0,0 +1,70 @@
1
+ import { useState, useCallback } from "react";
2
+ import { useSnackbar } from "../contexts/SnackbarContext";
3
+ export function useAsyncRequest(options = {}) {
4
+ const [isLoading, setIsLoading] = useState(false);
5
+ const { showSnackbar } = useSnackbar();
6
+ const { successMessage, errorMessage, successVariant = "success", errorVariant = "danger", onSuccess, onError, onFinally, } = options;
7
+ const execute = useCallback(async (requestFn) => {
8
+ setIsLoading(true);
9
+ try {
10
+ const result = await requestFn();
11
+ // Mostrar snackbar de éxito solo si existe successMessage
12
+ if (successMessage) {
13
+ console.log("TIENE SUCCESS MESSAGE", successMessage);
14
+ showSnackbar(successMessage, successVariant);
15
+ }
16
+ onSuccess?.(result);
17
+ return result;
18
+ }
19
+ catch (error) {
20
+ console.error("Error en async request:", error);
21
+ // Determinar el mensaje de error:
22
+ // 1. Si existe errorMessage en las opciones, usarlo
23
+ // 2. Si no, intentar usar error.message
24
+ // 3. Si tampoco existe, usar un mensaje genérico
25
+ let finalErrorMessage;
26
+ if (errorMessage) {
27
+ finalErrorMessage = errorMessage;
28
+ }
29
+ else if (error instanceof Error && error.message) {
30
+ finalErrorMessage = error.message;
31
+ }
32
+ else if (error &&
33
+ typeof error === "object" &&
34
+ "message" in error &&
35
+ typeof error.message === "string") {
36
+ finalErrorMessage = error.message;
37
+ }
38
+ else {
39
+ finalErrorMessage = "Ha ocurrido un error";
40
+ }
41
+ // Mostrar snackbar de error solo si existe un mensaje de error
42
+ if (finalErrorMessage) {
43
+ showSnackbar(finalErrorMessage, errorVariant);
44
+ }
45
+ onError?.(error);
46
+ return undefined;
47
+ }
48
+ finally {
49
+ setIsLoading(false);
50
+ onFinally?.();
51
+ }
52
+ }, [
53
+ showSnackbar,
54
+ successMessage,
55
+ errorMessage,
56
+ successVariant,
57
+ errorVariant,
58
+ onSuccess,
59
+ onError,
60
+ onFinally,
61
+ ]);
62
+ const setLoading = useCallback((loading) => {
63
+ setIsLoading(loading);
64
+ }, []);
65
+ return {
66
+ isLoading,
67
+ execute,
68
+ setLoading,
69
+ };
70
+ }