@os1-platform/dispatch-mobile 2.1.23 → 2.1.25

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 (114) hide show
  1. package/android/.gradle/6.8/fileChanges/last-build.bin +0 -0
  2. package/android/.gradle/6.8/fileHashes/fileHashes.lock +0 -0
  3. package/android/.gradle/6.8/gc.properties +0 -0
  4. package/android/.gradle/7.5/checksums/checksums.lock +0 -0
  5. package/android/.gradle/7.5/checksums/md5-checksums.bin +0 -0
  6. package/android/.gradle/7.5/checksums/sha1-checksums.bin +0 -0
  7. package/android/.gradle/7.5/dependencies-accessors/dependencies-accessors.lock +0 -0
  8. package/android/.gradle/7.5/dependencies-accessors/gc.properties +0 -0
  9. package/android/.gradle/7.5/executionHistory/executionHistory.lock +0 -0
  10. package/android/.gradle/7.5/fileChanges/last-build.bin +0 -0
  11. package/android/.gradle/7.5/fileHashes/fileHashes.bin +0 -0
  12. package/android/.gradle/7.5/fileHashes/fileHashes.lock +0 -0
  13. package/android/.gradle/7.5/gc.properties +0 -0
  14. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  15. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  16. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  17. package/android/.gradle/checksums/checksums.lock +0 -0
  18. package/android/.gradle/config.properties +2 -0
  19. package/android/.gradle/configuration-cache/gc.properties +0 -0
  20. package/android/.gradle/vcs-1/gc.properties +0 -0
  21. package/android/.idea/compiler.xml +6 -0
  22. package/android/.idea/gradle.xml +18 -0
  23. package/android/.idea/kotlinc.xml +6 -0
  24. package/android/.idea/migrations.xml +10 -0
  25. package/android/.idea/misc.xml +10 -0
  26. package/android/.idea/other.xml +263 -0
  27. package/android/.idea/vcs.xml +6 -0
  28. package/lib/commonjs/analytics/firebase/FirebaseLogging.js +0 -3
  29. package/lib/commonjs/analytics/firebase/FirebaseLogging.js.map +1 -1
  30. package/lib/commonjs/analytics/sentry/SentryAnalyticsUtils.js +0 -6
  31. package/lib/commonjs/analytics/sentry/SentryAnalyticsUtils.js.map +1 -1
  32. package/lib/commonjs/components/executiontasks/collectPayment/CollectPaymentSchema.js +1 -0
  33. package/lib/commonjs/components/executiontasks/collectPayment/CollectPaymentSchema.js.map +1 -1
  34. package/lib/commonjs/components/executiontasks/collectPayment/PaymentStyles.js +21 -0
  35. package/lib/commonjs/components/executiontasks/collectPayment/PaymentStyles.js.map +1 -1
  36. package/lib/commonjs/components/executiontasks/collectPayment/PaymentUtils.js +17 -1
  37. package/lib/commonjs/components/executiontasks/collectPayment/PaymentUtils.js.map +1 -1
  38. package/lib/commonjs/components/executiontasks/collectPayment/components/CompletePayment.js +11 -14
  39. package/lib/commonjs/components/executiontasks/collectPayment/components/CompletePayment.js.map +1 -1
  40. package/lib/commonjs/components/executiontasks/collectPayment/components/InitPayment.js.map +1 -1
  41. package/lib/commonjs/components/executiontasks/collectPayment/components/ProcessPayment.js +183 -36
  42. package/lib/commonjs/components/executiontasks/collectPayment/components/ProcessPayment.js.map +1 -1
  43. package/lib/commonjs/components/widgets/ProgressDialog.js +1 -1
  44. package/lib/commonjs/components/widgets/ProgressDialog.js.map +1 -1
  45. package/lib/commonjs/components/widgets/SnackBarCustom.js +44 -21
  46. package/lib/commonjs/components/widgets/SnackBarCustom.js.map +1 -1
  47. package/lib/commonjs/icons/blurQRCode.png +0 -0
  48. package/lib/commonjs/manager/syncmanager/constants.js +1 -1
  49. package/lib/commonjs/manager/syncmanager/constants.js.map +1 -1
  50. package/lib/commonjs/manager/syncmanager/document/DocumentManager.js +1 -4
  51. package/lib/commonjs/manager/syncmanager/document/DocumentManager.js.map +1 -1
  52. package/lib/commonjs/manager/syncmanager/document/DocumentSyncManager.js +6 -32
  53. package/lib/commonjs/manager/syncmanager/document/DocumentSyncManager.js.map +1 -1
  54. package/lib/commonjs/ui/screens/CollectPaymentScreen.js +6 -2
  55. package/lib/commonjs/ui/screens/CollectPaymentScreen.js.map +1 -1
  56. package/lib/commonjs/ui/screens/StartWorkFlowScreen.js +1 -1
  57. package/lib/commonjs/ui/screens/StartWorkFlowScreen.js.map +1 -1
  58. package/lib/commonjs/utils/Logger.js +0 -55
  59. package/lib/commonjs/utils/Logger.js.map +1 -1
  60. package/lib/module/analytics/firebase/FirebaseLogging.js +0 -3
  61. package/lib/module/analytics/firebase/FirebaseLogging.js.map +1 -1
  62. package/lib/module/analytics/sentry/SentryAnalyticsUtils.js +0 -6
  63. package/lib/module/analytics/sentry/SentryAnalyticsUtils.js.map +1 -1
  64. package/lib/module/components/executiontasks/collectPayment/CollectPaymentSchema.js +2 -0
  65. package/lib/module/components/executiontasks/collectPayment/CollectPaymentSchema.js.map +1 -1
  66. package/lib/module/components/executiontasks/collectPayment/PaymentStyles.js +21 -0
  67. package/lib/module/components/executiontasks/collectPayment/PaymentStyles.js.map +1 -1
  68. package/lib/module/components/executiontasks/collectPayment/PaymentUtils.js +14 -0
  69. package/lib/module/components/executiontasks/collectPayment/PaymentUtils.js.map +1 -1
  70. package/lib/module/components/executiontasks/collectPayment/components/CompletePayment.js +11 -14
  71. package/lib/module/components/executiontasks/collectPayment/components/CompletePayment.js.map +1 -1
  72. package/lib/module/components/executiontasks/collectPayment/components/InitPayment.js.map +1 -1
  73. package/lib/module/components/executiontasks/collectPayment/components/ProcessPayment.js +187 -38
  74. package/lib/module/components/executiontasks/collectPayment/components/ProcessPayment.js.map +1 -1
  75. package/lib/module/components/widgets/ProgressDialog.js +1 -1
  76. package/lib/module/components/widgets/ProgressDialog.js.map +1 -1
  77. package/lib/module/components/widgets/SnackBarCustom.js +43 -21
  78. package/lib/module/components/widgets/SnackBarCustom.js.map +1 -1
  79. package/lib/module/icons/blurQRCode.png +0 -0
  80. package/lib/module/manager/syncmanager/constants.js +1 -1
  81. package/lib/module/manager/syncmanager/constants.js.map +1 -1
  82. package/lib/module/manager/syncmanager/document/DocumentManager.js +1 -4
  83. package/lib/module/manager/syncmanager/document/DocumentManager.js.map +1 -1
  84. package/lib/module/manager/syncmanager/document/DocumentSyncManager.js +6 -32
  85. package/lib/module/manager/syncmanager/document/DocumentSyncManager.js.map +1 -1
  86. package/lib/module/ui/screens/CollectPaymentScreen.js +6 -2
  87. package/lib/module/ui/screens/CollectPaymentScreen.js.map +1 -1
  88. package/lib/module/ui/screens/StartWorkFlowScreen.js +1 -1
  89. package/lib/module/ui/screens/StartWorkFlowScreen.js.map +1 -1
  90. package/lib/module/utils/Logger.js +0 -55
  91. package/lib/module/utils/Logger.js.map +1 -1
  92. package/lib/typescript/components/executiontasks/collectPayment/CollectPaymentSchema.d.ts +1 -0
  93. package/lib/typescript/components/executiontasks/collectPayment/PaymentStyles.d.ts +20 -0
  94. package/lib/typescript/components/executiontasks/collectPayment/PaymentUtils.d.ts +1 -0
  95. package/lib/typescript/components/widgets/SnackBarCustom.d.ts +2 -1
  96. package/lib/typescript/manager/syncmanager/constants.d.ts +1 -1
  97. package/package.json +3 -3
  98. package/src/analytics/firebase/FirebaseLogging.ts +2 -11
  99. package/src/analytics/sentry/SentryAnalyticsUtils.ts +0 -7
  100. package/src/components/executiontasks/collectPayment/CollectPaymentSchema.ts +2 -0
  101. package/src/components/executiontasks/collectPayment/PaymentStyles.ts +37 -12
  102. package/src/components/executiontasks/collectPayment/PaymentUtils.ts +17 -0
  103. package/src/components/executiontasks/collectPayment/components/CompletePayment.tsx +19 -18
  104. package/src/components/executiontasks/collectPayment/components/InitPayment.tsx +5 -4
  105. package/src/components/executiontasks/collectPayment/components/ProcessPayment.tsx +268 -91
  106. package/src/components/widgets/ProgressDialog.tsx +2 -0
  107. package/src/components/widgets/SnackBarCustom.tsx +59 -19
  108. package/src/icons/blurQRCode.png +0 -0
  109. package/src/manager/syncmanager/constants.ts +1 -1
  110. package/src/manager/syncmanager/document/DocumentManager.ts +6 -8
  111. package/src/manager/syncmanager/document/DocumentSyncManager.ts +8 -43
  112. package/src/ui/screens/CollectPaymentScreen.tsx +6 -3
  113. package/src/ui/screens/StartWorkFlowScreen.tsx +1 -1
  114. package/src/utils/Logger.ts +1 -58
@@ -51,6 +51,7 @@ export interface QrResponse {
51
51
  txnId?: string;
52
52
  paymentCompleted?: boolean;
53
53
  status?: STATUS;
54
+ expiresIn?: number;
54
55
  };
55
56
  }
56
57
  export interface QR_REQUEST_BODY {
@@ -89,4 +89,24 @@ export declare const PaymentStyles: {
89
89
  justifyContent: "center";
90
90
  alignItems: "center";
91
91
  };
92
+ qrImage: {
93
+ width: number;
94
+ height: number;
95
+ backgroundColor: string;
96
+ };
97
+ overlay: {
98
+ position: "absolute";
99
+ width: string;
100
+ height: string;
101
+ justifyContent: "center";
102
+ alignItems: "center";
103
+ backgroundColor: string;
104
+ };
105
+ snackBarContainer: {
106
+ position: "absolute";
107
+ alignSelf: "center";
108
+ bottom: number;
109
+ width: string;
110
+ borderRadius: number;
111
+ };
92
112
  };
@@ -14,3 +14,4 @@ export declare function getSharedPrefPaymentSelection(refId: string, storage: St
14
14
  export declare function setSharedPrefPaymentSelection(refId: string, mode: AllowedModes, storage: Storage): Promise<void>;
15
15
  export declare function removeSharedPrefPaymentData(refId: string, storage: Storage): Promise<void>;
16
16
  export declare const formatTime: (time: number) => string;
17
+ export declare const formatExpiryTime: (timeInSeconds: number) => string;
@@ -18,7 +18,8 @@ export interface SnackbarProps {
18
18
  export declare enum SnackBarType {
19
19
  SUCCESS = 0,
20
20
  FAILURE = 1,
21
- WARNING = 2
21
+ WARNING = 2,
22
+ PAYMENT_WARNING = 3
22
23
  }
23
24
  declare const _default: React.ComponentType<Pick<SnackbarProps, "visible" | "message" | "type" | "onDismiss" | "duration" | "customBottom" | "customTop"> & {
24
25
  theme?: import("@callstack/react-theme-provider").$DeepPartial<ReactNativePaper.Theme> | undefined;
@@ -4,5 +4,5 @@ export declare const SHARED_PREFERENCE_DISPATCH_ID = "sharedPreferenceDispatchId
4
4
  export declare const SHARED_PREFERENCE_SCAN_OUTPUT = "scanETMappedOutput";
5
5
  export declare const SCAN_MERGED_OBJ_ID_OUTPUT = "scanMergedObjectiveIDs";
6
6
  export declare const POD_DOC = "POD_DOC";
7
- export declare const PROCESS_MAX_RETRIED_ROWS = false;
7
+ export declare const PROCESS_MAX_RETRIED_ROWS = true;
8
8
  export declare const MAX_RETRY_COUNT = 3;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@os1-platform/dispatch-mobile",
3
- "version": "2.1.23",
3
+ "version": "2.1.25",
4
4
  "description": "Dispatch SDK React Native Package",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -259,7 +259,7 @@
259
259
  ]
260
260
  },
261
261
  "dependencies": {
262
- "@os1-platform/platform-coreos-execution-engine-sdk": "1.0.15",
262
+ "@os1-platform/platform-coreos-execution-engine-sdk": "1.0.16",
263
263
  "@rjsf/core": "^2.0.0",
264
264
  "apollo-link-timeout": "^4.0.0",
265
265
  "decompress": "^4.2.1",
@@ -277,4 +277,4 @@
277
277
  "rjsf-native": "^1.0.14",
278
278
  "toggle-switch-react-native": "^3.3.0"
279
279
  }
280
- }
280
+ }
@@ -1,29 +1,20 @@
1
1
  import analytics from '@react-native-firebase/analytics';
2
- import {
3
- createObjectWithoutNullValues,
4
- flattenObject,
5
- } from '../../utils/utils';
6
2
  import { Event } from '@sentry/types';
7
3
  import { SentryEventNameSdkConstants } from '../sentry/SentrySdkConstants';
8
- import crashlytics from '@react-native-firebase/crashlytics';
9
- import Logger, { LOG_TYPE } from '../../utils/Logger';
10
4
 
11
5
  export async function fireFirebaseEvent(eventName: string, data: Event) {
12
6
  let strEventVal = eventName;
13
- console.log('fireFirebaseEvent:eventName', eventName);
14
- console.log('fireFirebaseEvent:data', data.extra);
15
7
  try {
16
8
  if (
17
9
  eventName === SentryEventNameSdkConstants.API_CALL ||
18
- eventName === SentryEventNameSdkConstants.API_RESPONSE ||
10
+ eventName === SentryEventNameSdkConstants.API_RESPONSE ||
19
11
  eventName === SentryEventNameSdkConstants.API_ERROR ||
20
12
  eventName === SentryEventNameSdkConstants.APP_LOG
21
13
  ) {
22
- if(data?.extra){
14
+ if (data?.extra) {
23
15
  strEventVal = JSON.stringify(data?.extra);
24
16
  }
25
17
  }
26
- console.log('fireFirebaseEvent:strEventVal', strEventVal);
27
18
  analytics().logEvent(eventName, { eventNameData: strEventVal });
28
19
  } catch (error: any) {
29
20
  analytics().logEvent(eventName, { eventNameData: 'fireFirebaseEvent error' });
@@ -10,13 +10,6 @@ export async function fireEventWithScreenName({ severityLevel, eventName, cta =
10
10
 
11
11
  //ignoring the button clicked event for now
12
12
  if (eventName === SentryEventNameSdkConstants.BUTTON_CLICKED) return;
13
-
14
- console.log("sentry::fireEventWithScreenName()", " called")
15
- console.log("sentry::fireEventWithScreenName::severityLevel", severityLevel)
16
- console.log("sentry::fireEventWithScreenName::eventName", eventName)
17
- console.log("sentry::fireEventWithScreenName::cta", cta)
18
- console.log("sentry::fireEventWithScreenName::screenName", screenName)
19
- console.log("sentry::fireEventWithScreenName::extraParams", JSON.stringify(extraParams))
20
13
  //
21
14
  const singletonInstance = SentryAnalyticsSingleton.getInstance();
22
15
  const tenantId = singletonInstance.getDispatchAndUserData()?.tenantId ?? "N/A"
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
1
2
  import {
2
3
  BaseETRequest,
3
4
  BaseETResponse,
@@ -69,6 +70,7 @@ export interface QrResponse {
69
70
  txnId?: string;
70
71
  paymentCompleted?: boolean;
71
72
  status?: STATUS;
73
+ expiresIn?: number;
72
74
  };
73
75
  }
74
76
 
@@ -11,14 +11,16 @@ export const PaymentStyles = StyleSheet.create({
11
11
  alignItems: 'center',
12
12
  paddingTop: 25,
13
13
  paddingBottom: 25,
14
- fontFamily: Platform.OS === 'android'
15
- ? Fonts.IBMPlexSans_600SemiBold
16
- : 'IBMPlexSans-SemiBold',
14
+ fontFamily:
15
+ Platform.OS === 'android'
16
+ ? Fonts.IBMPlexSans_600SemiBold
17
+ : 'IBMPlexSans-SemiBold',
17
18
  },
18
19
  messageStyle: {
19
- fontFamily: Platform.OS === 'android'
20
- ? Fonts.IBMPlexSans_400Regular
21
- : 'IBMPlexSans-Regular',
20
+ fontFamily:
21
+ Platform.OS === 'android'
22
+ ? Fonts.IBMPlexSans_400Regular
23
+ : 'IBMPlexSans-Regular',
22
24
  backgroundColor: '#FFFFFF',
23
25
  color: '#111111',
24
26
  padding: 20,
@@ -27,9 +29,10 @@ export const PaymentStyles = StyleSheet.create({
27
29
  fontSize: 14,
28
30
  },
29
31
  textStyle1: {
30
- fontFamily: Platform.OS === 'android'
31
- ? Fonts.IBMPlexSans_400Regular
32
- : 'IBMPlexSans-Regular',
32
+ fontFamily:
33
+ Platform.OS === 'android'
34
+ ? Fonts.IBMPlexSans_400Regular
35
+ : 'IBMPlexSans-Regular',
33
36
  marginTop: 20,
34
37
  marginStart: 20,
35
38
  marginEnd: 20,
@@ -41,9 +44,10 @@ export const PaymentStyles = StyleSheet.create({
41
44
  reasonTextStyle: {
42
45
  flex: 1,
43
46
  flexWrap: 'wrap',
44
- fontFamily: Platform.OS === 'android'
45
- ? Fonts.IBMPlexSans_400Regular
46
- : 'IBMPlexSans-Regular',
47
+ fontFamily:
48
+ Platform.OS === 'android'
49
+ ? Fonts.IBMPlexSans_400Regular
50
+ : 'IBMPlexSans-Regular',
47
51
  fontStyle: 'normal',
48
52
  fontSize: 14,
49
53
  lineHeight: 21,
@@ -99,4 +103,25 @@ export const PaymentStyles = StyleSheet.create({
99
103
  justifyContent: 'center',
100
104
  alignItems: 'center',
101
105
  },
106
+ // QR
107
+ qrImage: {
108
+ width: 300,
109
+ height: 300,
110
+ backgroundColor: 'transparent',
111
+ },
112
+ overlay: {
113
+ position: 'absolute',
114
+ width: '100%',
115
+ height: '100%',
116
+ justifyContent: 'center',
117
+ alignItems: 'center',
118
+ backgroundColor: 'rgba(255, 255, 255, 0.5)', // Semi-transparent background
119
+ },
120
+ snackBarContainer: {
121
+ position: 'absolute',
122
+ alignSelf: 'center',
123
+ bottom: 0,
124
+ width: '95%',
125
+ borderRadius: 8,
126
+ },
102
127
  });
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
1
2
  import Logger, { LOG_TYPE } from '../../../utils/Logger';
2
3
  import { APIData, getApiResponse } from '../../../utils/ApiUtils';
3
4
  import * as jsonLogic from 'json-logic-js';
@@ -9,6 +10,8 @@ import {
9
10
  } from './CollectPaymentSchema';
10
11
  import Storage from '../../../utils/storage';
11
12
  import { ENV } from '../../../models/sdk';
13
+ import { useCallback, useEffect, useRef, useState } from 'react';
14
+ import { AppState, AppStateStatus } from 'react-native';
12
15
 
13
16
  export const PAYMENT_SHARED_PREF_KEY = '@Payment_';
14
17
  export const PAYMENT_SELECTION_SHARED_PREF_KEY = '@Payment_Selection_';
@@ -198,3 +201,17 @@ export const formatTime = (time: number) => {
198
201
  minutes > 0 ? String(minutes).padStart(2, '') + ' min' : ''
199
202
  } ${String(remainingSeconds).padStart(2, '')} sec`;
200
203
  };
204
+
205
+ // Function to format the expiry time (without showing '0 sec' when it's unnecessary)
206
+ export const formatExpiryTime = (timeInSeconds: number) => {
207
+ const minutes = Math.floor(timeInSeconds / 60);
208
+ const seconds = timeInSeconds % 60;
209
+
210
+ if (minutes > 0 && seconds > 0) {
211
+ return `${minutes} min ${seconds} sec`;
212
+ } else if (minutes > 0 && seconds === 0) {
213
+ return `${minutes} min`;
214
+ } else {
215
+ return `${seconds} sec`;
216
+ }
217
+ };
@@ -39,12 +39,11 @@ const CompletePayment = (props: CollectPaymentInput & CollectPaymentOutput) => {
39
39
  const [disableProceed, setDisableProceed] = useState(false);
40
40
  const [showModal, setShowModal] = useState<boolean>(true);
41
41
 
42
- // TO hide header for modal screen
43
- useLayoutEffect(() => {
44
- props.navigation.setOptions({
45
- headerShown: false,
46
- });
47
- }, [props.navigation]);
42
+ // useLayoutEffect(() => {
43
+ // props.navigation.setOptions({
44
+ // headerShown: false,
45
+ // });
46
+ // }, [props.navigation]);
48
47
 
49
48
  // Handle back-button click
50
49
  useFocusEffect(
@@ -58,12 +57,12 @@ const CompletePayment = (props: CollectPaymentInput & CollectPaymentOutput) => {
58
57
  }, [])
59
58
  );
60
59
 
61
- // useLayoutEffect(() => {
62
- // props.navigation.setOptions({
63
- // title: 'Payment Complete',
64
- // headerShown: false,
65
- // });
66
- // }, [props.navigation, props.title]);
60
+ useLayoutEffect(() => {
61
+ props.navigation.setOptions({
62
+ title: 'Payment Complete',
63
+ headerShown: false, // To hide header for modal screen
64
+ });
65
+ }, [props.navigation, props.title]);
67
66
 
68
67
  useEffect(() => {
69
68
  if (props.success) {
@@ -254,9 +253,10 @@ const styles = StyleSheet.create({
254
253
  lineHeight: 28,
255
254
  textAlign: 'center',
256
255
  color: '#111111',
257
- fontFamily: Platform.OS === 'android'
258
- ? Fonts.IBMPlexSans_600SemiBold
259
- : 'IBMPlexSans-SemiBold',
256
+ fontFamily:
257
+ Platform.OS === 'android'
258
+ ? Fonts.IBMPlexSans_600SemiBold
259
+ : 'IBMPlexSans-SemiBold',
260
260
  },
261
261
  message1: {
262
262
  fontStyle: 'normal',
@@ -266,8 +266,9 @@ const styles = StyleSheet.create({
266
266
  textAlign: 'center',
267
267
  color: '#111111',
268
268
  marginTop: 12,
269
- fontFamily: Platform.OS === 'android'
270
- ? Fonts.IBMPlexSans_400Regular
271
- : 'IBMPlexSans-Regular',
269
+ fontFamily:
270
+ Platform.OS === 'android'
271
+ ? Fonts.IBMPlexSans_400Regular
272
+ : 'IBMPlexSans-Regular',
272
273
  },
273
274
  });
@@ -455,10 +455,11 @@ const InitPayment = (props: CollectPaymentInput) => {
455
455
 
456
456
  const renderItem = ({ item }: { item: AllowedModes }) => {
457
457
  return (
458
- <TouchableOpacity activeOpacity={1}
459
- onPress={() => {
460
- setPaymentMode(item);
461
- }}
458
+ <TouchableOpacity
459
+ activeOpacity={1}
460
+ onPress={() => {
461
+ setPaymentMode(item);
462
+ }}
462
463
  style={[
463
464
  styles.reasonItemStyle,
464
465
  { marginBottom: 4, paddingVertical: 8 },