@sincpro/mobile 0.4.3 → 1.0.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 (197) hide show
  1. package/README.md +3 -3
  2. package/dist/adapters/JsonSerializer.adapter.d.ts +1 -1
  3. package/dist/adapters/JsonSerializer.adapter.js +2 -2
  4. package/dist/adapters/ReceiptExporter.adapter.js +10 -2
  5. package/dist/adapters/repositories/database_table.repository.d.ts +3 -2
  6. package/dist/adapters/repositories/database_table.repository.js +1 -1
  7. package/dist/adapters/repositories/document.repository.d.ts +81 -0
  8. package/dist/adapters/repositories/document.repository.js +653 -0
  9. package/dist/adapters/repositories/domain_event.repository.d.ts +17 -17
  10. package/dist/adapters/repositories/domain_event.repository.js +25 -31
  11. package/dist/adapters/repositories/domain_event_dead_letter.repository.d.ts +10 -10
  12. package/dist/adapters/repositories/domain_event_dead_letter.repository.js +14 -13
  13. package/dist/adapters/repositories/event_row.d.ts +13 -0
  14. package/dist/adapters/repositories/event_row.js +22 -0
  15. package/dist/adapters/repositories/sqlite_document_store.d.ts +33 -0
  16. package/dist/adapters/repositories/sqlite_document_store.js +201 -0
  17. package/dist/domain/connectivity/events.d.ts +5 -5
  18. package/dist/domain/connectivity/events.js +3 -3
  19. package/dist/domain/database/criteria.d.ts +19 -0
  20. package/dist/domain/database/criteria.js +36 -0
  21. package/dist/domain/database/criteria_clock.d.ts +8 -0
  22. package/dist/domain/database/criteria_clock.js +305 -0
  23. package/dist/domain/database/criteria_sql.d.ts +61 -0
  24. package/dist/domain/database/criteria_sql.js +476 -0
  25. package/dist/domain/database/database.d.ts +1 -0
  26. package/dist/domain/database/index.d.ts +3 -1
  27. package/dist/domain/database/index.js +3 -1
  28. package/dist/domain/database/migration_plan.d.ts +14 -0
  29. package/dist/domain/database/migration_plan.js +44 -0
  30. package/dist/domain/entity/change_tracking.d.ts +21 -0
  31. package/dist/domain/entity/change_tracking.js +71 -0
  32. package/dist/domain/entity/checks.d.ts +8 -0
  33. package/dist/domain/entity/checks.js +82 -0
  34. package/dist/domain/entity/entity.d.ts +39 -32
  35. package/dist/domain/entity/entity.js +94 -105
  36. package/dist/domain/entity/entity_collection.d.ts +15 -30
  37. package/dist/domain/entity/entity_collection.js +30 -121
  38. package/dist/domain/entity/index.d.ts +5 -0
  39. package/dist/domain/entity/index.js +5 -0
  40. package/dist/domain/entity/reconcile.d.ts +7 -0
  41. package/dist/domain/entity/reconcile.js +12 -0
  42. package/dist/domain/entity/relations.d.ts +27 -0
  43. package/dist/domain/entity/relations.js +69 -0
  44. package/dist/domain/entity/remote_sync.d.ts +4 -0
  45. package/dist/domain/entity/remote_sync.js +19 -0
  46. package/dist/domain/entity/values.d.ts +6 -0
  47. package/dist/domain/entity/values.js +13 -0
  48. package/dist/domain/events/catalog.d.ts +29 -0
  49. package/dist/domain/{events.js → events/catalog.js} +7 -11
  50. package/dist/domain/events/chain.d.ts +5 -0
  51. package/dist/domain/events/chain.js +6 -0
  52. package/dist/domain/{event_sourcing → events}/domain_event.d.ts +20 -22
  53. package/dist/domain/events/domain_event.js +227 -0
  54. package/dist/domain/events/index.d.ts +8 -0
  55. package/dist/domain/events/index.js +8 -0
  56. package/dist/domain/events/integration_event.d.ts +103 -0
  57. package/dist/domain/events/integration_event.js +72 -0
  58. package/dist/domain/events/label.d.ts +2 -0
  59. package/dist/domain/events/label.js +26 -0
  60. package/dist/domain/index.d.ts +0 -1
  61. package/dist/domain/index.js +0 -1
  62. package/dist/domain/print/events.d.ts +8 -4
  63. package/dist/domain/print/events.js +9 -4
  64. package/dist/domain/repositories/document_store.d.ts +33 -0
  65. package/dist/domain/repositories/document_store.js +5 -0
  66. package/dist/domain/repositories/hooks.d.ts +23 -0
  67. package/dist/domain/repositories/hooks.js +32 -0
  68. package/dist/domain/repositories/index.d.ts +4 -0
  69. package/dist/domain/repositories/index.js +4 -0
  70. package/dist/domain/{database → repositories}/repository.d.ts +9 -3
  71. package/dist/domain/settings.d.ts +4 -1
  72. package/dist/domain/settings.js +3 -0
  73. package/dist/domain/webview/events.d.ts +2 -2
  74. package/dist/domain/webview/events.js +2 -2
  75. package/dist/entrypoints/db/migrations.js +10 -10
  76. package/dist/entrypoints/queue/QueueProcessor.d.ts +1 -1
  77. package/dist/entrypoints/queue/activateDomain.subscriber.d.ts +2 -2
  78. package/dist/entrypoints/queue/activateDomain.subscriber.js +2 -2
  79. package/dist/entrypoints/queue/newAppSettings.handler.d.ts +2 -2
  80. package/dist/entrypoints/queue/newAppSettings.handler.js +1 -1
  81. package/dist/entrypoints/queue/printImage.subscriber.d.ts +1 -1
  82. package/dist/entrypoints/queue/printImage.subscriber.js +2 -2
  83. package/dist/entrypoints/queue/processWebViewMessage.subscriber.d.ts +1 -1
  84. package/dist/entrypoints/queue/processWebViewMessage.subscriber.js +1 -1
  85. package/dist/entrypoints/ui/AppShell.js +2 -2
  86. package/dist/entrypoints/ui/common_provider.d.ts +1 -13
  87. package/dist/entrypoints/ui/common_provider.js +4 -133
  88. package/dist/entrypoints/ui/domain_switcher.d.ts +2 -2
  89. package/dist/event_driven/index.d.ts +1 -0
  90. package/dist/event_driven/index.js +1 -0
  91. package/dist/{domain/event_sourcing/event_handler.d.ts → event_driven/subscriber.d.ts} +1 -1
  92. package/dist/exceptions.d.ts +21 -0
  93. package/dist/exceptions.js +30 -0
  94. package/dist/framework/base_module.d.ts +1 -1
  95. package/dist/framework/createApp.d.ts +3 -3
  96. package/dist/framework/domain_module.d.ts +1 -1
  97. package/dist/framework/feature.d.ts +26 -0
  98. package/dist/framework/feature.js +36 -0
  99. package/dist/framework/kernel.d.ts +1 -1
  100. package/dist/framework/kernel.js +17 -8
  101. package/dist/index.d.ts +1 -0
  102. package/dist/index.js +1 -0
  103. package/dist/infrastructure/database/connector.d.ts +2 -0
  104. package/dist/infrastructure/database/connector.js +22 -0
  105. package/dist/infrastructure/database/index.d.ts +1 -0
  106. package/dist/infrastructure/database/index.js +1 -0
  107. package/dist/infrastructure/database/schema.d.ts +9 -0
  108. package/dist/infrastructure/database/schema.js +61 -0
  109. package/dist/infrastructure/database/utils.d.ts +2 -0
  110. package/dist/infrastructure/database/utils.js +12 -4
  111. package/dist/infrastructure/event_chain.d.ts +6 -0
  112. package/dist/infrastructure/event_chain.js +25 -0
  113. package/dist/infrastructure/interceptor/intercept.d.ts +7 -2
  114. package/dist/infrastructure/interceptor/intercept.js +5 -2
  115. package/dist/infrastructure/telemetry/tracing/tracing_hooks.d.ts +9 -6
  116. package/dist/infrastructure/telemetry/tracing/tracing_hooks.js +61 -35
  117. package/dist/infrastructure/ui/UIEventBus.d.ts +3 -1
  118. package/dist/infrastructure/ui/UIEventBus.js +8 -1
  119. package/dist/infrastructure/ui/activity.d.ts +37 -0
  120. package/dist/infrastructure/ui/activity.js +84 -0
  121. package/dist/infrastructure/workers/CronWorker.d.ts +6 -4
  122. package/dist/infrastructure/workers/CronWorker.js +24 -18
  123. package/dist/infrastructure/workers/EventBus.d.ts +9 -5
  124. package/dist/infrastructure/workers/EventBus.js +68 -33
  125. package/dist/services/bluetooth.service.js +16 -14
  126. package/dist/services/dead_letter_queue.service.d.ts +7 -7
  127. package/dist/services/dead_letter_queue.service.js +0 -2
  128. package/dist/services/event.service.d.ts +3 -3
  129. package/dist/services/event.service.js +1 -1
  130. package/dist/services/network.service.d.ts +1 -1
  131. package/dist/services/network.service.js +17 -15
  132. package/dist/services/printer.service.d.ts +1 -1
  133. package/dist/services/printer.service.js +50 -44
  134. package/dist/tools/utils/date.js +4 -3
  135. package/dist/tools/utils/monetary.d.ts +6 -3
  136. package/dist/tools/utils/monetary.js +33 -21
  137. package/dist/tools/utils/serializer.d.ts +1 -1
  138. package/dist/tools/utils/serializer.js +32 -35
  139. package/dist/ui/activity/DeviceNotices.d.ts +1 -0
  140. package/dist/ui/activity/DeviceNotices.js +29 -0
  141. package/dist/ui/activity/ProcessToast.d.ts +2 -0
  142. package/dist/ui/activity/ProcessToast.js +71 -0
  143. package/dist/ui/{components/molecules → activity}/ProcessToastProvider.d.ts +1 -1
  144. package/dist/ui/activity/index.d.ts +4 -0
  145. package/dist/ui/activity/index.js +4 -0
  146. package/dist/ui/activity/useActivity.d.ts +9 -0
  147. package/dist/ui/activity/useActivity.js +48 -0
  148. package/dist/ui/components/atoms/DebugBanner.d.ts +1 -1
  149. package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.d.ts +1 -1
  150. package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.js +8 -2
  151. package/dist/ui/components/molecules/DeadLetterErrorBlock.d.ts +1 -1
  152. package/dist/ui/components/molecules/EventTimelineItem.d.ts +3 -3
  153. package/dist/ui/components/molecules/EventTimelineItem.js +1 -1
  154. package/dist/ui/components/molecules/GeoPermissionCard.d.ts +1 -1
  155. package/dist/ui/components/molecules/TimeZoneSelector.d.ts +1 -1
  156. package/dist/ui/components/molecules/TimeZoneSelectorModal.d.ts +1 -1
  157. package/dist/ui/components/molecules/TimeZoneSelectorModal.js +5 -3
  158. package/dist/ui/components/molecules/index.d.ts +1 -2
  159. package/dist/ui/components/molecules/index.js +1 -2
  160. package/dist/ui/components/organisms/BluetoothPrinterSelector.d.ts +1 -1
  161. package/dist/ui/components/organisms/BluetoothPrinterSelector.js +3 -0
  162. package/dist/ui/components/organisms/DatabaseInfoRow.d.ts +1 -1
  163. package/dist/ui/components/organisms/DeadLetterQueueRow.d.ts +5 -4
  164. package/dist/ui/components/organisms/EventRow.d.ts +4 -4
  165. package/dist/ui/components/organisms/EventRow.js +1 -1
  166. package/dist/ui/components/organisms/InjectableWebView.d.ts +2 -2
  167. package/dist/ui/components/organisms/InjectableWebView.js +6 -3
  168. package/dist/ui/components/organisms/Receipt.d.ts +2 -1
  169. package/dist/ui/components/organisms/TableInfoInfoRow.d.ts +1 -1
  170. package/dist/ui/screens/database/database.context.d.ts +2 -2
  171. package/dist/ui/screens/database/database.context.js +9 -18
  172. package/dist/ui/screens/database/database.json_detail.d.ts +1 -1
  173. package/dist/ui/screens/database/database.list.d.ts +1 -1
  174. package/dist/ui/screens/database/database.table_rows.d.ts +1 -1
  175. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.context.d.ts +7 -7
  176. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.list.d.ts +1 -1
  177. package/dist/ui/screens/events/events.context.d.ts +6 -6
  178. package/dist/ui/screens/events/events.context.js +20 -25
  179. package/dist/ui/screens/events/events.list.d.ts +1 -1
  180. package/package.json +51 -40
  181. package/dist/domain/event_sourcing/domain_event.js +0 -164
  182. package/dist/domain/event_sourcing/event.d.ts +0 -25
  183. package/dist/domain/event_sourcing/event.js +0 -25
  184. package/dist/domain/event_sourcing/index.d.ts +0 -2
  185. package/dist/domain/event_sourcing/index.js +0 -2
  186. package/dist/domain/events.d.ts +0 -33
  187. package/dist/infrastructure/ui/ToastHost.d.ts +0 -6
  188. package/dist/infrastructure/ui/ToastHost.js +0 -28
  189. package/dist/infrastructure/ui/events.d.ts +0 -1
  190. package/dist/infrastructure/ui/events.js +0 -1
  191. package/dist/ui/components/molecules/ProcessToast.d.ts +0 -8
  192. package/dist/ui/components/molecules/ProcessToast.js +0 -52
  193. /package/dist/domain/{repositories.d.ts → repositories/catalog.d.ts} +0 -0
  194. /package/dist/domain/{repositories.js → repositories/catalog.js} +0 -0
  195. /package/dist/domain/{database → repositories}/repository.js +0 -0
  196. /package/dist/{domain/event_sourcing/event_handler.js → event_driven/subscriber.js} +0 -0
  197. /package/dist/ui/{components/molecules → activity}/ProcessToastProvider.js +0 -0
@@ -4,7 +4,7 @@ import { Display } from "@sincpro/mobile-ui/Display";
4
4
  import { Form } from "@sincpro/mobile-ui/Form";
5
5
  import { useTheme } from "@sincpro/mobile-ui/theme";
6
6
  import { Typography } from "@sincpro/mobile-ui/Typography";
7
- import { useEffect, useMemo, useState } from "react";
7
+ import { useMemo, useState } from "react";
8
8
  import { TextInput, TouchableOpacity, View } from "react-native";
9
9
  const TIMEZONES_LOCALES = {
10
10
  bolivia: { timezone: "America/La_Paz", locale: "es-BO" },
@@ -27,12 +27,14 @@ function TimeZoneSelectorModal({ visible, onClose, onSelect, currentTimezone, })
27
27
  const theme = useTheme();
28
28
  const [query, setQuery] = useState("");
29
29
  const [selectedTimezone, setSelectedTimezone] = useState(currentTimezone || null);
30
- useEffect(() => {
30
+ const [prevVisible, setPrevVisible] = useState(visible);
31
+ if (visible !== prevVisible) {
32
+ setPrevVisible(visible);
31
33
  if (visible) {
32
34
  setQuery("");
33
35
  setSelectedTimezone(currentTimezone || null);
34
36
  }
35
- }, [visible]);
37
+ }
36
38
  const timezoneList = useMemo(() => {
37
39
  return Object.values(TIMEZONES_LOCALES).map((tz) => ({
38
40
  ...tz,
@@ -2,8 +2,7 @@ export { BluetoothDeviceSelectorModal } from "./BluetoothDeviceSelectorModal";
2
2
  export { default as DeadLetterErrorBlock } from "./DeadLetterErrorBlock";
3
3
  export { default as EventTimelineItem } from "./EventTimelineItem";
4
4
  export { default as GeoPermissionCard } from "./GeoPermissionCard";
5
- export { default as ProcessToast } from "./ProcessToast";
6
- export { ProcessToastProvider } from "./ProcessToastProvider";
7
5
  export type { TimezoneLocale } from "./timezone";
8
6
  export { TimeZoneSelector } from "./TimeZoneSelector";
9
7
  export { TimeZoneSelectorModal } from "./TimeZoneSelectorModal";
8
+ export { DeviceNotices, ProcessToast, ProcessToastProvider, } from "../../../ui/activity";
@@ -2,7 +2,6 @@ export { BluetoothDeviceSelectorModal } from "./BluetoothDeviceSelectorModal";
2
2
  export { default as DeadLetterErrorBlock } from "./DeadLetterErrorBlock";
3
3
  export { default as EventTimelineItem } from "./EventTimelineItem";
4
4
  export { default as GeoPermissionCard } from "./GeoPermissionCard";
5
- export { default as ProcessToast } from "./ProcessToast";
6
- export { ProcessToastProvider } from "./ProcessToastProvider";
7
5
  export { TimeZoneSelector } from "./TimeZoneSelector";
8
6
  export { TimeZoneSelectorModal } from "./TimeZoneSelectorModal";
7
+ export { DeviceNotices, ProcessToast, ProcessToastProvider, } from "../../../ui/activity";
@@ -5,5 +5,5 @@ interface BluetoothPrinterSelectorProps {
5
5
  /** Render as section rows (no outer card) — use inside FormViewV2.Content.Section. */
6
6
  compact?: boolean;
7
7
  }
8
- declare function BluetoothPrinterSelector({ onPrinterSelected, onConnectionChange, compact, }: BluetoothPrinterSelectorProps): import("react/jsx-runtime").JSX.Element;
8
+ declare function BluetoothPrinterSelector({ onPrinterSelected, onConnectionChange, compact, }: BluetoothPrinterSelectorProps): import("react").JSX.Element;
9
9
  export { BluetoothPrinterSelector };
@@ -43,6 +43,9 @@ function BluetoothPrinterSelector({ onPrinterSelected, onConnectionChange, compa
43
43
  setIsConnected(connected);
44
44
  }, []);
45
45
  useEffect(() => {
46
+ // Async side effect on mount — checkStatus does sync setState internally,
47
+ // which is the documented React 19 pattern for on-mount async work.
48
+ // eslint-disable-next-line react-hooks/set-state-in-effect
46
49
  checkStatus();
47
50
  }, [checkStatus]);
48
51
  useEffect(() => {
@@ -7,5 +7,5 @@ interface DatabaseInfoRowProps {
7
7
  item: DatabaseInfoRowData;
8
8
  onPress?: () => void;
9
9
  }
10
- declare function DatabaseInfoRow({ item, onPress }: DatabaseInfoRowProps): import("react/jsx-runtime").JSX.Element;
10
+ declare function DatabaseInfoRow({ item, onPress }: DatabaseInfoRowProps): import("react").JSX.Element;
11
11
  export default DatabaseInfoRow;
@@ -1,7 +1,8 @@
1
- import { DomainEvent } from "../../../domain/event_sourcing";
1
+ import { IntegrationEvent } from "../../../domain/events";
2
2
  import { IRowItemProps } from "@sincpro/mobile-ui/views/types/IListView";
3
- interface DeadLetterQueueRowProps extends IRowItemProps<DomainEvent> {
4
- onRetry: (event: DomainEvent) => Promise<void> | void;
3
+ import React from "react";
4
+ interface DeadLetterQueueRowProps extends IRowItemProps<IntegrationEvent> {
5
+ onRetry: (event: IntegrationEvent) => Promise<void> | void;
5
6
  }
6
- declare function DeadLetterQueueRow({ item, onRetry }: DeadLetterQueueRowProps): import("react/jsx-runtime").JSX.Element | null;
7
+ declare function DeadLetterQueueRow({ item, onRetry }: DeadLetterQueueRowProps): React.JSX.Element | null;
7
8
  export default DeadLetterQueueRow;
@@ -1,7 +1,7 @@
1
- import { DomainEvent } from "../../../domain/event_sourcing";
1
+ import { IntegrationEvent } from "../../../domain/events";
2
2
  interface EventRowProps {
3
- item: DomainEvent;
4
- onRetry: (event: DomainEvent) => Promise<void> | void;
3
+ item: IntegrationEvent;
4
+ onRetry: (event: IntegrationEvent) => Promise<void> | void;
5
5
  }
6
- declare function EventRow({ item, onRetry }: EventRowProps): import("react/jsx-runtime").JSX.Element | null;
6
+ declare function EventRow({ item, onRetry }: EventRowProps): import("react").JSX.Element | null;
7
7
  export default EventRow;
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "nativewind/jsx-runtime";
2
- import { EEventStatus } from "../../../domain/event_sourcing";
2
+ import { EEventStatus } from "../../../domain/events";
3
3
  import { Display } from "@sincpro/mobile-ui/Display";
4
4
  import { Form } from "@sincpro/mobile-ui/Form";
5
5
  import { Typography } from "@sincpro/mobile-ui/Typography";
@@ -27,8 +27,8 @@ interface WebViewControlsProps {
27
27
  onGoForward: () => void;
28
28
  onReload: () => void;
29
29
  }
30
- declare function WebViewControls({ canGoBack: _canGoBack, canGoForward: _canGoForward, onGoBack: _onGoBack, onGoForward: _onGoForward, onReload: _onReload, }: WebViewControlsProps): import("react/jsx-runtime").JSX.Element;
31
- declare function InjectableWebView({ url, scripts, injectedJavaScript, onMessage, onNavigationChange, onLoadStart, onLoadEnd, onError, renderLoading, backgroundColor, reloadKey, hardRefreshKey, maxRetries, useDefaultCache, }: InjectableWebViewProps): import("react/jsx-runtime").JSX.Element;
30
+ declare function WebViewControls({ canGoBack: _canGoBack, canGoForward: _canGoForward, onGoBack: _onGoBack, onGoForward: _onGoForward, onReload: _onReload, }: WebViewControlsProps): import("react").JSX.Element;
31
+ declare function InjectableWebView({ url, scripts, injectedJavaScript, onMessage, onNavigationChange, onLoadStart, onLoadEnd, onError, renderLoading, backgroundColor, reloadKey, hardRefreshKey, maxRetries, useDefaultCache, }: InjectableWebViewProps): import("react").JSX.Element;
32
32
  declare namespace InjectableWebView {
33
33
  var Controls: typeof WebViewControls;
34
34
  }
@@ -4,15 +4,18 @@ import { webViewService } from "../../../services/webview.service";
4
4
  import { useToast } from "@sincpro/mobile-ui/Feedback";
5
5
  import Spinner from "@sincpro/mobile-ui/Feedback/Feedback.Spinner";
6
6
  import { useBottomInset } from "@sincpro/mobile-ui/layouts/BottomInset";
7
- import { useCallback, useEffect, useRef, useState } from "react";
7
+ import { useCallback, useEffect, useRef, useState, } from "react";
8
8
  import { BackHandler, StyleSheet, View } from "react-native";
9
9
  import { SafeAreaView } from "react-native-safe-area-context";
10
- import WebView from "react-native-webview";
10
+ import RawWebView from "react-native-webview";
11
+ // The library defaults its extra-props generic to `undefined`, and
12
+ // `WebViewProps & undefined` collapses to `never`. An empty record keeps the real props.
13
+ const WebView = RawWebView;
11
14
  function WebViewControls({ canGoBack: _canGoBack, canGoForward: _canGoForward, onGoBack: _onGoBack, onGoForward: _onGoForward, onReload: _onReload, }) {
12
15
  return _jsx(View, {});
13
16
  }
14
17
  function WebViewLoadingIndicator({ backgroundColor }) {
15
- return (_jsx(View, { style: [StyleSheet.absoluteFillObject, styles.loading, { backgroundColor }], children: _jsx(Spinner, { size: "large", text: "Cargando p\u00E1gina..." }) }));
18
+ return (_jsx(View, { style: [StyleSheet.absoluteFill, styles.loading, { backgroundColor }], children: _jsx(Spinner, { size: "large", text: "Cargando p\u00E1gina..." }) }));
16
19
  }
17
20
  function useWebView() {
18
21
  const toast = useToast();
@@ -1,4 +1,5 @@
1
1
  import { FormatterMap, LabelMap } from "../../../domain/receipt";
2
+ import React from "react";
2
3
  interface ReceiptProps {
3
4
  data: Record<string, any>;
4
5
  labels?: LabelMap;
@@ -7,5 +8,5 @@ interface ReceiptProps {
7
8
  formatters?: FormatterMap;
8
9
  emptyPlaceholder?: string;
9
10
  }
10
- declare function Receipt({ data, labels, order, strictOrder, formatters, emptyPlaceholder, }: ReceiptProps): import("react/jsx-runtime").JSX.Element;
11
+ declare function Receipt({ data, labels, order, strictOrder, formatters, emptyPlaceholder, }: ReceiptProps): React.JSX.Element;
11
12
  export default Receipt;
@@ -5,5 +5,5 @@ interface TableListItemProps {
5
5
  item: TableRowData;
6
6
  onPress?: () => void;
7
7
  }
8
- declare function TableInfoRow({ item, onPress }: TableListItemProps): import("react/jsx-runtime").JSX.Element;
8
+ declare function TableInfoRow({ item, onPress }: TableListItemProps): import("react").JSX.Element;
9
9
  export default TableInfoRow;
@@ -1,4 +1,4 @@
1
- import { ReactNode } from "react";
1
+ import React, { ReactNode } from "react";
2
2
  export declare enum EDatabaseView {
3
3
  TABLES_LIST = "TABLES_LIST",
4
4
  TABLE_ROWS = "TABLE_ROWS",
@@ -27,6 +27,6 @@ interface IDatabaseContext {
27
27
  }
28
28
  export declare function DatabaseProvider({ children }: {
29
29
  children: ReactNode;
30
- }): import("react/jsx-runtime").JSX.Element;
30
+ }): React.JSX.Element;
31
31
  export declare function useDatabase(): IDatabaseContext;
32
32
  export {};
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "nativewind/jsx-runtime";
2
2
  import { databaseTablesUseCase } from "../../../services/database_table.service";
3
3
  import { safeJsonParse, safeJsonStringify } from "../../../tools/utils/serializer";
4
- import { createContext, useCallback, useContext, useEffect, useState, } from "react";
4
+ import { createContext, useCallback, useContext, useMemo, useState, } from "react";
5
5
  export var EDatabaseView;
6
6
  (function (EDatabaseView) {
7
7
  EDatabaseView["TABLES_LIST"] = "TABLES_LIST";
@@ -13,7 +13,6 @@ export function DatabaseProvider({ children }) {
13
13
  const [currentView, setCurrentView] = useState(EDatabaseView.TABLES_LIST);
14
14
  const [tables, setTables] = useState([]);
15
15
  const [data, setData] = useState([]);
16
- const [filteredData, setFilteredData] = useState([]);
17
16
  const [isLoading, setIsLoading] = useState(false);
18
17
  const [selectedTable, setSelectedTable] = useState("");
19
18
  const [selectedRowJson, setSelectedRowJson] = useState("");
@@ -21,13 +20,11 @@ export function DatabaseProvider({ children }) {
21
20
  const [currentRowIndex, setCurrentRowIndex] = useState(0);
22
21
  const [previousSearchQuery, setPreviousSearchQuery] = useState("");
23
22
  const [isTransitioning, setIsTransitioning] = useState(false);
24
- const filterData = useCallback(() => {
25
- if (!searchQuery.trim()) {
26
- setFilteredData(data);
27
- return;
28
- }
23
+ const filteredData = useMemo(() => {
24
+ if (!searchQuery.trim())
25
+ return data;
29
26
  const query = searchQuery.toLowerCase().trim();
30
- const filtered = data.filter((row) => {
27
+ return data.filter((row) => {
31
28
  const parsedData = safeJsonParse(typeof row === "string" ? row : JSON.stringify(row));
32
29
  if (!parsedData)
33
30
  return false;
@@ -36,11 +33,7 @@ export function DatabaseProvider({ children }) {
36
33
  const name = parsedData.name?.toLowerCase() || "";
37
34
  return remoteId.includes(query) || uuid.includes(query) || name.includes(query);
38
35
  });
39
- setFilteredData(filtered);
40
36
  }, [data, searchQuery]);
41
- useEffect(() => {
42
- filterData();
43
- }, [filterData]);
44
37
  const loadTables = useCallback(async () => {
45
38
  setIsLoading(true);
46
39
  try {
@@ -121,12 +114,10 @@ export function DatabaseProvider({ children }) {
121
114
  }, [currentRowIndex, filteredData, isTransitioning]);
122
115
  const hasNextRow = currentRowIndex < filteredData.length - 1;
123
116
  const hasPreviousRow = currentRowIndex > 0;
124
- useEffect(() => {
125
- if (currentView === EDatabaseView.JSON_DETAIL && searchQuery !== previousSearchQuery) {
126
- goBackFromJson();
127
- setPreviousSearchQuery(searchQuery);
128
- }
129
- }, [searchQuery, previousSearchQuery, currentView, goBackFromJson]);
117
+ if (currentView === EDatabaseView.JSON_DETAIL && searchQuery !== previousSearchQuery) {
118
+ setPreviousSearchQuery(searchQuery);
119
+ goBackFromJson();
120
+ }
130
121
  return (_jsx(DatabaseContext.Provider, { value: {
131
122
  currentView,
132
123
  tables,
@@ -1,2 +1,2 @@
1
- declare function JsonDetailView(): import("react/jsx-runtime").JSX.Element;
1
+ declare function JsonDetailView(): import("react").JSX.Element;
2
2
  export default JsonDetailView;
@@ -1 +1 @@
1
- export default function DatabaseList(): import("react/jsx-runtime").JSX.Element;
1
+ export default function DatabaseList(): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
- declare function TableRowsView(): import("react/jsx-runtime").JSX.Element;
1
+ declare function TableRowsView(): import("react").JSX.Element;
2
2
  export default TableRowsView;
@@ -1,19 +1,19 @@
1
- import { DomainEvent } from "../../../domain/event_sourcing";
2
- import { ReactNode } from "react";
1
+ import { IntegrationEvent } from "../../../domain/events";
2
+ import React, { ReactNode } from "react";
3
3
  interface IDeadLetterQueueContext {
4
- events: DomainEvent[];
5
- enrichedEvents: DomainEvent[];
4
+ events: IntegrationEvent[];
5
+ enrichedEvents: IntegrationEvent[];
6
6
  selectedEvents: Set<string>;
7
7
  isLoading: boolean;
8
8
  isRetrying: boolean;
9
9
  isDeleting: boolean;
10
10
  loadEvents: () => Promise<void>;
11
- retryEvent: (event: DomainEvent) => Promise<void>;
11
+ retryEvent: (event: IntegrationEvent) => Promise<void>;
12
12
  retrySelectedEvents: () => Promise<{
13
13
  success: number;
14
14
  failed: number;
15
15
  }>;
16
- deleteEvent: (event: DomainEvent) => Promise<void>;
16
+ deleteEvent: (event: IntegrationEvent) => Promise<void>;
17
17
  deleteSelectedEvents: () => Promise<{
18
18
  success: number;
19
19
  failed: number;
@@ -29,6 +29,6 @@ interface IDeadLetterQueueContext {
29
29
  }
30
30
  export declare function DeadLetterQueueProvider({ children }: {
31
31
  children: ReactNode;
32
- }): import("react/jsx-runtime").JSX.Element;
32
+ }): React.JSX.Element;
33
33
  export declare function useDeadLetterQueue(): IDeadLetterQueueContext;
34
34
  export {};
@@ -1,2 +1,2 @@
1
- declare function DeadLetterQueueList(): import("react/jsx-runtime").JSX.Element;
1
+ declare function DeadLetterQueueList(): import("react").JSX.Element;
2
2
  export default DeadLetterQueueList;
@@ -1,9 +1,9 @@
1
- import { DomainEvent } from "../../../domain/event_sourcing";
2
- import { ReactNode } from "react";
1
+ import { IntegrationEvent } from "../../../domain/events";
2
+ import React, { ReactNode } from "react";
3
3
  type EventFilter = "ALL" | "FAILED" | "ACKNOWLEDGED" | "PENDING";
4
4
  interface IEventsContext {
5
- events: DomainEvent[];
6
- pagedEvents: DomainEvent[];
5
+ events: IntegrationEvent[];
6
+ pagedEvents: IntegrationEvent[];
7
7
  isLoading: boolean;
8
8
  isLoadingMore: boolean;
9
9
  isRetrying: boolean;
@@ -15,11 +15,11 @@ interface IEventsContext {
15
15
  loadEvents: () => Promise<void>;
16
16
  refreshEvents: () => Promise<void>;
17
17
  loadMore: () => Promise<void>;
18
- retryEvent: (event: DomainEvent) => Promise<void>;
18
+ retryEvent: (event: IntegrationEvent) => Promise<void>;
19
19
  }
20
20
  export declare function EventsProvider({ children, pageSize, }: {
21
21
  children: ReactNode;
22
22
  pageSize?: number;
23
- }): import("react/jsx-runtime").JSX.Element;
23
+ }): React.JSX.Element;
24
24
  export declare function useEvents(): IEventsContext;
25
25
  export {};
@@ -1,66 +1,61 @@
1
1
  import { jsx as _jsx } from "nativewind/jsx-runtime";
2
2
  import { eventService } from "../../../services/event.service";
3
- import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
3
+ import { createContext, useCallback, useContext, useMemo, useState, } from "react";
4
4
  const EventsContext = createContext(null);
5
5
  export function EventsProvider({ children, pageSize = 25, }) {
6
6
  const [events, setEvents] = useState([]);
7
- const [pagedEvents, setPagedEvents] = useState([]);
8
7
  const [isLoading, setIsLoading] = useState(false);
9
8
  const [isLoadingMore, setIsLoadingMore] = useState(false);
10
9
  const [isRetrying, setIsRetrying] = useState(false);
11
10
  const [page, setPage] = useState(1);
12
- const [hasMore, setHasMore] = useState(false);
13
11
  const [filter, setFilter] = useState("ALL");
14
- const filterEvents = useCallback((list, currentFilter) => {
15
- if (currentFilter === "ALL")
16
- return list;
17
- return list.filter((ev) => {
12
+ const filteredEvents = useMemo(() => {
13
+ if (filter === "ALL")
14
+ return events;
15
+ return events.filter((ev) => {
18
16
  if (!ev.status)
19
17
  return false;
20
- if (currentFilter === "FAILED")
18
+ if (filter === "FAILED")
21
19
  return ev.status === "FAILED";
22
- if (currentFilter === "ACKNOWLEDGED")
20
+ if (filter === "ACKNOWLEDGED")
23
21
  return ev.status === "ACKNOWLEDGED";
24
- if (currentFilter === "PENDING")
22
+ if (filter === "PENDING")
25
23
  return ev.status === "PENDING";
26
24
  return true;
27
25
  });
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]);
26
+ }, [events, filter]);
27
+ const pagedEvents = useMemo(() => filteredEvents.slice(0, page * pageSize), [filteredEvents, page, pageSize]);
28
+ const hasMore = pagedEvents.length < filteredEvents.length;
29
+ const [prevFilter, setPrevFilter] = useState(filter);
30
+ if (filter !== prevFilter) {
31
+ setPrevFilter(filter);
32
+ setPage(1);
33
+ }
36
34
  const loadEvents = useCallback(async () => {
37
35
  setIsLoading(true);
38
36
  try {
39
37
  const fetched = await eventService.listAllEvents();
40
38
  setEvents(fetched);
41
- paginate(fetched, 1, filter);
39
+ setPage(1);
42
40
  }
43
41
  finally {
44
42
  setIsLoading(false);
45
43
  }
46
- }, [filter, paginate]);
44
+ }, []);
47
45
  const refreshEvents = useCallback(async () => {
48
46
  await loadEvents();
49
47
  }, [loadEvents]);
50
- useEffect(() => {
51
- paginate(events, 1, filter);
52
- }, [events, filter, paginate]);
53
48
  const loadMore = useCallback(async () => {
54
49
  if (isLoadingMore || isLoading || !hasMore)
55
50
  return;
56
51
  setIsLoadingMore(true);
57
52
  try {
58
- paginate(events, page + 1, filter);
53
+ setPage((p) => p + 1);
59
54
  }
60
55
  finally {
61
56
  setIsLoadingMore(false);
62
57
  }
63
- }, [events, hasMore, isLoading, isLoadingMore, page, paginate, filter]);
58
+ }, [hasMore, isLoading, isLoadingMore]);
64
59
  const retryEvent = useCallback(async (event) => {
65
60
  setIsRetrying(true);
66
61
  try {
@@ -1 +1 @@
1
- export default function EventsScreen(): import("react/jsx-runtime").JSX.Element;
1
+ export default function EventsScreen(): import("react").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sincpro/mobile",
3
- "version": "0.4.3",
3
+ "version": "1.0.0",
4
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
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -26,23 +26,27 @@
26
26
  "repository": "https://github.com/Sincpro-SRL/sincpro_mobile",
27
27
  "author": "Gutierrez, Andres <andres.gutierrez@sincpro.com.bo>",
28
28
  "license": "MIT",
29
+ "engines": {
30
+ "node": ">=26"
31
+ },
29
32
  "dependencies": {
30
- "@opentelemetry/api": "^1.9.0",
31
- "@opentelemetry/core": "^2.8.0",
32
- "@opentelemetry/resources": "^2.8.0",
33
- "@opentelemetry/sdk-trace-base": "^2.8.0",
33
+ "@opentelemetry/api": "^1.9.1",
34
+ "@opentelemetry/core": "^2.10.0",
35
+ "@opentelemetry/resources": "^2.10.0",
36
+ "@opentelemetry/sdk-trace-base": "^2.10.0",
37
+ "@sincpro/client-framework": "^0.6.0",
38
+ "@sincpro/criteria": "^2.1.0",
34
39
  "async-mutex": "^0.5.0",
35
40
  "big.js": "^7.0.1",
36
- "dayjs": "^1.11.18",
41
+ "dayjs": "^1.11.21",
37
42
  "mitt": "^3.0.1",
38
43
  "pdf-lib": "^1.17.1",
39
- "tailwind-variants": "^3.2.2",
40
- "uuid": "^13.0.0"
44
+ "tailwind-variants": "^3.2.2"
41
45
  },
42
46
  "peerDependencies": {
43
47
  "@react-navigation/native": ">=7",
44
48
  "@react-navigation/native-stack": ">=7",
45
- "@sincpro/mobile-ui": "^0.7.2",
49
+ "@sincpro/mobile-ui": "^2.0.0",
46
50
  "expo-background-task": "*",
47
51
  "expo-clipboard": "*",
48
52
  "expo-crypto": "*",
@@ -56,7 +60,7 @@
56
60
  "expo-splash-screen": "*",
57
61
  "expo-sqlite": "*",
58
62
  "expo-task-manager": "*",
59
- "nativewind": ">=4",
63
+ "nativewind": ">=4.2.7",
60
64
  "react": "*",
61
65
  "react-native": "*",
62
66
  "react-native-gesture-handler": "*",
@@ -65,48 +69,53 @@
65
69
  "react-native-screens": "*",
66
70
  "react-native-toast-message": "*",
67
71
  "react-native-view-shot": "*",
68
- "react-native-webview": "*"
72
+ "react-native-webview": "*",
73
+ "react-native-worklets": "*"
69
74
  },
70
75
  "devDependencies": {
71
76
  "@opentelemetry/api": "^1.9.0",
72
77
  "@react-navigation/native": "^7.0.0",
73
78
  "@react-navigation/native-stack": "^7.0.0",
74
- "@sincpro/mobile-ui": "^0.7.2",
79
+ "@expo-google-fonts/ibm-plex-mono": "^0.4.1",
80
+ "@expo-google-fonts/ibm-plex-sans": "^0.4.1",
81
+ "@sincpro/mobile-ui": "^2.0.0",
75
82
  "@types/big.js": "^6.2.2",
76
- "@types/react": "~19.1.10",
77
- "@types/uuid": "^10.0.0",
83
+ "@types/react": "~19.3.0",
78
84
  "eslint": "^9.35.0",
79
- "eslint-config-expo": "~10.0.0",
85
+ "eslint-config-expo": "~58.0.4",
80
86
  "eslint-config-prettier": "^10.1.8",
81
87
  "eslint-plugin-prettier": "^5.5.4",
82
88
  "eslint-plugin-react": "^7.37.2",
83
89
  "eslint-plugin-simple-import-sort": "^12.1.1",
84
- "expo-background-task": "~1.0.10",
85
- "expo-clipboard": "~8.0.8",
86
- "expo-crypto": "~15.0.9",
87
- "expo-file-system": "~19.0.23",
88
- "expo-linking": "~8.0.12",
89
- "expo-localization": "~17.0.9",
90
- "expo-location": "~19.0.8",
91
- "expo-network": "~8.0.8",
92
- "expo-print": "~15.0.8",
93
- "expo-sharing": "~14.0.8",
94
- "expo-splash-screen": "~31.0.13",
95
- "expo-sqlite": "~16.0.10",
96
- "expo-task-manager": "~14.0.9",
97
- "nativewind": "^4.0.1",
90
+ "expo-background-task": "~58.0.12",
91
+ "expo-clipboard": "~58.0.4",
92
+ "expo-crypto": "~58.0.7",
93
+ "expo-file-system": "~58.0.13",
94
+ "expo-image": "~58.0.18",
95
+ "expo-linking": "~58.0.16",
96
+ "expo-localization": "~58.0.5",
97
+ "expo-location": "~58.0.20",
98
+ "expo-network": "~58.0.4",
99
+ "expo-print": "~58.0.8",
100
+ "expo-sharing": "~58.0.22",
101
+ "expo-splash-screen": "~58.0.13",
102
+ "expo-sqlite": "~58.0.15",
103
+ "expo-task-manager": "~58.0.13",
104
+ "nativewind": "4.2.7",
98
105
  "prettier": "^3.6.2",
99
- "react": "19.1.0",
100
- "react-native": "0.81.5",
101
- "react-native-gesture-handler": "~2.28.0",
102
- "react-native-keyboard-controller": "1.18.5",
103
- "react-native-reanimated": "~4.1.1",
104
- "react-native-safe-area-context": "~5.6.0",
105
- "react-native-screens": "~4.25.2",
106
- "react-native-svg": "15.12.1",
106
+ "react": "19.3.0",
107
+ "react-native": "0.88.1",
108
+ "react-native-gesture-handler": "~3.3.0",
109
+ "react-native-keyboard-controller": "1.22.7",
110
+ "react-native-reanimated": "4.7.1",
111
+ "react-native-safe-area-context": "~5.11.1",
112
+ "react-native-screens": "~4.30.1",
113
+ "react-native-svg": "15.16.0",
107
114
  "react-native-toast-message": "^2.3.3",
108
- "react-native-view-shot": "^4.0.3",
109
- "react-native-webview": "13.15.0",
115
+ "react-native-view-shot": "6.1.1",
116
+ "react-native-webview": "14.0.1",
117
+ "react-native-worklets": "0.13.0",
118
+ "tailwindcss": "3.4.19",
110
119
  "tsc-alias": "^1.8.17",
111
120
  "tsx": "^4.22.4",
112
121
  "typescript": "~5.9.2"
@@ -115,7 +124,9 @@
115
124
  ".": "./dist/index.js",
116
125
  "./domain": "./dist/domain/index.js",
117
126
  "./domain/entity": "./dist/domain/entity/index.js",
118
- "./domain/event_sourcing": "./dist/domain/event_sourcing/index.js",
127
+ "./domain/events": "./dist/domain/events/index.js",
128
+ "./domain/repositories": "./dist/domain/repositories/index.js",
129
+ "./event_driven": "./dist/event_driven/index.js",
119
130
  "./domain/database": "./dist/domain/database/index.js",
120
131
  "./domain/connectivity": "./dist/domain/connectivity/index.js",
121
132
  "./domain/print": "./dist/domain/print/index.js",