ordering-ui-react-native 0.21.64 → 0.21.65-release

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 (162) hide show
  1. package/package.json +6 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/PaymentOptionsWebView/index.tsx +1 -0
  5. package/src/components/StripeMethodForm/index.tsx +6 -4
  6. package/src/components/VerifyPhone/styles.tsx +1 -2
  7. package/src/types/index.tsx +3 -1
  8. package/themes/business/index.tsx +4 -0
  9. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  10. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  11. package/themes/business/src/components/Chat/index.tsx +3 -1
  12. package/themes/business/src/components/DriverMap/index.tsx +36 -23
  13. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  14. package/themes/business/src/components/Home/index.tsx +5 -1
  15. package/themes/business/src/components/LanguageSelector/index.tsx +1 -2
  16. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  17. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  18. package/themes/business/src/components/MapView/index.tsx +30 -15
  19. package/themes/business/src/components/NewOrderNotification/index.tsx +76 -26
  20. package/themes/business/src/components/OrderDetails/Business.tsx +63 -7
  21. package/themes/business/src/components/OrderDetails/Delivery.tsx +36 -21
  22. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +122 -56
  23. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +61 -35
  24. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  25. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +220 -0
  26. package/themes/business/src/components/OrderSummary/index.tsx +240 -76
  27. package/themes/business/src/components/OrdersListManager/index.tsx +9 -1
  28. package/themes/business/src/components/OrdersOption/index.tsx +249 -126
  29. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  30. package/themes/business/src/components/PreviousMessages/index.tsx +12 -0
  31. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +29 -19
  32. package/themes/business/src/components/PreviousOrders/index.tsx +5 -3
  33. package/themes/business/src/components/PrinterEdition/index.tsx +363 -0
  34. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  35. package/themes/business/src/components/PrinterSettings/index.tsx +267 -0
  36. package/themes/business/src/components/PrinterSettings/styles.tsx +30 -0
  37. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  38. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  39. package/themes/business/src/components/Sessions/index.tsx +187 -0
  40. package/themes/business/src/components/Sessions/styles.tsx +20 -0
  41. package/themes/business/src/components/StoresList/index.tsx +2 -2
  42. package/themes/business/src/components/UserFormDetails/index.tsx +111 -107
  43. package/themes/business/src/components/UserProfileForm/index.tsx +106 -54
  44. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  45. package/themes/business/src/components/shared/OInput.tsx +2 -0
  46. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  47. package/themes/business/src/hooks/useLocation.tsx +5 -4
  48. package/themes/business/src/types/index.tsx +23 -5
  49. package/themes/business/src/utils/index.tsx +19 -1
  50. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  52. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  54. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  55. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  56. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  57. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  58. package/themes/original/index.tsx +13 -1
  59. package/themes/original/src/components/AddressDetails/index.tsx +20 -10
  60. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  61. package/themes/original/src/components/AddressList/index.tsx +8 -7
  62. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  63. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  64. package/themes/original/src/components/BusinessBasicInformation/index.tsx +6 -9
  65. package/themes/original/src/components/BusinessController/index.tsx +12 -7
  66. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -7
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +2 -3
  68. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +1 -3
  69. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  70. package/themes/original/src/components/BusinessPreorder/index.tsx +20 -15
  71. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +5 -5
  72. package/themes/original/src/components/BusinessProductsList/index.tsx +3 -3
  73. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  74. package/themes/original/src/components/BusinessProductsListing/index.tsx +28 -13
  75. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  76. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  77. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +1 -1
  78. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  79. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  80. package/themes/original/src/components/Cart/index.tsx +17 -8
  81. package/themes/original/src/components/CartContent/index.tsx +60 -45
  82. package/themes/original/src/components/Checkout/index.tsx +94 -62
  83. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  84. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  85. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  86. package/themes/original/src/components/Favorite/index.tsx +1 -5
  87. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  88. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  89. package/themes/original/src/components/GiftCard/GiftCardOrdersList/index.tsx +64 -0
  90. package/themes/original/src/components/GiftCard/GiftCardOrdersList/styles.tsx +8 -0
  91. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  92. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  93. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  94. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +9 -11
  95. package/themes/original/src/components/GiftCard/SingleGiftCard/index.tsx +101 -0
  96. package/themes/original/src/components/GiftCard/SingleGiftCard/styles.tsx +4 -0
  97. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +82 -0
  98. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/styles.tsx +9 -0
  99. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  100. package/themes/original/src/components/Help/index.tsx +2 -0
  101. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  102. package/themes/original/src/components/Home/index.tsx +2 -10
  103. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  104. package/themes/original/src/components/LoginForm/index.tsx +4 -7
  105. package/themes/original/src/components/MessageListing/index.tsx +1 -0
  106. package/themes/original/src/components/Messages/index.tsx +8 -7
  107. package/themes/original/src/components/MomentOption/index.tsx +13 -2
  108. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  109. package/themes/original/src/components/MultiCheckout/index.tsx +123 -62
  110. package/themes/original/src/components/MultiCheckout/styles.tsx +17 -0
  111. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -14
  112. package/themes/original/src/components/MyOrders/index.tsx +21 -26
  113. package/themes/original/src/components/NavBar/index.tsx +4 -2
  114. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  115. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  116. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +5 -7
  117. package/themes/original/src/components/OrderDetails/index.tsx +5 -7
  118. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  119. package/themes/original/src/components/OrderProgress/index.tsx +22 -3
  120. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  121. package/themes/original/src/components/OrdersOption/index.tsx +2 -4
  122. package/themes/original/src/components/PaymentOptionCard/index.tsx +4 -2
  123. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  124. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  125. package/themes/original/src/components/PaymentOptions/index.tsx +47 -6
  126. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  127. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  128. package/themes/original/src/components/ProductForm/ActionButton.tsx +16 -19
  129. package/themes/original/src/components/ProductForm/index.tsx +120 -109
  130. package/themes/original/src/components/ProductItemAccordion/index.tsx +55 -49
  131. package/themes/original/src/components/ProductItemAccordion/styles.tsx +3 -4
  132. package/themes/original/src/components/ProductOptionSubOption/index.tsx +112 -91
  133. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  134. package/themes/original/src/components/Promotions/index.tsx +6 -9
  135. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  136. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  137. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  138. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  139. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  140. package/themes/original/src/components/Sessions/index.tsx +3 -3
  141. package/themes/original/src/components/SignupForm/index.tsx +65 -67
  142. package/themes/original/src/components/SingleOrderCard/index.tsx +1 -2
  143. package/themes/original/src/components/SingleProductCard/index.tsx +5 -6
  144. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  145. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  146. package/themes/original/src/components/StripeCardsList/index.tsx +12 -36
  147. package/themes/original/src/components/StripeElementsForm/index.tsx +78 -59
  148. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  149. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  150. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  151. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  152. package/themes/original/src/components/UserFormDetails/index.tsx +83 -84
  153. package/themes/original/src/components/UserProfile/index.tsx +11 -2
  154. package/themes/original/src/components/Wallets/index.tsx +7 -4
  155. package/themes/original/src/components/WebsocketStatus/index.tsx +169 -0
  156. package/themes/original/src/components/WebsocketStatus/styles.tsx +28 -0
  157. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  158. package/themes/original/src/components/shared/OButton.tsx +8 -7
  159. package/themes/original/src/components/shared/OInput.tsx +1 -4
  160. package/themes/original/src/types/index.tsx +5 -1
  161. package/themes/original/src/utils/index.tsx +12 -1
  162. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -55,10 +55,13 @@ const MapViewComponent = (props: MapViewParams) => {
55
55
  if (mapRef.current) {
56
56
  mapRef.current.fitToCoordinates(
57
57
  [
58
- { latitude: location.latitude, longitude: location.longitude },
59
58
  {
60
- latitude: userLocation?.latitude,
61
- longitude: userLocation?.longitude,
59
+ latitude: typeof location?.latitude !== 'object' ? location?.latitude : 0,
60
+ longitude: typeof location?.longitude !== 'object' ? location?.latitude : 0
61
+ },
62
+ {
63
+ latitude: typeof userLocation?.latitude !== 'object' ? userLocation?.latitude : 0,
64
+ longitude: typeof userLocation?.longitude !== 'object' ? userLocation?.latitude : 0
62
65
  },
63
66
  ],
64
67
  {
@@ -72,8 +75,8 @@ const MapViewComponent = (props: MapViewParams) => {
72
75
  const lastRegion = mapRef?.current?.__lastRegion
73
76
  mapRef?.current && mapRef.current.animateToRegion({
74
77
  ...mapRef?.current?.__lastRegion,
75
- longitudeDelta: lastRegion.longitudeDelta / 8,
76
- latitudeDelta: lastRegion.longitudeDelta / 8
78
+ longitudeDelta: lastRegion?.longitudeDelta / 8,
79
+ latitudeDelta: lastRegion?.longitudeDelta / 8
77
80
  })
78
81
  }
79
82
 
@@ -81,8 +84,8 @@ const MapViewComponent = (props: MapViewParams) => {
81
84
  const lastRegion = mapRef?.current?.__lastRegion
82
85
  mapRef?.current && mapRef.current.animateToRegion({
83
86
  ...lastRegion,
84
- longitudeDelta: lastRegion.longitudeDelta * 8,
85
- latitudeDelta: lastRegion.longitudeDelta * 8
87
+ longitudeDelta: lastRegion?.longitudeDelta * 8,
88
+ latitudeDelta: lastRegion?.longitudeDelta * 8
86
89
  })
87
90
  }
88
91
 
@@ -133,8 +136,20 @@ const MapViewComponent = (props: MapViewParams) => {
133
136
  const RenderMarker = ({ marker, customer, orderIds }: { marker: any, customer?: boolean, orderIds?: Array<number> }) => {
134
137
  const markerRef = useRef<any>()
135
138
 
136
- let coordinateLat = (customer ? marker?.customer?.location?.lat : marker?.business?.location?.lat) ?? initialPosition?.latitude
137
- let coordinateLng = (customer ? marker?.customer?.location?.lng : marker?.business?.location?.lng) ?? initialPosition?.longitude
139
+ let coordinateLat = (customer
140
+ ? typeof marker?.customer?.location?.lat === 'number' && !Number.isNaN(marker?.customer?.location?.lat)
141
+ ? marker?.customer?.location?.lat
142
+ : 0
143
+ : typeof marker?.business?.location?.lat === 'number' && !Number.isNaN(marker?.business?.location?.lat)
144
+ ? marker?.business?.location?.lat
145
+ : 0) ?? (initialPosition?.latitude || 0)
146
+ let coordinateLng = (customer
147
+ ? typeof marker?.customer?.location?.lng === 'number' && !Number.isNaN(marker?.customer?.location?.lng)
148
+ ? marker?.customer?.location?.lng
149
+ : 0
150
+ : typeof marker?.business?.location?.lng === 'number' && !Number.isNaN(marker?.business?.location?.lng)
151
+ ? marker?.business?.location?.lng
152
+ : 0) ?? (initialPosition?.longitude || 0)
138
153
 
139
154
  useEffect(() => {
140
155
  if (
@@ -154,8 +169,8 @@ const MapViewComponent = (props: MapViewParams) => {
154
169
  }}
155
170
  onPress={() =>
156
171
  setLocationSelected({
157
- latitude: customer ? marker?.customer?.location?.lat : marker?.business?.location?.lat,
158
- longitude: customer ? marker?.customer?.location?.lng : marker?.business?.location?.lng
172
+ latitude: coordinateLat,
173
+ longitude: coordinateLng
159
174
  })
160
175
  }
161
176
  ref={(ref) => markerRef.current = ref}
@@ -235,8 +250,8 @@ const MapViewComponent = (props: MapViewParams) => {
235
250
  ref={mapRef}
236
251
  provider={PROVIDER_GOOGLE}
237
252
  initialRegion={{
238
- latitude: initialPosition?.latitude,
239
- longitude: initialPosition?.longitude,
253
+ latitude: initialPosition?.latitude || 0,
254
+ longitude: initialPosition?.longitude || 0,
240
255
  latitudeDelta: haveOrders ? 0.01 : 0.1,
241
256
  longitudeDelta: haveOrders ? 0.01 * ASPECT_RATIO : 0.1 * ASPECT_RATIO,
242
257
  }}
@@ -266,8 +281,8 @@ const MapViewComponent = (props: MapViewParams) => {
266
281
  ))}
267
282
  <Marker
268
283
  coordinate={{
269
- latitude: location.lat,
270
- longitude: location.lng,
284
+ latitude: typeof location.lat === 'number' && !Number.isNaN(location.lat) ? location.lat : 0,
285
+ longitude: typeof location.lng === 'number' && !Number.isNaN(location.lng) ? location.lng : 0,
271
286
  }}
272
287
  title={t('YOUR_LOCATION', 'Your Location')}
273
288
  >
@@ -4,7 +4,10 @@ import {
4
4
  View,
5
5
  StyleSheet,
6
6
  Dimensions,
7
- TouchableOpacity
7
+ TouchableOpacity,
8
+ NativeModules,
9
+ PermissionsAndroid,
10
+ Platform
8
11
  } from 'react-native';
9
12
  import { useTheme } from 'styled-components/native'
10
13
  import moment from 'moment'
@@ -16,7 +19,10 @@ import {
16
19
  useApi,
17
20
  useEvent,
18
21
  useLanguage,
19
- useSession
22
+ useSession,
23
+ useConfig,
24
+ useToast,
25
+ ToastType
20
26
  } from 'ordering-components/native'
21
27
 
22
28
  import { OIcon, OText } from '../shared'
@@ -31,26 +37,47 @@ const SoundPlayerComponent = (props: any) => {
31
37
 
32
38
  const theme = useTheme()
33
39
  const [count, setCount] = useState(0);
34
-
40
+ const [isEnabledReadStorage, setIsEnabledReadStorage] = useState(true)
35
41
  const URL_SOUND = 'https://d33aymufw4jvwf.cloudfront.net/notification.mp3' ?? theme.sounds.notification
36
42
 
37
43
  useEffect(() => {
38
44
  const id = setInterval(() => setCount(count + 1), 2500)
39
45
 
40
46
  const playSound = async () => {
41
- SoundPlayer.playUrl(URL_SOUND)
42
- await new Promise(resolve => setTimeout(resolve, DELAY_SOUND))
43
- SoundPlayer.stop()
47
+ try {
48
+ SoundPlayer.playUrl(URL_SOUND)
49
+ await new Promise(resolve => setTimeout(resolve, DELAY_SOUND))
50
+ SoundPlayer.stop()
51
+ } catch (err: any) {
52
+ console.log('Sound Error - ', err.message)
53
+ }
54
+ }
55
+ if (NativeModules?.RNSoundPlayer?.playUrl && typeof URL_SOUND === 'string' && isEnabledReadStorage) {
56
+ playSound()
44
57
  }
45
-
46
- playSound()
47
58
 
48
59
  return () => {
49
- SoundPlayer.stop()
50
60
  clearInterval(id);
61
+ try {
62
+ SoundPlayer.stop()
63
+ } catch (err: any) {
64
+ console.log('Sound Error - ', err.message)
65
+ }
66
+ }
67
+ }, [count, isEnabledReadStorage])
68
+
69
+ useEffect(() => {
70
+ const checkSoundMedia = async () => {
71
+ if (Platform.OS === 'android') {
72
+ const enabled = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE)
73
+ setIsEnabledReadStorage(enabled)
74
+ } else {
75
+ setIsEnabledReadStorage(true)
76
+ }
51
77
  }
52
- }, [count])
78
+ // checkSoundMedia()
53
79
 
80
+ }, [])
54
81
  return (
55
82
  <Modal
56
83
  animationType='slide'
@@ -90,37 +117,50 @@ const SoundPlayerComponent = (props: any) => {
90
117
  }
91
118
 
92
119
  const NewOrderNotificationUI = (props: any) => {
93
- const { isBusinessApp, evtList } = props
94
-
120
+ const { isBusinessApp, evtList, orderStatus } = props
121
+ const [, t] = useLanguage()
95
122
  const [events] = useEvent()
96
123
  const [{ user, token }] = useSession()
97
124
  const [ordering] = useApi()
125
+ const [, { showToast }] = useToast()
98
126
  const { getCurrentLocation } = useLocation()
99
127
  const [currentEvent, setCurrentEvent] = useState<any>(null)
100
128
 
101
- const handleEventNotification = async (evtType: number, value: any) => {
129
+ const handleEventNotification = async (evtType: number, value: any, orderStatus?: any) => {
102
130
  if (value?.driver) {
103
131
  try {
104
132
  const location = await getCurrentLocation()
133
+ if (!location?.latitude || !location?.longitude) {
134
+ showToast(t('ERROR_UPDATING_COORDS', 'Error updating coords'), ToastType.Error)
135
+ return
136
+ }
105
137
  await fetch(`${ordering.root}/users/${user.id}/locations`, {
106
138
  method: 'POST',
107
139
  body: JSON.stringify({
108
- location: JSON.stringify({ location: `{lat: ${location.latitude}, lng: ${location.longitude}}` })
140
+ location: JSON.stringify({
141
+ location: `{
142
+ lat: ${location.latitude},
143
+ lng: ${location.longitude}
144
+ }`
145
+ })
109
146
  }),
110
- headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }
147
+ headers: {
148
+ 'Content-Type': 'application/json',
149
+ Authorization: `Bearer ${token}`
150
+ }
111
151
  })
112
152
  } catch { }
113
153
  const duration = moment.duration(moment().diff(moment.utc(value?.last_driver_assigned_at)))
114
154
  const assignedSecondsDiff = duration.asSeconds()
115
155
  if (assignedSecondsDiff < 5 && !isBusinessApp && !value?.logistic_status) {
116
- setCurrentEvent({ evt: 2, orderId: value?.id })
156
+ setCurrentEvent({ evt: 2, orderId: value?.id ?? value?.order_id })
117
157
  }
118
158
  }
119
- if (evtType === 3 || value?.author_id === user.id) return
159
+ if ((!orderStatus.includes(value.status) && evtType !== 1 && isBusinessApp) || value?.author_id === user.id) return
120
160
  setCurrentEvent({
121
161
  evt: evtType,
122
162
  orderId: value?.driver
123
- ? value?.order_id
163
+ ? value?.order_id ?? value?.id
124
164
  : evtList(currentEvent)[evtType].event === 'messages'
125
165
  ? value?.order?.id
126
166
  : value?.order_id ?? value?.id
@@ -128,11 +168,21 @@ const NewOrderNotificationUI = (props: any) => {
128
168
  }
129
169
 
130
170
  useEffect(() => {
131
- events.on('message_added_notification', (o: any) => handleEventNotification(1, o))
132
- events.on('order_added_notification', (o: any) => handleEventNotification(2, o))
133
- events.on('order_updated_notification', (o: any) => handleEventNotification(3, o))
134
- events.on('request_register_notification', (o: any) => handleEventNotification(2, o))
135
- events.on('request_update_notification', (o: any) => handleEventNotification(3, o))
171
+ if (!events?._events?.message_added_notification || events?._events?.message_added_notification?.length < 2) {
172
+ events.on('message_added_notification', (o: any) => handleEventNotification(1, o, orderStatus))
173
+ }
174
+ if (!events?._events?.order_added_notification || events?._events?.order_added_notification?.length < 2) {
175
+ events.on('order_added_notification', (o: any) => handleEventNotification(2, o, orderStatus))
176
+ }
177
+ if (!events?._events?.order_updated_notification || events?._events?.order_updated_notification?.length < 2) {
178
+ events.on('order_updated_notification', (o: any) => handleEventNotification(3, o, orderStatus))
179
+ }
180
+ if (!events?._events?.request_register_notification || events?._events?.request_register_notification?.length < 2) {
181
+ events.on('request_register_notification', (o: any) => handleEventNotification(2, o, orderStatus))
182
+ }
183
+ if (!events?._events?.request_update_notification || events?._events?.request_update_notification?.length < 2) {
184
+ events.on('request_update_notification', (o: any) => handleEventNotification(3, o, orderStatus))
185
+ }
136
186
 
137
187
  return () => {
138
188
  events.off('message_added_notification', (o: any) => handleEventNotification(1, o))
@@ -141,7 +191,7 @@ const NewOrderNotificationUI = (props: any) => {
141
191
  events.off('request_register_notification', (o: any) => handleEventNotification(2, o))
142
192
  events.off('request_update_notification', (o: any) => handleEventNotification(3, o))
143
193
  }
144
- }, [])
194
+ }, [orderStatus, events])
145
195
 
146
196
  useEffect(() => {
147
197
  return () => setCurrentEvent(null)
@@ -149,13 +199,13 @@ const NewOrderNotificationUI = (props: any) => {
149
199
 
150
200
  return (
151
201
  <>
152
- {!!currentEvent ? (
202
+ {!!currentEvent && (
153
203
  <SoundPlayerComponent
154
204
  evtList={evtList}
155
205
  currentEvent={currentEvent}
156
206
  handleCloseEvents={() => setCurrentEvent(null)}
157
207
  />
158
- ) : null}
208
+ )}
159
209
  </>
160
210
  )
161
211
  };
@@ -4,8 +4,10 @@ import {
4
4
  View,
5
5
  TouchableOpacity,
6
6
  ActivityIndicator,
7
+ Alert,
7
8
  } from 'react-native';
8
9
  import Clipboard from '@react-native-clipboard/clipboard';
10
+ import { StarPRNT } from 'react-native-star-prnt';
9
11
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
10
12
  import { useTheme } from 'styled-components/native';
11
13
  import {
@@ -35,6 +37,8 @@ import CountryPicker from 'react-native-country-picker-modal';
35
37
  import { NotFoundSource } from '../NotFoundSource';
36
38
  import { OrderHeaderComponent } from './OrderHeaderComponent';
37
39
  import { OrderContentComponent } from './OrderContentComponent';
40
+ import { _retrieveStoreData } from '../../providers/StoreUtil'
41
+ import { usePrinterCommands } from './usePrinterCommands'
38
42
 
39
43
  export const OrderDetailsUI = (props: OrderDetailsParams) => {
40
44
  const {
@@ -44,12 +48,12 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
44
48
  readMessages,
45
49
  messagesReadList,
46
50
  handleAssignDriver,
47
- handleChangeOrderStatus,
48
51
  isFromCheckout,
49
52
  driverLocation,
50
53
  actions,
51
54
  orderTitle,
52
55
  appTitle,
56
+ loadMessages
53
57
  } = props;
54
58
 
55
59
  const theme = useTheme();
@@ -57,6 +61,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
57
61
  const [{ parsePrice, parseNumber, parseDate }] = useUtils();
58
62
  const [{ user, token }] = useSession();
59
63
  const [{ configs }] = useConfig();
64
+ const { generateCommands } = usePrinterCommands()
60
65
  const [, { showToast }] = useToast();
61
66
  const [unreadAlert, setUnreadAlert] = useState({
62
67
  business: false,
@@ -70,6 +75,11 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
70
75
  const [openModalForAccept, setOpenModalForAccept] = useState(false);
71
76
  const [openModalForMapView, setOpenModalForMapView] = useState(false);
72
77
  const [isDriverModalVisible, setIsDriverModalVisible] = useState(false);
78
+ const [printerSettings, setPrinterSettings] = useState<any>('')
79
+ const [autoPrintEnabled, setAutoPrintEnabled] = useState<boolean>(false)
80
+
81
+ const orderToComplete = [4, 20, 21]
82
+ const orderToReady = [7, 14]
73
83
 
74
84
  if (order?.status === 7 || order?.status === 4) {
75
85
  if (drivers?.length > 0 && drivers) {
@@ -120,6 +130,16 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
120
130
  }
121
131
  }
122
132
 
133
+ const handleChangeOrderStatus = async (status: any, isAcceptOrReject: any = {}) => {
134
+ if (props.handleChangeOrderStatus) {
135
+ const order: any = await props.handleChangeOrderStatus(status, isAcceptOrReject)
136
+
137
+ if (order?.status === 7 && autoPrintEnabled && printerSettings) {
138
+ handleViewSummaryOrder()
139
+ }
140
+ }
141
+ }
142
+
123
143
  const getFormattedSubOptionName = ({ quantity, name, position, price }: any) => {
124
144
  if (name !== 'No') {
125
145
  const pos = position && position !== 'whole' ? `(${t(position.toUpperCase(), position)})` : '';
@@ -279,7 +299,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
279
299
 
280
300
  const handleOpenMessagesForBusiness = () => {
281
301
  setOpenModalForBusiness(true);
282
- readMessages && readMessages();
302
+ readMessages && readMessages()
303
+ loadMessages && loadMessages()
283
304
  setUnreadAlert({ ...unreadAlert, business: false });
284
305
  };
285
306
 
@@ -291,7 +312,28 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
291
312
  setOpenModalForAccept(true);
292
313
  };
293
314
 
315
+ const printAction = async (printerSettings: any, commands: any, showAlert: boolean = true) => {
316
+ try {
317
+ var printResult = await StarPRNT.print(printerSettings?.emulation, commands, printerSettings?.portName);
318
+ showAlert && showToast(ToastType.Info, t('ORDER_PRINTED_SUCCESS', 'Order printed'), 1000)
319
+ } catch (e) {
320
+ showAlert && showToast(ToastType.Error, t('ORDER_PRINTED_FAILED', 'Order not printed, connection failed'), 1000)
321
+ }
322
+ }
323
+
294
324
  const handleViewSummaryOrder = () => {
325
+ if (printerSettings) {
326
+ printerSettings.map((printer: any, idx: number) => {
327
+ const commands: any = generateCommands({
328
+ ...order,
329
+ orderStatus: getOrderStatus(order?.status, t)?.value
330
+ }, printer?.printMode)
331
+ commands.push({ appendCutPaper: StarPRNT.CutPaperAction.PartialCutWithFeed })
332
+
333
+ printAction(printer, commands, idx === printerSettings.length - 1)
334
+ })
335
+ return
336
+ }
295
337
  navigation?.navigate &&
296
338
  navigation.navigate('OrderSummary', {
297
339
  order,
@@ -300,6 +342,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
300
342
  };
301
343
 
302
344
  const handleCloseModal = () => {
345
+ readMessages && readMessages()
346
+ loadMessages && loadMessages()
303
347
  setOpenModalForBusiness(false);
304
348
  };
305
349
 
@@ -340,7 +384,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
340
384
  },
341
385
  {
342
386
  ...order?.customer?.location,
343
- title: order?.customer?.name ?? t('CUSTOMER', 'Customer'),
387
+ title: order?.customer?.name ?? t('CUSTOMER', 'Customer'),
344
388
  address: {
345
389
  addressName: order?.customer?.address,
346
390
  zipcode: order?.customer?.zipcode
@@ -372,6 +416,17 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
372
416
  }
373
417
  }, [driverLocation]);
374
418
 
419
+ useEffect(() => {
420
+ const getStorageData = async () => {
421
+ const printers = await _retrieveStoreData('printers')
422
+ const autoPrint = await _retrieveStoreData('auto_print_after_accept_order')
423
+ setPrinterSettings(printers?.length && printers)
424
+ setAutoPrintEnabled(!!autoPrint)
425
+ }
426
+
427
+ getStorageData()
428
+ }, [])
429
+
375
430
  const styles = StyleSheet.create({
376
431
  driverOff: {
377
432
  backgroundColor: theme.colors.notAvailable,
@@ -432,6 +487,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
432
487
  handleCopyClipboard={handleCopyClipboard}
433
488
  handleArrowBack={handleArrowBack}
434
489
  isCustomView={props.isCustomView}
490
+ messages={messages}
491
+ messagesReadList={messagesReadList}
435
492
  />
436
493
  <OrderDetailsContainer
437
494
  keyboardShouldPersistTaps="handled"
@@ -580,7 +637,6 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
580
637
  </>
581
638
  <View style={{ height: 30 }} />
582
639
  </OrderDetailsContainer>
583
-
584
640
  {order &&
585
641
  Object.keys(order).length > 0 &&
586
642
  getOrderStatus(order?.status, t)?.value ===
@@ -597,7 +653,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
597
653
  widthButton={'45%'}
598
654
  />
599
655
  )}
600
- {order?.status === 7 && (
656
+ {orderToReady.includes(order?.status) && (
601
657
  <FloatingButton
602
658
  btnText={t('READY_FOR_PICKUP', 'Ready for pickup')}
603
659
  colorTxt1={theme.colors.primary}
@@ -607,7 +663,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
607
663
  disabled={loading}
608
664
  />
609
665
  )}
610
- {order?.status === 4 && ![1].includes(order?.delivery_type) && (
666
+ {orderToComplete.includes(order?.status) && ![1].includes(order?.delivery_type) && (
611
667
  <FloatingButton
612
668
  btnText={t(
613
669
  'ORDER_NOT_PICKEDUP_BY_CUSTOMER',
@@ -618,7 +674,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
618
674
  secondButtonClick={() => handleChangeOrderStatus?.(15)}
619
675
  firstButtonClick={() => handleChangeOrderStatus?.(17)}
620
676
  secondBtnText={t(
621
- 'PICKUP_COMPLETED_BY_CUSTOMER',
677
+ 'ORDER_PICKUP_COMPLETED_BY_CUSTOMER',
622
678
  'Pickup completed by customer',
623
679
  )}
624
680
  secondButton={true}
@@ -64,8 +64,11 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
64
64
 
65
65
  const { order } = props.order
66
66
 
67
+ const hideTimer = configs?.hidden_driver_eta_time?.value === '1'
67
68
  const isAllowedDriverRejectOrder = configs?.allow_driver_reject_order?.value === '1'
68
69
  const isHideRejectButtons = configs?.reject_orders_enabled && configs?.reject_orders_enabled?.value !== '1'
70
+ const isEnabledOrderNotReady = configs?.order_not_ready_enabled?.value === '1'
71
+ const isEnabledFailedPickupDriver = configs?.failed_pickup_by_driver_enabled?.value === '1'
69
72
  const theme = useTheme();
70
73
  const [, t] = useLanguage();
71
74
  const [session] = useSession();
@@ -393,7 +396,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
393
396
  }, [props.order?.loading]);
394
397
 
395
398
  useEffect(() => {
396
- if (!order?.driver_id && session?.user?.level === 4) {
399
+ if (order?.driver_id === null && session?.user?.level === 4) {
397
400
  setAlertState({
398
401
  open: true,
399
402
  content: [
@@ -425,6 +428,16 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
425
428
  forceUpdate && handleViewActionOrder && handleViewActionOrder(forceUpdate === 9 ? 'forcePickUp' : 'forceDelivery')
426
429
  }, [forceUpdate])
427
430
 
431
+ useEffect(() => {
432
+ if (!!props.order?.error || props.order?.error?.length > 0) {
433
+ showToast(ToastType.Error,
434
+ props.order?.error?.[0] ||
435
+ props.order?.error ||
436
+ t('NETWORK_ERROR', 'Network Error'),
437
+ 5000)
438
+ }
439
+ }, [props.order?.error])
440
+
428
441
  const styles = StyleSheet.create({
429
442
  btnPickUp: {
430
443
  borderWidth: 0,
@@ -475,7 +488,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
475
488
  isOrderGroup={isOrderGroup}
476
489
  lastOrder={lastOrder}
477
490
  />
478
- {(order?.status === 8 || order?.status === 18) && order?.delivery_type === 1 && (
491
+ {(order?.status === 8 || order?.status === 18) && order?.delivery_type === 1 && !props.order?.loading && (
479
492
  <Pickup>
480
493
  <OButton
481
494
  style={styles.btnPickUp}
@@ -488,7 +501,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
488
501
  />
489
502
  </Pickup>
490
503
  )}
491
- {order?.status === 3 && order?.delivery_type === 1 && !isHideRejectButtons && (
504
+ {order?.status === 3 && order?.delivery_type === 1 && !isHideRejectButtons && isEnabledOrderNotReady && !props.order?.loading && (
492
505
  <View style={{ paddingVertical: 20, marginBottom: 20 }}>
493
506
  <OButton
494
507
  style={styles.btnPickUp}
@@ -532,20 +545,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
532
545
  ))}
533
546
  </View>
534
547
  )}
535
-
536
- {(!!props.order?.error || props.order?.error?.length > 0) && (
537
- <NotFoundSource
538
- btnTitle={t('GO_TO_MY_ORDERS', 'Go to my orders')}
539
- content={
540
- props.order.error[0] ||
541
- props.order.error ||
542
- t('NETWORK_ERROR', 'Network Error')
543
- }
544
- onClickButton={() => navigation.navigate('Orders')}
545
- />
546
- )}
547
548
  {!((!order || Object.keys(order).length === 0) &&
548
- (props.order?.error?.length < 1 || !props.order?.error)) && (
549
+ (props.order?.error?.length < 1 || !props.order?.error)) && order?.id && (
549
550
  <View style={{ flex: 1 }}>
550
551
  <OrderHeaderComponent
551
552
  order={order}
@@ -583,8 +584,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
583
584
  secondButton={true}
584
585
  firstColorCustom={theme.colors.red}
585
586
  secondColorCustom={theme.colors.green}
586
- widthButton={isHideRejectButtons ? '100%': '45%'}
587
- isHideRejectButtons={isHideRejectButtons}
587
+ widthButton={isHideRejectButtons || !isEnabledFailedPickupDriver ? '100%' : '45%'}
588
+ isHideRejectButtons={isHideRejectButtons || !isEnabledFailedPickupDriver}
588
589
  />
589
590
  )}
590
591
  {(validStatusComplete.includes(order?.status)) && (
@@ -603,22 +604,23 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
603
604
  secondButton={true}
604
605
  firstColorCustom={theme.colors.red}
605
606
  secondColorCustom={theme.colors.green}
606
- widthButton={isHideRejectButtons ? '100%': '45%'}
607
+ widthButton={isHideRejectButtons ? '100%' : '45%'}
607
608
  isHideRejectButtons={isHideRejectButtons}
608
609
  />
609
610
  </>
610
611
  )}
611
612
  {showFloatButtonsAcceptOrReject[order?.status] && (
612
613
  <FloatingButton
614
+ disabled={props.order?.loading}
613
615
  btnText={t('REJECT', 'Reject')}
614
616
  isSecondaryBtn={false}
615
- secondButtonClick={() => (order?.isLogistic && (order?.order_group || logisticOrderStatus.includes(order?.status))) ? handleAcceptLogisticOrder(order) : handleViewActionOrder('accept')}
617
+ secondButtonClick={() => hideTimer ? handleChangeOrderStatus && handleChangeOrderStatus(8) : (order?.isLogistic && (order?.order_group || logisticOrderStatus.includes(order?.status))) ? handleAcceptLogisticOrder(order) : handleViewActionOrder('accept')}
616
618
  firstButtonClick={() => order?.isLogistic && (order?.order_group || logisticOrderStatus.includes(order?.status)) ? handleRejectLogisticOrder() : handleViewActionOrder('reject')}
617
619
  secondBtnText={t('ACCEPT', 'Accept')}
618
620
  secondButton={true}
619
621
  firstColorCustom={theme.colors.red}
620
622
  secondColorCustom={theme.colors.green}
621
- widthButton={isHideRejectButtons ? '100%': '45%'}
623
+ widthButton={isHideRejectButtons ? '100%' : '45%'}
622
624
  isHideRejectButtons={isHideRejectButtons}
623
625
  />
624
626
  )}
@@ -684,11 +686,24 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
684
686
  actions={actions}
685
687
  orderTitle={orderTitle}
686
688
  appTitle={appTitle}
689
+ isLoadingOrder={props.order?.loading}
687
690
  />
688
691
  </OModal>
689
692
  )}
690
693
  </View>
691
694
  )}
695
+
696
+ {(!!props.order?.error || props.order?.error?.length > 0) && (
697
+ <NotFoundSource
698
+ btnTitle={t('GO_TO_MY_ORDERS', 'Go to my orders')}
699
+ content={
700
+ props.order.error[0] ||
701
+ props.order.error ||
702
+ t('NETWORK_ERROR', 'Network Error')
703
+ }
704
+ onClickButton={() => navigation.navigate('Orders')}
705
+ />
706
+ )}
692
707
  {alertState?.open && (
693
708
  <Alert
694
709
  open={alertState.open}