ordering-ui-react-native 0.15.65 → 0.15.66-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 (214) hide show
  1. package/package.json +7 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/AddressForm/index.tsx +18 -2
  4. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  5. package/src/components/BusinessController/index.tsx +16 -8
  6. package/src/components/BusinessInformation/index.tsx +14 -0
  7. package/src/components/BusinessTypeFilter/index.tsx +1 -2
  8. package/src/components/BusinessesListing/index.tsx +1 -1
  9. package/src/components/Checkout/index.tsx +23 -2
  10. package/src/components/DriverTips/index.tsx +11 -6
  11. package/src/components/LanguageSelector/index.tsx +6 -2
  12. package/src/components/LoginForm/index.tsx +120 -30
  13. package/src/components/LoginForm/styles.tsx +6 -0
  14. package/src/components/OrderDetails/index.tsx +7 -21
  15. package/src/components/PaymentOptions/index.tsx +67 -50
  16. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  17. package/src/components/ReviewDriver/index.tsx +1 -1
  18. package/src/components/ReviewOrder/index.tsx +2 -1
  19. package/src/components/ReviewProducts/index.tsx +11 -0
  20. package/src/components/SignupForm/index.tsx +145 -61
  21. package/src/components/SingleProductCard/index.tsx +16 -4
  22. package/src/components/SingleProductReview/index.tsx +1 -1
  23. package/src/components/StripeMethodForm/index.tsx +22 -24
  24. package/src/components/UpsellingProducts/index.tsx +1 -1
  25. package/src/components/UserProfileForm/index.tsx +63 -6
  26. package/src/components/UserProfileForm/styles.tsx +8 -0
  27. package/src/components/VerifyPhone/styles.tsx +1 -2
  28. package/src/components/shared/OModal.tsx +1 -1
  29. package/src/hooks/useCountdownTimer.tsx +26 -0
  30. package/src/navigators/CheckoutNavigator.tsx +6 -0
  31. package/src/navigators/HomeNavigator.tsx +12 -0
  32. package/src/pages/BusinessesListing.tsx +7 -6
  33. package/src/pages/MultiCheckout.tsx +31 -0
  34. package/src/pages/MultiOrdersDetails.tsx +27 -0
  35. package/src/pages/OrderDetails.tsx +1 -1
  36. package/src/pages/ReviewDriver.tsx +2 -2
  37. package/src/pages/ReviewOrder.tsx +2 -2
  38. package/src/pages/Sessions.tsx +22 -0
  39. package/src/theme.json +0 -1
  40. package/src/types/index.tsx +18 -11
  41. package/src/utils/index.tsx +68 -1
  42. package/themes/business/index.tsx +4 -0
  43. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  44. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  45. package/themes/business/src/components/Chat/index.tsx +42 -90
  46. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  47. package/themes/business/src/components/DriverSchedule/index.tsx +71 -0
  48. package/themes/business/src/components/DriverSchedule/styles.tsx +6 -0
  49. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  50. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  51. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  52. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -13
  53. package/themes/business/src/components/OrderDetails/Business.tsx +2 -2
  54. package/themes/business/src/components/OrderDetails/Delivery.tsx +28 -11
  55. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +14 -7
  56. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  57. package/themes/business/src/components/OrdersListManager/index.tsx +1 -1
  58. package/themes/business/src/components/OrdersOption/index.tsx +8 -4
  59. package/themes/business/src/components/PreviousOrders/index.tsx +7 -7
  60. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  61. package/themes/business/src/components/ScheduleBlocked/index.tsx +53 -0
  62. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  63. package/themes/business/src/components/UserProfileForm/index.tsx +28 -4
  64. package/themes/business/src/components/shared/OModal.tsx +41 -38
  65. package/themes/business/src/types/index.tsx +8 -2
  66. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  67. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  68. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  69. package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
  70. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  71. package/themes/kiosk/src/components/Cart/index.tsx +11 -12
  72. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  73. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  74. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  75. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  76. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  77. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  78. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  79. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  80. package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
  81. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  82. package/themes/kiosk/src/components/OrderDetails/index.tsx +32 -27
  83. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  84. package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
  85. package/themes/kiosk/src/components/ProductForm/index.tsx +7 -8
  86. package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
  87. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
  88. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  89. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  90. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  91. package/themes/kiosk/src/types/index.d.ts +1 -0
  92. package/themes/original/index.tsx +30 -8
  93. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  94. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  95. package/themes/original/src/components/AddressForm/index.tsx +7 -6
  96. package/themes/original/src/components/AddressList/index.tsx +30 -18
  97. package/themes/original/src/components/AppleLogin/index.tsx +6 -8
  98. package/themes/original/src/components/BusinessBasicInformation/index.tsx +304 -158
  99. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  100. package/themes/original/src/components/BusinessController/index.tsx +168 -96
  101. package/themes/original/src/components/BusinessController/styles.tsx +5 -0
  102. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  103. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  104. package/themes/original/src/components/BusinessListingSearch/index.tsx +231 -63
  105. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  106. package/themes/original/src/components/BusinessPreorder/index.tsx +1 -1
  107. package/themes/original/src/components/BusinessProductsCategories/index.tsx +2 -2
  108. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  109. package/themes/original/src/components/BusinessProductsList/index.tsx +51 -52
  110. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  111. package/themes/original/src/components/BusinessProductsListing/index.tsx +318 -155
  112. package/themes/original/src/components/BusinessProductsListing/styles.tsx +32 -0
  113. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  114. package/themes/original/src/components/BusinessTypeFilter/index.tsx +106 -39
  115. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  116. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +560 -0
  117. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Appointment/styles.tsx} +24 -2
  118. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +679 -0
  119. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  120. package/themes/original/src/components/BusinessesListing/index.tsx +99 -458
  121. package/themes/original/src/components/Cart/index.tsx +61 -42
  122. package/themes/original/src/components/Checkout/index.tsx +90 -39
  123. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  124. package/themes/original/src/components/Favorite/index.tsx +92 -0
  125. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  126. package/themes/original/src/components/FavoriteList/index.tsx +298 -0
  127. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  128. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  129. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  130. package/themes/original/src/components/GoogleMap/index.tsx +11 -11
  131. package/themes/original/src/components/Help/index.tsx +21 -4
  132. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  133. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  134. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -0
  135. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  136. package/themes/original/src/components/LoginForm/index.tsx +332 -164
  137. package/themes/original/src/components/LoginForm/styles.tsx +1 -3
  138. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  139. package/themes/original/src/components/Messages/index.tsx +1 -1
  140. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  141. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  142. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  143. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  144. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  145. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  146. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  147. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  148. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  149. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  150. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  151. package/themes/original/src/components/NavBar/index.tsx +4 -4
  152. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  153. package/themes/original/src/components/OrderDetails/index.tsx +150 -64
  154. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  155. package/themes/original/src/components/OrderSummary/index.tsx +6 -6
  156. package/themes/original/src/components/OrderTypeSelector/index.tsx +79 -35
  157. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  158. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  159. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  160. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  161. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  162. package/themes/original/src/components/OrdersOption/index.tsx +137 -38
  163. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  164. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  165. package/themes/original/src/components/PaymentOptionWallet/index.tsx +17 -23
  166. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  167. package/themes/original/src/components/PaymentOptions/index.tsx +58 -37
  168. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  169. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  170. package/themes/original/src/components/ProductForm/index.tsx +718 -679
  171. package/themes/original/src/components/ProductForm/styles.tsx +6 -2
  172. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  173. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  174. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  175. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  176. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  177. package/themes/original/src/components/ProfessionalProfile/index.tsx +298 -0
  178. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  179. package/themes/original/src/components/Promotions/index.tsx +151 -133
  180. package/themes/original/src/components/Promotions/styles.tsx +3 -23
  181. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  182. package/themes/original/src/components/ReviewOrder/index.tsx +1 -1
  183. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  184. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  185. package/themes/original/src/components/SearchBar/index.tsx +13 -5
  186. package/themes/original/src/components/ServiceForm/index.tsx +579 -0
  187. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  188. package/themes/original/src/components/Sessions/index.tsx +160 -0
  189. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  190. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  191. package/themes/original/src/components/SingleOrderCard/index.tsx +275 -0
  192. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  193. package/themes/original/src/components/SingleProductCard/index.tsx +161 -88
  194. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -2
  195. package/themes/original/src/components/StripeElementsForm/index.tsx +16 -8
  196. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  197. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  198. package/themes/original/src/components/UserDetails/index.tsx +15 -81
  199. package/themes/original/src/components/UserFormDetails/index.tsx +98 -66
  200. package/themes/original/src/components/UserProfile/index.tsx +11 -2
  201. package/themes/original/src/components/UserProfileForm/index.tsx +33 -22
  202. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  203. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  204. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  205. package/themes/original/src/components/Wallets/index.tsx +25 -12
  206. package/themes/original/src/components/shared/OBottomPopup.tsx +44 -13
  207. package/themes/original/src/components/shared/OButton.tsx +2 -0
  208. package/themes/original/src/components/shared/OInput.tsx +3 -2
  209. package/themes/original/src/components/shared/OModal.tsx +4 -2
  210. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  211. package/themes/original/src/types/index.tsx +187 -35
  212. package/themes/original/src/utils/index.tsx +96 -2
  213. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  214. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -44,6 +44,35 @@ import { USER_TYPE } from '../../config/constants';
44
44
 
45
45
  import SignatureScreen from 'react-native-signature-canvas';
46
46
 
47
+ const ORDER_STATUS: any = {
48
+ 0: 'ORDER_STATUS_PENDING',
49
+ 1: 'ORDERS_COMPLETED',
50
+ 2: 'ORDER_REJECTED',
51
+ 3: 'ORDER_STATUS_IN_BUSINESS',
52
+ 4: 'ORDER_READY',
53
+ 5: 'ORDER_REJECTED_RESTAURANT',
54
+ 6: 'ORDER_STATUS_CANCELLEDBYDRIVER',
55
+ 7: 'ORDER_STATUS_ACCEPTEDBYRESTAURANT',
56
+ 8: 'ORDER_CONFIRMED_ACCEPTED_BY_DRIVER',
57
+ 9: 'ORDER_PICKUP_COMPLETED_BY_DRIVER',
58
+ 10: 'ORDER_PICKUP_FAILED_BY_DRIVER',
59
+ 11: 'ORDER_DELIVERY_COMPLETED_BY_DRIVER',
60
+ 12: 'ORDER_DELIVERY_FAILED_BY_DRIVER',
61
+ 13: 'PREORDER',
62
+ 14: 'ORDER_NOT_READY',
63
+ 15: 'ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER',
64
+ 16: 'ORDER_STATUS_CANCELLED_BY_CUSTOMER',
65
+ 17: 'ORDER_NOT_PICKEDUP_BY_CUSTOMER',
66
+ 18: 'ORDER_DRIVER_ALMOST_ARRIVED_BUSINESS',
67
+ 19: 'ORDER_DRIVER_ALMOST_ARRIVED_CUSTOMER',
68
+ 20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
69
+ 21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
70
+ 22: 'ORDER_LOOKING_FOR_DRIVER',
71
+ 23: 'ORDER_DRIVER_ON_WAY'
72
+ }
73
+
74
+ const filterSpecialStatus = ['prepared_in', 'delivered_in', 'delivery_datetime']
75
+
47
76
  const ChatUI = (props: MessagesParams) => {
48
77
  const {
49
78
  type,
@@ -317,71 +346,6 @@ const ChatUI = (props: MessagesParams) => {
317
346
  }
318
347
  };
319
348
 
320
- const getStatus = (status: number, attribute: any) => {
321
- const hour = Math.trunc(status / 60);
322
- const min = Math.round((status / 60 - hour) * 60);
323
-
324
- if (attribute === 'status') {
325
- switch (status) {
326
- case 0:
327
- return 'ORDER_STATUS_PENDING';
328
- case 1:
329
- return 'ORDERS_COMPLETED';
330
- case 2:
331
- return 'ORDER_REJECTED';
332
- case 3:
333
- return 'ORDER_STATUS_IN_BUSINESS';
334
- case 4:
335
- return 'ORDER_READY';
336
- case 5:
337
- return 'ORDER_REJECTED_RESTAURANT';
338
- case 6:
339
- return 'ORDER_STATUS_CANCELLEDBYDRIVER';
340
- case 7:
341
- return 'ORDER_STATUS_ACCEPTEDBYRESTAURANT';
342
- case 8:
343
- return 'ORDER_CONFIRMED_ACCEPTED_BY_DRIVER';
344
- case 9:
345
- return 'ORDER_PICKUP_COMPLETED_BY_DRIVER';
346
- case 10:
347
- return 'ORDER_PICKUP_FAILED_BY_DRIVER';
348
- case 11:
349
- return 'ORDER_DELIVERY_COMPLETED_BY_DRIVER';
350
- case 12:
351
- return 'ORDER_DELIVERY_FAILED_BY_DRIVER';
352
- case 13:
353
- return 'PREORDER';
354
- case 14:
355
- return 'ORDER_NOT_READY';
356
- case 15:
357
- return 'ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER';
358
- case 16:
359
- return 'ORDER_STATUS_CANCELLED_BY_CUSTOMER';
360
- case 17:
361
- return 'ORDER_NOT_PICKEDUP_BY_CUSTOMER';
362
- case 18:
363
- return 'ORDER_DRIVER_ALMOST_ARRIVED_BUSINESS';
364
- case 19:
365
- return 'ORDER_DRIVER_ALMOST_ARRIVED_CUSTOMER';
366
- case 20:
367
- return 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS';
368
- case 21:
369
- return 'ORDER_CUSTOMER_ARRIVED_BUSINESS';
370
- case 22:
371
- return 'ORDER_LOOKING_FOR_DRIVER'
372
- case 23:
373
- return 'ORDER_DRIVER_ON_WAY'
374
- default:
375
- return ``;
376
- }
377
- }
378
-
379
- if (attribute === 'prepared_in' || attribute === 'delivered_in') {
380
- return `${hour < 10 ? '0' + hour : hour}:${min < 10 ? '0' + min : min} ${status > 60 ? 'hours' : 'minutes'
381
- }`;
382
- }
383
- };
384
-
385
349
  const onSubmit = (values: any) => {
386
350
  handleSend && handleSend();
387
351
  setImage && setImage(null);
@@ -403,28 +367,16 @@ const ChatUI = (props: MessagesParams) => {
403
367
  numberOfLines={3}
404
368
  style={{ ...styles.firstMessageText, textAlign: 'center' }}>
405
369
  {message.change?.attribute !== 'driver_id'
406
- ? `${t('ORDER', 'Order')} ${t(
407
- message.change.attribute.toUpperCase(),
408
- message.change.attribute,
409
- )} ${t('CHANGED_FROM', 'Changed from')} ${message.change.old !== null
410
- ? t(
411
- getStatus(
412
- parseInt(message.change.old, 10),
413
- message.change?.attribute,
414
- ),
415
- )
416
- : '0'
417
- } ${t('TO', 'to')} ${t(
418
- getStatus(
419
- parseInt(message.change.new, 10),
420
- message.change?.attribute,
421
- ),
422
- )}`
370
+ ?
371
+ `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${filterSpecialStatus.includes(message.change.attribute) ?
372
+ `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}` :
373
+ `${message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])} ${t('TO', 'to')} ${t(ORDER_STATUS[parseInt(message.change.new, 10)])}`
374
+ }`
423
375
  : message.change.new
424
- ? `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''
425
- } ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''
426
- }`
427
- : `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`}
376
+ ?
377
+ `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''} ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''}`
378
+ :
379
+ `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`}
428
380
  </OText>
429
381
  <OText size={10} color={'#aaa'} style={{ alignSelf: 'flex-start' }}>
430
382
  {parseTime(message?.created_at, { outputFormat: 'hh:mma' })}
@@ -532,12 +484,12 @@ const ChatUI = (props: MessagesParams) => {
532
484
  image: message.source,
533
485
  system: message.type === 1,
534
486
  user: {
535
- _id: message.author.id,
536
- name: message.author.name,
487
+ _id: message.author?.id,
488
+ name: message.author?.name,
537
489
  can_see: message?.can_see,
538
- level: message.author.level,
490
+ level: message.author?.level,
539
491
  avatar:
540
- message.author.id !== user?.id && type === USER_TYPE.DRIVER
492
+ message.author?.id !== user?.id && type === USER_TYPE.DRIVER
541
493
  ? order?.driver?.photo
542
494
  : order?.business?.logo,
543
495
  },
@@ -327,6 +327,7 @@ export const DriverMap = (props: GoogleMapsParams) => {
327
327
  justifyContent: 'center',
328
328
  paddingVertical: 10,
329
329
  paddingHorizontal: 80,
330
+ position: 'absolute'
330
331
  },
331
332
  showButton: {
332
333
  alignSelf: 'center',
@@ -490,14 +491,14 @@ export const DriverMap = (props: GoogleMapsParams) => {
490
491
  </View>
491
492
  </View>
492
493
  </View>
493
- <View style={styles.buttonContainer}>
494
+ <View style={{
495
+ ...styles.buttonContainer,
496
+ bottom: showAcceptOrReject ? 80 : 0
497
+ }}>
494
498
  <OButton
495
499
  imgRightSrc=''
496
500
  textStyle={{ color: theme.colors.white }}
497
- style={{
498
- ...styles.showButton,
499
- bottom: showAcceptOrReject ? 80 : 0
500
- }}
501
+ style={styles.showButton}
501
502
  onClick={() => showLocation({
502
503
  latitude: destination.latitude,
503
504
  longitude: destination.longitude,
@@ -0,0 +1,71 @@
1
+ import React, { useState } from 'react'
2
+ import { RefreshControl, ScrollView, View } from 'react-native'
3
+ import { OText } from '../shared'
4
+ import { useLanguage, useSession } from 'ordering-components/native'
5
+ import { DayContainer } from './styles'
6
+ import { useTheme } from 'styled-components/native'
7
+ export const DriverSchedule = (props: any) => {
8
+ const { schedule } = props
9
+ const [, t] = useLanguage()
10
+ const theme = useTheme()
11
+ const [, { refreshUserInfo }] = useSession()
12
+ const [refreshing] = useState(false);
13
+
14
+ const daysOfWeek = [
15
+ t('SUNDAY_ABBREVIATION', 'Sun'),
16
+ t('MONDAY_ABBREVIATION', 'Mon'),
17
+ t('TUESDAY_ABBREVIATION', 'Tues'),
18
+ t('WEDNESDAY_ABBREVIATION', 'Wed'),
19
+ t('THURSDAY_ABBREVIATION', 'Thur'),
20
+ t('FRIDAY_ABBREVIATION', 'Fri'),
21
+ t('SATURDAY_ABBREVIATION', 'Sat')
22
+ ]
23
+
24
+ const scheduleFormatted = ({ hour, minute }: any) => {
25
+ const checkTime = (val: number) => val < 10 ? `0${val}` : val
26
+ return `${checkTime(hour)}:${checkTime(minute)}`
27
+ }
28
+
29
+ return (
30
+ <ScrollView
31
+ refreshControl={<RefreshControl
32
+ refreshing={refreshing}
33
+ onRefresh={() => refreshUserInfo()}
34
+ />}
35
+ >
36
+ <OText size={24} style={{ paddingLeft: 30 }}>
37
+ {t('SCHEDULE', 'Schedule')}
38
+ </OText>
39
+ <View style={{ padding: 30 }}>
40
+ {schedule.map((item: any, i: number) => (
41
+ <DayContainer key={daysOfWeek[i]}>
42
+ <OText style={{ width: '20%' }} size={22} weight={700}>{daysOfWeek[i]}</OText>
43
+ <View style={{ width: '80%', alignItems: 'center' }}>
44
+ <>
45
+ {item?.enabled ? (
46
+ <View>
47
+ {item?.lapses.map((lapse: any, i: number) => (
48
+ <View key={`${daysOfWeek[i]}_${i}`} style={{ marginTop: 3, marginBottom: 20, flexDirection: 'row', justifyContent: 'space-between' }}>
49
+ <OText size={18} style={{ width: '30%' }}>
50
+ {scheduleFormatted(lapse.open)}
51
+ </OText>
52
+ <OText size={18} style={{ width: 15 }}>
53
+ -
54
+ </OText>
55
+ <OText size={18} style={{ width: '30%' }}>
56
+ {scheduleFormatted(lapse.close)}
57
+ </OText>
58
+ </View>
59
+ ))}
60
+ </View>
61
+ ) : (
62
+ <OText size={18} style={{ marginTop: 3, marginBottom: 10 }} color={theme.colors.red}>{t('NOT_AVAILABLE', 'Not available')}</OText>
63
+ )}
64
+ </>
65
+ </View>
66
+ </DayContainer>
67
+ ))}
68
+ </View>
69
+ </ScrollView>
70
+ )
71
+ }
@@ -0,0 +1,6 @@
1
+ import styled from "styled-components/native";
2
+
3
+ export const DayContainer = styled.View`
4
+ flex-direction: row;
5
+ width: 100%;
6
+ `
@@ -8,6 +8,8 @@ import {
8
8
  ScrollView,
9
9
  } from 'react-native';
10
10
  import { useForm, Controller } from 'react-hook-form';
11
+ import Recaptcha from 'react-native-recaptcha-that-works'
12
+ import { TouchableOpacity } from 'react-native-gesture-handler';
11
13
  import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
12
14
  import {
13
15
  ToastType,
@@ -25,6 +27,7 @@ import {
25
27
  TabsContainer,
26
28
  OrSeparator,
27
29
  LineSeparator,
30
+ RecaptchaButton
28
31
  } from './styles';
29
32
  import { _setStoreData } from '../../providers/StoreUtil'
30
33
  import { OText, OButton, OInput, OIconButton, OModal } from '../shared';
@@ -47,7 +50,10 @@ const LoginFormUI = (props: LoginParams) => {
47
50
  handleCheckPhoneCode,
48
51
  setCheckPhoneCodeState,
49
52
  allowedLevels,
50
- useRootPoint
53
+ useRootPoint,
54
+ notificationState,
55
+ handleReCaptcha,
56
+ enableReCaptcha
51
57
  } = props;
52
58
 
53
59
  const [ordering, { setOrdering }] = useApi();
@@ -61,6 +67,7 @@ const LoginFormUI = (props: LoginParams) => {
61
67
  const inputRef = useRef<any>(null);
62
68
  const inputMailRef = useRef<any>(null);
63
69
 
70
+ const [projectName, setProjectName] = useState({name: '', isFocued: false});
64
71
  const [passwordSee, setPasswordSee] = useState(false);
65
72
  const [isLoadingVerifyModal, setIsLoadingVerifyModal] = useState(false);
66
73
  const [isModalVisible, setIsModalVisible] = useState(false);
@@ -84,6 +91,50 @@ const LoginFormUI = (props: LoginParams) => {
84
91
  const [submitted, setSubmitted] = useState(false);
85
92
  const [formValues, setFormValues] = useState(null);
86
93
 
94
+ const [recaptchaConfig, setRecaptchaConfig] = useState<any>({})
95
+ const [recaptchaVerified, setRecaptchaVerified] = useState(false)
96
+
97
+ const recaptchaRef = useRef<any>({});
98
+
99
+ const handleOpenRecaptcha = () => {
100
+ setRecaptchaVerified(false)
101
+ if (!recaptchaConfig?.siteKey) {
102
+ showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
103
+ return
104
+ }
105
+ if (!recaptchaConfig?.baseUrl) {
106
+ showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
107
+ return
108
+ }
109
+ recaptchaRef.current.open()
110
+ }
111
+
112
+ const onRecaptchaVerify = (token: any) => {
113
+ setRecaptchaVerified(true)
114
+ handleReCaptcha(token)
115
+ }
116
+
117
+ useEffect(() => {
118
+ if (configs && Object.keys(configs).length > 0 && enableReCaptcha) {
119
+ setRecaptchaConfig({
120
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
121
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
122
+ })
123
+ }
124
+ }, [configs, enableReCaptcha])
125
+
126
+ useEffect(() => {
127
+ const projectInputInterval = setInterval(() => {
128
+ if (projectName.name && useRootPoint && projectName.isFocued) {
129
+ setOrdering({
130
+ ...ordering,
131
+ project: projectName.name
132
+ })
133
+ }
134
+ }, 1500)
135
+ return () => clearInterval(projectInputInterval);
136
+ }, [projectName])
137
+
87
138
  const getTraduction = (key: string) => {
88
139
  const keyList: any = {
89
140
  // Add the key and traduction that you need below
@@ -465,6 +516,7 @@ const LoginFormUI = (props: LoginParams) => {
465
516
  icon={theme.images.general.project}
466
517
  iconColor={theme.colors.arrowColor}
467
518
  onChange={(e: any) => {
519
+ setProjectName({name: e?.target?.value, isFocued: true})
468
520
  onChange(e?.target?.value);
469
521
  setSubmitted(false);
470
522
  }}
@@ -493,6 +545,7 @@ const LoginFormUI = (props: LoginParams) => {
493
545
  icon={theme.images.logos.emailInputIcon}
494
546
  iconColor={theme.colors.arrowColor}
495
547
  onChange={(e: any) => {
548
+ setProjectName({...projectName, isFocued: false})
496
549
  handleChangeInputEmail(e, onChange);
497
550
  }}
498
551
  selectionColor={theme.colors.primary}
@@ -590,7 +643,7 @@ const LoginFormUI = (props: LoginParams) => {
590
643
 
591
644
  {onNavigationRedirect && (
592
645
  <Pressable
593
- style={{ marginRight: 'auto', marginBottom: 35 }}
646
+ style={{ marginRight: 'auto', marginBottom: 20 }}
594
647
  onPress={() => onNavigationRedirect('Forgot')}>
595
648
  <OText style={styles.textForgot}>
596
649
  {t('FORGOT_YOUR_PASSWORD', 'Forgot your password?')}
@@ -598,6 +651,39 @@ const LoginFormUI = (props: LoginParams) => {
598
651
  </Pressable>
599
652
  )}
600
653
 
654
+ {enableReCaptcha && (
655
+ <>
656
+ <TouchableOpacity
657
+ style={{ marginBottom: 15 }}
658
+ onPress={handleOpenRecaptcha}
659
+ >
660
+ <RecaptchaButton>
661
+ {recaptchaVerified ? (
662
+ <MaterialCommunityIcons
663
+ name="checkbox-marked"
664
+ size={26}
665
+ color={theme.colors.primary}
666
+ />
667
+ ) : (
668
+ <MaterialCommunityIcons
669
+ name="checkbox-blank-outline"
670
+ size={26}
671
+ color={theme.colors.mediumGray}
672
+ />
673
+ )}
674
+ <OText size={14} mLeft={8}>{t('VERIFY_ReCAPTCHA', 'Verify reCAPTCHA')}</OText>
675
+ </RecaptchaButton>
676
+ </TouchableOpacity>
677
+ <Recaptcha
678
+ ref={recaptchaRef}
679
+ siteKey={recaptchaConfig?.siteKey}
680
+ baseUrl={recaptchaConfig?.baseUrl}
681
+ onVerify={onRecaptchaVerify}
682
+ onExpire={() => setRecaptchaVerified(false)}
683
+ />
684
+ </>
685
+ )}
686
+
601
687
  <OButton
602
688
  onClick={handleLogin}
603
689
  text={t('LOGIN', 'Login')}
@@ -657,6 +743,7 @@ const LoginFormUI = (props: LoginParams) => {
657
743
  export const LoginForm = (props: any) => {
658
744
  const loginProps = {
659
745
  ...props,
746
+ isRecaptchaEnable: true,
660
747
  UIComponent: LoginFormUI,
661
748
  };
662
749
 
@@ -46,3 +46,9 @@ export const LineSeparator = styled.View`
46
46
  height: 1px;
47
47
  background-color: ${(props: any) => props.theme.colors.disabled};
48
48
  `;
49
+
50
+ export const RecaptchaButton = styled.View`
51
+ flex-direction: row;
52
+ align-items: center;
53
+ margin-bottom: 10px;
54
+ `
@@ -15,7 +15,7 @@ const LogoutButtonUI = (props: any) => {
15
15
  const data = await _retrieveStoreData('notification_state');
16
16
  const res = await handleLogoutClick(data);
17
17
  if (res) {
18
- _clearStoreData({ excludedKeys: ['project_name'] });
18
+ _clearStoreData({ excludedKeys: ['isTutorial'] });
19
19
  }
20
20
  };
21
21
 
@@ -14,7 +14,8 @@ Sound.setCategory('Playback')
14
14
 
15
15
  const windowWidth = Dimensions.get('screen').width
16
16
 
17
- const NewOrderNotificationUI = () => {
17
+ const NewOrderNotificationUI = (props: any) => {
18
+ const { isBusinessApp } = props
18
19
  const [events] = useEvent()
19
20
  const theme = useTheme()
20
21
  const [, t] = useLanguage()
@@ -22,7 +23,7 @@ const NewOrderNotificationUI = () => {
22
23
  const [ordering] = useApi()
23
24
  const { getCurrentLocation } = useLocation();
24
25
  const [soundTimeout, setSoundTimeout] = useState<any>(null)
25
- const [currentEvent, setCurrentEvent] = useState<any>(null)
26
+ let [currentEvent, setCurrentEvent] = useState<any>(null)
26
27
 
27
28
  const evtList: any = {
28
29
  1: {
@@ -45,6 +46,7 @@ const NewOrderNotificationUI = () => {
45
46
  const notificationSound = new Sound(theme.sounds.notification, (e) => { console.log(e) });
46
47
 
47
48
  const handlePlayNotificationSound = () => {
49
+ if (currentEvent) return
48
50
  let times = 0
49
51
  const _timeout = setInterval(function () {
50
52
  notificationSound.play(success => {
@@ -62,29 +64,40 @@ const NewOrderNotificationUI = () => {
62
64
 
63
65
  const handleCloseModal = () => {
64
66
  clearInterval(soundTimeout)
67
+ currentEvent = null
65
68
  setCurrentEvent({ evt: null })
66
69
  }
67
70
 
68
71
  const handleEventNotification = async (evtType: number, value: any) => {
69
72
  if (value?.driver) {
70
- const location = await getCurrentLocation()
71
- await fetch(`${ordering.root}/users/${user.id}/locations`, {
72
- method: 'POST',
73
- body: JSON.stringify({
74
- location: JSON.stringify({location: `{lat: ${location.latitude}, lng: ${location.longitude}}`})
75
- }),
76
- headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }
77
- })
78
- const assignedTimeDiff = moment.utc(value?.driver?.last_order_assigned_at).local().fromNow()
79
- if (assignedTimeDiff === 'a few seconds ago') {
73
+ try {
74
+ const location = await getCurrentLocation()
75
+ await fetch(`${ordering.root}/users/${user.id}/locations`, {
76
+ method: 'POST',
77
+ body: JSON.stringify({
78
+ location: JSON.stringify({location: `{lat: ${location.latitude}, lng: ${location.longitude}}`})
79
+ }),
80
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }
81
+ })
82
+ } catch (error) {
83
+ console.log(error)
84
+ }
85
+ const duration = moment.duration(moment().diff(moment.utc(value?.last_driver_assigned_at)))
86
+ const assignedSecondsDiff = duration.asSeconds()
87
+ if (assignedSecondsDiff < 5 && !isBusinessApp) {
80
88
  handlePlayNotificationSound()
81
89
  clearInterval(soundTimeout)
90
+ currentEvent = { evt: 2, orderId: value?.id }
82
91
  setCurrentEvent({ evt: 2, orderId: value?.id })
83
92
  }
84
- return
85
93
  }
94
+ if (evtType === 3 || value.author_id === user.id) return
86
95
  handlePlayNotificationSound()
87
96
  clearInterval(soundTimeout)
97
+ currentEvent = {
98
+ evt: evtType,
99
+ orderId: evtList[evtType].event === 'messages' ? value?.order_id : value?.id
100
+ }
88
101
  setCurrentEvent({
89
102
  evt: evtType,
90
103
  orderId: evtList[evtType].event === 'messages' ? value?.order_id : value?.id
@@ -335,7 +335,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
335
335
  addressName: order?.business?.address,
336
336
  zipcode: order?.business?.zipcode
337
337
  },
338
- icon: order?.business?.logo || theme.images.dummies.businessLogo,
338
+ icon: order?.business?.logo || 'https://res.cloudinary.com/demo/image/fetch/c_thumb,g_face,r_max/https://res.cloudinary.com/ordering2/image/upload/v1654619525/hzegwosnplvrbtjkpfi6.png',
339
339
  level: 2,
340
340
  },
341
341
  {
@@ -439,7 +439,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
439
439
  <>
440
440
  <OrderContentComponent order={order} />
441
441
  {(order?.status === 7 || order?.status === 4) &&
442
- order?.delivery_type === 1 && (
442
+ order?.delivery_type === 1 && configs?.assign_driver_enabled?.value === '1' && (
443
443
  <AssignDriver>
444
444
  <OText style={{ marginBottom: 5 }} size={16} weight="600">
445
445
  {t('ASSIGN_DRIVER', 'Assign driver')}
@@ -1,6 +1,6 @@
1
1
  //React & React Native
2
2
  import React, { useState, useEffect } from 'react';
3
- import { StyleSheet, View, Platform, ScrollView } from 'react-native';
3
+ import { StyleSheet, View } from 'react-native';
4
4
 
5
5
  // Thirds
6
6
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
@@ -29,7 +29,6 @@ import { NotFoundSource } from '../NotFoundSource';
29
29
  import { getOrderStatus } from '../../utils';
30
30
  import { OrderHeaderComponent } from './OrderHeaderComponent';
31
31
  import { OrderContentComponent } from './OrderContentComponent';
32
-
33
32
  //Styles
34
33
  import { OrderDetailsContainer, Pickup } from './styles';
35
34
 
@@ -51,7 +50,9 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
51
50
  orderTitle,
52
51
  appTitle,
53
52
  handleClickLogisticOrder,
54
- forceUpdate
53
+ forceUpdate,
54
+ getPermissions,
55
+ isGrantedPermissions
55
56
  } = props;
56
57
  const [, { showToast }] = useToast();
57
58
  const { order } = props.order
@@ -72,6 +73,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
72
73
  key?: string | null;
73
74
  }>({ open: false, content: [], key: null });
74
75
 
76
+ const validStatusComplete = [9, 19, 23]
77
+
75
78
  const logisticOrderStatus = [4, 6, 7]
76
79
 
77
80
  const showFloatButtonsPickUp: any = {
@@ -101,9 +104,18 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
101
104
  };
102
105
 
103
106
  const handleOpenMapView = async () => {
104
- if (permissions?.locationStatus === 'granted') {
107
+ if (!isGrantedPermissions) {
108
+ navigation.navigate('RequestPermissions')
109
+ return
110
+ }
111
+ const _permissions = await getPermissions()
112
+
113
+ const isBlocked = _permissions.some((_permission: string) => permissions?.locationStatus?.[_permission] === 'blocked')
114
+ const isGranted = _permissions.reduce((allPermissions: boolean, _permission: string) => allPermissions && permissions?.locationStatus?.[_permission] === 'granted', true)
115
+
116
+ if (isGranted) {
105
117
  setOpenModalForMapView(!openModalForMapView);
106
- } else if (permissions?.locationStatus === 'blocked') {
118
+ } else if (isBlocked) {
107
119
  // redirectToSettings();
108
120
  showToast(
109
121
  ToastType.Error,
@@ -114,13 +126,18 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
114
126
  );
115
127
  } else {
116
128
  const response = await askLocationPermission();
117
- if (response === 'granted') {
118
- setOpenModalForMapView(!openModalForMapView);
129
+ const isGranted = _permissions.reduce((allPermissions: boolean, _permission: string) => allPermissions && response?.locationStatus?.[_permission] === 'granted', true)
130
+ if (isGranted) {
131
+ setOpenModalForMapView(true)
119
132
  }
120
133
  }
121
134
  };
122
135
 
123
136
  const handleViewActionOrder = (action: string) => {
137
+ if (!isGrantedPermissions) {
138
+ navigation.navigate('RequestPermissions')
139
+ return
140
+ }
124
141
  if (openModalForMapView) {
125
142
  setOpenModalForMapView(false);
126
143
  }
@@ -230,17 +247,17 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
230
247
  let isToFollow = false;
231
248
  let isBusinessMarker = false;
232
249
 
233
- if (order?.status === 7 || order?.status === 8) {
250
+ if (order?.status === 7 || order?.status === 8 || order?.status === 18) {
234
251
  const markerBusiness = 'Business';
235
252
  isBusinessMarker = true;
236
253
  locationMarker = locations.find(
237
254
  (location: any) => location.type === markerBusiness,
238
255
  );
239
256
 
240
- if (order?.status === 8) {
257
+ if (order?.status === 8 || order?.status === 18) {
241
258
  isToFollow = true;
242
259
  }
243
- } else if (order?.status === 3 || order?.status === 9) {
260
+ } else if (order?.status === 3 || order?.status === 9 || order?.status === 19 || order?.status === 23) {
244
261
  const markerCustomer = 'Customer';
245
262
  isToFollow = true;
246
263
  isBusinessMarker = false;
@@ -378,7 +395,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
378
395
  widthButton={'45%'}
379
396
  />
380
397
  )}
381
- {(order?.status === 9 || order?.status === 19) && (
398
+ {(validStatusComplete.includes(order?.status)) && (
382
399
  <>
383
400
  <FloatingButton
384
401
  disabled={props.order?.loading}