ordering-ui-react-native 0.21.83 → 0.21.84-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 (168) 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/BusinessController/index.tsx +8 -3
  12. package/themes/business/src/components/BusinessProductList/index.tsx +2 -1
  13. package/themes/business/src/components/Chat/index.tsx +3 -1
  14. package/themes/business/src/components/DriverMap/index.tsx +44 -27
  15. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  16. package/themes/business/src/components/Home/index.tsx +5 -1
  17. package/themes/business/src/components/LanguageSelector/index.tsx +2 -3
  18. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  19. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  20. package/themes/business/src/components/MapView/index.tsx +36 -17
  21. package/themes/business/src/components/NewOrderNotification/index.tsx +64 -28
  22. package/themes/business/src/components/OrderDetails/Business.tsx +65 -7
  23. package/themes/business/src/components/OrderDetails/Delivery.tsx +35 -20
  24. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +110 -40
  25. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +50 -24
  26. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  27. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +221 -0
  28. package/themes/business/src/components/OrderSummary/index.tsx +223 -73
  29. package/themes/business/src/components/OrdersListManager/index.tsx +9 -1
  30. package/themes/business/src/components/OrdersOption/index.tsx +247 -159
  31. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  32. package/themes/business/src/components/PreviousMessages/index.tsx +20 -3
  33. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +27 -16
  34. package/themes/business/src/components/PreviousOrders/index.tsx +5 -3
  35. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  36. package/themes/business/src/components/PrinterEdition/index.tsx +431 -0
  37. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  38. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  39. package/themes/business/src/components/PrinterSettings/index.tsx +267 -0
  40. package/themes/business/src/components/PrinterSettings/styles.tsx +30 -0
  41. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  42. package/themes/business/src/components/Sessions/index.tsx +187 -0
  43. package/themes/business/src/components/Sessions/styles.tsx +20 -0
  44. package/themes/business/src/components/StoresList/index.tsx +2 -2
  45. package/themes/business/src/components/UserFormDetails/index.tsx +111 -107
  46. package/themes/business/src/components/UserProfileForm/index.tsx +63 -30
  47. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  48. package/themes/business/src/components/shared/OInput.tsx +2 -0
  49. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  50. package/themes/business/src/hooks/useLocation.tsx +5 -4
  51. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  52. package/themes/business/src/types/index.tsx +23 -5
  53. package/themes/business/src/utils/index.tsx +19 -1
  54. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  55. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  56. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  57. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  58. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  59. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  60. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  61. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  62. package/themes/original/index.tsx +13 -1
  63. package/themes/original/src/components/AddressDetails/index.tsx +20 -10
  64. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  65. package/themes/original/src/components/AddressList/index.tsx +8 -7
  66. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  67. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  68. package/themes/original/src/components/BusinessBasicInformation/index.tsx +5 -8
  69. package/themes/original/src/components/BusinessController/index.tsx +12 -7
  70. package/themes/original/src/components/BusinessItemAccordion/index.tsx +13 -5
  71. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +2 -3
  72. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +1 -3
  73. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  74. package/themes/original/src/components/BusinessPreorder/index.tsx +20 -15
  75. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +5 -5
  76. package/themes/original/src/components/BusinessProductsList/index.tsx +2 -2
  77. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  78. package/themes/original/src/components/BusinessProductsListing/index.tsx +18 -6
  79. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  80. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  81. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +1 -1
  82. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  83. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  84. package/themes/original/src/components/Cart/index.tsx +43 -15
  85. package/themes/original/src/components/CartContent/index.tsx +21 -8
  86. package/themes/original/src/components/Checkout/index.tsx +108 -60
  87. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  88. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  89. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  90. package/themes/original/src/components/Favorite/index.tsx +1 -5
  91. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  92. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  93. package/themes/original/src/components/GiftCard/GiftCardOrdersList/index.tsx +64 -0
  94. package/themes/original/src/components/GiftCard/GiftCardOrdersList/styles.tsx +8 -0
  95. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  96. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  97. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  98. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  99. package/themes/original/src/components/GiftCard/SingleGiftCard/index.tsx +101 -0
  100. package/themes/original/src/components/GiftCard/SingleGiftCard/styles.tsx +4 -0
  101. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +82 -0
  102. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/styles.tsx +9 -0
  103. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  104. package/themes/original/src/components/Help/index.tsx +2 -0
  105. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  106. package/themes/original/src/components/Home/index.tsx +2 -10
  107. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  108. package/themes/original/src/components/LoginForm/index.tsx +4 -7
  109. package/themes/original/src/components/MessageListing/index.tsx +1 -0
  110. package/themes/original/src/components/Messages/index.tsx +8 -7
  111. package/themes/original/src/components/MomentOption/index.tsx +13 -2
  112. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  113. package/themes/original/src/components/MultiCheckout/index.tsx +139 -87
  114. package/themes/original/src/components/MultiOrdersDetails/index.tsx +2 -1
  115. package/themes/original/src/components/MyOrders/index.tsx +21 -26
  116. package/themes/original/src/components/NavBar/index.tsx +4 -2
  117. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  118. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  119. package/themes/original/src/components/OrderDetails/OrderEta.tsx +1 -1
  120. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +9 -9
  121. package/themes/original/src/components/OrderDetails/index.tsx +32 -13
  122. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  123. package/themes/original/src/components/OrderProgress/index.tsx +22 -3
  124. package/themes/original/src/components/OrderSummary/index.tsx +28 -9
  125. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  126. package/themes/original/src/components/OrdersOption/index.tsx +2 -4
  127. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  128. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  129. package/themes/original/src/components/PaymentOptions/index.tsx +17 -9
  130. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  131. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  132. package/themes/original/src/components/ProductForm/ActionButton.tsx +17 -20
  133. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  134. package/themes/original/src/components/ProductItemAccordion/index.tsx +55 -49
  135. package/themes/original/src/components/ProductItemAccordion/styles.tsx +3 -4
  136. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  137. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  138. package/themes/original/src/components/Promotions/index.tsx +6 -9
  139. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  140. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  141. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  142. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  143. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  144. package/themes/original/src/components/Sessions/index.tsx +3 -3
  145. package/themes/original/src/components/SignupForm/index.tsx +86 -78
  146. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -5
  147. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  148. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  149. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  150. package/themes/original/src/components/StripeCardsList/index.tsx +10 -3
  151. package/themes/original/src/components/StripeElementsForm/index.tsx +77 -60
  152. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  153. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  154. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  155. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  156. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  157. package/themes/original/src/components/UserDetails/index.tsx +3 -2
  158. package/themes/original/src/components/UserFormDetails/index.tsx +155 -131
  159. package/themes/original/src/components/UserProfile/index.tsx +11 -2
  160. package/themes/original/src/components/Wallets/index.tsx +6 -3
  161. package/themes/original/src/components/WebsocketStatus/index.tsx +169 -0
  162. package/themes/original/src/components/WebsocketStatus/styles.tsx +28 -0
  163. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  164. package/themes/original/src/components/shared/OButton.tsx +5 -4
  165. package/themes/original/src/components/shared/OInput.tsx +4 -8
  166. package/themes/original/src/types/index.tsx +5 -1
  167. package/themes/original/src/utils/index.tsx +12 -1
  168. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -53,16 +53,23 @@ const MapViewComponent = (props: MapViewParams) => {
53
53
 
54
54
  const fitCoordinates = (location?: any) => {
55
55
  if (mapRef.current) {
56
- mapRef.current.fitToCoordinates(
57
- [
58
- { latitude: location.latitude ?? 0, longitude: location.longitude ?? 0},
59
- {
60
- latitude: userLocation?.latitude,
61
- longitude: userLocation?.longitude,
62
- },
63
- ],
56
+ const isSendCoordinates =
57
+ location &&
58
+ userLocation &&
59
+ location.latitude !== userLocation.latitude &&
60
+ location.longitude !== userLocation.longitude &&
61
+ location.latitude !== 0 &&
62
+ location.longitude !== 0 &&
63
+ userLocation.latitude !== 0 &&
64
+ userLocation.longitude !== 0
65
+
66
+ isSendCoordinates && mapRef.current.fitToCoordinates(
67
+ [location, userLocation].map(_location => ({
68
+ latitude: _location.latitude,
69
+ longitude: _location.longitude
70
+ })),
64
71
  {
65
- edgePadding: { top: 120, right: 120, bottom: 120, left: 120 },
72
+ edgePadding: { top: 120, right: 120, bottom: 120, left: 120 }
66
73
  },
67
74
  );
68
75
  }
@@ -133,8 +140,20 @@ const MapViewComponent = (props: MapViewParams) => {
133
140
  const RenderMarker = ({ marker, customer, orderIds }: { marker: any, customer?: boolean, orderIds?: Array<number> }) => {
134
141
  const markerRef = useRef<any>()
135
142
 
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
143
+ let coordinateLat = (customer
144
+ ? typeof marker?.customer?.location?.lat === 'number' && !Number.isNaN(marker?.customer?.location?.lat)
145
+ ? marker?.customer?.location?.lat
146
+ : 0
147
+ : typeof marker?.business?.location?.lat === 'number' && !Number.isNaN(marker?.business?.location?.lat)
148
+ ? marker?.business?.location?.lat
149
+ : 0) ?? (initialPosition?.latitude || 0)
150
+ let coordinateLng = (customer
151
+ ? typeof marker?.customer?.location?.lng === 'number' && !Number.isNaN(marker?.customer?.location?.lng)
152
+ ? marker?.customer?.location?.lng
153
+ : 0
154
+ : typeof marker?.business?.location?.lng === 'number' && !Number.isNaN(marker?.business?.location?.lng)
155
+ ? marker?.business?.location?.lng
156
+ : 0) ?? (initialPosition?.longitude || 0)
138
157
 
139
158
  useEffect(() => {
140
159
  if (
@@ -154,8 +173,8 @@ const MapViewComponent = (props: MapViewParams) => {
154
173
  }}
155
174
  onPress={() =>
156
175
  setLocationSelected({
157
- latitude: customer ? marker?.customer?.location?.lat : marker?.business?.location?.lat,
158
- longitude: customer ? marker?.customer?.location?.lng : marker?.business?.location?.lng
176
+ latitude: coordinateLat,
177
+ longitude: coordinateLng
159
178
  })
160
179
  }
161
180
  ref={(ref) => markerRef.current = ref}
@@ -235,8 +254,8 @@ const MapViewComponent = (props: MapViewParams) => {
235
254
  ref={mapRef}
236
255
  provider={PROVIDER_GOOGLE}
237
256
  initialRegion={{
238
- latitude: initialPosition?.latitude,
239
- longitude: initialPosition?.longitude,
257
+ latitude: initialPosition?.latitude || 0,
258
+ longitude: initialPosition?.longitude || 0,
240
259
  latitudeDelta: haveOrders ? 0.01 : 0.1,
241
260
  longitudeDelta: haveOrders ? 0.01 * ASPECT_RATIO : 0.1 * ASPECT_RATIO,
242
261
  }}
@@ -266,8 +285,8 @@ const MapViewComponent = (props: MapViewParams) => {
266
285
  ))}
267
286
  <Marker
268
287
  coordinate={{
269
- latitude: location.lat,
270
- longitude: location.lng,
288
+ latitude: typeof location.lat === 'number' && !Number.isNaN(location.lat) ? location.lat : 0,
289
+ longitude: typeof location.lng === 'number' && !Number.isNaN(location.lng) ? location.lng : 0,
271
290
  }}
272
291
  title={t('YOUR_LOCATION', 'Your Location')}
273
292
  >
@@ -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'
@@ -17,7 +20,9 @@ import {
17
20
  useEvent,
18
21
  useLanguage,
19
22
  useSession,
20
- useConfig
23
+ useConfig,
24
+ useToast,
25
+ ToastType
21
26
  } from 'ordering-components/native'
22
27
 
23
28
  import { OIcon, OText } from '../shared'
@@ -32,26 +37,47 @@ const SoundPlayerComponent = (props: any) => {
32
37
 
33
38
  const theme = useTheme()
34
39
  const [count, setCount] = useState(0);
35
-
40
+ const [isEnabledReadStorage, setIsEnabledReadStorage] = useState(true)
36
41
  const URL_SOUND = 'https://d33aymufw4jvwf.cloudfront.net/notification.mp3' ?? theme.sounds.notification
37
42
 
38
43
  useEffect(() => {
39
44
  const id = setInterval(() => setCount(count + 1), 2500)
40
45
 
41
46
  const playSound = async () => {
42
- SoundPlayer.playUrl(URL_SOUND)
43
- await new Promise(resolve => setTimeout(resolve, DELAY_SOUND))
44
- 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()
45
57
  }
46
-
47
- playSound()
48
58
 
49
59
  return () => {
50
- SoundPlayer.stop()
51
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
+ }
52
77
  }
53
- }, [count])
78
+ // checkSoundMedia()
54
79
 
80
+ }, [])
55
81
  return (
56
82
  <Modal
57
83
  animationType='slide'
@@ -91,23 +117,23 @@ const SoundPlayerComponent = (props: any) => {
91
117
  }
92
118
 
93
119
  const NewOrderNotificationUI = (props: any) => {
94
- const { isBusinessApp, evtList } = props
95
-
120
+ const { isBusinessApp, evtList, orderStatus } = props
121
+ const [, t] = useLanguage()
96
122
  const [events] = useEvent()
97
123
  const [{ user, token }] = useSession()
98
124
  const [ordering] = useApi()
99
- const [{ configs }] = useConfig()
125
+ const [, { showToast }] = useToast()
100
126
  const { getCurrentLocation } = useLocation()
101
127
  const [currentEvent, setCurrentEvent] = useState<any>(null)
102
128
 
103
- const orderStatus = !!isBusinessApp
104
- ? configs?.notification_business_states?.value.split('|').map((value: any) => Number(value)) || []
105
- : configs?.notification_driver_states?.value.split('|').map((value: any) => Number(value)) || []
106
-
107
- const handleEventNotification = async (evtType: number, value: any) => {
129
+ const handleEventNotification = async (evtType: number, value: any, orderStatus?: any) => {
108
130
  if (value?.driver) {
109
131
  try {
110
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
+ }
111
137
  await fetch(`${ordering.root}/users/${user.id}/locations`, {
112
138
  method: 'POST',
113
139
  body: JSON.stringify({
@@ -126,11 +152,11 @@ const NewOrderNotificationUI = (props: any) => {
126
152
  } catch { }
127
153
  const duration = moment.duration(moment().diff(moment.utc(value?.last_driver_assigned_at)))
128
154
  const assignedSecondsDiff = duration.asSeconds()
129
- if (assignedSecondsDiff < 5 && !isBusinessApp && !value?.logistic_status && orderStatus.includes(value.status)) {
155
+ if (assignedSecondsDiff < 5 && !isBusinessApp && !value?.logistic_status) {
130
156
  setCurrentEvent({ evt: 2, orderId: value?.id ?? value?.order_id })
131
157
  }
132
158
  }
133
- if (!orderStatus.includes(value.status) || value?.author_id === user.id) return
159
+ if ((!orderStatus.includes(value.status) && evtType !== 1 && isBusinessApp) || value?.author_id === user.id) return
134
160
  setCurrentEvent({
135
161
  evt: evtType,
136
162
  orderId: value?.driver
@@ -142,11 +168,21 @@ const NewOrderNotificationUI = (props: any) => {
142
168
  }
143
169
 
144
170
  useEffect(() => {
145
- events.on('message_added_notification', (o: any) => handleEventNotification(1, o))
146
- events.on('order_added_notification', (o: any) => handleEventNotification(2, o))
147
- events.on('order_updated_notification', (o: any) => handleEventNotification(3, o))
148
- events.on('request_register_notification', (o: any) => handleEventNotification(2, o))
149
- 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
+ }
150
186
 
151
187
  return () => {
152
188
  events.off('message_added_notification', (o: any) => handleEventNotification(1, o))
@@ -155,7 +191,7 @@ const NewOrderNotificationUI = (props: any) => {
155
191
  events.off('request_register_notification', (o: any) => handleEventNotification(2, o))
156
192
  events.off('request_update_notification', (o: any) => handleEventNotification(3, o))
157
193
  }
158
- }, [])
194
+ }, [orderStatus, events])
159
195
 
160
196
  useEffect(() => {
161
197
  return () => setCurrentEvent(null)
@@ -163,13 +199,13 @@ const NewOrderNotificationUI = (props: any) => {
163
199
 
164
200
  return (
165
201
  <>
166
- {!!currentEvent ? (
202
+ {!!currentEvent && (
167
203
  <SoundPlayerComponent
168
204
  evtList={evtList}
169
205
  currentEvent={currentEvent}
170
206
  handleCloseEvents={() => setCurrentEvent(null)}
171
207
  />
172
- ) : null}
208
+ )}
173
209
  </>
174
210
  )
175
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,13 @@ 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,
57
+ notificationApp
53
58
  } = props;
54
59
 
55
60
  const theme = useTheme();
@@ -57,6 +62,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
57
62
  const [{ parsePrice, parseNumber, parseDate }] = useUtils();
58
63
  const [{ user, token }] = useSession();
59
64
  const [{ configs }] = useConfig();
65
+ const { generateCommands } = usePrinterCommands()
60
66
  const [, { showToast }] = useToast();
61
67
  const [unreadAlert, setUnreadAlert] = useState({
62
68
  business: false,
@@ -70,6 +76,11 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
70
76
  const [openModalForAccept, setOpenModalForAccept] = useState(false);
71
77
  const [openModalForMapView, setOpenModalForMapView] = useState(false);
72
78
  const [isDriverModalVisible, setIsDriverModalVisible] = useState(false);
79
+ const [printerSettings, setPrinterSettings] = useState<any>('')
80
+ const [autoPrintEnabled, setAutoPrintEnabled] = useState<boolean>(false)
81
+
82
+ const orderToComplete = [4, 20, 21]
83
+ const orderToReady = [7, 14]
73
84
 
74
85
  if (order?.status === 7 || order?.status === 4) {
75
86
  if (drivers?.length > 0 && drivers) {
@@ -120,6 +131,16 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
120
131
  }
121
132
  }
122
133
 
134
+ const handleChangeOrderStatus = async (status: any, isAcceptOrReject: any = {}) => {
135
+ if (props.handleChangeOrderStatus) {
136
+ const order: any = await props.handleChangeOrderStatus(status, isAcceptOrReject)
137
+
138
+ if (order?.status === 7 && autoPrintEnabled && printerSettings) {
139
+ handleViewSummaryOrder()
140
+ }
141
+ }
142
+ }
143
+
123
144
  const getFormattedSubOptionName = ({ quantity, name, position, price }: any) => {
124
145
  if (name !== 'No') {
125
146
  const pos = position && position !== 'whole' ? `(${t(position.toUpperCase(), position)})` : '';
@@ -279,7 +300,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
279
300
 
280
301
  const handleOpenMessagesForBusiness = () => {
281
302
  setOpenModalForBusiness(true);
282
- readMessages && readMessages();
303
+ readMessages && readMessages()
304
+ loadMessages && loadMessages()
283
305
  setUnreadAlert({ ...unreadAlert, business: false });
284
306
  };
285
307
 
@@ -291,7 +313,28 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
291
313
  setOpenModalForAccept(true);
292
314
  };
293
315
 
316
+ const printAction = async (printerSettings: any, commands: any, showAlert: boolean = true) => {
317
+ try {
318
+ var printResult = await StarPRNT.print(printerSettings?.emulation, commands, printerSettings?.portName);
319
+ showAlert && showToast(ToastType.Info, t('ORDER_PRINTED_SUCCESS', 'Order printed'), 1000)
320
+ } catch (e) {
321
+ showAlert && showToast(ToastType.Error, t('ORDER_PRINTED_FAILED', 'Order not printed, connection failed'), 1000)
322
+ }
323
+ }
324
+
294
325
  const handleViewSummaryOrder = () => {
326
+ if (printerSettings) {
327
+ printerSettings.map((printer: any, idx: number) => {
328
+ const commands: any = generateCommands({
329
+ ...order,
330
+ orderStatus: getOrderStatus(order?.status, t)?.value
331
+ }, printer?.printMode)
332
+ commands.push({ appendCutPaper: StarPRNT.CutPaperAction.PartialCutWithFeed })
333
+
334
+ printAction(printer, commands, idx === printerSettings.length - 1)
335
+ })
336
+ return
337
+ }
295
338
  navigation?.navigate &&
296
339
  navigation.navigate('OrderSummary', {
297
340
  order,
@@ -300,6 +343,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
300
343
  };
301
344
 
302
345
  const handleCloseModal = () => {
346
+ readMessages && readMessages()
347
+ loadMessages && loadMessages()
303
348
  setOpenModalForBusiness(false);
304
349
  };
305
350
 
@@ -340,7 +385,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
340
385
  },
341
386
  {
342
387
  ...order?.customer?.location,
343
- title: order?.customer?.name ?? t('CUSTOMER', 'Customer'),
388
+ title: order?.customer?.name ?? t('CUSTOMER', 'Customer'),
344
389
  address: {
345
390
  addressName: order?.customer?.address,
346
391
  zipcode: order?.customer?.zipcode
@@ -372,6 +417,17 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
372
417
  }
373
418
  }, [driverLocation]);
374
419
 
420
+ useEffect(() => {
421
+ const getStorageData = async () => {
422
+ const printers = await _retrieveStoreData('printers')
423
+ const autoPrint = await _retrieveStoreData('auto_print_after_accept_order')
424
+ setPrinterSettings(printers?.length && printers)
425
+ setAutoPrintEnabled(!!autoPrint)
426
+ }
427
+
428
+ getStorageData()
429
+ }, [])
430
+
375
431
  const styles = StyleSheet.create({
376
432
  driverOff: {
377
433
  backgroundColor: theme.colors.notAvailable,
@@ -432,6 +488,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
432
488
  handleCopyClipboard={handleCopyClipboard}
433
489
  handleArrowBack={handleArrowBack}
434
490
  isCustomView={props.isCustomView}
491
+ messages={messages}
492
+ messagesReadList={messagesReadList}
435
493
  />
436
494
  <OrderDetailsContainer
437
495
  keyboardShouldPersistTaps="handled"
@@ -537,6 +595,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
537
595
  messages={messages}
538
596
  order={order}
539
597
  setMessages={setMessages}
598
+ notificationApp={notificationApp}
540
599
  />
541
600
  </OModal>
542
601
 
@@ -580,7 +639,6 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
580
639
  </>
581
640
  <View style={{ height: 30 }} />
582
641
  </OrderDetailsContainer>
583
-
584
642
  {order &&
585
643
  Object.keys(order).length > 0 &&
586
644
  getOrderStatus(order?.status, t)?.value ===
@@ -597,7 +655,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
597
655
  widthButton={'45%'}
598
656
  />
599
657
  )}
600
- {order?.status === 7 && (
658
+ {orderToReady.includes(order?.status) && (
601
659
  <FloatingButton
602
660
  btnText={t('READY_FOR_PICKUP', 'Ready for pickup')}
603
661
  colorTxt1={theme.colors.primary}
@@ -607,7 +665,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
607
665
  disabled={loading}
608
666
  />
609
667
  )}
610
- {order?.status === 4 && ![1].includes(order?.delivery_type) && (
668
+ {orderToComplete.includes(order?.status) && ![1].includes(order?.delivery_type) && (
611
669
  <FloatingButton
612
670
  btnText={t(
613
671
  'ORDER_NOT_PICKEDUP_BY_CUSTOMER',
@@ -618,7 +676,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
618
676
  secondButtonClick={() => handleChangeOrderStatus?.(15)}
619
677
  firstButtonClick={() => handleChangeOrderStatus?.(17)}
620
678
  secondBtnText={t(
621
- 'PICKUP_COMPLETED_BY_CUSTOMER',
679
+ 'ORDER_PICKUP_COMPLETED_BY_CUSTOMER',
622
680
  'Pickup completed by customer',
623
681
  )}
624
682
  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();
@@ -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}