@controleonline/ui-common 1.2.70 → 1.2.75

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 (188) hide show
  1. package/.github/actions/workers/manager/action.yml +147 -0
  2. package/.github/actions/workers/qa/action.yml +44 -0
  3. package/.github/actions/workers/security/action.yml +44 -0
  4. package/.github/actions/workers/technical-documenter/action.yml +51 -0
  5. package/.github/workflows/manager-worker.yml +168 -0
  6. package/.github/workflows/publish-npm.yml +45 -0
  7. package/.gitmodules +3 -0
  8. package/AGENTS.md +6 -0
  9. package/README.md +14 -0
  10. package/package.json +32 -28
  11. package/src/api/fetch.js +1 -1
  12. package/src/api/index.js +328 -58
  13. package/src/react/components/AddImportModal.js +95 -111
  14. package/src/react/components/AnimatedModal.js +171 -0
  15. package/src/react/components/AnimatedModal.styles.js +21 -0
  16. package/src/react/components/AppTypeSwitcher.js +164 -0
  17. package/src/react/components/AppTypeSwitcher.styles.js +109 -0
  18. package/src/react/components/BackgroundRuntimeBridge.js +5 -4
  19. package/src/react/components/BottomNavigationBar.config.js +211 -231
  20. package/src/react/components/BottomNavigationBar.js +86 -31
  21. package/src/react/components/BottomNavigationBar.styles.js +118 -110
  22. package/src/react/components/CategoryForm.js +52 -35
  23. package/src/react/components/DefaultProvider.native.js +194 -156
  24. package/src/react/components/DefaultProvider.web.js +188 -112
  25. package/src/react/components/DeliveryPushBridge.native.js +2 -2
  26. package/src/react/components/DeviceAlertSoundService.js +3 -3
  27. package/src/react/components/KioskModeBridge.js +2 -2
  28. package/src/react/components/LauncherModeBridge.js +2 -2
  29. package/src/react/components/ManagerPushBridge.native.js +2 -2
  30. package/src/react/components/NetworkPrinterPreviewModal.js +249 -0
  31. package/src/react/components/NetworkPrinterPreviewModal.styles.js +159 -0
  32. package/src/react/components/RemoteCheckoutService.js +28 -20
  33. package/src/react/components/RuntimeBottomNavigationBar.js +146 -119
  34. package/src/react/components/RuntimeInfoFooter.js +137 -45
  35. package/src/react/components/RuntimeInfoFooter.styles.js +3 -0
  36. package/src/react/components/StateStore.js +258 -0
  37. package/src/react/components/UnifiedPaymentBar.js +7 -4
  38. package/src/react/components/UserAvatar.js +160 -0
  39. package/src/react/components/WebsocketListener.native.js +11 -11
  40. package/src/react/components/integrations/IntegrationHero/index.js +48 -0
  41. package/src/react/components/integrations/IntegrationHero/styles.js +57 -0
  42. package/src/react/components/integrations/IntegrationTabs/index.js +89 -0
  43. package/src/react/components/integrations/IntegrationTabs/styles.js +44 -0
  44. package/src/react/config/deviceConfigBootstrap.js +71 -30
  45. package/src/react/css/orders.js +72 -0
  46. package/src/react/pages/Connections.js +229 -0
  47. package/src/react/pages/Connections.styles.js +222 -0
  48. package/src/react/pages/DeviceDetailPage.js +2814 -0
  49. package/src/react/pages/DeviceDetailPage.styles.js +308 -0
  50. package/src/react/pages/Devices/currentDevice.js +194 -0
  51. package/src/react/pages/Devices/deviceTypes/DeviceGroupCard.js +257 -0
  52. package/src/react/pages/Devices/deviceTypes/all.js +23 -0
  53. package/src/react/pages/Devices/deviceTypes/device.js +25 -0
  54. package/src/react/pages/Devices/deviceTypes/deviceListHelpers.js +178 -0
  55. package/src/react/pages/Devices/deviceTypes/display.js +26 -0
  56. package/src/react/pages/Devices/deviceTypes/index.js +145 -0
  57. package/src/react/pages/Devices/deviceTypes/ipCamera.js +35 -0
  58. package/src/react/pages/Devices/deviceTypes/pdv.js +88 -0
  59. package/src/react/pages/Devices/deviceTypes/printer.js +37 -0
  60. package/src/react/pages/Devices/deviceTypes/shared.js +453 -0
  61. package/src/react/pages/Devices/deviceTypes/useDeviceNetworkConnectivity.js +145 -0
  62. package/src/react/pages/Devices.js +183 -0
  63. package/src/react/pages/Devices.styles.js +353 -0
  64. package/src/react/pages/Food99IntegrationPage/components/Food99CatalogTab.js +219 -0
  65. package/src/react/pages/Food99IntegrationPage/components/Food99OverviewTab.js +134 -0
  66. package/src/react/pages/Food99IntegrationPage/components/Food99PreviewModal.js +173 -0
  67. package/src/react/pages/Food99IntegrationPage/components/Food99ProductCard.js +1 -0
  68. package/src/react/pages/Food99IntegrationPage/components/Food99QuickWalletModal.js +181 -0
  69. package/src/react/pages/Food99IntegrationPage/components/Food99SettingsTab.js +306 -0
  70. package/src/react/pages/Food99IntegrationPage/components/Food99StoreTab.js +417 -0
  71. package/src/react/pages/Food99IntegrationPage/index.js +1530 -0
  72. package/src/react/pages/Food99IntegrationPage/styles.js +792 -0
  73. package/src/react/pages/Food99IntegrationPage/utils.js +155 -0
  74. package/src/react/pages/Food99IntegrationPage.js +1 -0
  75. package/src/react/pages/Food99IntegrationPage.styles.js +1 -0
  76. package/src/react/pages/GenericLogPage.js +42 -167
  77. package/src/react/pages/IFoodIntegrationPage/components/IFoodCatalogTab.js +8 -0
  78. package/src/react/pages/IFoodIntegrationPage/components/IFoodOperationsTab.js +420 -0
  79. package/src/react/pages/IFoodIntegrationPage/components/IFoodOverviewTab.js +118 -0
  80. package/src/react/pages/IFoodIntegrationPage/components/IFoodPreviewModal.js +103 -0
  81. package/src/react/pages/IFoodIntegrationPage/components/IFoodProductCard.js +1 -0
  82. package/src/react/pages/IFoodIntegrationPage/components/IFoodStoreTab.js +150 -0
  83. package/src/react/pages/IFoodIntegrationPage/index.js +1298 -0
  84. package/src/react/pages/IFoodIntegrationPage/styles.js +764 -0
  85. package/src/react/pages/IFoodIntegrationPage/utils.js +91 -0
  86. package/src/react/pages/IFoodIntegrationPage.js +1 -0
  87. package/src/react/pages/IFoodIntegrationPage.styles.js +1 -0
  88. package/src/react/pages/Imports.js +214 -166
  89. package/src/react/pages/IntegrationConfigPage.js +744 -0
  90. package/src/react/pages/IntegrationConfigPage.styles.js +269 -0
  91. package/src/react/pages/Integrations.js +299 -0
  92. package/src/react/pages/Integrations.styles.js +130 -0
  93. package/src/react/pages/ManagerOrderNotificationsPage.js +642 -0
  94. package/src/react/pages/MarketplaceIntegrationPage/components/MarketplaceProductCard.js +205 -0
  95. package/src/react/pages/MarketplaceIntegrationPage/components/RemoteMarketplaceMenuTab.js +335 -0
  96. package/src/react/pages/MarketplaceIntegrationPage/index.js +60 -0
  97. package/src/react/pages/MarketplaceIntegrationPage/utils.js +137 -0
  98. package/src/react/pages/MercadoLivreIntegrationPage.js +538 -0
  99. package/src/react/pages/PrinterDeviceDetailPage.js +1916 -0
  100. package/src/react/pages/PrinterDeviceDetailPage.styles.js +223 -0
  101. package/src/react/pages/PrinterDeviceFormPage.js +521 -0
  102. package/src/react/pages/PrinterDeviceFormPage.styles.js +159 -0
  103. package/src/react/pages/SettingsPage/PaymentTypesByWalletTab.js +484 -454
  104. package/src/react/pages/SettingsPage/index.js +1266 -1167
  105. package/src/react/pages/WhatsAppConnectionPage.js +459 -0
  106. package/src/react/pages/WhatsAppConnectionPage.styles.js +284 -0
  107. package/src/react/pages/integrationsCatalog.js +399 -0
  108. package/src/react/print/providers/local.js +1 -1
  109. package/src/react/router/publicRoutes.js +25 -0
  110. package/src/react/services/Cielo/Checkout.js +39 -0
  111. package/src/react/services/Cielo/Cielo.js +193 -0
  112. package/src/react/services/Cielo/Print.js +7 -0
  113. package/src/react/services/InfinitePay/Checkout.js +33 -0
  114. package/src/react/services/InfinitePay/InfinitePay.js +24 -0
  115. package/src/react/{utils → services}/paymentGatewayExecution.js +91 -91
  116. package/src/react/styles/global.js +115 -0
  117. package/src/react/utils/categoryContexts.js +46 -0
  118. package/src/react/utils/entityDisplay.js +222 -217
  119. package/src/react/utils/fileUrl.js +201 -16
  120. package/src/react/utils/integrationPage.js +16 -0
  121. package/src/react/utils/menuNavigation.js +31 -0
  122. package/src/react/utils/orderIdentity.js +277 -0
  123. package/src/react/utils/remotePayment.js +115 -61
  124. package/src/react/utils/runtimeFooter.js +40 -22
  125. package/src/react/utils/runtimeLanguage.js +50 -9
  126. package/src/react/utils/runtimeMenu.js +190 -98
  127. package/src/react/utils/runtimeZoom.js +43 -0
  128. package/src/react/utils/shopConfig.js +72 -34
  129. package/src/react/utils/shopFranchises.js +182 -23
  130. package/src/react/utils/socketRuntimePipeline.js +14 -14
  131. package/src/react/utils/storeColumns.js +23 -4
  132. package/src/react/utils/userAvatar.js +104 -0
  133. package/src/store/categories/index.js +48 -20
  134. package/src/store/configs/index.js +2 -2
  135. package/src/store/device_config/index.js +62 -21
  136. package/src/store/entity_log/index.js +22 -1
  137. package/src/store/imports/customActions.js +51 -0
  138. package/src/store/imports/index.js +89 -88
  139. package/src/store/status/index.js +11 -11
  140. package/src/store/themes/index.js +22 -0
  141. package/src/store/timezones/index.js +3 -1
  142. package/src/tests/browser/manager/connections.spec.js +143 -0
  143. package/src/tests/browser/manager/devices-current.spec.js +343 -0
  144. package/src/tests/browser/manager/mercado-livre-integration.spec.js +268 -0
  145. package/src/tests/react/api/deviceHeaders.test.js +114 -0
  146. package/src/tests/react/api/loadSmokeIndex.test.js +75 -0
  147. package/src/tests/react/components/AddImportModal.test.js +166 -0
  148. package/src/tests/react/components/BottomNavigationBar.config.test.js +20 -0
  149. package/src/tests/react/components/UserAvatar.test.js +52 -0
  150. package/src/tests/react/config/deviceConfigBootstrap.test.js +47 -0
  151. package/src/tests/react/pages/DevicePickerStyles.test.js +47 -0
  152. package/src/tests/react/pages/Devices/deviceListHelpers.test.js +39 -0
  153. package/src/tests/react/pages/DevicesCurrentDevice.test.js +198 -0
  154. package/src/tests/react/pages/connectionsHelpers.test.js +34 -0
  155. package/src/tests/react/pages/mercadoLivreIntegrationPageContract.test.mjs +16 -0
  156. package/src/tests/react/print/localPrintProvider.test.js +1 -1
  157. package/src/tests/react/services/Cielo.test.js +190 -0
  158. package/src/tests/react/store/categoriesOrdering.test.js +26 -0
  159. package/src/tests/react/utils/appDomain.test.js +62 -0
  160. package/src/tests/react/utils/entityDisplay.test.js +2 -2
  161. package/src/tests/react/utils/fileUrl.test.js +62 -0
  162. package/src/tests/react/utils/formatter.test.mjs +33 -0
  163. package/src/tests/react/utils/importStatus.test.js +2 -2
  164. package/src/tests/react/utils/orderIdentity.test.js +139 -0
  165. package/src/tests/react/utils/remotePayment.test.js +62 -0
  166. package/src/tests/react/utils/runtimeFooter.test.js +32 -9
  167. package/src/tests/react/utils/runtimeLanguage.test.js +80 -10
  168. package/src/tests/react/utils/runtimeMenu.test.js +195 -111
  169. package/src/tests/react/utils/runtimeZoom.test.js +38 -0
  170. package/src/tests/react/utils/shopConfig.test.js +75 -0
  171. package/src/tests/react/utils/shopFranchises.test.js +122 -12
  172. package/src/tests/react/utils/translate.discovery.test.mjs +170 -0
  173. package/src/tests/react/utils/translate.test.helpers.mjs +152 -0
  174. package/src/tests/react/utils/translate.test.mjs +252 -396
  175. package/src/tests/react/utils/userAvatar.test.js +63 -0
  176. package/src/utils/appDomain.js +15 -4
  177. package/src/utils/formatter.js +122 -16
  178. package/src/utils/integrationConfigs.js +1 -0
  179. package/src/utils/translate.js +277 -398
  180. package/src/utils/translateDiscovery.js +96 -0
  181. package/src/utils/translateNormalize.js +33 -0
  182. package/src/utils/translatePending.js +92 -0
  183. package/src/utils/translateStorage.js +142 -0
  184. package/.github/agents/developer.agent.md +0 -30
  185. package/.github/agents/devops.agent.md +0 -30
  186. package/.github/agents/qa.agent.md +0 -30
  187. package/.github/agents/security.agent.md +0 -30
  188. package/.github/workflows/npmjs.yml +0 -35
@@ -0,0 +1,39 @@
1
+ import CieloService from './Cielo';
2
+
3
+ export const formatCieloCheckoutProducts = orderProducts =>
4
+ (Array.isArray(orderProducts) ? orderProducts : []).map(orderProduct => ({
5
+ name: orderProduct?.product?.product,
6
+ quantity: orderProduct?.quantity,
7
+ sku:
8
+ orderProduct?.product?.sku ||
9
+ String(orderProduct?.product?.['@id'] || '').replace(/\D/g, ''),
10
+ unitOfMeasure: 'unidade',
11
+ unitPrice: Math.round(Number(orderProduct?.price || 0) * 100).toString(),
12
+ }));
13
+
14
+ export const runCieloCheckoutPayment = async ({
15
+ orderProducts = [],
16
+ payment = null,
17
+ total = 0,
18
+ }) => {
19
+ const resolvedTotal = Number(total || 0);
20
+
21
+ if (!payment?.paymentCode) {
22
+ throw new Error('Meio de pagamento sem codigo de gateway.');
23
+ }
24
+
25
+ if (resolvedTotal <= 0) {
26
+ throw new Error('Informe um valor de pagamento valido.');
27
+ }
28
+
29
+ const response = await new CieloService().payment(
30
+ payment.paymentCode,
31
+ formatCieloCheckoutProducts(orderProducts),
32
+ Math.round(resolvedTotal * 100).toString(),
33
+ );
34
+
35
+ return {
36
+ paidAmount: resolvedTotal,
37
+ response,
38
+ };
39
+ };
@@ -0,0 +1,193 @@
1
+ import Cielo from '@controleonline-rn/react-native-cielo-payment';
2
+ import {env} from '@env';
3
+ import {api} from '@controleonline/ui-common/src/api';
4
+ import {getAllStores} from '@store';
5
+ import {
6
+ DEFAULT_CIELO_CONFIG,
7
+ resolveCieloConfig,
8
+ } from '@controleonline/ui-common/src/utils/integrationConfigs';
9
+
10
+ const isConfigMap = value =>
11
+ value && typeof value === 'object' && !Array.isArray(value);
12
+
13
+ const normalizeEntityId = value =>
14
+ String(value?.id || value?.['@id'] || value || '')
15
+ .replace(/\D+/g, '')
16
+ .trim();
17
+
18
+ const extractCollectionItems = response => {
19
+ if (Array.isArray(response)) return response;
20
+ if (Array.isArray(response?.member)) return response.member;
21
+ if (Array.isArray(response?.['hydra:member'])) return response['hydra:member'];
22
+ return [];
23
+ };
24
+
25
+ const hasRequiredCieloConfig = config =>
26
+ Boolean(
27
+ String(config?.ACCESS_TOKEN || '').trim() &&
28
+ String(config?.CLIENT_ID || '').trim() &&
29
+ String(config?.EMAIL || '').trim(),
30
+ );
31
+
32
+ const hasExpectedMerchantCode = (result, expectedMerchantCode) => {
33
+ if (!expectedMerchantCode) return true;
34
+
35
+ const payments = Array.isArray(result?.payments) ? result.payments : [];
36
+
37
+ return (
38
+ payments.length > 0 &&
39
+ payments.every(
40
+ payment => String(payment?.merchantCode || '').trim() === expectedMerchantCode,
41
+ )
42
+ );
43
+ };
44
+
45
+ let technicalCieloConfigCache = DEFAULT_CIELO_CONFIG;
46
+ let technicalCieloConfigCompanyId = '';
47
+ let technicalCieloConfigPromise = null;
48
+
49
+ const resolveRuntimeCompanyConfigs = () => {
50
+ const stores = getAllStores();
51
+ const peopleStore = stores?.people?.getters || {};
52
+ const configsStore = stores?.configs?.getters || {};
53
+
54
+ if (isConfigMap(configsStore.items)) {
55
+ return configsStore.items;
56
+ }
57
+
58
+ if (isConfigMap(peopleStore.currentCompany?.configs)) {
59
+ return peopleStore.currentCompany.configs;
60
+ }
61
+
62
+ if (isConfigMap(peopleStore.defaultCompany?.configs)) {
63
+ return peopleStore.defaultCompany.configs;
64
+ }
65
+
66
+ return {};
67
+ };
68
+
69
+ const resolveDefaultCompanyId = () => {
70
+ const stores = getAllStores();
71
+ const peopleStore = stores?.people?.getters || {};
72
+
73
+ return normalizeEntityId(
74
+ peopleStore.defaultCompany?.id || peopleStore.defaultCompany?.['@id'],
75
+ );
76
+ };
77
+
78
+ const loadTechnicalCieloConfig = async () => {
79
+ const defaultCompanyId = resolveDefaultCompanyId();
80
+
81
+ if (!defaultCompanyId) {
82
+ return DEFAULT_CIELO_CONFIG;
83
+ }
84
+
85
+ if (
86
+ technicalCieloConfigCompanyId === defaultCompanyId &&
87
+ hasRequiredCieloConfig(technicalCieloConfigCache)
88
+ ) {
89
+ return technicalCieloConfigCache;
90
+ }
91
+
92
+ if (technicalCieloConfigPromise) {
93
+ return technicalCieloConfigPromise;
94
+ }
95
+
96
+ technicalCieloConfigPromise = api
97
+ .fetch('/configs', {
98
+ params: {
99
+ configKey: 'CIELO',
100
+ people: '/people/' + defaultCompanyId,
101
+ visibility: 'private',
102
+ },
103
+ })
104
+ .then(response => {
105
+ const item = extractCollectionItems(response)[0];
106
+ technicalCieloConfigCompanyId = defaultCompanyId;
107
+ technicalCieloConfigCache = resolveCieloConfig(
108
+ item?.configKey ? {[item.configKey]: item?.configValue} : {},
109
+ );
110
+
111
+ return technicalCieloConfigCache;
112
+ })
113
+ .catch(() => DEFAULT_CIELO_CONFIG)
114
+ .finally(() => {
115
+ technicalCieloConfigPromise = null;
116
+ });
117
+
118
+ return technicalCieloConfigPromise;
119
+ };
120
+
121
+ const resolveRuntimeCieloConfig = async () => {
122
+ const runtimeConfig = resolveCieloConfig(resolveRuntimeCompanyConfigs());
123
+ const technicalConfig = hasRequiredCieloConfig(runtimeConfig)
124
+ ? DEFAULT_CIELO_CONFIG
125
+ : await loadTechnicalCieloConfig();
126
+
127
+ return {
128
+ ACCESS_TOKEN:
129
+ runtimeConfig.ACCESS_TOKEN ||
130
+ technicalConfig.ACCESS_TOKEN ||
131
+ env?.CIELO?.ACCESS_TOKEN ||
132
+ '',
133
+ CLIENT_ID:
134
+ runtimeConfig.CLIENT_ID ||
135
+ technicalConfig.CLIENT_ID ||
136
+ env?.CIELO?.CLIENT_ID ||
137
+ '',
138
+ EMAIL: runtimeConfig.EMAIL || technicalConfig.EMAIL || env?.CIELO?.EMAIL || '',
139
+ MERCHANT_CODE:
140
+ runtimeConfig.MERCHANT_CODE ||
141
+ technicalConfig.MERCHANT_CODE ||
142
+ env?.CIELO?.MERCHANT_CODE ||
143
+ '',
144
+ };
145
+ };
146
+
147
+ class CieloService {
148
+ async payment(paymentCode, items, orderPrice) {
149
+ const cieloConfig = await resolveRuntimeCieloConfig();
150
+
151
+ if (
152
+ !cieloConfig.ACCESS_TOKEN ||
153
+ !cieloConfig.CLIENT_ID ||
154
+ !cieloConfig.EMAIL
155
+ ) {
156
+ throw new Error('Configuracao da Cielo incompleta.');
157
+ }
158
+
159
+ const json = {
160
+ accessToken: cieloConfig.ACCESS_TOKEN,
161
+ clientID: cieloConfig.CLIENT_ID,
162
+ email: cieloConfig.EMAIL,
163
+ installments: 0,
164
+ items: items,
165
+ paymentCode: paymentCode,
166
+ value: orderPrice,
167
+ };
168
+
169
+ if (cieloConfig.MERCHANT_CODE) {
170
+ json.merchantCode = cieloConfig.MERCHANT_CODE;
171
+ }
172
+
173
+ const response = await Cielo.payment(JSON.stringify(json));
174
+
175
+ const result = response.success
176
+ ? JSON.parse(response.result)
177
+ : response.result;
178
+ const hasValidMerchantCode = hasExpectedMerchantCode(
179
+ result,
180
+ cieloConfig.MERCHANT_CODE,
181
+ );
182
+
183
+ return {
184
+ success: response.success && hasValidMerchantCode,
185
+ code: response.code,
186
+ result: hasValidMerchantCode
187
+ ? result
188
+ : 'Pagamento processado em estabelecimento Cielo diferente do configurado.',
189
+ };
190
+ }
191
+ }
192
+
193
+ export default CieloService;
@@ -0,0 +1,7 @@
1
+ import Cielo from '@controleonline-rn/react-native-cielo-payment';
2
+
3
+ export class CieloPrint {
4
+ async print(printRequest) {
5
+ return await Cielo.print(printRequest);
6
+ }
7
+ }
@@ -0,0 +1,33 @@
1
+ import InfinitePayService from './InfinitePay';
2
+
3
+ export const runInfinitePayCheckoutPayment = async ({
4
+ installments = null,
5
+ order = null,
6
+ payment = null,
7
+ total = 0,
8
+ }) => {
9
+ const resolvedTotal = Number(total || 0);
10
+
11
+ if (!payment?.paymentCode) {
12
+ throw new Error('Meio de pagamento sem codigo de gateway.');
13
+ }
14
+
15
+ if (resolvedTotal <= 0) {
16
+ throw new Error('Informe um valor de pagamento valido.');
17
+ }
18
+
19
+ const response = await new InfinitePayService().payment(
20
+ payment.paymentCode,
21
+ installments || payment.installments || 1,
22
+ order?.['@id'] || order?.id || '',
23
+ Math.round(resolvedTotal * 100).toString(),
24
+ );
25
+
26
+ return {
27
+ paidAmount:
28
+ Number(response?.result?.paidAmount || 0) > 0
29
+ ? Number(response.result.paidAmount) / 100
30
+ : resolvedTotal,
31
+ response,
32
+ };
33
+ };
@@ -0,0 +1,24 @@
1
+ import InfinitePay from '@controleonline-rn/react-native-infinitepay-payment';
2
+
3
+ class InfinitePayService {
4
+ async payment(paymentMethod, installments, orderId, amount) {
5
+ const json = {
6
+ amount: amount,
7
+ payment_method: paymentMethod,
8
+ installments: installments,
9
+ order_id: orderId,
10
+ app_client_referrer: 'ControleOnline',
11
+ af_force_deeplink: 'true',
12
+ };
13
+
14
+ const response = await InfinitePay.payment(JSON.stringify(json));
15
+
16
+ return {
17
+ success: response.success,
18
+ code: response.code,
19
+ result: response.success ? JSON.parse(response.result) : response.result,
20
+ };
21
+ }
22
+ }
23
+
24
+ export default InfinitePayService;
@@ -1,91 +1,91 @@
1
- import {runCieloCheckoutPayment} from '@controleonline/ui-orders/src/react/services/Cielo/Checkout';
2
- import {runInfinitePayCheckoutPayment} from '@controleonline/ui-orders/src/react/services/InfinitePay/Checkout';
3
-
4
- import {
5
- PAYMENT_GATEWAY_CIELO,
6
- PAYMENT_GATEWAY_INFINITE_PAY,
7
- } from './paymentDevices';
8
-
9
- export const normalizeGatewayPaymentError = (
10
- error,
11
- fallback = 'Nao foi possivel concluir o pagamento.',
12
- ) => {
13
- if (typeof error === 'string' && error.trim()) {
14
- return error;
15
- }
16
-
17
- if (typeof error?.message === 'string' && error.message.trim()) {
18
- return error.message;
19
- }
20
-
21
- if (typeof error?.result === 'string' && error.result.trim()) {
22
- return error.result;
23
- }
24
-
25
- if (typeof error?.error === 'string' && error.error.trim()) {
26
- return error.error;
27
- }
28
-
29
- try {
30
- const serialized = JSON.stringify(error);
31
- return serialized && serialized !== '{}' ? serialized : fallback;
32
- } catch {
33
- return fallback;
34
- }
35
- };
36
-
37
- export const runConfiguredGatewayPayment = async ({
38
- gateway = '',
39
- installments = null,
40
- order = null,
41
- orderProducts = [],
42
- payment = null,
43
- total = 0,
44
- }) => {
45
- const resolvedTotal = Number(total || 0);
46
-
47
- if (!payment?.paymentCode) {
48
- throw new Error('Meio de pagamento sem codigo de gateway.');
49
- }
50
-
51
- if (resolvedTotal <= 0) {
52
- throw new Error('Informe um valor de pagamento valido.');
53
- }
54
-
55
- if (gateway === PAYMENT_GATEWAY_CIELO) {
56
- const {response, paidAmount} = await runCieloCheckoutPayment({
57
- orderProducts,
58
- payment,
59
- total: resolvedTotal,
60
- });
61
-
62
- if (!response?.success) {
63
- throw new Error(normalizeGatewayPaymentError(response?.result));
64
- }
65
-
66
- return {
67
- paidAmount,
68
- response,
69
- };
70
- }
71
-
72
- if (gateway === PAYMENT_GATEWAY_INFINITE_PAY) {
73
- const {response, paidAmount} = await runInfinitePayCheckoutPayment({
74
- installments,
75
- order,
76
- payment,
77
- total: resolvedTotal,
78
- });
79
-
80
- if (!response?.success || response?.code === 1 || response?.code === 2) {
81
- throw response;
82
- }
83
-
84
- return {
85
- paidAmount,
86
- response,
87
- };
88
- }
89
-
90
- throw new Error('Gateway de pagamento indisponível neste equipamento.');
91
- };
1
+ import {runCieloCheckoutPayment} from './Cielo/Checkout';
2
+ import {runInfinitePayCheckoutPayment} from './InfinitePay/Checkout';
3
+
4
+ import {
5
+ PAYMENT_GATEWAY_CIELO,
6
+ PAYMENT_GATEWAY_INFINITE_PAY,
7
+ } from '../utils/paymentDevices';
8
+
9
+ export const normalizeGatewayPaymentError = (
10
+ error,
11
+ fallback = 'Nao foi possivel concluir o pagamento.',
12
+ ) => {
13
+ if (typeof error === 'string' && error.trim()) {
14
+ return error;
15
+ }
16
+
17
+ if (typeof error?.message === 'string' && error.message.trim()) {
18
+ return error.message;
19
+ }
20
+
21
+ if (typeof error?.result === 'string' && error.result.trim()) {
22
+ return error.result;
23
+ }
24
+
25
+ if (typeof error?.error === 'string' && error.error.trim()) {
26
+ return error.error;
27
+ }
28
+
29
+ try {
30
+ const serialized = JSON.stringify(error);
31
+ return serialized && serialized !== '{}' ? serialized : fallback;
32
+ } catch {
33
+ return fallback;
34
+ }
35
+ };
36
+
37
+ export const runConfiguredGatewayPayment = async ({
38
+ gateway = '',
39
+ installments = null,
40
+ order = null,
41
+ orderProducts = [],
42
+ payment = null,
43
+ total = 0,
44
+ }) => {
45
+ const resolvedTotal = Number(total || 0);
46
+
47
+ if (!payment?.paymentCode) {
48
+ throw new Error('Meio de pagamento sem codigo de gateway.');
49
+ }
50
+
51
+ if (resolvedTotal <= 0) {
52
+ throw new Error('Informe um valor de pagamento valido.');
53
+ }
54
+
55
+ if (gateway === PAYMENT_GATEWAY_CIELO) {
56
+ const {response, paidAmount} = await runCieloCheckoutPayment({
57
+ orderProducts,
58
+ payment,
59
+ total: resolvedTotal,
60
+ });
61
+
62
+ if (!response?.success) {
63
+ throw new Error(normalizeGatewayPaymentError(response?.result));
64
+ }
65
+
66
+ return {
67
+ paidAmount,
68
+ response,
69
+ };
70
+ }
71
+
72
+ if (gateway === PAYMENT_GATEWAY_INFINITE_PAY) {
73
+ const {response, paidAmount} = await runInfinitePayCheckoutPayment({
74
+ installments,
75
+ order,
76
+ payment,
77
+ total: resolvedTotal,
78
+ });
79
+
80
+ if (!response?.success || response?.code === 1 || response?.code === 2) {
81
+ throw response;
82
+ }
83
+
84
+ return {
85
+ paidAmount,
86
+ response,
87
+ };
88
+ }
89
+
90
+ throw new Error('Gateway de pagamento indisponível neste equipamento.');
91
+ };
@@ -0,0 +1,115 @@
1
+ import {StyleSheet} from 'react-native';
2
+ import {useStore} from '@store';
3
+
4
+ const css = () => {
5
+ const themeStore = useStore('theme');
6
+ const getters = themeStore.getters;
7
+ const {colors} = getters;
8
+
9
+ return StyleSheet.create({
10
+ container: {
11
+ flex: 1,
12
+ backgroundColor: '#f4f4f4',
13
+ paddingTop: 20,
14
+ paddingHorizontal: 20,
15
+ },
16
+ loadingContainer: {
17
+ flex: 1,
18
+ justifyContent: 'center',
19
+ alignItems: 'center',
20
+ },
21
+ button: {
22
+ padding: 11,
23
+ justifyContent: 'center',
24
+ alignItems: 'center',
25
+ marginHorizontal: 5,
26
+ flex: 1,
27
+ color: '#fff',
28
+ backgroundColor: colors['primary'],
29
+ flexDirection: 'row',
30
+ },
31
+ btnText: {
32
+ color: '#fff',
33
+ fontSize: 16,
34
+ fontWeight: 'bold',
35
+ },
36
+ primary: {
37
+ backgroundColor: colors['primary'],
38
+ color: '#000000',
39
+ },
40
+ state: {
41
+ container: {
42
+ flex: 1,
43
+ justifyContent: 'center',
44
+ alignItems: 'center',
45
+ padding: 20,
46
+ },
47
+ displayContainer: {
48
+ flex: 1,
49
+ justifyContent: 'center',
50
+ alignItems: 'center',
51
+ paddingVertical: 24,
52
+ paddingHorizontal: 20,
53
+ },
54
+ compactContainer: {
55
+ width: '100%',
56
+ justifyContent: 'center',
57
+ alignItems: 'center',
58
+ paddingVertical: 12,
59
+ paddingHorizontal: 16,
60
+ },
61
+ content: {
62
+ width: '100%',
63
+ maxWidth: 520,
64
+ gap: 8,
65
+ padding: 20,
66
+ backgroundColor: '#fff',
67
+ borderRadius: 10,
68
+ elevation: 5,
69
+ },
70
+ displayContent: {
71
+ width: '100%',
72
+ maxWidth: 640,
73
+ gap: 10,
74
+ paddingVertical: 24,
75
+ paddingHorizontal: 22,
76
+ backgroundColor: '#fff',
77
+ borderRadius: 16,
78
+ borderWidth: 1,
79
+ borderColor: '#E2E8F0',
80
+ elevation: 8,
81
+ },
82
+ compactContent: {
83
+ width: '100%',
84
+ gap: 8,
85
+ paddingVertical: 12,
86
+ paddingHorizontal: 16,
87
+ alignItems: 'center',
88
+ justifyContent: 'center',
89
+ },
90
+ loadingContainer: {
91
+ alignItems: 'center',
92
+ justifyContent: 'center',
93
+ },
94
+ errorContainer: {
95
+ justifyContent: 'center',
96
+ alignItems: 'center',
97
+ padding: 20,
98
+ backgroundColor: '#fff',
99
+ borderRadius: 10,
100
+ elevation: 5,
101
+ },
102
+ messageText: {
103
+ color: '#475569',
104
+ textAlign: 'center',
105
+ },
106
+ errorText: {
107
+ color: '#000',
108
+ textAlign: 'center',
109
+ fontWeight: '700',
110
+ },
111
+ },
112
+ });
113
+ };
114
+
115
+ export default css;
@@ -0,0 +1,46 @@
1
+ const DOCUMENT_CATEGORY_CONTEXTS = {
2
+ proposal: 'proposal-category',
3
+ contract: 'contract-category',
4
+ email: 'email-category',
5
+ menu: 'menu-category',
6
+ };
7
+
8
+ export const normalizeCategoryContext = value => String(value || '').trim();
9
+
10
+ export const getCategoryContextForDocument = documentContext => {
11
+ const normalizedContext = normalizeCategoryContext(documentContext);
12
+ if (!normalizedContext) {
13
+ return '';
14
+ }
15
+
16
+ return DOCUMENT_CATEGORY_CONTEXTS[normalizedContext] || `${normalizedContext}-category`;
17
+ };
18
+
19
+ export const getCategoryContextCandidates = documentContext => {
20
+ const normalizedContext = normalizeCategoryContext(documentContext);
21
+ if (!normalizedContext) {
22
+ return [];
23
+ }
24
+
25
+ const preferredContext = getCategoryContextForDocument(normalizedContext);
26
+ const legacyContext = `${normalizedContext}-model`;
27
+
28
+ if (preferredContext === legacyContext) {
29
+ return [preferredContext];
30
+ }
31
+
32
+ return [preferredContext, legacyContext];
33
+ };
34
+
35
+ export const humanizeCategoryContext = value => {
36
+ const normalizedContext = normalizeCategoryContext(value);
37
+ if (!normalizedContext) {
38
+ return 'Sem contexto';
39
+ }
40
+
41
+ return normalizedContext
42
+ .split(/[-_]+/)
43
+ .filter(Boolean)
44
+ .map(part => part.charAt(0).toUpperCase() + part.slice(1))
45
+ .join(' ');
46
+ };