@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,144 @@
1
+ import React, { useEffect, useState, useRef } from 'react';
2
+ import { View, Text, Platform } from 'react-native';
3
+ import { useStore } from '@store';
4
+ import { api } from '@controleonline/ui-common/src/api';
5
+ import styles from './Spotify.styles';
6
+
7
+ const SpotifyPlayer = () => {
8
+ const peopleStore = useStore('people');
9
+ const { currentCompany } = peopleStore.getters;
10
+
11
+ const [token, setToken] = useState(null);
12
+ const [isReady, setIsReady] = useState(false);
13
+ const [track, setTrack] = useState(null);
14
+
15
+ const playerRef = useRef(null);
16
+
17
+ // 🔑 TOKEN
18
+ const fetchToken = async () => {
19
+ try {
20
+ const data = await api.fetch('/spotify/token/' + currentCompany?.id);
21
+ if (data.access_token) {
22
+ setToken(data.access_token);
23
+ console.log('[Spotify] Token OK');
24
+ }
25
+ } catch (e) {
26
+ console.error('[Spotify] token error', e);
27
+ }
28
+ };
29
+
30
+ useEffect(() => {
31
+ if (Platform.OS !== 'web' || !currentCompany?.id) return;
32
+ fetchToken();
33
+ }, [currentCompany?.id]);
34
+
35
+ // 🔓 DESBLOQUEAR ÁUDIO (ESSENCIAL)
36
+ useEffect(() => {
37
+ const unlockAudio = async () => {
38
+ try {
39
+ console.log('[Spotify] desbloqueando áudio...');
40
+ await playerRef.current?.resume();
41
+ await playerRef.current?.setVolume(0.8);
42
+ } catch {
43
+ console.log('[Spotify] ainda não liberado');
44
+ }
45
+ };
46
+
47
+ document.addEventListener('click', unlockAudio, { once: true });
48
+
49
+ return () => {
50
+ document.removeEventListener('click', unlockAudio);
51
+ };
52
+ }, []);
53
+
54
+ // 🚀 SDK
55
+ useEffect(() => {
56
+ if (!token || Platform.OS !== 'web') return;
57
+
58
+ if (!document.getElementById('spotify-sdk')) {
59
+ const script = document.createElement('script');
60
+ script.id = 'spotify-sdk';
61
+ script.src = 'https://sdk.scdn.co/spotify-player.js';
62
+ script.async = true;
63
+ document.body.appendChild(script);
64
+ }
65
+
66
+ window.onSpotifyWebPlaybackSDKReady = () => {
67
+ const player = new window.Spotify.Player({
68
+ name: 'KDS Player TV',
69
+ getOAuthToken: cb => cb(token),
70
+ volume: 0.5,
71
+ });
72
+
73
+ playerRef.current = player;
74
+
75
+ // 🎧 Estado vindo do celular
76
+ player.addListener('player_state_changed', state => {
77
+ if (!state) return;
78
+
79
+ const currentTrack = state.track_window.current_track;
80
+
81
+ if (currentTrack) {
82
+ console.log('[Spotify] Tocando:', currentTrack.name);
83
+
84
+ setTrack({
85
+ name: currentTrack.name,
86
+ artist: currentTrack.artists.map(a => a.name).join(', ')
87
+ });
88
+ }
89
+ });
90
+
91
+ // ✅ PLAYER PRONTO
92
+ player.addListener('ready', async ({ device_id }) => {
93
+ console.log('[Spotify] READY:', device_id);
94
+ setIsReady(true);
95
+
96
+ // 🔊 garantir volume
97
+ setTimeout(() => {
98
+ player.setVolume(0.8);
99
+ }, 1000);
100
+ });
101
+
102
+ player.addListener('not_ready', () => {
103
+ setIsReady(false);
104
+ });
105
+
106
+ player.addListener('initialization_error', e => console.error(e));
107
+ player.addListener('authentication_error', e => console.error(e));
108
+ player.addListener('account_error', e => console.error('Premium necessário', e));
109
+ player.addListener('playback_error', e => console.error(e));
110
+
111
+ player.connect();
112
+ };
113
+
114
+ return () => {
115
+ playerRef.current?.disconnect();
116
+ };
117
+ }, [token]);
118
+
119
+ if (Platform.OS !== 'web') {
120
+ return (
121
+ <View style={styles.container}>
122
+ <Text>Spotify apenas na Web</Text>
123
+ </View>
124
+ );
125
+ }
126
+
127
+ return (
128
+ <View style={styles.footer}>
129
+ <Text style={styles.status}>
130
+ {isReady ? '🟢 Aguardando Spotify Connect...' : '🟠 Carregando...'}
131
+ </Text>
132
+
133
+ {track && (
134
+ <View style={styles.trackBox}>
135
+ <Text style={styles.trackName}>{track.name}</Text>
136
+ <Text style={styles.artist}>{track.artist}</Text>
137
+ </View>
138
+ )}
139
+ </View>
140
+ );
141
+ };
142
+
143
+ export default SpotifyPlayer;
144
+ // TODO(store-first): quando este arquivo for mexido, mover a leitura para stores, remover api.fetch e evitar repassar dados em objetos quando o store ja resolver isso.
@@ -0,0 +1,32 @@
1
+ import { StyleSheet } from 'react-native'
2
+
3
+ const styles = StyleSheet.create({
4
+ footer: {
5
+ height: 100,
6
+ backgroundColor: '#121212',
7
+ justifyContent: 'center',
8
+ alignItems: 'center',
9
+ },
10
+ status: {
11
+ color: '#fff',
12
+ fontWeight: 'bold',
13
+ },
14
+ trackBox: {
15
+ marginTop: 8,
16
+ alignItems: 'center',
17
+ },
18
+ trackName: {
19
+ color: '#fff',
20
+ fontSize: 14,
21
+ fontWeight: 'bold',
22
+ },
23
+ artist: {
24
+ color: '#aaa',
25
+ fontSize: 12,
26
+ },
27
+ container: {
28
+ padding: 20,
29
+ },
30
+ })
31
+
32
+ export default styles
@@ -0,0 +1,82 @@
1
+ // components/YouTube.js
2
+ import React, { useRef, useEffect } from 'react';
3
+ import { View, Platform } from 'react-native';
4
+ import { WebView } from 'react-native-webview';
5
+ import styles from './YouTube.styles';
6
+
7
+ const YouTube = ({
8
+ playlistId = 'PLbpi6ZahtOH7DrxWUmkwvsXnFeCfB5LUp',
9
+ height = 400,
10
+ volume = 100
11
+ }) => {
12
+ const webRef = useRef(null);
13
+
14
+ // URL do embed com JS API habilitada, autoplay e mute inicial
15
+ const embedUrl = `https://www.youtube.com/embed/videoseries?list=${playlistId}&autoplay=1&mute=1&controls=0&rel=0&modestbranding=1&enablejsapi=1`;
16
+
17
+ useEffect(() => {
18
+ if (Platform.OS === 'web') {
19
+ const timer = setTimeout(() => {
20
+ const iframe = document.querySelector(`iframe[src*="${playlistId}"]`);
21
+ if (iframe) {
22
+ iframe.contentWindow?.postMessage(
23
+ JSON.stringify({ event: 'command', func: 'unMute', args: [] }),
24
+ '*'
25
+ );
26
+ iframe.contentWindow?.postMessage(
27
+ JSON.stringify({ event: 'command', func: 'setVolume', args: [volume] }),
28
+ '*'
29
+ );
30
+ console.log('[YouTube Web] Volume aumentado');
31
+ }
32
+ }, 10000);
33
+
34
+ return () => clearTimeout(timer);
35
+ }
36
+ }, [playlistId, volume]);
37
+
38
+ // Mobile / TV WebView
39
+ const injectedJS = `
40
+ setTimeout(() => {
41
+ if (window.YT && window.YT.Player) {
42
+ const player = new YT.Player('ytplayer');
43
+ player.unMute();
44
+ player.setVolume(${volume});
45
+ }
46
+ }, 3000);
47
+ true;
48
+ `;
49
+
50
+ if (Platform.OS === 'web') {
51
+ return (
52
+ <View style={[styles.container, { height }]}>
53
+ <iframe
54
+ id="ytplayer"
55
+ src={embedUrl}
56
+ width="100%"
57
+ height={height}
58
+ frameBorder="0"
59
+ allow="autoplay; encrypted-media; fullscreen"
60
+ allowFullScreen
61
+ />
62
+ </View>
63
+ );
64
+ }
65
+
66
+ return (
67
+ <View style={[styles.container, { height }]}>
68
+ <WebView
69
+ ref={webRef}
70
+ source={{ uri: embedUrl }}
71
+ style={styles.webview}
72
+ javaScriptEnabled
73
+ domStorageEnabled
74
+ allowsInlineMediaPlayback
75
+ mediaPlaybackRequiresUserAction={false}
76
+ injectedJavaScript={injectedJS}
77
+ />
78
+ </View>
79
+ );
80
+ };
81
+
82
+ export default YouTube;
@@ -0,0 +1,16 @@
1
+ import { StyleSheet } from 'react-native'
2
+
3
+ const styles = StyleSheet.create({
4
+ container: {
5
+ position: 'absolute',
6
+ bottom: 0,
7
+ left: 0,
8
+ right: 0,
9
+ backgroundColor: '#000',
10
+ },
11
+ webview: {
12
+ flex: 1,
13
+ },
14
+ })
15
+
16
+ export default styles
@@ -0,0 +1,16 @@
1
+ export const TOAST_PROVIDER_KEYS = {
2
+ ROOT: 'APP_ROOT_TOASTS',
3
+ MODAL: 'APP_MODAL_TOASTS',
4
+ PERSIST: 'PERSISTS',
5
+ };
6
+
7
+ export const TOAST_MODAL_COUNT_KEY = '__coToastModalDepth';
8
+
9
+ export const TOAST_DEFAULT_DURATION = 4000;
10
+ export const TOAST_DEFAULT_TOP_OFFSET = 46;
11
+ export const TOAST_DEFAULT_BOTTOM_OFFSET = 30;
12
+
13
+ export const TOAST_EXTRA_INSETS = {
14
+ top: TOAST_DEFAULT_TOP_OFFSET - 16,
15
+ bottom: 72,
16
+ };