@controleonline/ui-common 1.2.70

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 (203) hide show
  1. package/.github/agents/developer.agent.md +30 -0
  2. package/.github/agents/devops.agent.md +30 -0
  3. package/.github/agents/qa.agent.md +30 -0
  4. package/.github/agents/security.agent.md +30 -0
  5. package/.github/workflows/npmjs.yml +35 -0
  6. package/.github/workflows/pull-request-checks.yml +19 -0
  7. package/.scrutinizer.yml +24 -0
  8. package/FUNDING.yml +1 -0
  9. package/package.json +28 -0
  10. package/src/api/fetch.js +74 -0
  11. package/src/api/index.js +155 -0
  12. package/src/api/localDB.js +131 -0
  13. package/src/api/queue.js +66 -0
  14. package/src/react/assets/tap.mp3 +0 -0
  15. package/src/react/components/AddImportModal.js +157 -0
  16. package/src/react/components/AddImportModal.styles.js +81 -0
  17. package/src/react/components/BackgroundRuntimeBridge.js +219 -0
  18. package/src/react/components/BottomNavigationBar.config.js +238 -0
  19. package/src/react/components/BottomNavigationBar.js +120 -0
  20. package/src/react/components/BottomNavigationBar.styles.js +110 -0
  21. package/src/react/components/CategoryForm.js +572 -0
  22. package/src/react/components/CategoryForm.styles.js +334 -0
  23. package/src/react/components/ConfirmModal.js +24 -0
  24. package/src/react/components/ConfirmModal.styles.js +43 -0
  25. package/src/react/components/ContextHelpButton.js +69 -0
  26. package/src/react/components/ContextHelpButton.styles.js +62 -0
  27. package/src/react/components/DefaultProvider.native.js +848 -0
  28. package/src/react/components/DefaultProvider.styles.js +21 -0
  29. package/src/react/components/DefaultProvider.web.js +909 -0
  30. package/src/react/components/DeliveryPushBridge.native.js +314 -0
  31. package/src/react/components/DeliveryPushBridge.web.js +5 -0
  32. package/src/react/components/DeviceAlertSoundService.js +499 -0
  33. package/src/react/components/EntityLogContent.js +909 -0
  34. package/src/react/components/EntityLogContent.styles.js +400 -0
  35. package/src/react/components/EventBus.js +12 -0
  36. package/src/react/components/KioskModeBridge.js +65 -0
  37. package/src/react/components/LauncherModeBridge.js +47 -0
  38. package/src/react/components/LinkedOrderProductsTab.js +388 -0
  39. package/src/react/components/LinkedOrderProductsTab.styles.js +180 -0
  40. package/src/react/components/ManagerPushBridge.native.js +345 -0
  41. package/src/react/components/MessageService.js +314 -0
  42. package/src/react/components/Paywall/Google.js +89 -0
  43. package/src/react/components/PrintService.js +778 -0
  44. package/src/react/components/ProductCatalogCacheService.js +45 -0
  45. package/src/react/components/RemoteCheckoutService.js +292 -0
  46. package/src/react/components/RuntimeBottomNavigationBar.js +151 -0
  47. package/src/react/components/RuntimeInfoFooter.js +214 -0
  48. package/src/react/components/RuntimeInfoFooter.styles.js +56 -0
  49. package/src/react/components/SystemErrorToast.js +29 -0
  50. package/src/react/components/SystemErrorToast.styles.js +38 -0
  51. package/src/react/components/TouchFeedbackProvider.js +65 -0
  52. package/src/react/components/UnifiedPaymentBar.js +155 -0
  53. package/src/react/components/UnifiedPaymentBar.styles.js +174 -0
  54. package/src/react/components/WebsocketListener.native.js +487 -0
  55. package/src/react/components/WebsocketListener.web.js +102 -0
  56. package/src/react/components/inputs/IdInput.js +49 -0
  57. package/src/react/components/inputs/IdInput.styles.js +26 -0
  58. package/src/react/components/inputs/InvoiceDueDateFilterInput.js +74 -0
  59. package/src/react/components/inputs/InvoiceDueDateFilterInput.styles.js +34 -0
  60. package/src/react/components/inputs/InvoiceDueDateRangeFilterInput.js +115 -0
  61. package/src/react/components/inputs/InvoiceDueDateRangeFilterInput.styles.js +39 -0
  62. package/src/react/components/lists/CategoriesList.js +56 -0
  63. package/src/react/components/lists/PaymentTypeList.js +55 -0
  64. package/src/react/components/lists/ReceiverList.js +56 -0
  65. package/src/react/components/lists/SelectList.styles.js +18 -0
  66. package/src/react/components/lists/StatusList.js +55 -0
  67. package/src/react/components/lists/WalletList.js +54 -0
  68. package/src/react/components/radio/Spotify.js +144 -0
  69. package/src/react/components/radio/Spotify.styles.js +32 -0
  70. package/src/react/components/radio/YouTube.js +82 -0
  71. package/src/react/components/radio/YouTube.styles.js +16 -0
  72. package/src/react/components/toastConfig.js +16 -0
  73. package/src/react/config/deviceConfigBootstrap.js +571 -0
  74. package/src/react/index.js +4 -0
  75. package/src/react/localStorage.js +30 -0
  76. package/src/react/pages/EntityLogPage.js +124 -0
  77. package/src/react/pages/EntityLogPage.styles.js +17 -0
  78. package/src/react/pages/GenericLogPage.js +760 -0
  79. package/src/react/pages/GenericLogPage.styles.js +401 -0
  80. package/src/react/pages/Imports.js +361 -0
  81. package/src/react/pages/Imports.styles.js +223 -0
  82. package/src/react/pages/SettingsPage/PaymentTypesByWalletTab.js +462 -0
  83. package/src/react/pages/SettingsPage/index.js +1171 -0
  84. package/src/react/pages/SettingsPage/index.styles.js +122 -0
  85. package/src/react/print/jobs.js +147 -0
  86. package/src/react/print/providers/local.js +53 -0
  87. package/src/react/print/providers/remote.js +81 -0
  88. package/src/react/print/selection.js +296 -0
  89. package/src/react/print/usePrintButtonController.js +474 -0
  90. package/src/react/router/routes.js +42 -0
  91. package/src/react/services/NetworkPrinterService.native.js +391 -0
  92. package/src/react/services/NetworkPrinterService.web.js +15 -0
  93. package/src/react/stores/index.js +128 -0
  94. package/src/react/stores/storeErrorBridge.js +36 -0
  95. package/src/react/utils/backgroundRuntimeRegistration.js +69 -0
  96. package/src/react/utils/cashPayment.js +87 -0
  97. package/src/react/utils/commercialDocumentOrders.js +269 -0
  98. package/src/react/utils/dateRangeFilter.js +264 -0
  99. package/src/react/utils/deviceRuntime.js +193 -0
  100. package/src/react/utils/entityDisplay.js +231 -0
  101. package/src/react/utils/entityLog.js +649 -0
  102. package/src/react/utils/fileUrl.js +102 -0
  103. package/src/react/utils/frontendDebugLog.js +45 -0
  104. package/src/react/utils/googleMapsConfig.js +49 -0
  105. package/src/react/utils/importStatus.js +100 -0
  106. package/src/react/utils/invoiceDueDateMessages.js +14 -0
  107. package/src/react/utils/invoicePresentation.js +46 -0
  108. package/src/react/utils/logSettings.js +143 -0
  109. package/src/react/utils/maintenanceSettings.js +53 -0
  110. package/src/react/utils/managerOrderNotifications.js +523 -0
  111. package/src/react/utils/mapNavigation.js +76 -0
  112. package/src/react/utils/menuCatalogConfig.js +8 -0
  113. package/src/react/utils/menuCatalogDownload.js +157 -0
  114. package/src/react/utils/networkCameraDevices.js +175 -0
  115. package/src/react/utils/networkDeviceProfiles.js +135 -0
  116. package/src/react/utils/normalizedCatalogDownload.js +157 -0
  117. package/src/react/utils/notificationNavigation.js +94 -0
  118. package/src/react/utils/notificationSound.js +42 -0
  119. package/src/react/utils/paymentDevices.js +397 -0
  120. package/src/react/utils/paymentGatewayExecution.js +91 -0
  121. package/src/react/utils/paymentOptions.js +88 -0
  122. package/src/react/utils/peopleDisplay.js +39 -0
  123. package/src/react/utils/printerDevices.js +465 -0
  124. package/src/react/utils/remotePayment.js +61 -0
  125. package/src/react/utils/runtimeFooter.js +475 -0
  126. package/src/react/utils/runtimeLanguage.js +50 -0
  127. package/src/react/utils/runtimeMenu.js +224 -0
  128. package/src/react/utils/screenMetrics.js +30 -0
  129. package/src/react/utils/shopConfig.js +294 -0
  130. package/src/react/utils/shopFranchises.js +114 -0
  131. package/src/react/utils/socketRuntimePipeline.js +454 -0
  132. package/src/react/utils/spoolAckTracker.js +77 -0
  133. package/src/react/utils/storeColumns.js +427 -0
  134. package/src/react/utils/systemErrorChannel.js +109 -0
  135. package/src/react/utils/systemErrorMessage.js +67 -0
  136. package/src/react/utils/toastPresentation.js +53 -0
  137. package/src/react/utils/websocketSharedRuntime.js +826 -0
  138. package/src/store/acl/getters.js +4 -0
  139. package/src/store/acl/index.js +19 -0
  140. package/src/store/acl/mutation_types.js +4 -0
  141. package/src/store/acl/mutations.js +17 -0
  142. package/src/store/address/city.js +22 -0
  143. package/src/store/categories/category_file/index.js +25 -0
  144. package/src/store/categories/index.js +93 -0
  145. package/src/store/configs/customActions.js +131 -0
  146. package/src/store/configs/index.js +25 -0
  147. package/src/store/connections/customActions.js +26 -0
  148. package/src/store/connections/index.js +124 -0
  149. package/src/store/device/index.js +22 -0
  150. package/src/store/device_config/customActions.js +190 -0
  151. package/src/store/device_config/index.js +28 -0
  152. package/src/store/entity_log/customActions.js +63 -0
  153. package/src/store/entity_log/index.js +25 -0
  154. package/src/store/extra/data.js +85 -0
  155. package/src/store/extra/fields.js +88 -0
  156. package/src/store/file/actions.js +27 -0
  157. package/src/store/file/index.js +24 -0
  158. package/src/store/imports/index.js +88 -0
  159. package/src/store/print/customActions.js +251 -0
  160. package/src/store/print/index.js +28 -0
  161. package/src/store/printer/customActions.js +54 -0
  162. package/src/store/printer/index.js +26 -0
  163. package/src/store/runtime_debug/customActions.js +71 -0
  164. package/src/store/runtime_debug/index.js +30 -0
  165. package/src/store/status/index.js +65 -0
  166. package/src/store/timezones/index.js +43 -0
  167. package/src/store/websocket/customActions.js +24 -0
  168. package/src/store/websocket/index.js +28 -0
  169. package/src/tests/react/components/LauncherModeBridge.test.js +93 -0
  170. package/src/tests/react/config/deviceConfigBootstrap.test.js +337 -0
  171. package/src/tests/react/print/localPrintProvider.test.js +45 -0
  172. package/src/tests/react/utils/backgroundRuntimeRegistration.test.js +123 -0
  173. package/src/tests/react/utils/cashPayment.test.js +41 -0
  174. package/src/tests/react/utils/dateRangeFilter.test.mjs +29 -0
  175. package/src/tests/react/utils/entityDisplay.test.js +18 -0
  176. package/src/tests/react/utils/googleMapsConfig.test.js +32 -0
  177. package/src/tests/react/utils/importStatus.test.js +85 -0
  178. package/src/tests/react/utils/invoicePresentation.test.mjs +40 -0
  179. package/src/tests/react/utils/managerOrderNotifications.test.js +127 -0
  180. package/src/tests/react/utils/mapNavigation.test.js +58 -0
  181. package/src/tests/react/utils/notificationNavigation.test.js +39 -0
  182. package/src/tests/react/utils/notificationSound.test.js +27 -0
  183. package/src/tests/react/utils/paymentDevices.test.js +88 -0
  184. package/src/tests/react/utils/runtimeFooter.test.js +429 -0
  185. package/src/tests/react/utils/runtimeLanguage.test.js +80 -0
  186. package/src/tests/react/utils/runtimeMenu.test.js +174 -0
  187. package/src/tests/react/utils/shopFranchises.test.js +82 -0
  188. package/src/tests/react/utils/socketRuntimePipeline.test.js +124 -0
  189. package/src/tests/react/utils/spoolAckTracker.test.js +40 -0
  190. package/src/tests/react/utils/storeErrorBridge.test.js +66 -0
  191. package/src/tests/react/utils/systemErrorChannel.test.js +58 -0
  192. package/src/tests/react/utils/systemErrorMessage.test.js +59 -0
  193. package/src/tests/react/utils/toastPresentation.test.js +75 -0
  194. package/src/tests/react/utils/translate.test.mjs +396 -0
  195. package/src/tests/react/utils/websocketSharedRuntime.test.js +245 -0
  196. package/src/utils/apiEntryPoint.js +31 -0
  197. package/src/utils/appDomain.js +50 -0
  198. package/src/utils/config.js +14 -0
  199. package/src/utils/formatter.js +419 -0
  200. package/src/utils/integrationConfigs.js +79 -0
  201. package/src/utils/methods.js +23 -0
  202. package/src/utils/oauth.js +42 -0
  203. package/src/utils/translate.js +620 -0
@@ -0,0 +1,120 @@
1
+ import React, {useLayoutEffect, useMemo} from 'react';
2
+ import {Pressable, Text, View} from 'react-native';
3
+ import Icon from 'react-native-vector-icons/Feather';
4
+ import {useTheme} from './DefaultProvider';
5
+ import RuntimeInfoFooter from './RuntimeInfoFooter';
6
+ import {resolveMenuRouteParams} from '@controleonline/ui-layout/src/react/utils/menuNavigation';
7
+ import createStyles from './BottomNavigationBar.styles';
8
+
9
+ const BottomNavigationBar = ({
10
+ navigation,
11
+ items = [],
12
+ activeRouteName,
13
+ disabled = false,
14
+ colors = {},
15
+ testID = 'bottom-navigation',
16
+ }) => {
17
+ const theme = useTheme?.() || {};
18
+ const runtimeFooter = theme?.runtimeFooter || null;
19
+ const registerBottomNavigation =
20
+ theme?.bottomChrome?.registerBottomNavigation || null;
21
+ const primaryColor = colors.primary || '#1B5587';
22
+ const dockBackground =
23
+ colors['toolbar-background'] || colors.background || '#F8FBFF';
24
+ const borderColor = colors['toolbar-border'] || colors.border || '#D1DDE9';
25
+ const inactiveText =
26
+ colors['toolbar-text-muted'] || colors.textSecondary || '#64748B';
27
+ const activeBg = `${primaryColor}1A`;
28
+ const activeBorder = `${primaryColor}55`;
29
+
30
+ const styles = useMemo(
31
+ () =>
32
+ createStyles({
33
+ primaryColor,
34
+ dockBackground,
35
+ borderColor,
36
+ inactiveText,
37
+ activeBg,
38
+ activeBorder,
39
+ }),
40
+ [
41
+ activeBg,
42
+ activeBorder,
43
+ borderColor,
44
+ dockBackground,
45
+ inactiveText,
46
+ primaryColor,
47
+ ],
48
+ );
49
+
50
+ useLayoutEffect(() => {
51
+ if (typeof registerBottomNavigation !== 'function') {
52
+ return undefined;
53
+ }
54
+
55
+ return registerBottomNavigation();
56
+ }, [registerBottomNavigation]);
57
+
58
+ const routeItems = Array.isArray(items) ? items : [];
59
+ const knownRoute = routeItems.some(item => item?.route === activeRouteName);
60
+ const effectiveActiveRoute = knownRoute
61
+ ? activeRouteName
62
+ : routeItems[0]?.route || '';
63
+
64
+ const navigateTo = item => {
65
+ try {
66
+ navigation?.navigate?.(item?.route, resolveMenuRouteParams(item?.routeParams));
67
+ } catch {
68
+ // Keep the footer stable if a route is unavailable in the current app flavor.
69
+ }
70
+ };
71
+
72
+ return (
73
+ <View pointerEvents="box-none" style={styles.host}>
74
+ <View style={styles.stack}>
75
+ <View style={styles.dock} testID={testID}>
76
+ {routeItems.map(item => {
77
+ const isActive = effectiveActiveRoute === item.route;
78
+ const isDisabled = disabled || item.disabled;
79
+ const iconSize = item.iconSize || 18;
80
+ const iconColor = isActive ? primaryColor : inactiveText;
81
+
82
+ return (
83
+ <Pressable
84
+ key={item.route}
85
+ accessibilityRole="button"
86
+ disabled={isDisabled}
87
+ onPress={() => navigateTo(item)}
88
+ style={({pressed}) => [
89
+ styles.item,
90
+ isActive && styles.itemActive,
91
+ pressed && !isDisabled && styles.itemPressed,
92
+ isDisabled && styles.itemDisabled,
93
+ ]}>
94
+ <View style={[styles.iconWrap, isActive && styles.iconWrapActive]}>
95
+ <Icon color={iconColor} name={item.icon} size={iconSize} />
96
+ </View>
97
+ <Text
98
+ numberOfLines={1}
99
+ style={[styles.itemLabel, isActive && styles.itemLabelActive]}>
100
+ {item.label}
101
+ </Text>
102
+ </Pressable>
103
+ );
104
+ })}
105
+ </View>
106
+
107
+ {runtimeFooter && (
108
+ <RuntimeInfoFooter
109
+ appVersion={runtimeFooter.appVersion}
110
+ colors={runtimeFooter.colors || colors}
111
+ defaultCompany={runtimeFooter.defaultCompany}
112
+ device={runtimeFooter.device}
113
+ />
114
+ )}
115
+ </View>
116
+ </View>
117
+ );
118
+ };
119
+
120
+ export default BottomNavigationBar;
@@ -0,0 +1,110 @@
1
+ import {Platform, StyleSheet} from 'react-native';
2
+
3
+ const withAlpha = (color, alphaHex) => {
4
+ const raw = String(color || '').trim().replace('#', '');
5
+ if (/^[0-9a-fA-F]{6}$/.test(raw)) {
6
+ return `#${raw}${alphaHex}`;
7
+ }
8
+
9
+ if (/^[0-9a-fA-F]{8}$/.test(raw)) {
10
+ return `#${raw.slice(0, 6)}${alphaHex}`;
11
+ }
12
+
13
+ return color || '#1B5587';
14
+ };
15
+
16
+ const createStyles = ({
17
+ primaryColor,
18
+ dockBackground,
19
+ borderColor,
20
+ inactiveText,
21
+ activeBg,
22
+ activeBorder,
23
+ }) =>
24
+ StyleSheet.create({
25
+ host: {
26
+ position: Platform.OS === 'web' ? 'fixed' : 'absolute',
27
+ left: 0,
28
+ right: 0,
29
+ bottom: 0,
30
+ zIndex: 1000,
31
+ backgroundColor: 'transparent',
32
+ alignItems: 'stretch',
33
+ },
34
+ stack: {
35
+ width: '100%',
36
+ alignItems: 'stretch',
37
+ },
38
+ dock: {
39
+ flexDirection: 'row',
40
+ alignItems: 'center',
41
+ justifyContent: 'space-between',
42
+ minHeight: 64,
43
+ paddingHorizontal: 8,
44
+ paddingTop: 8,
45
+ paddingBottom: 8,
46
+ borderWidth: 1,
47
+ borderBottomWidth: 0,
48
+ borderColor,
49
+ borderTopLeftRadius: 24,
50
+ borderTopRightRadius: 24,
51
+ borderBottomLeftRadius: 0,
52
+ borderBottomRightRadius: 0,
53
+ backgroundColor: dockBackground,
54
+ overflow: 'hidden',
55
+ ...(Platform.OS === 'android'
56
+ ? {elevation: 10}
57
+ : {
58
+ shadowColor: '#0F172A',
59
+ shadowOpacity: 0.12,
60
+ shadowOffset: {width: 0, height: -6},
61
+ shadowRadius: 14,
62
+ }),
63
+ },
64
+ item: {
65
+ flex: 1,
66
+ minHeight: 44,
67
+ alignItems: 'center',
68
+ justifyContent: 'center',
69
+ paddingVertical: 6,
70
+ paddingHorizontal: 4,
71
+ borderWidth: 1,
72
+ borderColor: 'transparent',
73
+ borderRadius: 18,
74
+ },
75
+ itemActive: {
76
+ backgroundColor: activeBg,
77
+ borderColor: activeBorder,
78
+ },
79
+ itemPressed: {
80
+ opacity: 0.92,
81
+ transform: [{scale: 0.99}],
82
+ },
83
+ itemDisabled: {
84
+ opacity: 0.45,
85
+ },
86
+ iconWrap: {
87
+ width: 24,
88
+ height: 24,
89
+ borderRadius: 999,
90
+ alignItems: 'center',
91
+ justifyContent: 'center',
92
+ marginBottom: 4,
93
+ backgroundColor: 'transparent',
94
+ },
95
+ iconWrapActive: {
96
+ backgroundColor: withAlpha(primaryColor, '18'),
97
+ },
98
+ itemLabel: {
99
+ fontSize: 12,
100
+ fontWeight: '600',
101
+ color: inactiveText,
102
+ textAlign: 'center',
103
+ },
104
+ itemLabelActive: {
105
+ color: primaryColor,
106
+ fontWeight: '800',
107
+ },
108
+ });
109
+
110
+ export default createStyles;