ordering-ui-react-native 0.21.21 → 0.21.22-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 (239) hide show
  1. package/package.json +7 -6
  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 +4 -4
  6. package/src/components/VerifyPhone/styles.tsx +1 -2
  7. package/src/types/index.tsx +2 -1
  8. package/src/utils/index.tsx +2 -2
  9. package/themes/business/index.tsx +4 -0
  10. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -2
  11. package/themes/business/src/components/BusinessController/index.tsx +19 -17
  12. package/themes/business/src/components/BusinessProductList/AccordionDropdown.tsx +63 -0
  13. package/themes/business/src/components/BusinessProductList/IterateCategories.tsx +108 -0
  14. package/themes/business/src/components/BusinessProductList/ProductList.tsx +196 -0
  15. package/themes/business/src/components/BusinessProductList/index.tsx +196 -0
  16. package/themes/business/src/components/BusinessProductList/styles.tsx +10 -0
  17. package/themes/business/src/components/Chat/index.tsx +23 -14
  18. package/themes/business/src/components/DriverMap/index.tsx +4 -3
  19. package/themes/business/src/components/FloatingButton/index.tsx +34 -31
  20. package/themes/business/src/components/Home/index.tsx +5 -1
  21. package/themes/business/src/components/LanguageSelector/index.tsx +4 -2
  22. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  23. package/themes/business/src/components/MapView/index.tsx +11 -7
  24. package/themes/business/src/components/MessagesOption/index.tsx +2 -1
  25. package/themes/business/src/components/NewOrderNotification/index.tsx +163 -113
  26. package/themes/business/src/components/OrderDetails/Business.tsx +50 -2
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +23 -11
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +60 -53
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +54 -23
  30. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +220 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +6 -1
  32. package/themes/business/src/components/OrderSummary/index.tsx +240 -76
  33. package/themes/business/src/components/OrdersListManager/index.tsx +7 -2
  34. package/themes/business/src/components/OrdersListManager/utils.tsx +1 -1
  35. package/themes/business/src/components/OrdersOption/index.tsx +125 -48
  36. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  37. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +33 -36
  38. package/themes/business/src/components/PreviousOrders/OrderList.tsx +18 -13
  39. package/themes/business/src/components/PreviousOrders/index.tsx +80 -66
  40. package/themes/business/src/components/PreviousOrders/styles.tsx +10 -0
  41. package/themes/business/src/components/PrinterSettings/index.tsx +279 -0
  42. package/themes/business/src/components/PrinterSettings/styles.tsx +17 -0
  43. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  44. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  45. package/themes/business/src/components/SearchBar/index.tsx +2 -1
  46. package/themes/business/src/components/Sessions/index.tsx +187 -0
  47. package/themes/business/src/components/Sessions/styles.tsx +20 -0
  48. package/themes/business/src/components/StoresList/index.tsx +5 -3
  49. package/themes/business/src/components/UserFormDetails/index.tsx +111 -107
  50. package/themes/business/src/components/UserProfileForm/index.tsx +98 -44
  51. package/themes/business/src/components/WebsocketStatus/index.tsx +171 -0
  52. package/themes/business/src/components/WebsocketStatus/styles.tsx +28 -0
  53. package/themes/business/src/components/shared/OInput.tsx +2 -0
  54. package/themes/business/src/hooks/useLocation.tsx +5 -4
  55. package/themes/business/src/types/index.tsx +15 -2
  56. package/themes/business/src/utils/index.tsx +5 -0
  57. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  58. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  59. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  60. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  61. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -4
  62. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  63. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  64. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  65. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  66. package/themes/original/index.tsx +9 -4
  67. package/themes/original/src/components/AddressDetails/index.tsx +20 -10
  68. package/themes/original/src/components/AddressForm/index.tsx +10 -6
  69. package/themes/original/src/components/AddressForm/styles.tsx +1 -1
  70. package/themes/original/src/components/AddressList/index.tsx +4 -7
  71. package/themes/original/src/components/AddressList/styles.tsx +4 -4
  72. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  73. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  74. package/themes/original/src/components/BusinessBasicInformation/index.tsx +4 -4
  75. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +1 -1
  76. package/themes/original/src/components/BusinessController/index.tsx +20 -12
  77. package/themes/original/src/components/BusinessController/styles.tsx +8 -7
  78. package/themes/original/src/components/BusinessInformation/styles.tsx +2 -2
  79. package/themes/original/src/components/BusinessItemAccordion/index.tsx +11 -7
  80. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +317 -0
  81. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +96 -0
  82. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +1 -1
  83. package/themes/original/src/components/BusinessListingSearch/index.tsx +56 -361
  84. package/themes/original/src/components/BusinessListingSearch/styles.tsx +1 -1
  85. package/themes/original/src/components/BusinessPreorder/index.tsx +2 -3
  86. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -1
  87. package/themes/original/src/components/BusinessProductsList/index.tsx +3 -3
  88. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  89. package/themes/original/src/components/BusinessProductsListing/index.tsx +51 -20
  90. package/themes/original/src/components/BusinessProductsListing/styles.tsx +3 -4
  91. package/themes/original/src/components/BusinessReviews/index.tsx +1 -1
  92. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  93. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -5
  94. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +69 -0
  95. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +406 -0
  96. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListing.tsx +76 -0
  97. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +24 -404
  98. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  99. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  100. package/themes/original/src/components/Cart/index.tsx +32 -9
  101. package/themes/original/src/components/CartContent/index.tsx +96 -58
  102. package/themes/original/src/components/CartStoresListing/styles.tsx +2 -2
  103. package/themes/original/src/components/Checkout/index.tsx +190 -66
  104. package/themes/original/src/components/Checkout/styles.tsx +17 -0
  105. package/themes/original/src/components/CitiesControl/styles.tsx +1 -1
  106. package/themes/original/src/components/DatePicker/index.tsx +33 -0
  107. package/themes/original/src/components/DatePicker/styles.tsx +20 -0
  108. package/themes/original/src/components/Favorite/index.tsx +4 -9
  109. package/themes/original/src/components/Favorite/styles.tsx +0 -2
  110. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  111. package/themes/original/src/components/GPSButton/index.tsx +1 -1
  112. package/themes/original/src/components/GiftCard/GiftCardOrdersList/index.tsx +64 -0
  113. package/themes/original/src/components/GiftCard/GiftCardOrdersList/styles.tsx +8 -0
  114. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +8 -3
  115. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +36 -3
  116. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +1 -1
  117. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +67 -4
  118. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +1 -1
  119. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +2 -2
  120. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +1 -1
  121. package/themes/original/src/components/GiftCard/SingleGiftCard/index.tsx +101 -0
  122. package/themes/original/src/components/GiftCard/SingleGiftCard/styles.tsx +4 -0
  123. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +83 -0
  124. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/styles.tsx +9 -0
  125. package/themes/original/src/components/GoogleMap/index.tsx +6 -5
  126. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +2 -2
  127. package/themes/original/src/components/HighestRatedBusinesses/styles.tsx +1 -1
  128. package/themes/original/src/components/Home/index.tsx +2 -1
  129. package/themes/original/src/components/LastOrder/index.tsx +2 -1
  130. package/themes/original/src/components/LastOrders/index.tsx +2 -1
  131. package/themes/original/src/components/LoginForm/Otp/index.tsx +4 -16
  132. package/themes/original/src/components/Messages/index.tsx +9 -4
  133. package/themes/original/src/components/Messages/styles.tsx +1 -1
  134. package/themes/original/src/components/MomentOption/index.tsx +4 -3
  135. package/themes/original/src/components/MultiCart/index.tsx +1 -1
  136. package/themes/original/src/components/MultiCheckout/index.tsx +208 -21
  137. package/themes/original/src/components/MultiCheckout/styles.tsx +17 -0
  138. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -15
  139. package/themes/original/src/components/MyOrders/index.tsx +24 -29
  140. package/themes/original/src/components/NavBar/index.tsx +3 -1
  141. package/themes/original/src/components/NetworkError/index.tsx +2 -3
  142. package/themes/original/src/components/NetworkError/styles.tsx +2 -2
  143. package/themes/original/src/components/Notifications/index.tsx +4 -8
  144. package/themes/original/src/components/Notifications/styles.tsx +0 -1
  145. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +1 -1
  146. package/themes/original/src/components/OrderDetails/index.tsx +716 -668
  147. package/themes/original/src/components/OrderDetails/styles.tsx +24 -8
  148. package/themes/original/src/components/OrderProgress/index.tsx +28 -6
  149. package/themes/original/src/components/OrderProgress/styles.tsx +1 -1
  150. package/themes/original/src/components/OrderSummary/index.tsx +3 -1
  151. package/themes/original/src/components/OrderTypeSelector/index.tsx +5 -6
  152. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +1 -1
  153. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +1 -1
  154. package/themes/original/src/components/OrdersOption/index.tsx +3 -5
  155. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  156. package/themes/original/src/components/PageBanner/index.tsx +3 -0
  157. package/themes/original/src/components/PaymentOptionCard/index.tsx +4 -2
  158. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +3 -0
  159. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  160. package/themes/original/src/components/PaymentOptions/index.tsx +72 -6
  161. package/themes/original/src/components/ProductForm/ActionButton.tsx +120 -0
  162. package/themes/original/src/components/ProductForm/ExtraOptions.tsx +56 -0
  163. package/themes/original/src/components/ProductForm/index.tsx +74 -165
  164. package/themes/original/src/components/ProductItemAccordion/index.tsx +54 -44
  165. package/themes/original/src/components/ProductItemAccordion/styles.tsx +3 -4
  166. package/themes/original/src/components/ProductOptionSubOption/index.tsx +123 -82
  167. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +6 -1
  168. package/themes/original/src/components/ProfessionalProfile/styles.tsx +3 -3
  169. package/themes/original/src/components/Promotions/index.tsx +4 -4
  170. package/themes/original/src/components/Promotions/styles.tsx +0 -2
  171. package/themes/original/src/components/ReviewDriver/styles.tsx +1 -1
  172. package/themes/original/src/components/ReviewOrder/styles.tsx +1 -1
  173. package/themes/original/src/components/ReviewProducts/styles.tsx +1 -1
  174. package/themes/original/src/components/ServiceForm/index.tsx +2 -2
  175. package/themes/original/src/components/ServiceForm/styles.tsx +4 -4
  176. package/themes/original/src/components/SignupForm/index.tsx +60 -58
  177. package/themes/original/src/components/SingleOrderCard/index.tsx +3 -2
  178. package/themes/original/src/components/SingleProductCard/index.tsx +2 -2
  179. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  180. package/themes/original/src/components/StripeCardsList/index.tsx +17 -36
  181. package/themes/original/src/components/StripeElementsForm/index.tsx +72 -59
  182. package/themes/original/src/components/StripeElementsForm/naked.tsx +47 -0
  183. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +170 -0
  184. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +86 -0
  185. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -199
  186. package/themes/original/src/components/UpsellingProducts/styles.tsx +19 -0
  187. package/themes/original/src/components/UserFormDetails/index.tsx +125 -77
  188. package/themes/original/src/components/UserFormDetails/styles.tsx +7 -0
  189. package/themes/original/src/components/UserProfile/index.tsx +3 -2
  190. package/themes/original/src/components/UserProfileForm/index.tsx +30 -36
  191. package/themes/original/src/components/WalletTransactions/styles.tsx +1 -0
  192. package/themes/original/src/components/Wallets/index.tsx +8 -9
  193. package/themes/original/src/components/Wallets/styles.tsx +1 -1
  194. package/themes/original/src/components/WebsocketStatus/index.tsx +172 -0
  195. package/themes/original/src/components/WebsocketStatus/styles.tsx +28 -0
  196. package/themes/original/src/components/shared/HeaderTitle.tsx +1 -1
  197. package/themes/original/src/components/shared/OButton.tsx +5 -5
  198. package/themes/original/src/components/shared/OInput.tsx +1 -4
  199. package/themes/original/src/components/shared/OModal.tsx +12 -14
  200. package/themes/original/src/layouts/Container.tsx +5 -3
  201. package/themes/original/src/types/index.tsx +1 -0
  202. package/themes/original/src/utils/index.tsx +125 -1
  203. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  204. package/src/navigators/BottomNavigator.tsx +0 -117
  205. package/src/navigators/CheckoutNavigator.tsx +0 -66
  206. package/src/navigators/HomeNavigator.tsx +0 -202
  207. package/src/navigators/NavigationRef.tsx +0 -7
  208. package/src/navigators/RootNavigator.tsx +0 -269
  209. package/src/pages/Account.tsx +0 -34
  210. package/src/pages/AddressForm.tsx +0 -62
  211. package/src/pages/AddressList.tsx +0 -24
  212. package/src/pages/BusinessProductsList.tsx +0 -81
  213. package/src/pages/BusinessesListing.tsx +0 -43
  214. package/src/pages/CartList.tsx +0 -49
  215. package/src/pages/Checkout.tsx +0 -101
  216. package/src/pages/ForgotPassword.tsx +0 -24
  217. package/src/pages/Help.tsx +0 -23
  218. package/src/pages/HelpAccountAndPayment.tsx +0 -23
  219. package/src/pages/HelpGuide.tsx +0 -23
  220. package/src/pages/HelpOrder.tsx +0 -23
  221. package/src/pages/Home.tsx +0 -36
  222. package/src/pages/IntroductoryTutorial.tsx +0 -170
  223. package/src/pages/Login.tsx +0 -47
  224. package/src/pages/MomentOption.tsx +0 -30
  225. package/src/pages/MultiCheckout.tsx +0 -31
  226. package/src/pages/MultiOrdersDetails.tsx +0 -27
  227. package/src/pages/MyOrders.tsx +0 -40
  228. package/src/pages/NetworkError.tsx +0 -24
  229. package/src/pages/NotFound.tsx +0 -22
  230. package/src/pages/OrderDetails.tsx +0 -25
  231. package/src/pages/ProductDetails.tsx +0 -55
  232. package/src/pages/Profile.tsx +0 -36
  233. package/src/pages/ReviewDriver.tsx +0 -30
  234. package/src/pages/ReviewOrder.tsx +0 -32
  235. package/src/pages/ReviewProducts.tsx +0 -30
  236. package/src/pages/Sessions.tsx +0 -22
  237. package/src/pages/Signup.tsx +0 -53
  238. package/src/pages/SpinnerLoader.tsx +0 -10
  239. package/src/pages/Splash.tsx +0 -21
@@ -12,6 +12,7 @@ import { PreviousMessages } from '../PreviousMessages';
12
12
  import { FiltersTab, TabsContainer, TagsContainer, Tag } from './styles';
13
13
  import { MessagesOptionParams } from '../../types';
14
14
  import { useDeviceOrientation } from '../../../../../src/hooks/DeviceOrientation';
15
+ import { WebsocketStatus } from '../WebsocketStatus'
15
16
 
16
17
  const MessagesOptionUI = (props: MessagesOptionParams) => {
17
18
  const {
@@ -163,7 +164,7 @@ const MessagesOptionUI = (props: MessagesOptionParams) => {
163
164
  <View style={styles.header}>
164
165
  <OText style={styles.title}>{t('MESSAGES', 'Messages')}</OText>
165
166
  </View>
166
-
167
+ <WebsocketStatus />
167
168
  <FiltersTab>
168
169
  <TabsContainer width={dimensions.width - 42}>
169
170
  {tabs.map((tab: any) => (
@@ -1,112 +1,170 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import {
3
+ Modal,
4
+ View,
5
+ StyleSheet,
6
+ Dimensions,
7
+ TouchableOpacity,
8
+ NativeModules,
9
+ PermissionsAndroid,
10
+ Platform
11
+ } from 'react-native';
12
+ import { useTheme } from 'styled-components/native'
1
13
  import moment from 'moment'
2
- import { NewOrderNotification as NewOrderNotificationController, useApi, useEvent, useLanguage, useSession } from 'ordering-components/native'
3
- import React, { useEffect, useState } from 'react'
4
- import { Dimensions, Modal, StyleSheet, TouchableOpacity, View } from 'react-native'
5
- import Sound from 'react-native-sound'
6
14
  import Icon from 'react-native-vector-icons/Feather'
7
- import { useTheme } from 'styled-components/native'
15
+ import SoundPlayer from 'react-native-sound-player'
16
+
17
+ import {
18
+ NewOrderNotification as NewOrderNotificationController,
19
+ useApi,
20
+ useEvent,
21
+ useLanguage,
22
+ useSession,
23
+ useConfig,
24
+ useToast,
25
+ ToastType
26
+ } from 'ordering-components/native'
8
27
 
9
- import { useLocation } from '../../hooks/useLocation'
10
28
  import { OIcon, OText } from '../shared'
11
29
  import { NotificationContainer } from './styles'
30
+ import { useLocation } from '../../hooks/useLocation'
12
31
 
13
- Sound.setCategory('Playback', true)
14
- Sound.setMode('Default')
15
-
32
+ const DELAY_SOUND = 2500 // 2 sec
16
33
  const windowWidth = Dimensions.get('screen').width
17
34
 
18
- const SOUND_LOOP = 3
35
+ const SoundPlayerComponent = (props: any) => {
36
+ const { evtList, currentEvent, handleCloseEvents } = props
19
37
 
20
- const NewOrderNotificationUI = (props: any) => {
21
- const { isBusinessApp } = props
22
- const [events] = useEvent()
23
38
  const theme = useTheme()
24
- const [, t] = useLanguage()
25
- const [{ user, token }] = useSession()
26
- const [ordering] = useApi()
27
- const { getCurrentLocation } = useLocation();
28
- const [currentEvent, setCurrentEvent] = useState<any>(null)
39
+ const [count, setCount] = useState(0);
40
+ const [isEnabledReadStorage, setIsEnabledReadStorage] = useState(true)
41
+ const URL_SOUND = 'https://d33aymufw4jvwf.cloudfront.net/notification.mp3' ?? theme.sounds.notification
29
42
 
30
- const evtList: any = {
31
- 1: {
32
- event: 'messages',
33
- message: t('NEW_MESSAGES_RECEIVED', 'New messages have been received!'),
34
- message2: t('ORDER_N_UNREAD_MESSAGES', 'Order #_order_id_ has unread messages.').replace('_order_id_', currentEvent?.orderId),
35
- },
36
- 2: {
37
- event: 'order_added',
38
- message: t('NEW_ORDERS_RECEIVED', 'New orders have been received!'),
39
- message2: t('ORDER_N_ORDERED', 'Order #_order_id_ has been ordered.').replace('_order_id_', currentEvent?.orderId),
40
- },
41
- 3: {
42
- event: 'order_updated',
43
- message: t('NEW_ORDERS_UPDATED', 'New orders have been updated!'),
44
- message2: t('ORDER_N_UPDATED', 'Order #_order_id_ has been updated.').replace('_order_id_', currentEvent?.orderId),
45
- },
46
- }
47
-
48
- const notificationSound = new Sound(theme.sounds.notification, '', () => { });
49
-
50
- let _timeout: any = null
51
- let times = 0
43
+ useEffect(() => {
44
+ const id = setInterval(() => setCount(count + 1), 2500)
52
45
 
53
- const handleCloseEvents = () => {
54
- notificationSound.stop()
55
- setCurrentEvent(null)
56
- clearInterval(_timeout)
57
- }
46
+ const playSound = async () => {
47
+ SoundPlayer.playUrl(URL_SOUND)
48
+ await new Promise(resolve => setTimeout(resolve, DELAY_SOUND))
49
+ SoundPlayer.stop()
50
+ }
51
+ if (NativeModules?.RNSoundPlayer?.playUrl && typeof URL_SOUND === 'string' && isEnabledReadStorage) {
52
+ playSound()
53
+ }
58
54
 
59
- const handlePlayNotificationSound = (eventObj: any = null) => {
60
- setCurrentEvent(eventObj)
61
- if (times > 0) {
62
- if (times === 3) {
63
- times = 0
64
- return
65
- }
66
- return
55
+ return () => {
56
+ SoundPlayer.stop()
57
+ clearInterval(id);
67
58
  }
68
- _timeout = setInterval(() => {
69
- if (times < SOUND_LOOP) {
70
- notificationSound.play()
71
- times++
59
+ }, [count, isEnabledReadStorage])
60
+
61
+ useEffect(() => {
62
+ const checkSoundMedia = async () => {
63
+ if (Platform.OS === 'android') {
64
+ const enabled = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE)
65
+ setIsEnabledReadStorage(enabled)
72
66
  } else {
73
- clearInterval(_timeout)
74
- return
67
+ setIsEnabledReadStorage(true)
75
68
  }
76
- }, 2500)
77
- }
69
+ }
70
+ checkSoundMedia()
71
+
72
+ }, [])
73
+ return (
74
+ <Modal
75
+ animationType='slide'
76
+ transparent={true}
77
+ visible={!!currentEvent?.orderId}
78
+ >
79
+ <NotificationContainer>
80
+ <View style={styles.modalView}>
81
+ <TouchableOpacity
82
+ style={styles.wrapperIcon}
83
+ onPress={() => handleCloseEvents()}
84
+ >
85
+ <Icon name="x" size={30} />
86
+ </TouchableOpacity>
87
+ <OText
88
+ size={18}
89
+ color={theme.colors.textGray}
90
+ weight={600}
91
+ >
92
+ {evtList(currentEvent)[currentEvent?.evt]?.message}
93
+ </OText>
94
+ <OIcon
95
+ src={theme.images.general.newOrder}
96
+ width={250}
97
+ height={200}
98
+ />
99
+ <OText
100
+ color={theme.colors.textGray}
101
+ mBottom={15}
102
+ >
103
+ {evtList(currentEvent)[currentEvent?.evt]?.message2}
104
+ </OText>
105
+ </View>
106
+ </NotificationContainer>
107
+ </Modal>
108
+ )
109
+ }
110
+
111
+ const NewOrderNotificationUI = (props: any) => {
112
+ const { isBusinessApp, evtList, orderStatus } = props
113
+ const [, t] = useLanguage()
114
+ const [events] = useEvent()
115
+ const [{ user, token }] = useSession()
116
+ const [ordering] = useApi()
117
+ const [, { showToast }] = useToast()
118
+ const { getCurrentLocation } = useLocation()
119
+ const [currentEvent, setCurrentEvent] = useState<any>(null)
78
120
 
79
- const handleEventNotification = async (evtType: number, value: any) => {
121
+ const handleEventNotification = async (evtType: number, value: any, orderStatus?: any) => {
80
122
  if (value?.driver) {
81
123
  try {
82
124
  const location = await getCurrentLocation()
125
+ if (!location?.latitude || !location?.longitude) {
126
+ showToast(t('ERROR_UPDATING_COORDS', 'Error updating coords'), ToastType.Error)
127
+ return
128
+ }
83
129
  await fetch(`${ordering.root}/users/${user.id}/locations`, {
84
130
  method: 'POST',
85
131
  body: JSON.stringify({
86
- location: JSON.stringify({ location: `{lat: ${location.latitude}, lng: ${location.longitude}}` })
132
+ location: JSON.stringify({
133
+ location: `{
134
+ lat: ${location.latitude},
135
+ lng: ${location.longitude}
136
+ }`
137
+ })
87
138
  }),
88
- headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }
139
+ headers: {
140
+ 'Content-Type': 'application/json',
141
+ Authorization: `Bearer ${token}`
142
+ }
89
143
  })
90
144
  } catch { }
91
145
  const duration = moment.duration(moment().diff(moment.utc(value?.last_driver_assigned_at)))
92
146
  const assignedSecondsDiff = duration.asSeconds()
93
- if (assignedSecondsDiff < 5 && !isBusinessApp && !value?.logistic_status) {
94
- handlePlayNotificationSound({ evt: 2, orderId: value?.id })
147
+ if (assignedSecondsDiff < 5 && !isBusinessApp && !value?.logistic_status && orderStatus.includes(value.status)) {
148
+ setCurrentEvent({ evt: 2, orderId: value?.id ?? value?.order_id })
95
149
  }
96
150
  }
97
- if (evtType === 3 || value.author_id === user.id) return
98
- setTimeout(() => handlePlayNotificationSound({
151
+ if (!orderStatus.includes(value.status) || value?.author_id === user.id) return
152
+ setCurrentEvent({
99
153
  evt: evtType,
100
- orderId: value?.driver ? value?.order_id : evtList[evtType].event === 'messages' ? value?.order?.id : value?.order_id
101
- }), 1000)
154
+ orderId: value?.driver
155
+ ? value?.order_id ?? value?.id
156
+ : evtList(currentEvent)[evtType].event === 'messages'
157
+ ? value?.order?.id
158
+ : value?.order_id ?? value?.id
159
+ })
102
160
  }
103
161
 
104
162
  useEffect(() => {
105
- events.on('message_added_notification', (o: any) => handleEventNotification(1, o))
106
- events.on('order_added_notification', (o: any) => handleEventNotification(2, o))
107
- events.on('order_updated_notification', (o: any) => handleEventNotification(3, o))
108
- events.on('request_register_notification', (o: any) => handleEventNotification(2, o))
109
- events.on('request_update_notification', (o: any) => handleEventNotification(3, o))
163
+ events.on('message_added_notification', (o: any) => handleEventNotification(1, o, orderStatus))
164
+ events.on('order_added_notification', (o: any) => handleEventNotification(2, o, orderStatus))
165
+ events.on('order_updated_notification', (o: any) => handleEventNotification(3, o, orderStatus))
166
+ events.on('request_register_notification', (o: any) => handleEventNotification(2, o, orderStatus))
167
+ events.on('request_update_notification', (o: any) => handleEventNotification(3, o, orderStatus))
110
168
 
111
169
  return () => {
112
170
  events.off('message_added_notification', (o: any) => handleEventNotification(1, o))
@@ -115,51 +173,24 @@ const NewOrderNotificationUI = (props: any) => {
115
173
  events.off('request_register_notification', (o: any) => handleEventNotification(2, o))
116
174
  events.off('request_update_notification', (o: any) => handleEventNotification(3, o))
117
175
  }
118
- }, [])
176
+ }, [orderStatus])
119
177
 
120
178
  useEffect(() => {
121
- return () => handleCloseEvents()
179
+ return () => setCurrentEvent(null)
122
180
  }, [])
123
181
 
124
182
  return (
125
183
  <>
126
- <Modal
127
- animationType='slide'
128
- transparent={true}
129
- visible={!!currentEvent?.orderId}
130
- >
131
- <NotificationContainer>
132
- <View style={styles.modalView}>
133
- <TouchableOpacity
134
- style={styles.wrapperIcon}
135
- onPress={() => handleCloseEvents()}
136
- >
137
- <Icon name="x" size={30} />
138
- </TouchableOpacity>
139
- <OText
140
- size={18}
141
- color={theme.colors.textGray}
142
- weight={600}
143
- >
144
- {evtList[currentEvent?.evt]?.message}
145
- </OText>
146
- <OIcon
147
- src={theme.images.general.newOrder}
148
- width={250}
149
- height={200}
150
- />
151
- <OText
152
- color={theme.colors.textGray}
153
- mBottom={15}
154
- >
155
- {evtList[currentEvent?.evt]?.message2}
156
- </OText>
157
- </View>
158
- </NotificationContainer>
159
- </Modal>
184
+ {!!currentEvent && (
185
+ <SoundPlayerComponent
186
+ evtList={evtList}
187
+ currentEvent={currentEvent}
188
+ handleCloseEvents={() => setCurrentEvent(null)}
189
+ />
190
+ )}
160
191
  </>
161
192
  )
162
- }
193
+ };
163
194
 
164
195
  const styles = StyleSheet.create({
165
196
  modalView: {
@@ -179,9 +210,28 @@ const styles = StyleSheet.create({
179
210
  })
180
211
 
181
212
  export const NewOrderNotification = (props: any) => {
213
+ const [, t] = useLanguage()
214
+
182
215
  const newOrderNotificationProps = {
183
216
  ...props,
184
- UIComponent: NewOrderNotificationUI
217
+ UIComponent: NewOrderNotificationUI,
218
+ evtList: (currentEvent: any) => ({
219
+ 1: {
220
+ event: 'messages',
221
+ message: t('NEW_MESSAGES_RECEIVED', 'New messages have been received!'),
222
+ message2: t('ORDER_N_UNREAD_MESSAGES', 'Order #_order_id_ has unread messages.').replace('_order_id_', currentEvent?.orderId),
223
+ },
224
+ 2: {
225
+ event: 'order_added',
226
+ message: t('NEW_ORDERS_RECEIVED', 'New orders have been received!'),
227
+ message2: t('ORDER_N_ORDERED', 'Order #_order_id_ has been ordered.').replace('_order_id_', currentEvent?.orderId),
228
+ },
229
+ 3: {
230
+ event: 'order_updated',
231
+ message: t('NEW_ORDERS_UPDATED', 'New orders have been updated!'),
232
+ message2: t('ORDER_N_UPDATED', 'Order #_order_id_ has been updated.').replace('_order_id_', currentEvent?.orderId),
233
+ },
234
+ })
185
235
  };
186
236
 
187
237
  return <NewOrderNotificationController {...newOrderNotificationProps} />;
@@ -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,7 +48,6 @@ 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,
@@ -57,6 +60,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
57
60
  const [{ parsePrice, parseNumber, parseDate }] = useUtils();
58
61
  const [{ user, token }] = useSession();
59
62
  const [{ configs }] = useConfig();
63
+ const { generateCommands } = usePrinterCommands()
60
64
  const [, { showToast }] = useToast();
61
65
  const [unreadAlert, setUnreadAlert] = useState({
62
66
  business: false,
@@ -70,6 +74,10 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
70
74
  const [openModalForAccept, setOpenModalForAccept] = useState(false);
71
75
  const [openModalForMapView, setOpenModalForMapView] = useState(false);
72
76
  const [isDriverModalVisible, setIsDriverModalVisible] = useState(false);
77
+ const [printerSettings, setPrinterSettings] = useState<any>('')
78
+ const [autoPrintEnabled, setAutoPrintEnabled] = useState<boolean>(false)
79
+
80
+ const orderToComplete = [4,20,21]
73
81
 
74
82
  if (order?.status === 7 || order?.status === 4) {
75
83
  if (drivers?.length > 0 && drivers) {
@@ -120,6 +128,16 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
120
128
  }
121
129
  }
122
130
 
131
+ const handleChangeOrderStatus = async (status: any, isAcceptOrReject: any = {}) => {
132
+ if (props.handleChangeOrderStatus) {
133
+ const order: any = await props.handleChangeOrderStatus(status, isAcceptOrReject)
134
+
135
+ if (order?.status === 7 && autoPrintEnabled && printerSettings) {
136
+ handleViewSummaryOrder()
137
+ }
138
+ }
139
+ }
140
+
123
141
  const getFormattedSubOptionName = ({ quantity, name, position, price }: any) => {
124
142
  if (name !== 'No') {
125
143
  const pos = position && position !== 'whole' ? `(${t(position.toUpperCase(), position)})` : '';
@@ -291,7 +309,26 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
291
309
  setOpenModalForAccept(true);
292
310
  };
293
311
 
312
+ const printAction = async (printerSettings: any, commands: any) => {
313
+ try {
314
+ var printResult = await StarPRNT.print(printerSettings?.emulation, commands, printerSettings?.portName);
315
+ showToast(ToastType.Info, t('ORDER_PRINTED_SUCCESS', 'Order printed'), 1000)
316
+ } catch (e) {
317
+ showToast(ToastType.Error, t('ORDER_PRINTED_FAILED', 'Order not printed, connection failed'), 1000)
318
+ }
319
+ }
320
+
294
321
  const handleViewSummaryOrder = () => {
322
+ if (printerSettings) {
323
+ const commands: any = generateCommands({
324
+ ...order,
325
+ orderStatus: getOrderStatus(order?.status, t)?.value
326
+ }, printerSettings?.printMode)
327
+ commands.push({ appendCutPaper: StarPRNT.CutPaperAction.PartialCutWithFeed })
328
+
329
+ printAction(printerSettings, commands)
330
+ return
331
+ }
295
332
  navigation?.navigate &&
296
333
  navigation.navigate('OrderSummary', {
297
334
  order,
@@ -372,6 +409,17 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
372
409
  }
373
410
  }, [driverLocation]);
374
411
 
412
+ useEffect(() => {
413
+ const getStorageData = async () => {
414
+ const printer = await _retrieveStoreData('printer')
415
+ const autoPrint = await _retrieveStoreData('auto_print_after_accept_order')
416
+ setPrinterSettings(printer)
417
+ setAutoPrintEnabled(!!autoPrint)
418
+ }
419
+
420
+ getStorageData()
421
+ }, [])
422
+
375
423
  const styles = StyleSheet.create({
376
424
  driverOff: {
377
425
  backgroundColor: theme.colors.notAvailable,
@@ -607,7 +655,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
607
655
  disabled={loading}
608
656
  />
609
657
  )}
610
- {order?.status === 4 && ![1].includes(order?.delivery_type) && (
658
+ {orderToComplete.includes(order?.status) && ![1].includes(order?.delivery_type) && (
611
659
  <FloatingButton
612
660
  btnText={t(
613
661
  'ORDER_NOT_PICKEDUP_BY_CUSTOMER',
@@ -61,9 +61,14 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
61
61
  const [, { showToast }] = useToast();
62
62
  const [{ parsePrice, parseNumber }] = useUtils();
63
63
  const [{ configs }] = useConfig();
64
+
64
65
  const { order } = props.order
65
66
 
67
+ const hideTimer = configs?.hidden_driver_eta_time?.value === '1'
66
68
  const isAllowedDriverRejectOrder = configs?.allow_driver_reject_order?.value === '1'
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'
67
72
  const theme = useTheme();
68
73
  const [, t] = useLanguage();
69
74
  const [session] = useSession();
@@ -88,9 +93,9 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
88
93
  const logisticOrderStatus = [4, 6, 7]
89
94
 
90
95
  const showFloatButtonsPickUp: any = {
91
- 8: true,
96
+ 8: !isHideRejectButtons,
92
97
  3: true,
93
- 18: true,
98
+ 18: !isHideRejectButtons,
94
99
  };
95
100
 
96
101
  const showFloatButtonsAcceptOrReject: any = {
@@ -113,6 +118,10 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
113
118
  readMessages && readMessages();
114
119
  };
115
120
 
121
+ const goToPermissionPage = () => {
122
+ navigation.navigate('RequestPermissions')
123
+ }
124
+
116
125
  const handleOpenMapView = async () => {
117
126
  if (!isGrantedPermissions) {
118
127
  navigation.navigate('RequestPermissions')
@@ -387,7 +396,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
387
396
  }, [props.order?.loading]);
388
397
 
389
398
  useEffect(() => {
390
- if (!order?.driver_id && session?.user?.level === 4) {
399
+ if (order?.driver_id === null && session?.user?.level === 4) {
391
400
  setAlertState({
392
401
  open: true,
393
402
  content: [
@@ -476,13 +485,13 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
476
485
  textStyle={{ color: theme.colors.primary }}
477
486
  text={t('ARRIVED_TO_BUSINESS', 'Arrived to bussiness')}
478
487
  onClick={() =>
479
- handleChangeOrderStatus && handleChangeOrderStatus(3)
488
+ handleChangeOrderStatus && isGrantedPermissions ? handleChangeOrderStatus(3) : goToPermissionPage()
480
489
  }
481
490
  imgLeftStyle={{ tintColor: theme.colors.backArrow }}
482
491
  />
483
492
  </Pickup>
484
493
  )}
485
- {order?.status === 3 && order?.delivery_type === 1 && (
494
+ {order?.status === 3 && order?.delivery_type === 1 && !isHideRejectButtons && isEnabledOrderNotReady && (
486
495
  <View style={{ paddingVertical: 20, marginBottom: 20 }}>
487
496
  <OButton
488
497
  style={styles.btnPickUp}
@@ -568,7 +577,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
568
577
  btnText={t('PICKUP_FAILED', 'Pickup failed')}
569
578
  isSecondaryBtn={false}
570
579
  secondButtonClick={() =>
571
- handleChangeOrderStatus && handleChangeOrderStatus(9)
580
+ handleChangeOrderStatus && isGrantedPermissions ? handleChangeOrderStatus(9) : goToPermissionPage()
572
581
  }
573
582
  firstButtonClick={() =>
574
583
  handleViewActionOrder && handleViewActionOrder('pickupFailed')
@@ -577,7 +586,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
577
586
  secondButton={true}
578
587
  firstColorCustom={theme.colors.red}
579
588
  secondColorCustom={theme.colors.green}
580
- widthButton={'45%'}
589
+ widthButton={isHideRejectButtons || !isEnabledFailedPickupDriver ? '100%' : '45%'}
590
+ isHideRejectButtons={isHideRejectButtons || !isEnabledFailedPickupDriver}
581
591
  />
582
592
  )}
583
593
  {(validStatusComplete.includes(order?.status)) && (
@@ -587,7 +597,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
587
597
  btnText={t('DELIVERY_FAILED', 'Delivery Failed')}
588
598
  isSecondaryBtn={false}
589
599
  secondButtonClick={() =>
590
- handleChangeOrderStatus && handleChangeOrderStatus(11)
600
+ handleChangeOrderStatus && isGrantedPermissions ? handleChangeOrderStatus(11) : goToPermissionPage()
591
601
  }
592
602
  firstButtonClick={() =>
593
603
  handleViewActionOrder && handleViewActionOrder('deliveryFailed')
@@ -596,7 +606,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
596
606
  secondButton={true}
597
607
  firstColorCustom={theme.colors.red}
598
608
  secondColorCustom={theme.colors.green}
599
- widthButton={'45%'}
609
+ widthButton={isHideRejectButtons ? '100%' : '45%'}
610
+ isHideRejectButtons={isHideRejectButtons}
600
611
  />
601
612
  </>
602
613
  )}
@@ -604,13 +615,14 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
604
615
  <FloatingButton
605
616
  btnText={t('REJECT', 'Reject')}
606
617
  isSecondaryBtn={false}
607
- secondButtonClick={() => (order?.isLogistic && (order?.order_group || logisticOrderStatus.includes(order?.status))) ? handleAcceptLogisticOrder(order) : handleViewActionOrder('accept')}
618
+ secondButtonClick={() => hideTimer ? handleChangeOrderStatus && handleChangeOrderStatus(8) : (order?.isLogistic && (order?.order_group || logisticOrderStatus.includes(order?.status))) ? handleAcceptLogisticOrder(order) : handleViewActionOrder('accept')}
608
619
  firstButtonClick={() => order?.isLogistic && (order?.order_group || logisticOrderStatus.includes(order?.status)) ? handleRejectLogisticOrder() : handleViewActionOrder('reject')}
609
620
  secondBtnText={t('ACCEPT', 'Accept')}
610
621
  secondButton={true}
611
622
  firstColorCustom={theme.colors.red}
612
623
  secondColorCustom={theme.colors.green}
613
- widthButton={'45%'}
624
+ widthButton={isHideRejectButtons ? '100%' : '45%'}
625
+ isHideRejectButtons={isHideRejectButtons}
614
626
  />
615
627
  )}
616
628
  </>