@sincpro/mobile 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +74 -0
  2. package/dist/adapters/Bluetooth.adapter.d.ts +14 -0
  3. package/dist/adapters/Bluetooth.adapter.js +100 -0
  4. package/dist/adapters/Geo.adapter.d.ts +8 -0
  5. package/dist/adapters/Geo.adapter.js +30 -0
  6. package/dist/adapters/JsonSerializer.adapter.d.ts +28 -0
  7. package/dist/adapters/JsonSerializer.adapter.js +47 -0
  8. package/dist/adapters/Network.adapter.d.ts +4 -0
  9. package/dist/adapters/Network.adapter.js +13 -0
  10. package/dist/adapters/ReceiptExporter.adapter.d.ts +19 -0
  11. package/dist/adapters/ReceiptExporter.adapter.js +142 -0
  12. package/dist/adapters/repositories/database_table.repository.d.ts +13 -0
  13. package/dist/adapters/repositories/database_table.repository.js +29 -0
  14. package/dist/adapters/repositories/domain_event.repository.d.ts +32 -0
  15. package/dist/adapters/repositories/domain_event.repository.js +147 -0
  16. package/dist/adapters/repositories/domain_event_dead_letter.repository.d.ts +23 -0
  17. package/dist/adapters/repositories/domain_event_dead_letter.repository.js +81 -0
  18. package/dist/adapters/repositories/setting.repository.d.ts +10 -0
  19. package/dist/adapters/repositories/setting.repository.js +21 -0
  20. package/dist/adapters/webview.adapter.d.ts +10 -0
  21. package/dist/adapters/webview.adapter.js +166 -0
  22. package/dist/domain/connectivity/bluetooth.d.ts +19 -0
  23. package/dist/domain/connectivity/bluetooth.js +1 -0
  24. package/dist/domain/connectivity/events.d.ts +17 -0
  25. package/dist/domain/connectivity/events.js +17 -0
  26. package/dist/domain/connectivity/geo.d.ts +4 -0
  27. package/dist/domain/connectivity/geo.js +1 -0
  28. package/dist/domain/connectivity/index.d.ts +3 -0
  29. package/dist/domain/connectivity/index.js +3 -0
  30. package/dist/domain/connectivity/network.d.ts +7 -0
  31. package/dist/domain/connectivity/network.js +1 -0
  32. package/dist/domain/database/database.d.ts +16 -0
  33. package/dist/domain/database/database.js +1 -0
  34. package/dist/domain/database/index.d.ts +2 -0
  35. package/dist/domain/database/index.js +2 -0
  36. package/dist/domain/database/repository.d.ts +19 -0
  37. package/dist/domain/database/repository.js +1 -0
  38. package/dist/domain/entity/entity.d.ts +109 -0
  39. package/dist/domain/entity/entity.js +246 -0
  40. package/dist/domain/entity/entity_collection.d.ts +396 -0
  41. package/dist/domain/entity/entity_collection.js +824 -0
  42. package/dist/domain/entity/index.d.ts +3 -0
  43. package/dist/domain/entity/index.js +3 -0
  44. package/dist/domain/entity/value_object.d.ts +12 -0
  45. package/dist/domain/entity/value_object.js +39 -0
  46. package/dist/domain/event_sourcing/domain_event.d.ts +58 -0
  47. package/dist/domain/event_sourcing/domain_event.js +164 -0
  48. package/dist/domain/event_sourcing/event.d.ts +25 -0
  49. package/dist/domain/event_sourcing/event.js +25 -0
  50. package/dist/domain/event_sourcing/event_handler.d.ts +7 -0
  51. package/dist/domain/event_sourcing/event_handler.js +13 -0
  52. package/dist/domain/event_sourcing/index.d.ts +2 -0
  53. package/dist/domain/event_sourcing/index.js +2 -0
  54. package/dist/domain/events.d.ts +33 -0
  55. package/dist/domain/events.js +32 -0
  56. package/dist/domain/icon.d.ts +1 -0
  57. package/dist/domain/icon.js +1 -0
  58. package/dist/domain/index.d.ts +9 -0
  59. package/dist/domain/index.js +9 -0
  60. package/dist/domain/print/driver_registry.d.ts +4 -0
  61. package/dist/domain/print/driver_registry.js +29 -0
  62. package/dist/domain/print/events.d.ts +13 -0
  63. package/dist/domain/print/events.js +13 -0
  64. package/dist/domain/print/index.d.ts +2 -0
  65. package/dist/domain/print/index.js +1 -0
  66. package/dist/domain/print/printer.d.ts +35 -0
  67. package/dist/domain/print/printer.js +1 -0
  68. package/dist/domain/receipt.d.ts +31 -0
  69. package/dist/domain/receipt.js +1 -0
  70. package/dist/domain/repositories.d.ts +6 -0
  71. package/dist/domain/repositories.js +7 -0
  72. package/dist/domain/settings.d.ts +7 -0
  73. package/dist/domain/settings.js +1 -0
  74. package/dist/domain/webview/events.d.ts +11 -0
  75. package/dist/domain/webview/events.js +11 -0
  76. package/dist/domain/webview/index.d.ts +1 -0
  77. package/dist/domain/webview/index.js +1 -0
  78. package/dist/domain/webview/webview.d.ts +57 -0
  79. package/dist/domain/webview/webview.js +9 -0
  80. package/dist/entrypoints/cron/Cron.d.ts +13 -0
  81. package/dist/entrypoints/cron/Cron.js +57 -0
  82. package/dist/entrypoints/cron/checkNetworkStatus.cron.d.ts +3 -0
  83. package/dist/entrypoints/cron/checkNetworkStatus.cron.js +10 -0
  84. package/dist/entrypoints/db/index.d.ts +2 -0
  85. package/dist/entrypoints/db/index.js +2 -0
  86. package/dist/entrypoints/db/migrations.d.ts +10 -0
  87. package/dist/entrypoints/db/migrations.js +115 -0
  88. package/dist/entrypoints/db/repositories.d.ts +8 -0
  89. package/dist/entrypoints/db/repositories.js +34 -0
  90. package/dist/entrypoints/queue/QueueProcessor.d.ts +12 -0
  91. package/dist/entrypoints/queue/QueueProcessor.js +75 -0
  92. package/dist/entrypoints/queue/activateDomain.subscriber.d.ts +7 -0
  93. package/dist/entrypoints/queue/activateDomain.subscriber.js +15 -0
  94. package/dist/entrypoints/queue/newAppSettings.handler.d.ts +7 -0
  95. package/dist/entrypoints/queue/newAppSettings.handler.js +17 -0
  96. package/dist/entrypoints/queue/printImage.subscriber.d.ts +7 -0
  97. package/dist/entrypoints/queue/printImage.subscriber.js +14 -0
  98. package/dist/entrypoints/queue/processWebViewMessage.subscriber.d.ts +7 -0
  99. package/dist/entrypoints/queue/processWebViewMessage.subscriber.js +23 -0
  100. package/dist/entrypoints/ui/AppShell.d.ts +15 -0
  101. package/dist/entrypoints/ui/AppShell.js +58 -0
  102. package/dist/entrypoints/ui/common_provider.d.ts +35 -0
  103. package/dist/entrypoints/ui/common_provider.js +244 -0
  104. package/dist/entrypoints/ui/domain_switcher.d.ts +19 -0
  105. package/dist/entrypoints/ui/domain_switcher.js +22 -0
  106. package/dist/entrypoints/ui/theme.d.ts +15 -0
  107. package/dist/entrypoints/ui/theme.js +16 -0
  108. package/dist/exceptions.d.ts +22 -0
  109. package/dist/exceptions.js +60 -0
  110. package/dist/framework/base_module.d.ts +14 -0
  111. package/dist/framework/base_module.js +40 -0
  112. package/dist/framework/createApp.d.ts +6 -0
  113. package/dist/framework/createApp.js +9 -0
  114. package/dist/framework/domain_module.d.ts +13 -0
  115. package/dist/framework/domain_module.js +18 -0
  116. package/dist/framework/kernel.d.ts +18 -0
  117. package/dist/framework/kernel.js +60 -0
  118. package/dist/framework/orchestrator.d.ts +29 -0
  119. package/dist/framework/orchestrator.js +118 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +11 -0
  122. package/dist/infrastructure/database/connector.d.ts +13 -0
  123. package/dist/infrastructure/database/connector.js +165 -0
  124. package/dist/infrastructure/database/index.d.ts +2 -0
  125. package/dist/infrastructure/database/index.js +2 -0
  126. package/dist/infrastructure/database/mapped.d.ts +128 -0
  127. package/dist/infrastructure/database/mapped.js +174 -0
  128. package/dist/infrastructure/database/utils.d.ts +10 -0
  129. package/dist/infrastructure/database/utils.js +35 -0
  130. package/dist/infrastructure/logger.d.ts +45 -0
  131. package/dist/infrastructure/logger.js +125 -0
  132. package/dist/infrastructure/ui/ToastHost.d.ts +1 -0
  133. package/dist/infrastructure/ui/ToastHost.js +19 -0
  134. package/dist/infrastructure/ui/UIEventBus.d.ts +12 -0
  135. package/dist/infrastructure/ui/UIEventBus.js +65 -0
  136. package/dist/infrastructure/ui/errorHandler.d.ts +1 -0
  137. package/dist/infrastructure/ui/errorHandler.js +20 -0
  138. package/dist/infrastructure/ui/events.d.ts +1 -0
  139. package/dist/infrastructure/ui/events.js +1 -0
  140. package/dist/infrastructure/workers/CronWorker.d.ts +42 -0
  141. package/dist/infrastructure/workers/CronWorker.js +143 -0
  142. package/dist/infrastructure/workers/EventBus.d.ts +67 -0
  143. package/dist/infrastructure/workers/EventBus.js +279 -0
  144. package/dist/infrastructure/workers/index.d.ts +2 -0
  145. package/dist/infrastructure/workers/index.js +2 -0
  146. package/dist/services/bluetooth.service.d.ts +14 -0
  147. package/dist/services/bluetooth.service.js +72 -0
  148. package/dist/services/database_table.service.d.ts +8 -0
  149. package/dist/services/database_table.service.js +19 -0
  150. package/dist/services/dead_letter_queue.service.d.ts +38 -0
  151. package/dist/services/dead_letter_queue.service.js +99 -0
  152. package/dist/services/event.service.d.ts +7 -0
  153. package/dist/services/event.service.js +24 -0
  154. package/dist/services/network.service.d.ts +7 -0
  155. package/dist/services/network.service.js +43 -0
  156. package/dist/services/printer.service.d.ts +25 -0
  157. package/dist/services/printer.service.js +220 -0
  158. package/dist/services/webview.service.d.ts +17 -0
  159. package/dist/services/webview.service.js +59 -0
  160. package/dist/tools/utils/Initials.d.ts +1 -0
  161. package/dist/tools/utils/Initials.js +12 -0
  162. package/dist/tools/utils/collections.d.ts +120 -0
  163. package/dist/tools/utils/collections.js +158 -0
  164. package/dist/tools/utils/date.d.ts +70 -0
  165. package/dist/tools/utils/date.js +126 -0
  166. package/dist/tools/utils/maps.d.ts +4 -0
  167. package/dist/tools/utils/maps.js +20 -0
  168. package/dist/tools/utils/monetary.d.ts +3 -0
  169. package/dist/tools/utils/monetary.js +31 -0
  170. package/dist/tools/utils/quantity.d.ts +11 -0
  171. package/dist/tools/utils/quantity.js +44 -0
  172. package/dist/tools/utils/searchTools.d.ts +39 -0
  173. package/dist/tools/utils/searchTools.js +56 -0
  174. package/dist/tools/utils/serializer.d.ts +2 -0
  175. package/dist/tools/utils/serializer.js +44 -0
  176. package/dist/ui/components/atoms/DebugBanner.d.ts +2 -0
  177. package/dist/ui/components/atoms/DebugBanner.js +15 -0
  178. package/dist/ui/components/atoms/index.d.ts +1 -0
  179. package/dist/ui/components/atoms/index.js +1 -0
  180. package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.d.ts +8 -0
  181. package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.js +61 -0
  182. package/dist/ui/components/molecules/DeadLetterErrorBlock.d.ts +8 -0
  183. package/dist/ui/components/molecules/DeadLetterErrorBlock.js +14 -0
  184. package/dist/ui/components/molecules/EventTimelineItem.d.ts +7 -0
  185. package/dist/ui/components/molecules/EventTimelineItem.js +65 -0
  186. package/dist/ui/components/molecules/ProcessToast.d.ts +5 -0
  187. package/dist/ui/components/molecules/ProcessToast.js +51 -0
  188. package/dist/ui/components/molecules/ProcessToastProvider.d.ts +4 -0
  189. package/dist/ui/components/molecules/ProcessToastProvider.js +5 -0
  190. package/dist/ui/components/molecules/index.d.ts +5 -0
  191. package/dist/ui/components/molecules/index.js +5 -0
  192. package/dist/ui/components/organisms/BluetoothPrinterSelector.d.ts +7 -0
  193. package/dist/ui/components/organisms/BluetoothPrinterSelector.js +92 -0
  194. package/dist/ui/components/organisms/DatabaseInfoRow.d.ts +11 -0
  195. package/dist/ui/components/organisms/DatabaseInfoRow.js +8 -0
  196. package/dist/ui/components/organisms/DeadLetterQueueRow.d.ts +7 -0
  197. package/dist/ui/components/organisms/DeadLetterQueueRow.js +72 -0
  198. package/dist/ui/components/organisms/EventRow.d.ts +7 -0
  199. package/dist/ui/components/organisms/EventRow.js +90 -0
  200. package/dist/ui/components/organisms/InjectableWebView.d.ts +35 -0
  201. package/dist/ui/components/organisms/InjectableWebView.js +169 -0
  202. package/dist/ui/components/organisms/Receipt.d.ts +11 -0
  203. package/dist/ui/components/organisms/Receipt.js +207 -0
  204. package/dist/ui/components/organisms/TableInfoInfoRow.d.ts +9 -0
  205. package/dist/ui/components/organisms/TableInfoInfoRow.js +19 -0
  206. package/dist/ui/components/organisms/index.d.ts +7 -0
  207. package/dist/ui/components/organisms/index.js +7 -0
  208. package/dist/ui/index.d.ts +4 -0
  209. package/dist/ui/index.js +4 -0
  210. package/dist/ui/layouts/router_layouts.d.ts +17 -0
  211. package/dist/ui/layouts/router_layouts.js +20 -0
  212. package/dist/ui/screens/database/database.context.d.ts +32 -0
  213. package/dist/ui/screens/database/database.context.js +158 -0
  214. package/dist/ui/screens/database/database.json_detail.d.ts +2 -0
  215. package/dist/ui/screens/database/database.json_detail.js +19 -0
  216. package/dist/ui/screens/database/database.list.d.ts +1 -0
  217. package/dist/ui/screens/database/database.list.js +41 -0
  218. package/dist/ui/screens/database/database.table_rows.d.ts +2 -0
  219. package/dist/ui/screens/database/database.table_rows.js +10 -0
  220. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.context.d.ts +34 -0
  221. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.context.js +166 -0
  222. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.list.d.ts +2 -0
  223. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.list.js +24 -0
  224. package/dist/ui/screens/events/events.context.d.ts +25 -0
  225. package/dist/ui/screens/events/events.context.js +113 -0
  226. package/dist/ui/screens/events/events.list.d.ts +1 -0
  227. package/dist/ui/screens/events/events.list.js +26 -0
  228. package/dist/ui/screens/events/index.d.ts +1 -0
  229. package/dist/ui/screens/events/index.js +1 -0
  230. package/dist/ui/screens/index.d.ts +3 -0
  231. package/dist/ui/screens/index.js +3 -0
  232. package/package.json +125 -0
@@ -0,0 +1,166 @@
1
+ import { jsx as _jsx } from "nativewind/jsx-runtime";
2
+ import { deadLetterQueueUseCases } from "../../../services/dead_letter_queue.service";
3
+ import { createContext, useCallback, useContext, useMemo, useState, } from "react";
4
+ const DeadLetterQueueContext = createContext(null);
5
+ export function DeadLetterQueueProvider({ children }) {
6
+ const [events, setEvents] = useState([]);
7
+ const [selectedEvents, setSelectedEvents] = useState(new Set());
8
+ const [isLoading, setIsLoading] = useState(false);
9
+ const [isRetrying, setIsRetrying] = useState(false);
10
+ const [isDeleting, setIsDeleting] = useState(false);
11
+ const [page, setPage] = useState(1);
12
+ const [pageSize] = useState(25);
13
+ const [pagedEvents, setPagedEvents] = useState([]);
14
+ const [hasMore, setHasMore] = useState(false);
15
+ const [isLoadingMore, setIsLoadingMore] = useState(false);
16
+ const paginate = useCallback((list, nextPage) => {
17
+ const slice = list.slice(0, nextPage * pageSize);
18
+ setPagedEvents(slice);
19
+ setHasMore(slice.length < list.length);
20
+ setPage(nextPage);
21
+ }, [pageSize]);
22
+ const loadEvents = useCallback(async () => {
23
+ setIsLoading(true);
24
+ try {
25
+ const fetched = await deadLetterQueueUseCases.getFailedEvents();
26
+ setEvents(fetched);
27
+ setSelectedEvents(new Set());
28
+ paginate(fetched, 1);
29
+ }
30
+ finally {
31
+ setIsLoading(false);
32
+ }
33
+ }, [paginate]);
34
+ const retryEvent = useCallback(async (event) => {
35
+ setIsRetrying(true);
36
+ try {
37
+ await deadLetterQueueUseCases.retryFailedEvent(event);
38
+ await loadEvents();
39
+ }
40
+ finally {
41
+ setIsRetrying(false);
42
+ }
43
+ }, [loadEvents]);
44
+ const loadMore = useCallback(async () => {
45
+ if (isLoadingMore || isLoading || !hasMore)
46
+ return;
47
+ setIsLoadingMore(true);
48
+ try {
49
+ paginate(events, page + 1);
50
+ }
51
+ finally {
52
+ setIsLoadingMore(false);
53
+ }
54
+ }, [events, hasMore, isLoading, isLoadingMore, page, paginate]);
55
+ const retrySelectedEvents = useCallback(async () => {
56
+ if (selectedEvents.size === 0) {
57
+ return { success: 0, failed: 0 };
58
+ }
59
+ setIsRetrying(true);
60
+ try {
61
+ const eventsToRetry = events.filter((event) => selectedEvents.has(event.uuid));
62
+ const result = await deadLetterQueueUseCases.retryMultipleFailedEvents(eventsToRetry);
63
+ await loadEvents();
64
+ return result;
65
+ }
66
+ finally {
67
+ setIsRetrying(false);
68
+ }
69
+ }, [events, selectedEvents, loadEvents]);
70
+ const deleteEvent = useCallback(async (event) => {
71
+ setIsDeleting(true);
72
+ try {
73
+ await deadLetterQueueUseCases.deleteFailedEvent(event);
74
+ await loadEvents();
75
+ }
76
+ finally {
77
+ setIsDeleting(false);
78
+ }
79
+ }, [loadEvents]);
80
+ const deleteSelectedEvents = useCallback(async () => {
81
+ if (selectedEvents.size === 0) {
82
+ return { success: 0, failed: 0 };
83
+ }
84
+ setIsDeleting(true);
85
+ try {
86
+ const eventsToDelete = events.filter((event) => selectedEvents.has(event.uuid));
87
+ const result = await deadLetterQueueUseCases.deleteMultipleFailedEvents(eventsToDelete);
88
+ await loadEvents();
89
+ return result;
90
+ }
91
+ finally {
92
+ setIsDeleting(false);
93
+ }
94
+ }, [events, selectedEvents, loadEvents]);
95
+ const toggleSelection = useCallback((eventId) => {
96
+ setSelectedEvents((prev) => {
97
+ const next = new Set(prev);
98
+ if (next.has(eventId)) {
99
+ next.delete(eventId);
100
+ }
101
+ else {
102
+ next.add(eventId);
103
+ }
104
+ return next;
105
+ });
106
+ }, []);
107
+ const selectAll = useCallback(() => {
108
+ setSelectedEvents(new Set(events.map((event) => event.uuid)));
109
+ }, [events]);
110
+ const clearSelection = useCallback(() => {
111
+ setSelectedEvents(new Set());
112
+ }, []);
113
+ const enrichedEvents = useMemo(() => {
114
+ return pagedEvents || [];
115
+ }, [pagedEvents]);
116
+ const value = useMemo(() => ({
117
+ events,
118
+ enrichedEvents,
119
+ selectedEvents,
120
+ isLoading,
121
+ isRetrying,
122
+ isDeleting,
123
+ loadEvents,
124
+ retryEvent,
125
+ retrySelectedEvents,
126
+ deleteEvent,
127
+ deleteSelectedEvents,
128
+ toggleSelection,
129
+ selectAll,
130
+ clearSelection,
131
+ // Pagination
132
+ loadMore,
133
+ hasMore,
134
+ page,
135
+ pageSize,
136
+ isLoadingMore,
137
+ }), [
138
+ events,
139
+ enrichedEvents,
140
+ selectedEvents,
141
+ isLoading,
142
+ isRetrying,
143
+ isDeleting,
144
+ loadEvents,
145
+ retryEvent,
146
+ retrySelectedEvents,
147
+ deleteEvent,
148
+ deleteSelectedEvents,
149
+ toggleSelection,
150
+ selectAll,
151
+ clearSelection,
152
+ loadMore,
153
+ hasMore,
154
+ page,
155
+ pageSize,
156
+ isLoadingMore,
157
+ ]);
158
+ return (_jsx(DeadLetterQueueContext.Provider, { value: value, children: children }));
159
+ }
160
+ export function useDeadLetterQueue() {
161
+ const context = useContext(DeadLetterQueueContext);
162
+ if (!context) {
163
+ throw new Error("useDeadLetterQueue must be used within DeadLetterQueueProvider");
164
+ }
165
+ return context;
166
+ }
@@ -0,0 +1,2 @@
1
+ declare function DeadLetterQueueList(): import("react/jsx-runtime").JSX.Element;
2
+ export default DeadLetterQueueList;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
+ import DeadLetterQueueRow from "../../../ui/components/organisms/DeadLetterQueueRow";
3
+ import { ListViewV2 } from "@sincpro/mobile-ui/views/ListViewV2";
4
+ import { useEffect } from "react";
5
+ import { useNavigate } from "react-router-native";
6
+ import { DeadLetterQueueProvider, useDeadLetterQueue } from "./dead_letter_queue.context";
7
+ function DeadLetterQueueScreenComponent() {
8
+ const navigate = useNavigate();
9
+ const { enrichedEvents, isLoading, loadEvents, retryEvent } = useDeadLetterQueue();
10
+ useEffect(() => {
11
+ loadEvents();
12
+ }, [loadEvents]);
13
+ const onBack = () => navigate(-1);
14
+ return (_jsxs(ListViewV2.Root, { description: "Eventos que no pudieron ser procesados", isLoading: isLoading, items: enrichedEvents, name: "Eventos fallidos", onBack: onBack, onRefresh: loadEvents, children: [_jsx(ListViewV2.Header, { variant: "FLAT_HEADER" /* EVariantScreenHeader.FLAT_HEADER */ }), _jsx(ListViewV2.Content, { children: (event) => (_jsx(DeadLetterQueueRow, { item: event, onRetry: async (evt) => {
15
+ await retryEvent(evt);
16
+ setTimeout(() => {
17
+ void loadEvents();
18
+ }, 5000);
19
+ } })) })] }));
20
+ }
21
+ function DeadLetterQueueList() {
22
+ return (_jsx(DeadLetterQueueProvider, { children: _jsx(DeadLetterQueueScreenComponent, {}) }));
23
+ }
24
+ export default DeadLetterQueueList;
@@ -0,0 +1,25 @@
1
+ import { DomainEvent } from "../../../domain/event_sourcing";
2
+ import { ReactNode } from "react";
3
+ type EventFilter = "ALL" | "FAILED" | "ACKNOWLEDGED" | "PENDING";
4
+ interface IEventsContext {
5
+ events: DomainEvent[];
6
+ pagedEvents: DomainEvent[];
7
+ isLoading: boolean;
8
+ isLoadingMore: boolean;
9
+ isRetrying: boolean;
10
+ hasMore: boolean;
11
+ page: number;
12
+ pageSize: number;
13
+ filter: EventFilter;
14
+ setFilter: (filter: EventFilter) => void;
15
+ loadEvents: () => Promise<void>;
16
+ refreshEvents: () => Promise<void>;
17
+ loadMore: () => Promise<void>;
18
+ retryEvent: (event: DomainEvent) => Promise<void>;
19
+ }
20
+ export declare function EventsProvider({ children, pageSize, }: {
21
+ children: ReactNode;
22
+ pageSize?: number;
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ export declare function useEvents(): IEventsContext;
25
+ export {};
@@ -0,0 +1,113 @@
1
+ import { jsx as _jsx } from "nativewind/jsx-runtime";
2
+ import { eventService } from "../../../services/event.service";
3
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
4
+ const EventsContext = createContext(null);
5
+ export function EventsProvider({ children, pageSize = 25, }) {
6
+ const [events, setEvents] = useState([]);
7
+ const [pagedEvents, setPagedEvents] = useState([]);
8
+ const [isLoading, setIsLoading] = useState(false);
9
+ const [isLoadingMore, setIsLoadingMore] = useState(false);
10
+ const [isRetrying, setIsRetrying] = useState(false);
11
+ const [page, setPage] = useState(1);
12
+ const [hasMore, setHasMore] = useState(false);
13
+ const [filter, setFilter] = useState("ALL");
14
+ const filterEvents = useCallback((list, currentFilter) => {
15
+ if (currentFilter === "ALL")
16
+ return list;
17
+ return list.filter((ev) => {
18
+ if (!ev.status)
19
+ return false;
20
+ if (currentFilter === "FAILED")
21
+ return ev.status === "FAILED";
22
+ if (currentFilter === "ACKNOWLEDGED")
23
+ return ev.status === "ACKNOWLEDGED";
24
+ if (currentFilter === "PENDING")
25
+ return ev.status === "PENDING";
26
+ return true;
27
+ });
28
+ }, []);
29
+ const paginate = useCallback((list, nextPage, currentFilter) => {
30
+ const filtered = filterEvents(list, currentFilter);
31
+ const slice = filtered.slice(0, nextPage * pageSize);
32
+ setPagedEvents(slice);
33
+ setHasMore(slice.length < filtered.length);
34
+ setPage(nextPage);
35
+ }, [filterEvents, pageSize]);
36
+ const loadEvents = useCallback(async () => {
37
+ setIsLoading(true);
38
+ try {
39
+ const fetched = await eventService.listAllEvents();
40
+ setEvents(fetched);
41
+ paginate(fetched, 1, filter);
42
+ }
43
+ finally {
44
+ setIsLoading(false);
45
+ }
46
+ }, [filter, paginate]);
47
+ const refreshEvents = useCallback(async () => {
48
+ await loadEvents();
49
+ }, [loadEvents]);
50
+ useEffect(() => {
51
+ paginate(events, 1, filter);
52
+ }, [events, filter, paginate]);
53
+ const loadMore = useCallback(async () => {
54
+ if (isLoadingMore || isLoading || !hasMore)
55
+ return;
56
+ setIsLoadingMore(true);
57
+ try {
58
+ paginate(events, page + 1, filter);
59
+ }
60
+ finally {
61
+ setIsLoadingMore(false);
62
+ }
63
+ }, [events, hasMore, isLoading, isLoadingMore, page, paginate, filter]);
64
+ const retryEvent = useCallback(async (event) => {
65
+ setIsRetrying(true);
66
+ try {
67
+ await eventService.republishSync(event);
68
+ await refreshEvents();
69
+ }
70
+ finally {
71
+ setIsRetrying(false);
72
+ }
73
+ }, [refreshEvents]);
74
+ const value = useMemo(() => ({
75
+ events,
76
+ pagedEvents,
77
+ isLoading,
78
+ isLoadingMore,
79
+ isRetrying,
80
+ hasMore,
81
+ page,
82
+ pageSize,
83
+ filter,
84
+ setFilter,
85
+ loadEvents,
86
+ refreshEvents,
87
+ loadMore,
88
+ retryEvent,
89
+ }), [
90
+ events,
91
+ pagedEvents,
92
+ isLoading,
93
+ isLoadingMore,
94
+ isRetrying,
95
+ hasMore,
96
+ page,
97
+ pageSize,
98
+ filter,
99
+ setFilter,
100
+ loadEvents,
101
+ refreshEvents,
102
+ loadMore,
103
+ retryEvent,
104
+ ]);
105
+ return _jsx(EventsContext.Provider, { value: value, children: children });
106
+ }
107
+ export function useEvents() {
108
+ const context = useContext(EventsContext);
109
+ if (!context) {
110
+ throw new Error("useEvents must be used within EventsProvider");
111
+ }
112
+ return context;
113
+ }
@@ -0,0 +1 @@
1
+ export default function EventsScreen(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
+ import EventRow from "../../../ui/components/organisms/EventRow";
3
+ import { ListViewV2 } from "@sincpro/mobile-ui/views/ListViewV2";
4
+ import { useEffect } from "react";
5
+ import { useNavigate } from "react-router-native";
6
+ import { EventsProvider, useEvents } from "./events.context";
7
+ const FILTER_OPTIONS = [
8
+ { label: "Todos", value: "ALL" },
9
+ { label: "Fallidos", value: "FAILED" },
10
+ { label: "Reconocidos", value: "ACKNOWLEDGED" },
11
+ { label: "Pendientes", value: "PENDING" },
12
+ ];
13
+ function EventsScreenComponent() {
14
+ const navigate = useNavigate();
15
+ const { pagedEvents, isLoading, loadEvents, retryEvent, filter, setFilter } = useEvents();
16
+ useEffect(() => {
17
+ void loadEvents();
18
+ }, [loadEvents]);
19
+ const onBack = () => navigate(-1);
20
+ return (_jsxs(ListViewV2.Root, { description: "Eventos registrados", isLoading: isLoading, items: pagedEvents, name: "Eventos", onBack: onBack, onRefresh: loadEvents, children: [_jsx(ListViewV2.Header, { variant: "FLAT_HEADER" /* EVariantScreenHeader.FLAT_HEADER */, children: _jsx(ListViewV2.Header.Filters, { children: _jsx(ListViewV2.Header.Filters.Chips, { children: FILTER_OPTIONS.map((option) => (_jsx(ListViewV2.Header.Filters.Chip, { active: filter === option.value, label: option.label, onPress: () => setFilter(option.value) }, option.value))) }) }) }), _jsx(ListViewV2.Content, { children: (event) => (_jsx(EventRow, { item: event, onRetry: async (evt) => {
21
+ await retryEvent(evt);
22
+ } })) })] }));
23
+ }
24
+ export default function EventsScreen() {
25
+ return (_jsx(EventsProvider, { children: _jsx(EventsScreenComponent, {}) }));
26
+ }
@@ -0,0 +1 @@
1
+ export { default as EventsScreen } from "./events.list";
@@ -0,0 +1 @@
1
+ export { default as EventsScreen } from "./events.list";
@@ -0,0 +1,3 @@
1
+ export { default as DatabaseList } from "../../ui/screens/database/database.list";
2
+ export { default as DeadLetterQueueList } from "../../ui/screens/dead_letter_queue/dead_letter_queue.list";
3
+ export { default as EventsScreen } from "../../ui/screens/events/events.list";
@@ -0,0 +1,3 @@
1
+ export { default as DatabaseList } from "../../ui/screens/database/database.list";
2
+ export { default as DeadLetterQueueList } from "../../ui/screens/dead_letter_queue/dead_letter_queue.list";
3
+ export { default as EventsScreen } from "../../ui/screens/events/events.list";
package/package.json ADDED
@@ -0,0 +1,125 @@
1
+ {
2
+ "name": "@sincpro/mobile",
3
+ "version": "0.1.0",
4
+ "description": "Sincpro Mobile framework core: offline-first infra (DB, queue/events, cron), DDD patterns, adapters, AppShell and module-driven composition for React Native",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "sideEffects": false,
15
+ "prettier": {
16
+ "printWidth": 94
17
+ },
18
+ "keywords": [
19
+ "react-native",
20
+ "expo",
21
+ "framework",
22
+ "ddd",
23
+ "offline-first",
24
+ "sincpro"
25
+ ],
26
+ "repository": "https://github.com/Sincpro-SRL/sincpro_mobile",
27
+ "author": "Gutierrez, Andres <andres.gutierrez@sincpro.com.bo>",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "async-mutex": "^0.5.0",
31
+ "big.js": "^7.0.1",
32
+ "dayjs": "^1.11.18",
33
+ "mitt": "^3.0.1",
34
+ "pdf-lib": "^1.17.1",
35
+ "tailwind-variants": "^3.2.2",
36
+ "uuid": "^13.0.0"
37
+ },
38
+ "peerDependencies": {
39
+ "expo-background-task": "*",
40
+ "expo-clipboard": "*",
41
+ "expo-crypto": "*",
42
+ "expo-file-system": "*",
43
+ "expo-linking": "*",
44
+ "expo-localization": "*",
45
+ "expo-location": "*",
46
+ "expo-network": "*",
47
+ "expo-print": "*",
48
+ "expo-sharing": "*",
49
+ "expo-splash-screen": "*",
50
+ "expo-sqlite": "*",
51
+ "expo-task-manager": "*",
52
+ "nativewind": ">=4",
53
+ "react": "*",
54
+ "react-native": "*",
55
+ "react-native-gesture-handler": "*",
56
+ "react-native-keyboard-controller": "*",
57
+ "react-native-safe-area-context": "*",
58
+ "react-native-toast-message": "*",
59
+ "react-native-view-shot": "*",
60
+ "react-native-webview": "*",
61
+ "react-router-native": ">=6",
62
+ "@sincpro/mobile-ui": "^0.2.0"
63
+ },
64
+ "devDependencies": {
65
+ "@types/big.js": "^6.2.2",
66
+ "@types/react": "~19.1.10",
67
+ "@types/uuid": "^10.0.0",
68
+ "eslint": "^9.35.0",
69
+ "eslint-config-expo": "~10.0.0",
70
+ "eslint-config-prettier": "^10.1.8",
71
+ "eslint-plugin-prettier": "^5.5.4",
72
+ "eslint-plugin-react": "^7.37.2",
73
+ "eslint-plugin-simple-import-sort": "^12.1.1",
74
+ "expo-background-task": "~1.0.10",
75
+ "expo-clipboard": "~8.0.8",
76
+ "expo-crypto": "~15.0.9",
77
+ "expo-file-system": "~19.0.23",
78
+ "expo-linking": "~8.0.12",
79
+ "expo-localization": "~17.0.9",
80
+ "expo-location": "~19.0.8",
81
+ "expo-network": "~8.0.8",
82
+ "expo-print": "~15.0.8",
83
+ "expo-sharing": "~14.0.8",
84
+ "expo-splash-screen": "~31.0.13",
85
+ "expo-sqlite": "~16.0.10",
86
+ "expo-task-manager": "~14.0.9",
87
+ "nativewind": "^4.0.1",
88
+ "prettier": "^3.6.2",
89
+ "react": "19.1.0",
90
+ "react-native": "0.81.5",
91
+ "react-native-gesture-handler": "~2.28.0",
92
+ "react-native-keyboard-controller": "1.18.5",
93
+ "react-native-reanimated": "~4.1.1",
94
+ "react-native-safe-area-context": "~5.6.0",
95
+ "react-native-svg": "15.12.1",
96
+ "react-native-toast-message": "^2.3.3",
97
+ "react-native-view-shot": "^4.0.3",
98
+ "react-native-webview": "13.15.0",
99
+ "react-router-native": "^6.30.0",
100
+ "tsc-alias": "^1.8.17",
101
+ "typescript": "~5.9.2",
102
+ "@sincpro/mobile-ui": "^0.2.0"
103
+ },
104
+ "exports": {
105
+ ".": "./dist/index.js",
106
+ "./domain": "./dist/domain/index.js",
107
+ "./domain/entity": "./dist/domain/entity/index.js",
108
+ "./domain/event_sourcing": "./dist/domain/event_sourcing/index.js",
109
+ "./domain/database": "./dist/domain/database/index.js",
110
+ "./domain/connectivity": "./dist/domain/connectivity/index.js",
111
+ "./domain/print": "./dist/domain/print/index.js",
112
+ "./domain/webview": "./dist/domain/webview/index.js",
113
+ "./entrypoints/db": "./dist/entrypoints/db/index.js",
114
+ "./infrastructure/database": "./dist/infrastructure/database/index.js",
115
+ "./infrastructure/workers": "./dist/infrastructure/workers/index.js",
116
+ "./ui": "./dist/ui/index.js",
117
+ "./ui/components/atoms": "./dist/ui/components/atoms/index.js",
118
+ "./ui/components/molecules": "./dist/ui/components/molecules/index.js",
119
+ "./ui/components/organisms": "./dist/ui/components/organisms/index.js",
120
+ "./ui/screens": "./dist/ui/screens/index.js",
121
+ "./ui/screens/events": "./dist/ui/screens/events/index.js",
122
+ "./*": "./dist/*.js",
123
+ "./package.json": "./package.json"
124
+ }
125
+ }