@makroz/mobile 1.0.1

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 (232) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +19 -0
  3. package/dist/auth/MkAuthContext.d.ts +72 -0
  4. package/dist/auth/MkAuthContext.d.ts.map +1 -0
  5. package/dist/auth/MkAuthContext.js +19 -0
  6. package/dist/auth/MkAuthContext.js.map +1 -0
  7. package/dist/auth/MkAuthForm.d.ts +31 -0
  8. package/dist/auth/MkAuthForm.d.ts.map +1 -0
  9. package/dist/auth/MkAuthForm.js +180 -0
  10. package/dist/auth/MkAuthForm.js.map +1 -0
  11. package/dist/auth/MkAuthProvider.d.ts +57 -0
  12. package/dist/auth/MkAuthProvider.d.ts.map +1 -0
  13. package/dist/auth/MkAuthProvider.js +282 -0
  14. package/dist/auth/MkAuthProvider.js.map +1 -0
  15. package/dist/auth/secureStorage.d.ts +63 -0
  16. package/dist/auth/secureStorage.d.ts.map +1 -0
  17. package/dist/auth/secureStorage.js +104 -0
  18. package/dist/auth/secureStorage.js.map +1 -0
  19. package/dist/auth/types.d.ts +65 -0
  20. package/dist/auth/types.d.ts.map +1 -0
  21. package/dist/auth/types.js +10 -0
  22. package/dist/auth/types.js.map +1 -0
  23. package/dist/auth/useMkAuth.d.ts +17 -0
  24. package/dist/auth/useMkAuth.d.ts.map +1 -0
  25. package/dist/auth/useMkAuth.js +24 -0
  26. package/dist/auth/useMkAuth.js.map +1 -0
  27. package/dist/components/MkAccordion.d.ts +19 -0
  28. package/dist/components/MkAccordion.d.ts.map +1 -0
  29. package/dist/components/MkAccordion.js +49 -0
  30. package/dist/components/MkAccordion.js.map +1 -0
  31. package/dist/components/MkAlert.d.ts +18 -0
  32. package/dist/components/MkAlert.d.ts.map +1 -0
  33. package/dist/components/MkAlert.js +35 -0
  34. package/dist/components/MkAlert.js.map +1 -0
  35. package/dist/components/MkAvatar.d.ts +12 -0
  36. package/dist/components/MkAvatar.d.ts.map +1 -0
  37. package/dist/components/MkAvatar.js +33 -0
  38. package/dist/components/MkAvatar.js.map +1 -0
  39. package/dist/components/MkBadge.d.ts +11 -0
  40. package/dist/components/MkBadge.d.ts.map +1 -0
  41. package/dist/components/MkBadge.js +22 -0
  42. package/dist/components/MkBadge.js.map +1 -0
  43. package/dist/components/MkButton.d.ts +13 -0
  44. package/dist/components/MkButton.d.ts.map +1 -0
  45. package/dist/components/MkButton.js +53 -0
  46. package/dist/components/MkButton.js.map +1 -0
  47. package/dist/components/MkCard.d.ts +15 -0
  48. package/dist/components/MkCard.d.ts.map +1 -0
  49. package/dist/components/MkCard.js +25 -0
  50. package/dist/components/MkCard.js.map +1 -0
  51. package/dist/components/MkCheck.d.ts +18 -0
  52. package/dist/components/MkCheck.d.ts.map +1 -0
  53. package/dist/components/MkCheck.js +33 -0
  54. package/dist/components/MkCheck.js.map +1 -0
  55. package/dist/components/MkDatePicker.d.ts +30 -0
  56. package/dist/components/MkDatePicker.d.ts.map +1 -0
  57. package/dist/components/MkDatePicker.js +87 -0
  58. package/dist/components/MkDatePicker.js.map +1 -0
  59. package/dist/components/MkDivider.d.ts +11 -0
  60. package/dist/components/MkDivider.d.ts.map +1 -0
  61. package/dist/components/MkDivider.js +28 -0
  62. package/dist/components/MkDivider.js.map +1 -0
  63. package/dist/components/MkDropDown.d.ts +37 -0
  64. package/dist/components/MkDropDown.d.ts.map +1 -0
  65. package/dist/components/MkDropDown.js +82 -0
  66. package/dist/components/MkDropDown.js.map +1 -0
  67. package/dist/components/MkEmptyState.d.ts +11 -0
  68. package/dist/components/MkEmptyState.d.ts.map +1 -0
  69. package/dist/components/MkEmptyState.js +16 -0
  70. package/dist/components/MkEmptyState.js.map +1 -0
  71. package/dist/components/MkFileUpload.d.ts +63 -0
  72. package/dist/components/MkFileUpload.d.ts.map +1 -0
  73. package/dist/components/MkFileUpload.js +80 -0
  74. package/dist/components/MkFileUpload.js.map +1 -0
  75. package/dist/components/MkIcons.d.ts +15 -0
  76. package/dist/components/MkIcons.d.ts.map +1 -0
  77. package/dist/components/MkIcons.js +35 -0
  78. package/dist/components/MkIcons.js.map +1 -0
  79. package/dist/components/MkInfiniteList.d.ts +22 -0
  80. package/dist/components/MkInfiniteList.d.ts.map +1 -0
  81. package/dist/components/MkInfiniteList.js +62 -0
  82. package/dist/components/MkInfiniteList.js.map +1 -0
  83. package/dist/components/MkInput.d.ts +16 -0
  84. package/dist/components/MkInput.d.ts.map +1 -0
  85. package/dist/components/MkInput.js +66 -0
  86. package/dist/components/MkInput.js.map +1 -0
  87. package/dist/components/MkLoading.d.ts +12 -0
  88. package/dist/components/MkLoading.d.ts.map +1 -0
  89. package/dist/components/MkLoading.js +20 -0
  90. package/dist/components/MkLoading.js.map +1 -0
  91. package/dist/components/MkModal.d.ts +20 -0
  92. package/dist/components/MkModal.d.ts.map +1 -0
  93. package/dist/components/MkModal.js +71 -0
  94. package/dist/components/MkModal.js.map +1 -0
  95. package/dist/components/MkProgressBar.d.ts +13 -0
  96. package/dist/components/MkProgressBar.d.ts.map +1 -0
  97. package/dist/components/MkProgressBar.js +27 -0
  98. package/dist/components/MkProgressBar.js.map +1 -0
  99. package/dist/components/MkRadio.d.ts +20 -0
  100. package/dist/components/MkRadio.d.ts.map +1 -0
  101. package/dist/components/MkRadio.js +35 -0
  102. package/dist/components/MkRadio.js.map +1 -0
  103. package/dist/components/MkSearchInput.d.ts +21 -0
  104. package/dist/components/MkSearchInput.d.ts.map +1 -0
  105. package/dist/components/MkSearchInput.js +44 -0
  106. package/dist/components/MkSearchInput.js.map +1 -0
  107. package/dist/components/MkSelect.d.ts +16 -0
  108. package/dist/components/MkSelect.d.ts.map +1 -0
  109. package/dist/components/MkSelect.js +75 -0
  110. package/dist/components/MkSelect.js.map +1 -0
  111. package/dist/components/MkSkeleton.d.ts +13 -0
  112. package/dist/components/MkSkeleton.d.ts.map +1 -0
  113. package/dist/components/MkSkeleton.js +32 -0
  114. package/dist/components/MkSkeleton.js.map +1 -0
  115. package/dist/components/MkSwitch.d.ts +13 -0
  116. package/dist/components/MkSwitch.d.ts.map +1 -0
  117. package/dist/components/MkSwitch.js +68 -0
  118. package/dist/components/MkSwitch.js.map +1 -0
  119. package/dist/components/MkTable.d.ts +39 -0
  120. package/dist/components/MkTable.d.ts.map +1 -0
  121. package/dist/components/MkTable.js +47 -0
  122. package/dist/components/MkTable.js.map +1 -0
  123. package/dist/components/MkTabs.d.ts +19 -0
  124. package/dist/components/MkTabs.d.ts.map +1 -0
  125. package/dist/components/MkTabs.js +38 -0
  126. package/dist/components/MkTabs.js.map +1 -0
  127. package/dist/components/MkTextArea.d.ts +17 -0
  128. package/dist/components/MkTextArea.d.ts.map +1 -0
  129. package/dist/components/MkTextArea.js +18 -0
  130. package/dist/components/MkTextArea.js.map +1 -0
  131. package/dist/components/MkToastRenderer.d.ts +3 -0
  132. package/dist/components/MkToastRenderer.d.ts.map +1 -0
  133. package/dist/components/MkToastRenderer.js +133 -0
  134. package/dist/components/MkToastRenderer.js.map +1 -0
  135. package/dist/components/MkTooltip.d.ts +15 -0
  136. package/dist/components/MkTooltip.d.ts.map +1 -0
  137. package/dist/components/MkTooltip.js +36 -0
  138. package/dist/components/MkTooltip.js.map +1 -0
  139. package/dist/components/MkWindowList.d.ts +47 -0
  140. package/dist/components/MkWindowList.d.ts.map +1 -0
  141. package/dist/components/MkWindowList.js +50 -0
  142. package/dist/components/MkWindowList.js.map +1 -0
  143. package/dist/components/index.d.ts +30 -0
  144. package/dist/components/index.d.ts.map +1 -0
  145. package/dist/components/index.js +33 -0
  146. package/dist/components/index.js.map +1 -0
  147. package/dist/context/MkApiContext.d.ts +15 -0
  148. package/dist/context/MkApiContext.d.ts.map +1 -0
  149. package/dist/context/MkApiContext.js +27 -0
  150. package/dist/context/MkApiContext.js.map +1 -0
  151. package/dist/context/MkAuthContext.d.ts +19 -0
  152. package/dist/context/MkAuthContext.d.ts.map +1 -0
  153. package/dist/context/MkAuthContext.js +86 -0
  154. package/dist/context/MkAuthContext.js.map +1 -0
  155. package/dist/context/MkConfirmContext.d.ts +8 -0
  156. package/dist/context/MkConfirmContext.d.ts.map +1 -0
  157. package/dist/context/MkConfirmContext.js +36 -0
  158. package/dist/context/MkConfirmContext.js.map +1 -0
  159. package/dist/context/MkToastContext.d.ts +19 -0
  160. package/dist/context/MkToastContext.d.ts.map +1 -0
  161. package/dist/context/MkToastContext.js +86 -0
  162. package/dist/context/MkToastContext.js.map +1 -0
  163. package/dist/hooks/filePicker.types.d.ts +13 -0
  164. package/dist/hooks/filePicker.types.d.ts.map +1 -0
  165. package/dist/hooks/filePicker.types.js +7 -0
  166. package/dist/hooks/filePicker.types.js.map +1 -0
  167. package/dist/hooks/useApi.d.ts +19 -0
  168. package/dist/hooks/useApi.d.ts.map +1 -0
  169. package/dist/hooks/useApi.js +78 -0
  170. package/dist/hooks/useApi.js.map +1 -0
  171. package/dist/hooks/useApi.test.d.ts +2 -0
  172. package/dist/hooks/useApi.test.d.ts.map +1 -0
  173. package/dist/hooks/useApi.test.js +10 -0
  174. package/dist/hooks/useApi.test.js.map +1 -0
  175. package/dist/hooks/useMkCrud.d.ts +39 -0
  176. package/dist/hooks/useMkCrud.d.ts.map +1 -0
  177. package/dist/hooks/useMkCrud.js +118 -0
  178. package/dist/hooks/useMkCrud.js.map +1 -0
  179. package/dist/hooks/useMkDebounce.d.ts +24 -0
  180. package/dist/hooks/useMkDebounce.d.ts.map +1 -0
  181. package/dist/hooks/useMkDebounce.js +36 -0
  182. package/dist/hooks/useMkDebounce.js.map +1 -0
  183. package/dist/hooks/useMkEffectDebug.d.ts +6 -0
  184. package/dist/hooks/useMkEffectDebug.d.ts.map +1 -0
  185. package/dist/hooks/useMkEffectDebug.js +23 -0
  186. package/dist/hooks/useMkEffectDebug.js.map +1 -0
  187. package/dist/hooks/useMkEvent.d.ts +42 -0
  188. package/dist/hooks/useMkEvent.d.ts.map +1 -0
  189. package/dist/hooks/useMkEvent.js +49 -0
  190. package/dist/hooks/useMkEvent.js.map +1 -0
  191. package/dist/hooks/useMkFilePickerCli.d.ts +59 -0
  192. package/dist/hooks/useMkFilePickerCli.d.ts.map +1 -0
  193. package/dist/hooks/useMkFilePickerCli.js +68 -0
  194. package/dist/hooks/useMkFilePickerCli.js.map +1 -0
  195. package/dist/hooks/useMkFilePickerExpo.d.ts +38 -0
  196. package/dist/hooks/useMkFilePickerExpo.d.ts.map +1 -0
  197. package/dist/hooks/useMkFilePickerExpo.js +68 -0
  198. package/dist/hooks/useMkFilePickerExpo.js.map +1 -0
  199. package/dist/hooks/useMkForm.d.ts +43 -0
  200. package/dist/hooks/useMkForm.d.ts.map +1 -0
  201. package/dist/hooks/useMkForm.js +115 -0
  202. package/dist/hooks/useMkForm.js.map +1 -0
  203. package/dist/hooks/useMkInfiniteList.d.ts +16 -0
  204. package/dist/hooks/useMkInfiniteList.d.ts.map +1 -0
  205. package/dist/hooks/useMkInfiniteList.js +58 -0
  206. package/dist/hooks/useMkInfiniteList.js.map +1 -0
  207. package/dist/hooks/useMkList.d.ts +61 -0
  208. package/dist/hooks/useMkList.d.ts.map +1 -0
  209. package/dist/hooks/useMkList.js +55 -0
  210. package/dist/hooks/useMkList.js.map +1 -0
  211. package/dist/hooks/useMkLocalStorage.d.ts +6 -0
  212. package/dist/hooks/useMkLocalStorage.d.ts.map +1 -0
  213. package/dist/hooks/useMkLocalStorage.js +28 -0
  214. package/dist/hooks/useMkLocalStorage.js.map +1 -0
  215. package/dist/hooks/useMkPrevious.d.ts +6 -0
  216. package/dist/hooks/useMkPrevious.d.ts.map +1 -0
  217. package/dist/hooks/useMkPrevious.js +13 -0
  218. package/dist/hooks/useMkPrevious.js.map +1 -0
  219. package/dist/hooks/useMkToggle.d.ts +6 -0
  220. package/dist/hooks/useMkToggle.d.ts.map +1 -0
  221. package/dist/hooks/useMkToggle.js +13 -0
  222. package/dist/hooks/useMkToggle.js.map +1 -0
  223. package/dist/index.d.ts +29 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +32 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/theme/MkThemeProvider.d.ts +14 -0
  228. package/dist/theme/MkThemeProvider.d.ts.map +1 -0
  229. package/dist/theme/MkThemeProvider.js +22 -0
  230. package/dist/theme/MkThemeProvider.js.map +1 -0
  231. package/eslint-plugin-mk/index.js +20 -0
  232. package/package.json +66 -0
@@ -0,0 +1,118 @@
1
+ import { useState, useCallback, useRef } from 'react';
2
+ import { useMkForm } from './useMkForm';
3
+ import { useApi } from './useApi';
4
+ import { useMkToast } from '../context/MkToastContext';
5
+ export function useMkCrud(config) {
6
+ const { module: moduleName, singular, fields, messages, showSuccessToast = true, autoReload = true, onSuccess, onError, onReload, } = config;
7
+ const api = useApi();
8
+ const toast = useMkToast();
9
+ const [action, setAction] = useState('add');
10
+ const [isOpen, setIsOpen] = useState(false);
11
+ const [isDelOpen, setIsDelOpen] = useState(false);
12
+ const [saving, setSaving] = useState(false);
13
+ const currentItemRef = useRef(null);
14
+ const form = useMkForm({
15
+ fields,
16
+ action,
17
+ });
18
+ // ──── Actions ────
19
+ const onAdd = useCallback(() => {
20
+ setAction('add');
21
+ form.reset();
22
+ currentItemRef.current = null;
23
+ setIsOpen(true);
24
+ }, [form]);
25
+ const onEdit = useCallback((item) => {
26
+ setAction('edit');
27
+ form.reset(item);
28
+ currentItemRef.current = item;
29
+ setIsOpen(true);
30
+ }, [form]);
31
+ const onDel = useCallback((item) => {
32
+ setAction('del');
33
+ currentItemRef.current = item;
34
+ form.reset(item);
35
+ setIsDelOpen(true);
36
+ }, [form]);
37
+ const onClose = useCallback(() => {
38
+ setIsOpen(false);
39
+ setIsDelOpen(false);
40
+ form.clearErrors();
41
+ }, [form]);
42
+ // ──── Save ────
43
+ const onSave = useCallback(async () => {
44
+ var _a;
45
+ // Validate (skip for delete)
46
+ if (action !== 'del') {
47
+ if (!form.validate())
48
+ return false;
49
+ }
50
+ setSaving(true);
51
+ try {
52
+ const itemId = (_a = currentItemRef.current) === null || _a === void 0 ? void 0 : _a.id;
53
+ let response;
54
+ if (action === 'del') {
55
+ response = await api.delete(`/${moduleName}/${itemId}`);
56
+ }
57
+ else if (action === 'edit' && itemId) {
58
+ const data = form.getApiData();
59
+ response = await api.put(`/${moduleName}/${itemId}`, data);
60
+ }
61
+ else {
62
+ const data = form.getApiData();
63
+ response = await api.post(`/${moduleName}`, data);
64
+ }
65
+ if (response === null || response === void 0 ? void 0 : response.success) {
66
+ onClose();
67
+ if (showSuccessToast) {
68
+ const msg = (messages === null || messages === void 0 ? void 0 : messages[action])
69
+ || response.message
70
+ || `${singular} ${action === 'del' ? 'eliminado' : action === 'edit' ? 'actualizado' : 'creado'} correctamente`;
71
+ toast.showToast(msg, { type: 'success' });
72
+ }
73
+ if (autoReload && onReload) {
74
+ onReload();
75
+ }
76
+ onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(action, response.data);
77
+ return true;
78
+ }
79
+ else {
80
+ if (response === null || response === void 0 ? void 0 : response.errors) {
81
+ const apiErrors = {};
82
+ for (const key in response.errors) {
83
+ apiErrors[key] = Array.isArray(response.errors[key])
84
+ ? response.errors[key][0]
85
+ : response.errors[key];
86
+ }
87
+ form.setErrors(apiErrors);
88
+ }
89
+ if (response === null || response === void 0 ? void 0 : response.message) {
90
+ toast.showToast(response.message, { type: 'error' });
91
+ }
92
+ onError === null || onError === void 0 ? void 0 : onError(action, response);
93
+ return false;
94
+ }
95
+ }
96
+ catch (error) {
97
+ toast.showToast('Error al procesar la solicitud', { type: 'error' });
98
+ onError === null || onError === void 0 ? void 0 : onError(action, error);
99
+ return false;
100
+ }
101
+ finally {
102
+ setSaving(false);
103
+ }
104
+ }, [action, form, api, moduleName, singular, messages, showSuccessToast, autoReload, onReload, onSuccess, onError, onClose, toast]);
105
+ return {
106
+ action,
107
+ form,
108
+ onAdd,
109
+ onEdit,
110
+ onDel,
111
+ onSave,
112
+ onClose,
113
+ isOpen,
114
+ isDelOpen,
115
+ saving,
116
+ };
117
+ }
118
+ //# sourceMappingURL=useMkCrud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkCrud.js","sourceRoot":"","sources":["../../src/hooks/useMkCrud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @module useMkDebounce
3
+ * @description Returns a debounced value — the value only updates after the specified
4
+ * delay of inactivity. Useful for search inputs, filters, and API-driven queries.
5
+ *
6
+ * API is identical between mk-web and mk-mobile.
7
+ *
8
+ * @template T - Type of the input value.
9
+ * @param value - The value to debounce.
10
+ * @param delay - Milliseconds to wait before updating. Default 300.
11
+ * @returns The debounced value.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const [search, setSearch] = useState('');
16
+ * const debouncedSearch = useMkDebounce(search, 400);
17
+ *
18
+ * useEffect(() => {
19
+ * if (debouncedSearch) api.get('/search', { q: debouncedSearch });
20
+ * }, [debouncedSearch]);
21
+ * ```
22
+ */
23
+ export declare const useMkDebounce: <T = any>(value: T, delay?: number) => T;
24
+ //# sourceMappingURL=useMkDebounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkDebounce.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkDebounce.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,QAAO,MAAY,KAAG,CActE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { useEffect, useState } from 'react';
2
+ /**
3
+ * @module useMkDebounce
4
+ * @description Returns a debounced value — the value only updates after the specified
5
+ * delay of inactivity. Useful for search inputs, filters, and API-driven queries.
6
+ *
7
+ * API is identical between mk-web and mk-mobile.
8
+ *
9
+ * @template T - Type of the input value.
10
+ * @param value - The value to debounce.
11
+ * @param delay - Milliseconds to wait before updating. Default 300.
12
+ * @returns The debounced value.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const [search, setSearch] = useState('');
17
+ * const debouncedSearch = useMkDebounce(search, 400);
18
+ *
19
+ * useEffect(() => {
20
+ * if (debouncedSearch) api.get('/search', { q: debouncedSearch });
21
+ * }, [debouncedSearch]);
22
+ * ```
23
+ */
24
+ export const useMkDebounce = (value, delay = 300) => {
25
+ const [debouncedValue, setDebouncedValue] = useState(value);
26
+ useEffect(() => {
27
+ const handler = setTimeout(() => {
28
+ setDebouncedValue(value);
29
+ }, delay);
30
+ return () => {
31
+ clearTimeout(handler);
32
+ };
33
+ }, [value, delay]);
34
+ return debouncedValue;
35
+ };
36
+ //# sourceMappingURL=useMkDebounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkDebounce.js","sourceRoot":"","sources":["../../src/hooks/useMkDebounce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAU,KAAQ,EAAE,QAAgB,GAAG,EAAK,EAAE;IACvE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAI,KAAK,CAAC,CAAC;IAE/D,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,GAAG,EAAE;YACR,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnB,OAAO,cAAc,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * useMkEffectDebug (Mobile)
3
+ * 🚀 Parity with Web.
4
+ */
5
+ export declare const useMkEffectDebug: (effectFunction: () => void | (() => void), dependencies: any[]) => void;
6
+ //# sourceMappingURL=useMkEffectDebug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkEffectDebug.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkEffectDebug.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,gBAAgB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EACzC,cAAc,GAAG,EAAE,KAClB,IAoBF,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { useEffect } from "react";
2
+ import { useMkPrevious } from "./useMkPrevious";
3
+ /**
4
+ * useMkEffectDebug (Mobile)
5
+ * 🚀 Parity with Web.
6
+ */
7
+ export const useMkEffectDebug = (effectFunction, dependencies) => {
8
+ const previousDependencies = useMkPrevious(dependencies, []);
9
+ const changedDependencies = dependencies.reduce((accum, dependency, index) => {
10
+ if (dependency !== (previousDependencies === null || previousDependencies === void 0 ? void 0 : previousDependencies[index])) {
11
+ accum[index] = {
12
+ before: previousDependencies === null || previousDependencies === void 0 ? void 0 : previousDependencies[index],
13
+ after: dependency,
14
+ };
15
+ }
16
+ return accum;
17
+ }, {});
18
+ if (Object.keys(changedDependencies).length) {
19
+ console.log("📌 [useMkEffectDebug] Dependency changed:", changedDependencies);
20
+ }
21
+ useEffect(effectFunction, dependencies);
22
+ };
23
+ //# sourceMappingURL=useMkEffectDebug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkEffectDebug.js","sourceRoot":"","sources":["../../src/hooks/useMkEffectDebug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,cAAyC,EACzC,YAAmB,EACb,EAAE;IACR,MAAM,oBAAoB,GAAG,aAAa,CAAQ,YAAY,EAAE,EAAE,CAAC,CAAC;IAEpE,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAE7C,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;QAC7B,IAAI,UAAU,MAAK,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAG,KAAK,CAAC,CAAA,EAAE,CAAC;YACjD,KAAK,CAAC,KAAK,CAAC,GAAG;gBACb,MAAM,EAAE,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAG,KAAK,CAAC;gBACrC,KAAK,EAAE,UAAU;aAClB,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,mBAAmB,CAAC,CAAC;IAChF,CAAC;IAED,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @module useMkEvent
3
+ * @description Lightweight event bus for cross-component communication in React Native.
4
+ * Uses a shared in-memory Map — no DOM APIs, no external dependencies.
5
+ * API matches mk-web's useMkEvent exactly: { emit }.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * // Component A — listen
10
+ * useMkEvent('cart:updated', (data) => {
11
+ * console.log('Cart updated:', data);
12
+ * });
13
+ *
14
+ * // Component B — emit
15
+ * const { emit } = useMkEvent('cart:updated');
16
+ * emit({ items: 5 });
17
+ * ```
18
+ */
19
+ type Listener = (data?: any) => void;
20
+ declare function _on(event: string, fn: Listener): void;
21
+ declare function _off(event: string, fn: Listener): void;
22
+ declare function _emit(event: string, data?: any): void;
23
+ export declare function useMkEvent<T = any>(eventName: string, handler?: (data: T) => void): {
24
+ emit: (data?: T) => void;
25
+ };
26
+ /**
27
+ * Imperative event API — for use outside React components (services, callbacks).
28
+ * @example
29
+ * import { MkEventBus } from '@mk/mobile';
30
+ * MkEventBus.emit('notification:received', payload);
31
+ */
32
+ export declare const MkEventBus: {
33
+ readonly on: typeof _on;
34
+ readonly off: typeof _off;
35
+ readonly emit: typeof _emit;
36
+ /** Clear all listeners for an event. */
37
+ readonly clear: (event: string) => void;
38
+ /** Clear ALL listeners. */
39
+ readonly clearAll: () => void;
40
+ };
41
+ export {};
42
+ //# sourceMappingURL=useMkEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkEvent.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkEvent.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,KAAK,QAAQ,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;AAKrC,iBAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAG9C;AAED,iBAAS,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAE/C;AAED,iBAAS,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAE9C;AAED,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI;kBAkBf,CAAC;EAKhB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU;;;;IAInB,wCAAwC;4BACzB,MAAM;IACrB,2BAA2B;;CAErB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { useEffect, useCallback, useRef } from 'react';
2
+ /** Shared in-memory event store — survives re-renders, scoped to JS runtime. */
3
+ const _listeners = new Map();
4
+ function _on(event, fn) {
5
+ if (!_listeners.has(event))
6
+ _listeners.set(event, new Set());
7
+ _listeners.get(event).add(fn);
8
+ }
9
+ function _off(event, fn) {
10
+ var _a;
11
+ (_a = _listeners.get(event)) === null || _a === void 0 ? void 0 : _a.delete(fn);
12
+ }
13
+ function _emit(event, data) {
14
+ var _a;
15
+ (_a = _listeners.get(event)) === null || _a === void 0 ? void 0 : _a.forEach(fn => fn(data));
16
+ }
17
+ export function useMkEvent(eventName, handler) {
18
+ // Stable ref to avoid stale closures
19
+ const handlerRef = useRef(handler);
20
+ handlerRef.current = handler;
21
+ useEffect(() => {
22
+ if (!handlerRef.current)
23
+ return;
24
+ const listener = (data) => {
25
+ var _a;
26
+ (_a = handlerRef.current) === null || _a === void 0 ? void 0 : _a.call(handlerRef, data);
27
+ };
28
+ _on(eventName, listener);
29
+ return () => { _off(eventName, listener); };
30
+ }, [eventName]);
31
+ const emit = useCallback((data) => { _emit(eventName, data); }, [eventName]);
32
+ return { emit };
33
+ }
34
+ /**
35
+ * Imperative event API — for use outside React components (services, callbacks).
36
+ * @example
37
+ * import { MkEventBus } from '@mk/mobile';
38
+ * MkEventBus.emit('notification:received', payload);
39
+ */
40
+ export const MkEventBus = {
41
+ on: _on,
42
+ off: _off,
43
+ emit: _emit,
44
+ /** Clear all listeners for an event. */
45
+ clear: (event) => { _listeners.delete(event); },
46
+ /** Clear ALL listeners. */
47
+ clearAll: () => { _listeners.clear(); },
48
+ };
49
+ //# sourceMappingURL=useMkEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkEvent.js","sourceRoot":"","sources":["../../src/hooks/useMkEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAuBvD,gFAAgF;AAChF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEpD,SAAS,GAAG,CAAC,KAAa,EAAE,EAAY;IACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7D,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,EAAY;;IACrC,MAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,0CAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,IAAU;;IACpC,MAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,0CAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,UAAU,CACtB,SAAiB,EACjB,OAA2B;IAE3B,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,UAAU,CAAC,OAAO;YAAE,OAAO;QAEhC,MAAM,QAAQ,GAAa,CAAC,IAAI,EAAE,EAAE;;YAChC,MAAA,UAAU,CAAC,OAAO,2DAAG,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,WAAW,CACpB,CAAC,IAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,SAAS,CAAC,CACd,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,EAAE,EAAE,GAAG;IACP,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,KAAK;IACX,wCAAwC;IACxC,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvD,2BAA2B;IAC3B,QAAQ,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACjC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { UseMkFilePickerReturn } from './filePicker.types';
2
+ /**
3
+ * @module useMkFilePickerCli
4
+ * @description Picker adapter for **React Native CLI** projects.
5
+ *
6
+ * **Required peer packages** (choose what you need):
7
+ * ```bash
8
+ * # Images / Videos:
9
+ * npm install react-native-image-picker
10
+ * cd ios && pod install && cd ..
11
+ *
12
+ * # Documents (PDF, Word, etc.):
13
+ * npm install react-native-document-picker
14
+ * cd ios && pod install && cd ..
15
+ * ```
16
+ *
17
+ * **Android** — add to AndroidManifest.xml:
18
+ * ```xml
19
+ * <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
20
+ * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
21
+ * ```
22
+ *
23
+ * **iOS** — add to Info.plist:
24
+ * ```xml
25
+ * <key>NSPhotoLibraryUsageDescription</key>
26
+ * <string>Necesitamos acceso para subir imágenes</string>
27
+ * ```
28
+ *
29
+ * @example Images
30
+ * ```tsx
31
+ * const picker = useMkFilePickerCli({ mediaType: 'images', multiple: true });
32
+ * <MkFileUpload onTap={picker.pick} onFiles={setFiles} />
33
+ * ```
34
+ *
35
+ * @example Documents
36
+ * ```tsx
37
+ * const picker = useMkFilePickerCli({
38
+ * mediaType: 'documents',
39
+ * documentMimeTypes: ['application/pdf'],
40
+ * });
41
+ * <MkFileUpload onTap={picker.pick} onFiles={setFiles} />
42
+ * ```
43
+ */
44
+ export type CliMediaType = 'images' | 'videos' | 'documents' | 'all';
45
+ export interface UseMkFilePickerCliOptions {
46
+ /** What type of files to pick. Default 'images'. */
47
+ mediaType?: CliMediaType;
48
+ /** Allow multiple selection. Default false. */
49
+ multiple?: boolean;
50
+ /** Image quality 0–1. Default 0.8. */
51
+ quality?: number;
52
+ /**
53
+ * MIME types for document picker.
54
+ * Default: ['image/*', 'application/pdf']
55
+ */
56
+ documentMimeTypes?: string[];
57
+ }
58
+ export declare function useMkFilePickerCli(options?: UseMkFilePickerCliOptions): UseMkFilePickerReturn;
59
+ //# sourceMappingURL=useMkFilePickerCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkFilePickerCli.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkFilePickerCli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;AAErE,MAAM,WAAW,yBAAyB;IACtC,oDAAoD;IACpD,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,qBAAqB,CA0EjG"}
@@ -0,0 +1,68 @@
1
+ import { useCallback } from 'react';
2
+ export function useMkFilePickerCli(options = {}) {
3
+ const { mediaType = 'images', multiple = false, quality = 0.8, documentMimeTypes = ['image/*', 'application/pdf'], } = options;
4
+ const pick = useCallback(async () => {
5
+ var _a, _b, _c, _d;
6
+ // ── Documents ──────────────────────────────────────────────────────────
7
+ if (mediaType === 'documents') {
8
+ let DocumentPicker;
9
+ try {
10
+ DocumentPicker = require('react-native-document-picker');
11
+ }
12
+ catch (_e) {
13
+ throw new Error('[mk-mobile] useMkFilePickerCli: react-native-document-picker is not installed.\n' +
14
+ 'Fix: npm install react-native-document-picker && cd ios && pod install');
15
+ }
16
+ try {
17
+ const DP = (_a = DocumentPicker.default) !== null && _a !== void 0 ? _a : DocumentPicker;
18
+ const results = multiple
19
+ ? await DP.pickMultiple({ type: documentMimeTypes })
20
+ : [await DP.pickSingle({ type: documentMimeTypes })];
21
+ return results.map((r) => ({
22
+ name: r.name || 'document',
23
+ uri: r.uri,
24
+ type: r.type || 'application/octet-stream',
25
+ sizeMB: r.size ? r.size / (1024 * 1024) : 0,
26
+ }));
27
+ }
28
+ catch (err) {
29
+ const DP = (_b = DocumentPicker.default) !== null && _b !== void 0 ? _b : DocumentPicker;
30
+ if ((_c = DP.isCancel) === null || _c === void 0 ? void 0 : _c.call(DP, err))
31
+ return [];
32
+ throw err;
33
+ }
34
+ }
35
+ // ── Images / Videos ────────────────────────────────────────────────────
36
+ let ImagePicker;
37
+ try {
38
+ ImagePicker = require('react-native-image-picker');
39
+ }
40
+ catch (_f) {
41
+ throw new Error('[mk-mobile] useMkFilePickerCli: react-native-image-picker is not installed.\n' +
42
+ 'Fix: npm install react-native-image-picker && cd ios && pod install');
43
+ }
44
+ const IP = (_d = ImagePicker.default) !== null && _d !== void 0 ? _d : ImagePicker;
45
+ const rnMediaType = mediaType === 'videos' ? 'video' : mediaType === 'all' ? 'mixed' : 'photo';
46
+ return new Promise((resolve) => {
47
+ IP.launchImageLibrary({ mediaType: rnMediaType, quality, selectionLimit: multiple ? 0 : 1 }, (response) => {
48
+ var _a;
49
+ if (response.didCancel || response.errorCode) {
50
+ resolve([]);
51
+ return;
52
+ }
53
+ const assets = ((_a = response.assets) !== null && _a !== void 0 ? _a : []).map((asset) => {
54
+ var _a;
55
+ return ({
56
+ name: asset.fileName || ((_a = asset.uri) === null || _a === void 0 ? void 0 : _a.split('/').pop()) || 'image',
57
+ uri: asset.uri,
58
+ type: asset.type || 'image/jpeg',
59
+ sizeMB: asset.fileSize ? asset.fileSize / (1024 * 1024) : 0,
60
+ });
61
+ });
62
+ resolve(assets);
63
+ });
64
+ });
65
+ }, [mediaType, multiple, quality, documentMimeTypes]);
66
+ return { pick };
67
+ }
68
+ //# sourceMappingURL=useMkFilePickerCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkFilePickerCli.js","sourceRoot":"","sources":["../../src/hooks/useMkFilePickerCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { UseMkFilePickerReturn } from './filePicker.types';
2
+ /**
3
+ * @module useMkFilePickerExpo
4
+ * @description Picker adapter for **Expo** projects.
5
+ *
6
+ * **Required peer packages** (install separately in your app):
7
+ * ```bash
8
+ * npx expo install expo-image-picker expo-document-picker
9
+ * ```
10
+ *
11
+ * This hook uses `require()` at runtime so the library compiles even if these
12
+ * packages are not installed. A clear error message is shown if they're missing.
13
+ *
14
+ * @example Images
15
+ * ```tsx
16
+ * const picker = useMkFilePickerExpo({ mediaType: 'images', multiple: true });
17
+ * <MkFileUpload onTap={picker.pick} onFiles={setFiles} />
18
+ * ```
19
+ *
20
+ * @example Documents
21
+ * ```tsx
22
+ * const picker = useMkFilePickerExpo({ mediaType: 'documents' });
23
+ * <MkFileUpload onTap={picker.pick} onFiles={setFiles} accept=".pdf" />
24
+ * ```
25
+ */
26
+ export type ExpoMediaType = 'images' | 'videos' | 'documents' | 'all';
27
+ export interface UseMkFilePickerExpoOptions {
28
+ /** What type of files to pick. Default 'images'. */
29
+ mediaType?: ExpoMediaType;
30
+ /** Allow multiple selection. Default false. */
31
+ multiple?: boolean;
32
+ /** Allow editing after picking (images only, ignored when multiple=true). */
33
+ allowsEditing?: boolean;
34
+ /** Image quality 0–1. Default 0.8. */
35
+ quality?: number;
36
+ }
37
+ export declare function useMkFilePickerExpo(options?: UseMkFilePickerExpoOptions): UseMkFilePickerReturn;
38
+ //# sourceMappingURL=useMkFilePickerExpo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkFilePickerExpo.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkFilePickerExpo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;AAEtE,MAAM,WAAW,0BAA0B;IACvC,oDAAoD;IACpD,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,qBAAqB,CAkFnG"}
@@ -0,0 +1,68 @@
1
+ import { useCallback } from 'react';
2
+ export function useMkFilePickerExpo(options = {}) {
3
+ const { mediaType = 'images', multiple = false, allowsEditing = false, quality = 0.8, } = options;
4
+ const pick = useCallback(async () => {
5
+ var _a, _b, _c, _d;
6
+ // ── Documents ──────────────────────────────────────────────────────────
7
+ if (mediaType === 'documents') {
8
+ let DocumentPicker;
9
+ try {
10
+ DocumentPicker = require('expo-document-picker');
11
+ }
12
+ catch (_e) {
13
+ throw new Error('[mk-mobile] useMkFilePickerExpo: expo-document-picker is not installed.\n' +
14
+ 'Fix: npx expo install expo-document-picker');
15
+ }
16
+ const result = await DocumentPicker.getDocumentAsync({
17
+ multiple,
18
+ copyToCacheDirectory: true,
19
+ });
20
+ if (result.canceled)
21
+ return [];
22
+ return ((_a = result.assets) !== null && _a !== void 0 ? _a : []).map((asset) => ({
23
+ name: asset.name || 'document',
24
+ uri: asset.uri,
25
+ type: asset.mimeType || 'application/octet-stream',
26
+ sizeMB: asset.size ? asset.size / (1024 * 1024) : 0,
27
+ }));
28
+ }
29
+ // ── Images / Videos ────────────────────────────────────────────────────
30
+ let ImagePicker;
31
+ try {
32
+ ImagePicker = require('expo-image-picker');
33
+ }
34
+ catch (_f) {
35
+ throw new Error('[mk-mobile] useMkFilePickerExpo: expo-image-picker is not installed.\n' +
36
+ 'Fix: npx expo install expo-image-picker');
37
+ }
38
+ const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync();
39
+ if (status !== 'granted') {
40
+ throw new Error('[mk-mobile] useMkFilePickerExpo: Media library permission denied.');
41
+ }
42
+ const mediaTypeMap = {
43
+ images: 'Images',
44
+ videos: 'Videos',
45
+ documents: 'Images',
46
+ all: 'All',
47
+ };
48
+ const result = await ImagePicker.launchImageLibraryAsync({
49
+ mediaTypes: (_c = ((_b = ImagePicker.MediaTypeOptions) !== null && _b !== void 0 ? _b : {})[mediaTypeMap[mediaType]]) !== null && _c !== void 0 ? _c : 'Images',
50
+ allowsMultipleSelection: multiple,
51
+ allowsEditing: !multiple && allowsEditing,
52
+ quality,
53
+ });
54
+ if (result.canceled)
55
+ return [];
56
+ return ((_d = result.assets) !== null && _d !== void 0 ? _d : []).map((asset) => {
57
+ const uriParts = (asset.uri || '').split('/');
58
+ return {
59
+ name: asset.fileName || uriParts[uriParts.length - 1] || 'image',
60
+ uri: asset.uri,
61
+ type: asset.type === 'video' ? 'video/mp4' : 'image/jpeg',
62
+ sizeMB: asset.fileSize ? asset.fileSize / (1024 * 1024) : 0,
63
+ };
64
+ });
65
+ }, [mediaType, multiple, allowsEditing, quality]);
66
+ return { pick };
67
+ }
68
+ //# sourceMappingURL=useMkFilePickerExpo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkFilePickerExpo.js","sourceRoot":"","sources":["../../src/hooks/useMkFilePickerExpo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { MkFormFields, MkFormReturn, MkCrudAction } from '@mk/core';
2
+ /**
3
+ * @module useMkForm
4
+ * @description Unified form state manager with built-in validation.
5
+ * Works on both Web and Mobile — zero platform dependencies.
6
+ *
7
+ * Uses mkValidation from mk-core for field-level and form-level validation,
8
+ * and mkValidation.getApiFields for extracting API-ready data.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * const form = useMkForm({
13
+ * fields: {
14
+ * name: { rules: ['required', 'min:3'], api: 'ae' },
15
+ * email: { rules: ['required', 'email'], api: 'ae' },
16
+ * phone: { rules: ['phone'], api: 'ae*' },
17
+ * },
18
+ * initialData: { name: '', email: '', phone: '' },
19
+ * });
20
+ *
21
+ * // In handler
22
+ * <MkInput label="Nombre" value={form.formState.name} error={form.errors.name}
23
+ * onChange={v => form.setField('name', v)} />
24
+ *
25
+ * const handleSave = () => {
26
+ * if (!form.validate()) return;
27
+ * const data = form.getApiData();
28
+ * api.post('/users', data);
29
+ * };
30
+ * ```
31
+ */
32
+ export interface UseMkFormOptions<T = Record<string, any>> {
33
+ /** Field definitions with rules and API flags. */
34
+ fields: MkFormFields;
35
+ /** Initial data for the form. */
36
+ initialData?: Partial<T>;
37
+ /** Current CRUD action (affects which rules apply). Default 'add'. */
38
+ action?: MkCrudAction;
39
+ /** Validate on every setField call. Default false. */
40
+ validateOnChange?: boolean;
41
+ }
42
+ export declare function useMkForm<T extends Record<string, any> = Record<string, any>>({ fields, initialData, action, validateOnChange, }: UseMkFormOptions<T>): MkFormReturn<T>;
43
+ //# sourceMappingURL=useMkForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMkForm.d.ts","sourceRoot":"","sources":["../../src/hooks/useMkForm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAgB,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACrD,kDAAkD;IAClD,MAAM,EAAE,YAAY,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,sEAAsE;IACtE,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC3E,MAAM,EACN,WAA8B,EAC9B,MAAc,EACd,gBAAwB,GAC3B,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAmIvC"}