ordering-components-external 13.2.13 → 13.2.14

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 (554) hide show
  1. package/.babelrc +22 -22
  2. package/.vscode/settings.json +3 -3
  3. package/_bundles/0.ordering-component.71fcc1b93f7c954870c3.js +1 -0
  4. package/_bundles/{1.ordering-component.aa21761da1477298dd80.js → 1.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  5. package/_bundles/{2.ordering-component.aa21761da1477298dd80.js → 2.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  6. package/_bundles/{4.ordering-component.aa21761da1477298dd80.js → 4.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  7. package/_bundles/{5.ordering-component.aa21761da1477298dd80.js → 5.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  8. package/_bundles/{6.ordering-component.aa21761da1477298dd80.js → 6.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  9. package/_bundles/7.ordering-component.71fcc1b93f7c954870c3.js +2 -0
  10. package/_bundles/7.ordering-component.71fcc1b93f7c954870c3.js.LICENSE.txt +1 -0
  11. package/_bundles/{8.ordering-component.aa21761da1477298dd80.js → 8.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  12. package/_bundles/ordering-component.71fcc1b93f7c954870c3.js +2 -0
  13. package/_bundles/{ordering-component.aa21761da1477298dd80.js.LICENSE.txt → ordering-component.71fcc1b93f7c954870c3.js.LICENSE.txt} +0 -9
  14. package/_modules/components/AddressDetails/index.js +35 -35
  15. package/_modules/components/AddressForm/index.js +63 -63
  16. package/_modules/components/AddressList/index.js +56 -56
  17. package/_modules/components/Analitycs/index.js +11 -11
  18. package/_modules/components/AnalyticsSegment/index.js +11 -11
  19. package/_modules/components/AppleLogin/index.js +37 -37
  20. package/_modules/components/BaseComponent/index.js +15 -15
  21. package/_modules/components/BusinessAndProductList/index.js +43 -43
  22. package/_modules/components/BusinessBasicInformation/index.js +30 -30
  23. package/_modules/components/BusinessController/index.js +65 -65
  24. package/_modules/components/BusinessInformation/BusinessOption/index.js +22 -22
  25. package/_modules/components/BusinessInformation/index.js +24 -24
  26. package/_modules/components/BusinessList/index.js +57 -57
  27. package/_modules/components/BusinessMenuListing/index.js +30 -30
  28. package/_modules/components/BusinessProductsCategories/index.js +18 -18
  29. package/_modules/components/BusinessProductsSearch/index.js +16 -16
  30. package/_modules/components/BusinessReviews/index.js +37 -37
  31. package/_modules/components/BusinessSearchList/index.js +34 -34
  32. package/_modules/components/BusinessSortControl/index.js +34 -34
  33. package/_modules/components/BusinessTypeFilter/index.js +36 -36
  34. package/_modules/components/BusinessesMap/index.js +33 -33
  35. package/_modules/components/Cart/index.js +48 -48
  36. package/_modules/components/CartStoresListing/index.js +15 -15
  37. package/_modules/components/Checkout/index.js +83 -83
  38. package/_modules/components/CmsContent/index.js +30 -30
  39. package/_modules/components/Contacts/index.js +45 -45
  40. package/_modules/components/CouponControl/index.js +29 -29
  41. package/_modules/components/DragAndDrop/index.js +4 -4
  42. package/_modules/components/DriverList/index.js +31 -31
  43. package/_modules/components/DriverTips/index.js +41 -41
  44. package/_modules/components/Emitter/index.js +3 -3
  45. package/_modules/components/FacebookLoginButton/index.js +50 -50
  46. package/_modules/components/FacebookPixel/index.js +8 -8
  47. package/_modules/components/FavoriteList/index.js +43 -43
  48. package/_modules/components/FirebaseGoogleLoginButton/index.js +21 -21
  49. package/_modules/components/FloatingButton/index.js +22 -22
  50. package/_modules/components/ForgotPasswordForm/index.js +53 -53
  51. package/_modules/components/GiftCard/GiftCardOrdersList/index.js +16 -16
  52. package/_modules/components/GiftCard/PurchaseGiftCard/index.js +17 -17
  53. package/_modules/components/GiftCard/RedeemGiftCard/index.js +14 -14
  54. package/_modules/components/GiftCard/SendGiftCard/index.js +14 -14
  55. package/_modules/components/GoogleAutocompleteInput/index.js +25 -25
  56. package/_modules/components/GoogleIdentity/index.js +38 -38
  57. package/_modules/components/GoogleLoginButton/index.js +61 -61
  58. package/_modules/components/GoogleMaps/index.js +44 -44
  59. package/_modules/components/GpsButton/index.js +27 -27
  60. package/_modules/components/LanguageSelector/index.js +38 -38
  61. package/_modules/components/LoginForm/index.js +72 -72
  62. package/_modules/components/LogoutAction/index.js +28 -28
  63. package/_modules/components/MainSearch/index.js +41 -41
  64. package/_modules/components/MapView/index.js +12 -12
  65. package/_modules/components/MenuControl/index.js +58 -58
  66. package/_modules/components/Messages/index.js +35 -35
  67. package/_modules/components/MomentOption/index.js +57 -57
  68. package/_modules/components/MultiCartCreate/index.js +10 -10
  69. package/_modules/components/MultiCartsPaymethodsAndWallets/index.js +22 -22
  70. package/_modules/components/MultiCheckout/index.js +34 -34
  71. package/_modules/components/MultiOrdersDetails/index.js +19 -19
  72. package/_modules/components/MyOrders/index.js +35 -35
  73. package/_modules/components/MyOrdersList/index.js +35 -35
  74. package/_modules/components/NewOrderNotification/index.js +8 -8
  75. package/_modules/components/OrderChange/index.js +30 -30
  76. package/_modules/components/OrderDetails/index.js +66 -66
  77. package/_modules/components/OrderList/index.js +67 -67
  78. package/_modules/components/OrderListGroups/index.js +28 -28
  79. package/_modules/components/OrderReview/index.js +35 -35
  80. package/_modules/components/OrderTypeControl/index.js +23 -23
  81. package/_modules/components/OrderVerticalList/index.js +15 -15
  82. package/_modules/components/OrdersControlFilters/index.js +15 -15
  83. package/_modules/components/OrdersDashboardComponents/Appointments/index.js +14 -14
  84. package/_modules/components/OrdersDashboardComponents/BusinessProductsListing/index.js +51 -51
  85. package/_modules/components/OrdersDashboardComponents/CheckPassword/index.js +35 -35
  86. package/_modules/components/OrdersDashboardComponents/CityList/index.js +33 -33
  87. package/_modules/components/OrdersDashboardComponents/CountryList/index.js +32 -32
  88. package/_modules/components/OrdersDashboardComponents/CustomOrderDetails/index.js +25 -25
  89. package/_modules/components/OrdersDashboardComponents/DashboardBusinessList/index.js +75 -75
  90. package/_modules/components/OrdersDashboardComponents/DashboardOrdersList/index.js +77 -77
  91. package/_modules/components/OrdersDashboardComponents/DriversList/index.js +73 -73
  92. package/_modules/components/OrdersDashboardComponents/ExportCSV/index.js +26 -26
  93. package/_modules/components/OrdersDashboardComponents/GiftCardsList/index.js +16 -16
  94. package/_modules/components/OrdersDashboardComponents/GoogleMapsApiKeySetting/index.js +14 -14
  95. package/_modules/components/OrdersDashboardComponents/LogisticInformation/index.js +29 -29
  96. package/_modules/components/OrdersDashboardComponents/Logistics/index.js +29 -29
  97. package/_modules/components/OrdersDashboardComponents/Messages/index.js +42 -42
  98. package/_modules/components/OrdersDashboardComponents/MetaFields/index.js +40 -40
  99. package/_modules/components/OrdersDashboardComponents/OrderDetails/index.js +54 -54
  100. package/_modules/components/OrdersDashboardComponents/OrderNotification/index.js +19 -19
  101. package/_modules/components/OrdersDashboardComponents/OrdersFilter/index.js +73 -73
  102. package/_modules/components/OrdersDashboardComponents/OrdersManage/index.js +74 -74
  103. package/_modules/components/OrdersDashboardComponents/PointsWalletLevels/index.js +38 -38
  104. package/_modules/components/OrdersDashboardComponents/ReviewCustomer/index.js +26 -26
  105. package/_modules/components/OrdersDashboardComponents/Schedule/index.js +56 -56
  106. package/_modules/components/OrdersDashboardComponents/SettingsList/index.js +51 -51
  107. package/_modules/components/OrdersDashboardComponents/UserFormDetails/index.js +82 -82
  108. package/_modules/components/OrdersDashboardComponents/UsersList/index.js +72 -72
  109. package/_modules/components/OrdersDashboardComponents/WebsocketStatus/index.js +10 -10
  110. package/_modules/components/PageBanner/index.js +17 -17
  111. package/_modules/components/PaymentOptionCash/index.js +26 -26
  112. package/_modules/components/PaymentOptionPaypal/index.js +35 -35
  113. package/_modules/components/PaymentOptionSquare/index.js +22 -22
  114. package/_modules/components/PaymentOptionStripe/index.js +45 -45
  115. package/_modules/components/PaymentOptionStripeDirect/index.js +34 -34
  116. package/_modules/components/PaymentOptionStripeRedirect/StripeRedirectForm/index.js +24 -24
  117. package/_modules/components/PaymentOptionStripeRedirect/index.js +39 -39
  118. package/_modules/components/PaymentOptionWallet/index.js +11 -11
  119. package/_modules/components/PaymentOptions/index.js +37 -37
  120. package/_modules/components/PaymethodList/index.js +30 -30
  121. package/_modules/components/PhoneAutocomplete/index.js +30 -30
  122. package/_modules/components/PlaceSpot/index.js +15 -15
  123. package/_modules/components/Popup/index.js +39 -39
  124. package/_modules/components/ProductComponent/index.js +36 -36
  125. package/_modules/components/ProductForm/index.js +145 -145
  126. package/_modules/components/ProductImages/index.js +20 -20
  127. package/_modules/components/ProductIngredient/index.js +19 -19
  128. package/_modules/components/ProductItemAccordion/index.js +18 -18
  129. package/_modules/components/ProductOption/index.js +9 -9
  130. package/_modules/components/ProductOptionSuboption/index.js +36 -36
  131. package/_modules/components/ProductShare/index.js +26 -26
  132. package/_modules/components/ProductsList/index.js +26 -26
  133. package/_modules/components/ProductsListing/index.js +50 -50
  134. package/_modules/components/ProfessionalInfo/index.js +34 -34
  135. package/_modules/components/PromotionsController/index.js +10 -10
  136. package/_modules/components/QueryLoginSpoonity/index.js +30 -30
  137. package/_modules/components/ReCaptcha/index.js +9 -9
  138. package/_modules/components/ResetPassword/index.js +30 -30
  139. package/_modules/components/ReviewCustomer/index.js +26 -26
  140. package/_modules/components/ReviewDriver/index.js +33 -33
  141. package/_modules/components/ReviewProduct/index.js +38 -38
  142. package/_modules/components/SearchOptions/index.js +23 -23
  143. package/_modules/components/Sessions/index.js +33 -33
  144. package/_modules/components/SignupForm/index.js +71 -71
  145. package/_modules/components/SingleBusinessCard/index.js +29 -29
  146. package/_modules/components/SingleOrderCard/index.js +32 -32
  147. package/_modules/components/SingleProductCard/index.js +28 -28
  148. package/_modules/components/SingleProfessionalCard/index.js +28 -28
  149. package/_modules/components/SmartAppBanner/index.js +13 -13
  150. package/_modules/components/StoreProductList/index.js +46 -46
  151. package/_modules/components/StripeElementsForm/CardForm/index.js +36 -36
  152. package/_modules/components/StripeElementsForm/index.js +25 -25
  153. package/_modules/components/UpsellingPage/index.js +27 -27
  154. package/_modules/components/UserFormDetails/index.js +85 -85
  155. package/_modules/components/UserVerification/index.js +28 -28
  156. package/_modules/components/WalletList/index.js +11 -11
  157. package/_modules/components/WebsocketStatus/index.js +10 -10
  158. package/_modules/components/WrapperGoogleMaps/index.js +9 -9
  159. package/_modules/contexts/ApiContext/index.js +13 -13
  160. package/_modules/contexts/BillingContext/index.js +7 -7
  161. package/_modules/contexts/BusinessContext/index.js +18 -18
  162. package/_modules/contexts/ConfigContext/index.js +19 -19
  163. package/_modules/contexts/CustomerContext/index.js +10 -10
  164. package/_modules/contexts/EventContext/index.js +9 -9
  165. package/_modules/contexts/LanguageContext/index.js +28 -28
  166. package/_modules/contexts/OptimizationLoadContext/index.js +16 -16
  167. package/_modules/contexts/OrderContext/index.js +97 -97
  168. package/_modules/contexts/OrderingContext/index.js +7 -7
  169. package/_modules/contexts/OrderingThemeContext/index.js +19 -19
  170. package/_modules/contexts/ProductContext/index.js +14 -14
  171. package/_modules/contexts/SessionContext/index.js +23 -23
  172. package/_modules/contexts/SiteContext/index.js +18 -18
  173. package/_modules/contexts/ToastContext/index.js +4 -4
  174. package/_modules/contexts/UtilsContext/index.js +14 -14
  175. package/_modules/contexts/ValidationsFieldsContext/index.js +9 -9
  176. package/_modules/contexts/WebsocketContext/index.js +17 -17
  177. package/_modules/contexts/WebsocketContext/socket.js +4 -4
  178. package/_modules/native/src/NativeStrategy/index.js +9 -9
  179. package/_modules/native/src/contexts/OrderingContext/index.js +7 -7
  180. package/_modules/utils/index.js +2 -2
  181. package/_modules/webStrategy/index.js +8 -8
  182. package/cypress/fixtures/example.json +4 -4
  183. package/cypress/integration/naked/BusinessProductsCategories.spec.js +9 -9
  184. package/cypress/integration/naked/PhoneAutocomplete.spec.js +22 -22
  185. package/cypress/integration/naked/activeOrders.spec.js +15 -15
  186. package/cypress/integration/naked/addressDetails.spec.js +10 -10
  187. package/cypress/integration/naked/appleLogin.spec.js +14 -14
  188. package/cypress/integration/naked/businessBasicInformation.spec.js +14 -14
  189. package/cypress/integration/naked/businessController.spec.js +9 -9
  190. package/cypress/integration/naked/businessInformation.spec.js +19 -19
  191. package/cypress/integration/naked/businessProductsSearch.spec.js +9 -9
  192. package/cypress/integration/naked/businessReviews.spec.js +16 -16
  193. package/cypress/integration/naked/businessSortControl.spec.js +9 -9
  194. package/cypress/integration/naked/businessTypeFilter.spec.js +10 -10
  195. package/cypress/integration/naked/businessesMap.spec.js +13 -13
  196. package/cypress/integration/naked/cms.spec.js +9 -9
  197. package/cypress/integration/naked/config.spec.js +34 -34
  198. package/cypress/integration/naked/driverTips.spec.js +10 -10
  199. package/cypress/integration/naked/events.spec.js +13 -13
  200. package/cypress/integration/naked/facebookLogin.spec.js +13 -13
  201. package/cypress/integration/naked/floatingButton.spec.js +13 -13
  202. package/cypress/integration/naked/forgotPassword.spec.js +20 -20
  203. package/cypress/integration/naked/googleLogin.spec.js +11 -11
  204. package/cypress/integration/naked/languageExamples.spec.js +25 -25
  205. package/cypress/integration/naked/languageSelector.spec.js +10 -10
  206. package/cypress/integration/naked/login.spec.js +38 -38
  207. package/cypress/integration/naked/logout.spec.js +15 -15
  208. package/cypress/integration/naked/mainSearch.spec.js +9 -9
  209. package/cypress/integration/naked/menuControl.spec.js +9 -9
  210. package/cypress/integration/naked/messages.spec.js +25 -25
  211. package/cypress/integration/naked/momentOption.spec.js +10 -10
  212. package/cypress/integration/naked/myOrders.spec.js +11 -11
  213. package/cypress/integration/naked/myOrdersList.spec.js +9 -9
  214. package/cypress/integration/naked/orderContextAdvanced.spec.js +23 -23
  215. package/cypress/integration/naked/orderDetails.spec.js +11 -11
  216. package/cypress/integration/naked/paymentOptionCash.spec.js +21 -21
  217. package/cypress/integration/naked/paymentOptionStripe.spec.js +11 -11
  218. package/cypress/integration/naked/paymentOptionStripeDirect.spec.js +11 -11
  219. package/cypress/integration/naked/paymentOptions.spec.js +9 -9
  220. package/cypress/integration/naked/popupExample.spec.js +17 -17
  221. package/cypress/integration/naked/productImages.spec.js +11 -11
  222. package/cypress/integration/naked/productOptionExample.spec.js +21 -21
  223. package/cypress/integration/naked/productShare.spec.js +9 -9
  224. package/cypress/integration/naked/productsList.spec.js +9 -9
  225. package/cypress/integration/naked/resetPassword.spec.js +11 -11
  226. package/cypress/integration/naked/reviewOrders.spec.js +13 -13
  227. package/cypress/integration/naked/searchOptions.spec.js +18 -18
  228. package/cypress/integration/naked/signup.spec.js +31 -31
  229. package/cypress/integration/naked/upselling.spec.js +13 -13
  230. package/cypress/integration/naked/userDetails.spec.js +12 -12
  231. package/cypress/plugins/index.js +21 -21
  232. package/cypress/support/commands.js +35 -35
  233. package/cypress/support/index.js +20 -20
  234. package/cypress.json +12 -12
  235. package/example/App.js +263 -263
  236. package/example/components/ActiveOrdersUI/index.js +72 -72
  237. package/example/components/AddressDetailsUI/index.js +101 -101
  238. package/example/components/AddressFormUI/index.js +161 -161
  239. package/example/components/AddressListUI/index.js +33 -33
  240. package/example/components/AlertPopup/index.js +10 -10
  241. package/example/components/AlertUI/index.js +49 -49
  242. package/example/components/AlertUI/style.css +5 -5
  243. package/example/components/AppleLoginUI/index.js +40 -40
  244. package/example/components/BaseComponentUI/index.js +34 -34
  245. package/example/components/BusinessBasicInformationUI/index.js +118 -118
  246. package/example/components/BusinessControllerUI/index.js +89 -89
  247. package/example/components/BusinessInformationUI/BusinessOptionUI/index.js +83 -83
  248. package/example/components/BusinessInformationUI/index.js +83 -83
  249. package/example/components/BusinessProductsCategoriesUI/index.js +42 -42
  250. package/example/components/BusinessProductsSearchUI/index.js +38 -38
  251. package/example/components/BusinessReviewsUI/index.js +77 -77
  252. package/example/components/BusinessSortControlUI/index.js +47 -47
  253. package/example/components/BusinessTypeFilterUI/index.js +53 -53
  254. package/example/components/BusinessesMapUI/index.js +57 -57
  255. package/example/components/CartUI/index.js +154 -154
  256. package/example/components/ChangeView/index.js +19 -19
  257. package/example/components/CheckoutUI/index.js +206 -206
  258. package/example/components/CmsContentUI/index.js +52 -52
  259. package/example/components/ConfigsExample/index.js +118 -118
  260. package/example/components/CouponControlUI/index.js +63 -63
  261. package/example/components/DriverTipsUI/index.js +58 -58
  262. package/example/components/FacebookLoginButtonUI/index.js +48 -48
  263. package/example/components/FloatingButtonUI/index.js +145 -145
  264. package/example/components/ForgotPasswordFormUI/index.js +93 -93
  265. package/example/components/GoogleLoginUI/index.js +30 -30
  266. package/example/components/GpsButtonUI/index.js +22 -22
  267. package/example/components/Header/index.js +18 -18
  268. package/example/components/LanguageSelectorUI/index.js +57 -57
  269. package/example/components/LanguagesExample/index.js +51 -51
  270. package/example/components/LoginFormUI/index.js +159 -159
  271. package/example/components/LogoutButtonUI/index.js +21 -21
  272. package/example/components/MainSearchUI/index.js +131 -131
  273. package/example/components/MenuControlUI/index.js +103 -103
  274. package/example/components/MessagesUI/index.js +162 -162
  275. package/example/components/ModalUI/index.js +36 -36
  276. package/example/components/ModalUI/style.css +5 -5
  277. package/example/components/MomentOptionUI/index.js +68 -68
  278. package/example/components/MyOrdersListUI/index.js +51 -51
  279. package/example/components/MyOrdersUI/index.js +52 -52
  280. package/example/components/OrderChangeUI/index.js +54 -54
  281. package/example/components/OrderDetailsUI/index.js +174 -174
  282. package/example/components/OrderReviewUI/index.js +125 -125
  283. package/example/components/OrderTypeControlUI/index.js +32 -32
  284. package/example/components/PaymentOptionCashUI/index.js +60 -60
  285. package/example/components/PaymentOptionPaypalUI/index.js +50 -50
  286. package/example/components/PaymentOptionStripeDirectUI/index.js +89 -89
  287. package/example/components/PaymentOptionStripeRedirectUI/index.js +97 -97
  288. package/example/components/PaymentOptionStripeUI/index.js +129 -129
  289. package/example/components/PaymentOptionsUI/index.js +169 -169
  290. package/example/components/PhoneAutocompleteUI/index.js +67 -67
  291. package/example/components/PhoneAutocompleteUI/styles.css +49 -49
  292. package/example/components/ProductComponentUI/index.js +113 -113
  293. package/example/components/ProductFormUI/index.js +131 -131
  294. package/example/components/ProductImagesUI/index.js +82 -82
  295. package/example/components/ProductIngredientUI/index.js +21 -21
  296. package/example/components/ProductOptionSuboptionUI/index.js +65 -65
  297. package/example/components/ProductOptionUI/index.js +31 -31
  298. package/example/components/ProductShareUI/index.js +48 -48
  299. package/example/components/ProductsListUI/index.js +108 -108
  300. package/example/components/ProductsListingUI/index.js +42 -42
  301. package/example/components/ResetPasswordUI/index.js +121 -121
  302. package/example/components/SearchOptionsUI/index.js +82 -82
  303. package/example/components/SignupFormUI/index.js +117 -117
  304. package/example/components/SingleBusinessCardUI/index.js +82 -82
  305. package/example/components/SingleOrderCardUI/index.js +52 -52
  306. package/example/components/SingleProductCardUI/index.js +47 -47
  307. package/example/components/StripeElementsFormUI/CardFormUI/index.js +51 -51
  308. package/example/components/StripeElementsFormUI/CardFormUI/style.css +118 -118
  309. package/example/components/StripeElementsFormUI/index.js +38 -38
  310. package/example/components/StripeRedirectFormUI/index.js +99 -99
  311. package/example/components/TestComponent/index.js +5 -5
  312. package/example/components/UpsellingPageUI/index.js +26 -26
  313. package/example/components/UserDetailsUI/index.js +94 -94
  314. package/example/components/UserProfileUI/index.js +156 -156
  315. package/example/views/ActiveOrders/index.js +86 -86
  316. package/example/views/AddressDetailsExample/index.js +57 -57
  317. package/example/views/AppleLoginExample/index.js +51 -51
  318. package/example/views/BaseComponentExample/index.js +35 -35
  319. package/example/views/BusinessBasicInformationExample/index.js +43 -43
  320. package/example/views/BusinessControllerExample/index.js +55 -55
  321. package/example/views/BusinessInformationExample/index.js +68 -68
  322. package/example/views/BusinessProductsCategoriesExample/index.js +50 -50
  323. package/example/views/BusinessProductsSearchExample/index.js +39 -39
  324. package/example/views/BusinessReviewsExample/index.js +43 -43
  325. package/example/views/BusinessSortControlExample/index.js +53 -53
  326. package/example/views/BusinessTypeFilterExample/index.js +53 -53
  327. package/example/views/BusinessesMapExample/index.js +57 -57
  328. package/example/views/CheckoutExample/index.js +143 -143
  329. package/example/views/CmsContentExample/index.js +44 -44
  330. package/example/views/DriverTipsExample/index.js +47 -47
  331. package/example/views/EventsExample/index.js +26 -26
  332. package/example/views/FacebookLogin/index.js +63 -63
  333. package/example/views/FloatingButtonExample/index.js +47 -47
  334. package/example/views/ForgotPassword/index.js +77 -77
  335. package/example/views/GoogleLoginExample/index.js +85 -85
  336. package/example/views/Home/index.js +200 -200
  337. package/example/views/LanguageSelectorExample/index.js +55 -55
  338. package/example/views/Login/index.js +84 -84
  339. package/example/views/MainSearchExample/index.js +43 -43
  340. package/example/views/MenuControlExample/index.js +68 -68
  341. package/example/views/MessagesExample/index.js +58 -58
  342. package/example/views/MomentOptionExample/index.js +52 -52
  343. package/example/views/MyOrdersExample/index.js +35 -35
  344. package/example/views/MyOrdersListExample/index.js +50 -50
  345. package/example/views/OrderChangeExample/index.js +46 -46
  346. package/example/views/OrderContextExample/index.js +139 -139
  347. package/example/views/OrderDetailsExample/index.js +50 -50
  348. package/example/views/OrderReviewExample/index.js +64 -64
  349. package/example/views/PaymentOptionCashExample/index.js +51 -51
  350. package/example/views/PaymentOptionPaypalExample/index.js +71 -71
  351. package/example/views/PaymentOptionStripeDirectExample/index.js +43 -43
  352. package/example/views/PaymentOptionStripeExample/index.js +47 -47
  353. package/example/views/PaymentOptionStripeRedirectExample/index.js +56 -56
  354. package/example/views/PaymentOptionsExample/index.js +47 -47
  355. package/example/views/PhoneAutocompleteExample/index.js +34 -34
  356. package/example/views/PlacesExample/index.js +94 -94
  357. package/example/views/PopupExample/index.js +78 -78
  358. package/example/views/PopupExample/style.css +18 -18
  359. package/example/views/ProductDetail/index.js +323 -323
  360. package/example/views/ProductImagesExample/index.js +43 -43
  361. package/example/views/ProductOptionExample/index.js +88 -88
  362. package/example/views/ProductShareExample/index.js +51 -51
  363. package/example/views/ProductsListExample/index.js +77 -77
  364. package/example/views/ProductsListingExample/index.js +47 -47
  365. package/example/views/ResetPasswordExample/index.js +60 -60
  366. package/example/views/SearchOptionsExample/index.js +42 -42
  367. package/example/views/SessionManager/index.js +122 -122
  368. package/example/views/Signup/index.js +64 -64
  369. package/example/views/UpsellingPageExample/index.js +35 -35
  370. package/example/views/UserDetailsExample/index.js +69 -69
  371. package/example/views/UserProfile/index.js +73 -73
  372. package/index-example.js +23 -23
  373. package/index.html +13 -13
  374. package/native/index.js +257 -257
  375. package/native/src/NativeStrategy/index.js +20 -20
  376. package/native/src/contexts/OrderingContext/index.js +85 -85
  377. package/package.json +92 -92
  378. package/src/components/AddressDetails/index.js +149 -149
  379. package/src/components/AddressForm/index.js +372 -372
  380. package/src/components/AddressList/index.js +254 -254
  381. package/src/components/Analitycs/index.js +119 -119
  382. package/src/components/AnalyticsSegment/index.js +145 -145
  383. package/src/components/AppleLogin/index.js +164 -164
  384. package/src/components/BaseComponent/index.js +52 -52
  385. package/src/components/BusinessAndProductList/index.js +986 -986
  386. package/src/components/BusinessBasicInformation/index.js +119 -119
  387. package/src/components/BusinessController/index.js +351 -351
  388. package/src/components/BusinessInformation/BusinessOption/index.js +86 -86
  389. package/src/components/BusinessInformation/index.js +93 -93
  390. package/src/components/BusinessList/index.js +670 -670
  391. package/src/components/BusinessMenuListing/index.js +99 -99
  392. package/src/components/BusinessProductsCategories/index.js +60 -60
  393. package/src/components/BusinessProductsSearch/index.js +54 -54
  394. package/src/components/BusinessReviews/index.js +187 -187
  395. package/src/components/BusinessSearchList/index.js +364 -364
  396. package/src/components/BusinessSortControl/index.js +100 -100
  397. package/src/components/BusinessTypeFilter/index.js +142 -142
  398. package/src/components/BusinessesMap/index.js +110 -110
  399. package/src/components/Cart/index.js +211 -211
  400. package/src/components/CartStoresListing/index.js +157 -157
  401. package/src/components/Checkout/index.js +636 -636
  402. package/src/components/CmsContent/index.js +97 -97
  403. package/src/components/Contacts/index.js +512 -512
  404. package/src/components/CouponControl/index.js +171 -171
  405. package/src/components/DragAndDrop/index.js +41 -41
  406. package/src/components/DriverList/index.js +112 -112
  407. package/src/components/DriverTips/index.js +141 -141
  408. package/src/components/Emitter/index.js +36 -36
  409. package/src/components/ExamineClick/index.js +40 -40
  410. package/src/components/FacebookLoginButton/index.js +214 -214
  411. package/src/components/FacebookPixel/index.js +148 -148
  412. package/src/components/FavoriteList/index.js +278 -278
  413. package/src/components/FirebaseGoogleLoginButton/index.js +93 -93
  414. package/src/components/FloatingButton/index.js +70 -70
  415. package/src/components/ForgotPasswordForm/index.js +180 -180
  416. package/src/components/GiftCard/GiftCardOrdersList/index.js +155 -155
  417. package/src/components/GiftCard/PurchaseGiftCard/index.js +127 -127
  418. package/src/components/GiftCard/RedeemGiftCard/index.js +77 -77
  419. package/src/components/GiftCard/SendGiftCard/index.js +83 -83
  420. package/src/components/GoogleAutocompleteInput/index.js +154 -154
  421. package/src/components/GoogleIdentity/index.js +144 -144
  422. package/src/components/GoogleLoginButton/index.js +276 -276
  423. package/src/components/GoogleMaps/index.js +499 -499
  424. package/src/components/GpsButton/index.js +127 -127
  425. package/src/components/LanguageSelector/index.js +163 -163
  426. package/src/components/LoginForm/index.js +527 -527
  427. package/src/components/LogoutAction/index.js +211 -211
  428. package/src/components/MainSearch/index.js +149 -149
  429. package/src/components/MapView/index.js +116 -116
  430. package/src/components/MenuControl/index.js +238 -238
  431. package/src/components/Messages/index.js +166 -166
  432. package/src/components/MomentOption/index.js +322 -322
  433. package/src/components/MultiCartCreate/index.js +70 -70
  434. package/src/components/MultiCartsPaymethodsAndWallets/index.js +201 -201
  435. package/src/components/MultiCheckout/index.js +378 -378
  436. package/src/components/MultiOrdersDetails/index.js +109 -109
  437. package/src/components/MyOrders/index.js +150 -150
  438. package/src/components/MyOrdersList/index.js +104 -104
  439. package/src/components/NewOrderNotification/index.js +30 -30
  440. package/src/components/OrderChange/index.js +128 -128
  441. package/src/components/OrderDetails/index.js +684 -684
  442. package/src/components/OrderList/index.js +814 -814
  443. package/src/components/OrderListGroups/index.js +1245 -1245
  444. package/src/components/OrderReview/index.js +180 -180
  445. package/src/components/OrderTypeControl/index.js +75 -75
  446. package/src/components/OrderVerticalList/index.js +422 -422
  447. package/src/components/OrdersControlFilters/index.js +75 -75
  448. package/src/components/OrdersDashboardComponents/Appointments/index.js +72 -72
  449. package/src/components/OrdersDashboardComponents/BusinessProductsListing/index.js +629 -629
  450. package/src/components/OrdersDashboardComponents/CheckPassword/index.js +177 -177
  451. package/src/components/OrdersDashboardComponents/CityList/index.js +98 -98
  452. package/src/components/OrdersDashboardComponents/CountryList/index.js +162 -162
  453. package/src/components/OrdersDashboardComponents/CustomOrderDetails/index.js +238 -238
  454. package/src/components/OrdersDashboardComponents/DashboardBusinessList/index.js +617 -617
  455. package/src/components/OrdersDashboardComponents/DashboardOrdersList/index.js +943 -943
  456. package/src/components/OrdersDashboardComponents/DriversList/index.js +448 -448
  457. package/src/components/OrdersDashboardComponents/ExportCSV/index.js +192 -192
  458. package/src/components/OrdersDashboardComponents/GiftCardsList/index.js +189 -189
  459. package/src/components/OrdersDashboardComponents/GoogleMapsApiKeySetting/index.js +77 -77
  460. package/src/components/OrdersDashboardComponents/LogisticInformation/index.js +97 -97
  461. package/src/components/OrdersDashboardComponents/Logistics/index.js +174 -174
  462. package/src/components/OrdersDashboardComponents/Messages/index.js +384 -384
  463. package/src/components/OrdersDashboardComponents/MetaFields/index.js +186 -186
  464. package/src/components/OrdersDashboardComponents/OrderDetails/index.js +404 -404
  465. package/src/components/OrdersDashboardComponents/OrderNotification/index.js +70 -70
  466. package/src/components/OrdersDashboardComponents/OrdersFilter/index.js +362 -362
  467. package/src/components/OrdersDashboardComponents/OrdersManage/index.js +873 -873
  468. package/src/components/OrdersDashboardComponents/PointsWalletLevels/index.js +123 -123
  469. package/src/components/OrdersDashboardComponents/ReviewCustomer/index.js +113 -113
  470. package/src/components/OrdersDashboardComponents/Schedule/index.js +315 -315
  471. package/src/components/OrdersDashboardComponents/SettingsList/index.js +298 -298
  472. package/src/components/OrdersDashboardComponents/UserFormDetails/index.js +463 -463
  473. package/src/components/OrdersDashboardComponents/UsersList/index.js +944 -944
  474. package/src/components/OrdersDashboardComponents/WebsocketStatus/index.js +77 -77
  475. package/src/components/OrdersDashboardComponents/index.js +57 -57
  476. package/src/components/PageBanner/index.js +107 -107
  477. package/src/components/PaymentOptionCash/index.js +74 -74
  478. package/src/components/PaymentOptionPaypal/index.js +146 -146
  479. package/src/components/PaymentOptionSquare/index.js +336 -336
  480. package/src/components/PaymentOptionStripe/index.js +289 -289
  481. package/src/components/PaymentOptionStripeDirect/index.js +116 -116
  482. package/src/components/PaymentOptionStripeRedirect/StripeRedirectForm/index.js +71 -71
  483. package/src/components/PaymentOptionStripeRedirect/index.js +122 -122
  484. package/src/components/PaymentOptionWallet/index.js +185 -185
  485. package/src/components/PaymentOptions/index.js +262 -262
  486. package/src/components/PaymethodList/index.js +119 -119
  487. package/src/components/PhoneAutocomplete/index.js +318 -318
  488. package/src/components/PlaceSpot/index.js +183 -183
  489. package/src/components/Popup/index.js +169 -169
  490. package/src/components/ProductComponent/index.js +269 -269
  491. package/src/components/ProductForm/index.js +1105 -1105
  492. package/src/components/ProductImages/index.js +64 -64
  493. package/src/components/ProductIngredient/index.js +72 -72
  494. package/src/components/ProductItemAccordion/index.js +72 -72
  495. package/src/components/ProductOption/index.js +42 -42
  496. package/src/components/ProductOptionSuboption/index.js +181 -181
  497. package/src/components/ProductShare/index.js +97 -97
  498. package/src/components/ProductsList/index.js +74 -74
  499. package/src/components/ProductsListing/index.js +166 -166
  500. package/src/components/ProfessionalInfo/index.js +156 -156
  501. package/src/components/PromotionsController/index.js +123 -123
  502. package/src/components/QueryLoginSpoonity/index.js +159 -159
  503. package/src/components/ReCaptcha/index.js +53 -53
  504. package/src/components/ResetPassword/index.js +111 -111
  505. package/src/components/ReviewCustomer/index.js +117 -117
  506. package/src/components/ReviewDriver/index.js +157 -157
  507. package/src/components/ReviewProduct/index.js +162 -162
  508. package/src/components/SearchOptions/index.js +69 -69
  509. package/src/components/Sessions/index.js +217 -217
  510. package/src/components/SignupForm/index.js +555 -555
  511. package/src/components/SingleBusinessCard/index.js +80 -80
  512. package/src/components/SingleOrderCard/index.js +160 -160
  513. package/src/components/SingleProductCard/index.js +130 -130
  514. package/src/components/SingleProfessionalCard/index.js +121 -121
  515. package/src/components/SmartAppBanner/index.js +71 -71
  516. package/src/components/StoreProductList/index.js +303 -303
  517. package/src/components/StripeElementsForm/CardForm/index.js +248 -248
  518. package/src/components/StripeElementsForm/index.js +78 -78
  519. package/src/components/UpsellingPage/index.js +120 -120
  520. package/src/components/UserFormDetails/index.js +742 -742
  521. package/src/components/UserVerification/index.js +242 -242
  522. package/src/components/WalletList/index.js +160 -160
  523. package/src/components/WebsocketStatus/index.js +80 -80
  524. package/src/components/WrapperGoogleMaps/index.js +67 -67
  525. package/src/constants/code-numbers.js +219 -219
  526. package/src/constants/timezones.js +427 -427
  527. package/src/contexts/ApiContext/index.js +59 -59
  528. package/src/contexts/BillingContext/index.js +28 -28
  529. package/src/contexts/BusinessContext/index.js +71 -71
  530. package/src/contexts/ConfigContext/index.js +217 -217
  531. package/src/contexts/CustomerContext/index.js +69 -69
  532. package/src/contexts/EventContext/index.js +31 -31
  533. package/src/contexts/LanguageContext/index.js +144 -144
  534. package/src/contexts/OptimizationLoadContext/index.js +95 -95
  535. package/src/contexts/OrderContext/index.js +1450 -1450
  536. package/src/contexts/OrderingContext/index.js +86 -86
  537. package/src/contexts/OrderingThemeContext/index.js +107 -107
  538. package/src/contexts/ProductContext/index.js +62 -62
  539. package/src/contexts/SessionContext/index.js +172 -172
  540. package/src/contexts/SiteContext/index.js +79 -79
  541. package/src/contexts/ToastContext/index.js +42 -42
  542. package/src/contexts/UtilsContext/index.js +352 -352
  543. package/src/contexts/ValidationsFieldsContext/index.js +65 -65
  544. package/src/contexts/WebsocketContext/index.js +91 -91
  545. package/src/contexts/WebsocketContext/socket.js +92 -92
  546. package/src/index.js +371 -371
  547. package/src/utils/index.js +32 -32
  548. package/src/webStrategy/index.js +18 -18
  549. package/webpack.dev.js +41 -41
  550. package/webpack.prod.js +64 -64
  551. package/_bundles/0.ordering-component.aa21761da1477298dd80.js +0 -1
  552. package/_bundles/7.ordering-component.aa21761da1477298dd80.js +0 -2
  553. package/_bundles/7.ordering-component.aa21761da1477298dd80.js.LICENSE.txt +0 -53
  554. package/_bundles/ordering-component.aa21761da1477298dd80.js +0 -2
@@ -1,1245 +1,1245 @@
1
- import React, { useEffect, useState, useCallback } from 'react'
2
- import { useSession } from '../../contexts/SessionContext'
3
- import { useApi } from '../../contexts/ApiContext'
4
- import { useWebsocket } from '../../contexts/WebsocketContext'
5
- import { ToastType, useToast } from '../../contexts/ToastContext'
6
- import { useLanguage } from '../../contexts/LanguageContext'
7
- import { useEvent } from '../../contexts/EventContext'
8
- import { useConfig } from '../../contexts/ConfigContext'
9
-
10
- export const OrderListGroups = (props) => {
11
- const {
12
- UIComponent,
13
- orderBy,
14
- isIos,
15
- useDefualtSessionManager,
16
- paginationSettings,
17
- asDashboard,
18
- orderGroupStatusCustom,
19
- onOrdersDeleted,
20
- customOrderTypes,
21
- customPaymethods,
22
- isDriverApp
23
- } = props
24
-
25
- const [ordering] = useApi()
26
- const socket = useWebsocket()
27
- const [session] = useSession()
28
- const [events] = useEvent()
29
- const [, t] = useLanguage()
30
- const [, { showToast }] = useToast()
31
- const [{ configs }] = useConfig()
32
-
33
- const _combineTabs = props.combineTabs ?? configs?.combine_pending_and_progress_orders?.value === '1'
34
- const [combineTabs, setCombineTabsState] = useState(_combineTabs)
35
-
36
- const isLogisticActivated = configs?.logistic_module?.value
37
- const ordersStatusArray = combineTabs ? ['active', 'completed', 'cancelled'] : ['pending', 'inProgress', 'completed', 'cancelled']
38
- const notificationStatusses = props.isDriverApp
39
- ? configs?.notification_driver_states?.value.split('|').map(value => Number(value)) || []
40
- : configs?.notification_business_states?.value.split('|').map(value => Number(value)) || []
41
- const ordersGroupStatus = {
42
- active: orderGroupStatusCustom?.active ?? [0, 3, 4, 7, 8, 9, 13, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26],
43
- pending: orderGroupStatusCustom?.pending ?? [0, 13],
44
- inProgress: orderGroupStatusCustom?.inProgress ?? [3, 4, 7, 8, 9, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26],
45
- completed: orderGroupStatusCustom?.completed ?? [1, 11, 15],
46
- cancelled: orderGroupStatusCustom?.cancelled ?? [2, 5, 6, 10, 12, 16, 17]
47
- }
48
-
49
- const orderStructure = {
50
- loading: false,
51
- error: null,
52
- orders: [],
53
- pagination: {
54
- currentPage: (paginationSettings.controlType === 'pages' && paginationSettings.initialPage && paginationSettings.initialPage >= 1)
55
- ? paginationSettings.initialPage - 1
56
- : 1,
57
- pageSize: paginationSettings.pageSize ?? 10,
58
- total: null
59
- }
60
- }
61
-
62
- let [ordersGroup, setOrdersGroup] = useState({
63
- active: {
64
- ...orderStructure,
65
- defaultFilter: ordersGroupStatus.active,
66
- currentFilter: ordersGroupStatus.active,
67
- fetched: false
68
- },
69
- pending: {
70
- ...orderStructure,
71
- defaultFilter: ordersGroupStatus.pending,
72
- currentFilter: ordersGroupStatus.pending,
73
- fetched: false
74
- },
75
- inProgress: {
76
- ...orderStructure,
77
- defaultFilter: ordersGroupStatus.inProgress,
78
- currentFilter: ordersGroupStatus.inProgress,
79
- fetched: false
80
- },
81
- completed: {
82
- ...orderStructure,
83
- defaultFilter: ordersGroupStatus.completed,
84
- currentFilter: ordersGroupStatus.completed,
85
- fetched: false
86
- },
87
- cancelled: {
88
- ...orderStructure,
89
- defaultFilter: ordersGroupStatus.cancelled,
90
- currentFilter: ordersGroupStatus.cancelled,
91
- fetched: false
92
- }
93
- })
94
- const [currentTabSelected, setCurrentTabSelected] = useState(combineTabs ? 'active' : 'pending')
95
- const [logisticOrders, setlogisticOrders] = useState({ loading: false, error: null, orders: [] })
96
- const [messages, setMessages] = useState({ loading: false, error: null, messages: [] })
97
- const [currentFilters, setCurrentFilters] = useState(null)
98
- const [filtered, setFiltered] = useState(null)
99
- const [ordersDeleted, setOrdersDeleted] = useState({ loading: false, error: null, result: [] })
100
- const [controlsState, setControlsState] = useState({ loading: true, error: null, paymethods: [] })
101
- const [businessIDs, setBusinessIDs] = useState([])
102
- const [orderLogisticAdded, setOrderLogisticAdded] = useState(null)
103
- const [orderLogisticUpdated, setOrderLogisticUpdated] = useState(null)
104
- const [recentlyReceivedMessage, setRecentlyReceivedMessage] = useState(null)
105
- const [ordersFiltered, setOrdersFiltered] = useState({
106
- orders: [],
107
- loading: false,
108
- error: null,
109
- pagination: {
110
- currentPage: (paginationSettings.controlType === 'pages' && paginationSettings.initialPage && paginationSettings.initialPage >= 1)
111
- ? paginationSettings.initialPage - 1
112
- : 0,
113
- pageSize: paginationSettings.pageSize ?? 10,
114
- total: null
115
- }
116
- })
117
-
118
- const accessToken = useDefualtSessionManager ? session.token : props.accessToken
119
- const requestsState = {}
120
-
121
- const getOrders = async ({
122
- page,
123
- pageSize = paginationSettings.pageSize,
124
- orderStatus,
125
- newFetch
126
- }) => {
127
- const options = {
128
- query: {
129
- orderBy,
130
- page: page,
131
- page_size: pageSize
132
- }
133
- }
134
- options.query.where = []
135
- if (orderStatus) {
136
- if (!filtered?.state) {
137
- options.query.where.push({ attribute: 'status', value: orderStatus })
138
- }
139
-
140
- if (ordersGroup[currentTabSelected]?.orders?.length > 0 && !newFetch) {
141
- options.query = {
142
- ...options.query,
143
- page: 1
144
- }
145
- if (!filtered?.id) {
146
- options.query.where.push({
147
- attribute: 'id',
148
- value: {
149
- condition: '!=',
150
- value: ordersGroup[currentTabSelected]?.orders?.map((o) => o.id)
151
- }
152
- })
153
- }
154
- }
155
- }
156
-
157
- if (filtered?.id) {
158
- options.query.where.push({
159
- attribute: 'id',
160
- value: {
161
- condition: 'ilike',
162
- value: isIos ? `%${filtered?.id}%` : encodeURI(`%${filtered?.id}%`)
163
- }
164
- })
165
- }
166
-
167
- if (filtered?.external_id) {
168
- options.query.where.push({
169
- attribute: 'external_id',
170
- value: {
171
- condition: 'ilike',
172
- value: isIos ? `%${filtered?.external_id}%` : encodeURI(`%${filtered?.external_id}%`)
173
- }
174
- })
175
- }
176
-
177
- if (filtered?.state) {
178
- options.query.where.push({ attribute: 'status', value: filtered.state })
179
- }
180
-
181
- if (filtered?.city) {
182
- options.query.where.push({
183
- attribute: 'business',
184
- conditions: [{
185
- attribute: 'city_id',
186
- value: filtered?.city
187
- }]
188
- })
189
- }
190
-
191
- if (filtered?.paymethod || customPaymethods) {
192
- let paymethodResult = controlsState
193
- if (!controlsState.paymethods.length) {
194
- paymethodResult = await getControls()
195
- }
196
- options.query.where.push({
197
- attribute: 'paymethod_id',
198
- value: (!!filtered?.paymethod && filtered?.paymethod) || paymethodResult?.paymethods
199
- })
200
- }
201
-
202
- if (filtered?.driver) {
203
- options.query.where.push({ attribute: 'driver_id', value: filtered?.driver })
204
- }
205
-
206
- if (filtered?.driver_groups) {
207
- options.query.where.push({ attribute: 'driver_id', value: filtered?.driver_groups?.drivers })
208
- }
209
-
210
- if (filtered?.customer?.email || filtered?.customer?.phone) {
211
- const customerOptions = []
212
- if (filtered?.customer?.email) {
213
- customerOptions.push({
214
- attribute: 'email',
215
- value: {
216
- condition: 'ilike',
217
- value: isIos ? `%${filtered?.customer?.email}%` : encodeURI(`%${filtered?.customer?.email}%`)
218
- }
219
- })
220
- }
221
- if (filtered?.customer?.phone) {
222
- customerOptions.push({
223
- attribute: 'cellphone',
224
- value: {
225
- condition: 'ilike',
226
- value: isIos ? `%${filtered?.customer?.phone}%` : encodeURI(`%${filtered?.customer?.phone}%`)
227
- }
228
- })
229
- }
230
-
231
- options.query.where.push({
232
- attribute: 'customer',
233
- conditions: customerOptions
234
- })
235
- }
236
-
237
- if (filtered?.delivery_type || customOrderTypes) {
238
- options.query.where.push({
239
- attribute: 'delivery_type',
240
- value: (!!filtered?.delivery_type && filtered?.delivery_type) || customOrderTypes
241
- })
242
- }
243
-
244
- if (filtered?.date?.from) {
245
- options.query.where.push({
246
- attribute: 'delivery_datetime',
247
- value: {
248
- condition: '>=',
249
- value: filtered?.date?.from
250
- }
251
- })
252
- }
253
- if (filtered?.date?.to) {
254
- options.query.where.push({
255
- attribute: 'delivery_datetime',
256
- value: {
257
- condition: '<=',
258
- value: filtered?.date?.to
259
- }
260
- })
261
- }
262
-
263
- if (filtered?.timeStatus) {
264
- options.query.where.push({
265
- attribute: 'time_status',
266
- value: filtered?.timeStatus
267
- })
268
- }
269
-
270
- if (!isDriverApp) {
271
- options.query.where.push({
272
- attribute: 'products',
273
- conditions: [{
274
- attribute: 'type',
275
- value: {
276
- condition: '=',
277
- value: 'item'
278
- }
279
- }]
280
- })
281
- }
282
-
283
- const source = {}
284
- requestsState.orders = source
285
- options.cancelToken = source
286
-
287
- const functionFetch = asDashboard
288
- ? ordering.setAccessToken(accessToken).orders().asDashboard()
289
- : ordering.setAccessToken(accessToken).orders()
290
- return await functionFetch.get(options)
291
- }
292
-
293
- const getControls = async () => {
294
- try {
295
- setControlsState({ ...controlsState, loading: true })
296
- const { content: { error, result } } = await ordering
297
- .setAccessToken(accessToken)
298
- .controls()
299
- .get()
300
- const obj = {
301
- ...controlsState,
302
- loading: false,
303
- paymethods: result?.paymethods
304
- ?.filter((p) => customPaymethods?.includes(p.name))
305
- ?.map((pay) => pay.id),
306
- error: error ? result : null
307
- }
308
- setControlsState(obj)
309
- return obj
310
- } catch (e) {
311
- setControlsState({
312
- ...controlsState,
313
- loading: false,
314
- error: e?.message ? controlsState.error?.push(e?.message) : ['ERROR']
315
- })
316
- }
317
- }
318
-
319
- const loadOrders = async ({ newFetch, newFetchCurrent } = {}, options = {}) => {
320
- if (
321
- !(newFetch || newFetchCurrent) &&
322
- ordersGroup[currentTabSelected].pagination.currentPage === ordersGroup[currentTabSelected].pagination.totalPages &&
323
- ordersGroup[currentTabSelected].pagination.total !== null
324
- ) {
325
- return
326
- }
327
-
328
- if (newFetch) {
329
- ordersStatusArray?.map(tab => {
330
- ordersGroup = {
331
- ...ordersGroup,
332
- [tab]: {
333
- ...orderStructure,
334
- defaultFilter: ordersGroupStatus[tab],
335
- currentFilter: ordersGroup[tab].currentFilter,
336
- orders: ordersGroup[tab].orders
337
- }
338
- }
339
- })
340
- } else if (newFetchCurrent) {
341
- ordersGroup = {
342
- ...ordersGroup,
343
- [currentTabSelected]: {
344
- ...orderStructure,
345
- defaultFilter: ordersGroupStatus[currentTabSelected],
346
- currentFilter: ordersGroup[currentTabSelected]?.currentFilter
347
- }
348
- }
349
- }
350
-
351
- const pageSize = paginationSettings.pageSize
352
-
353
- try {
354
- if (options?.allStatusses) {
355
- setOrdersFiltered({
356
- ...ordersFiltered,
357
- loading: true
358
- })
359
- } else {
360
- setOrdersGroup({
361
- ...ordersGroup,
362
- [currentTabSelected]: {
363
- ...ordersGroup[currentTabSelected],
364
- loading: true
365
- }
366
- })
367
- }
368
- const { content: { error, result, pagination } } = await getOrders({
369
- page: 1,
370
- pageSize,
371
- orderStatus: options?.allStatusses ? null : ordersGroup[currentTabSelected]?.currentFilter,
372
- newFetch: (newFetch || newFetchCurrent)
373
- })
374
- const _ordersCleaned = error
375
- ? (newFetch || newFetchCurrent)
376
- ? []
377
- : sortOrders(ordersGroup[currentTabSelected]?.orders)
378
- : (newFetch || newFetchCurrent)
379
- ? sortOrders(result)
380
- : sortOrders(ordersGroup[currentTabSelected]?.orders.concat(result))
381
-
382
- if (options?.allStatusses) {
383
- setOrdersFiltered({
384
- error,
385
- orders: formatOrdersGrouped(_ordersCleaned, { allStatusses: true }),
386
- pagination: {
387
- ...ordersFiltered.pagination,
388
- currentPage: pagination.current_page,
389
- pageSize: pagination.page_size,
390
- totalPages: pagination.total_pages,
391
- total: pagination.total,
392
- from: pagination.from,
393
- to: pagination.to
394
- },
395
- loading: false
396
- })
397
- return
398
- }
399
-
400
- setOrdersGroup({
401
- ...ordersGroup,
402
- [currentTabSelected]: {
403
- ...ordersGroup[currentTabSelected],
404
- loading: false,
405
- orders: _ordersCleaned,
406
- error: error ? result : null,
407
- fetched: true,
408
- pagination: {
409
- ...ordersGroup[currentTabSelected].pagination,
410
- currentPage: pagination.current_page,
411
- pageSize: pagination.page_size,
412
- totalPages: pagination.total_pages,
413
- total: pagination.total,
414
- from: pagination.from,
415
- to: pagination.to
416
- }
417
- }
418
- })
419
- } catch (err) {
420
- if (err.constructor.name !== 'Cancel') {
421
- if (options?.allStatusses) {
422
- setOrdersFiltered({
423
- ...ordersFiltered,
424
- loading: false,
425
- error: [err?.message ?? 'ERROR']
426
- })
427
- } else {
428
- setOrdersGroup({
429
- ...ordersGroup,
430
- [currentTabSelected]: {
431
- ...ordersGroup[currentTabSelected],
432
- loading: false,
433
- error: [err?.message ?? 'ERROR']
434
- }
435
- })
436
- }
437
- }
438
- }
439
- }
440
-
441
- const loadMoreOrders = async (options = {}) => {
442
- if (!options?.allStatusses) {
443
- setOrdersGroup({
444
- ...ordersGroup,
445
- [currentTabSelected]: {
446
- ...ordersGroup[currentTabSelected],
447
- loading: true
448
- }
449
- })
450
- } else {
451
- setOrdersFiltered({
452
- ...ordersFiltered,
453
- loading: true
454
- })
455
- }
456
- try {
457
- const { content: { error, result, pagination } } = await getOrders({
458
- page: options?.allStatusses ? ordersFiltered.pagination.currentPage + 1 : ordersGroup[currentTabSelected].pagination.currentPage + 1,
459
- orderStatus: options?.allStatusses ? null : ordersGroup[currentTabSelected]?.currentFilter,
460
- newFetch: true
461
- })
462
-
463
- if (options?.allStatusses) {
464
- setOrdersFiltered({
465
- error,
466
- orders: formatOrdersGrouped([
467
- ...ordersFiltered?.orders,
468
- ...sortOrders(result)
469
- ], { allStatusses: true }),
470
- pagination: {
471
- ...ordersFiltered.pagination,
472
- currentPage: pagination.current_page,
473
- pageSize: pagination.page_size,
474
- totalPages: pagination.total_pages,
475
- total: pagination.total,
476
- from: pagination.from,
477
- to: pagination.to
478
- },
479
- loading: false
480
- })
481
- return
482
- }
483
-
484
- const _ordersCleaned = error
485
- ? sortOrders(ordersGroup[currentTabSelected]?.orders)
486
- : sortOrders(ordersGroup[currentTabSelected]?.orders?.concat(result))
487
- setOrdersGroup({
488
- ...ordersGroup,
489
- [currentTabSelected]: {
490
- ...ordersGroup[currentTabSelected],
491
- loading: false,
492
- orders: _ordersCleaned,
493
- error: error ? result : null,
494
- pagination: !error
495
- ? {
496
- ...ordersGroup[currentTabSelected].pagination,
497
- currentPage: pagination.current_page,
498
- pageSize: pagination.page_size,
499
- totalPages: pagination.total_pages,
500
- total: pagination.total,
501
- from: pagination.from,
502
- to: pagination.to
503
- }
504
- : ordersGroup[currentTabSelected].pagination
505
- }
506
- })
507
- } catch (err) {
508
- if (err.constructor.name !== 'Cancel') {
509
- setOrdersGroup({
510
- ...ordersGroup,
511
- [currentTabSelected]: {
512
- ...ordersGroup[currentTabSelected],
513
- loading: false,
514
- error: [err?.message ?? 'ERROR']
515
- }
516
- })
517
- }
518
- }
519
- }
520
-
521
- const loadMessages = async (orderId) => {
522
- try {
523
- setMessages({ ...messages, loading: true })
524
- const url = `${ordering.root}/orders/${orderId}/messages?mode=dashboard`
525
-
526
- const response = await fetch(url, {
527
- method: 'GET',
528
- headers: {
529
- 'Content-Type': 'application/json',
530
- Authorization: `Bearer ${accessToken}`,
531
- 'X-App-X': ordering.appId,
532
- 'X-Socket-Id-X': socket?.getId()
533
- }
534
- })
535
- const { error, result } = await response.json()
536
- if (!error) {
537
- setMessages({
538
- messages: result,
539
- loading: false,
540
- error: null
541
- })
542
- } else {
543
- setMessages({
544
- ...messages,
545
- loading: false,
546
- error: result
547
- })
548
- }
549
- } catch (error) {
550
- setMessages({ ...messages, loading: false, error: [error.Messages] })
551
- }
552
- }
553
-
554
- const deleteOrders = async (orderIds) => {
555
- try {
556
- setOrdersDeleted({ ...ordersDeleted, loading: true })
557
- const errorState = []
558
-
559
- if (orderIds.length === 1) {
560
- const { content: { error } } = await ordering.setAccessToken(accessToken).orders(orderIds[0]).delete()
561
- errorState.push({ error, id: orderIds[0] })
562
- } else if (orderIds.length > 1) {
563
- for (const id of orderIds) {
564
- const { content: { error: multiError } } = await ordering.setAccessToken(accessToken).orders(id).delete()
565
- errorState.push({ error: multiError, id })
566
- }
567
- }
568
-
569
- const isError = errorState.some((e) => e.error)
570
- const idsDeleted = errorState?.map((obj) => !obj.error && obj.id)
571
-
572
- onOrdersDeleted && onOrdersDeleted({ isError, list: idsDeleted })
573
- setOrdersDeleted({ ...ordersDeleted, loading: false })
574
- setOrdersGroup({
575
- ...ordersGroup,
576
- [currentTabSelected]: {
577
- ...ordersGroup[currentTabSelected],
578
- orders: idsDeleted.length
579
- ? sortOrders(ordersGroup[currentTabSelected]?.orders?.filter((order) => !idsDeleted.includes(order.id)))
580
- : sortOrders(ordersGroup[currentTabSelected]?.orders)
581
- }
582
- })
583
- } catch (err) {
584
- if (err.constructor.name !== 'Cancel') {
585
- setOrdersGroup({
586
- ...ordersGroup,
587
- [currentTabSelected]: {
588
- ...ordersGroup[currentTabSelected],
589
- loading: false,
590
- error: [err?.message ?? 'ERROR']
591
- }
592
- })
593
- }
594
- }
595
- }
596
-
597
- const loadLogisticOrders = async (isAlreadyFetched) => {
598
- try {
599
- setlogisticOrders({ ...logisticOrders, loading: true })
600
- const url = `${ordering.root}/drivers/${session.user?.id}/assign_requests`
601
- const response = await fetch(url, {
602
- method: 'GET',
603
- headers: {
604
- 'Content-Type': 'application/json',
605
- Authorization: `Bearer ${accessToken}`,
606
- 'X-App-X': ordering.appId,
607
- 'X-Socket-Id-X': socket?.getId()
608
- }
609
- })
610
- const { result, error } = await response.json()
611
- if (!error) {
612
- setlogisticOrders({ ...logisticOrders, loading: false, orders: result.filter(order => !(order?.order_group && order?.order_group?.orders?.length === 0)) })
613
- return
614
- }
615
- setlogisticOrders({ loading: false, orders: [], error: result })
616
- } catch (err) {
617
- setlogisticOrders({ loading: false, orders: [], error: err.message })
618
- }
619
- }
620
-
621
- const sortOrders = (orders, sortBy = 'desc') => {
622
- const ordersSorted = orders?.sort((a, b) => {
623
- if (sortBy === 'desc') {
624
- return b.id - a.id
625
- }
626
- return a.id - b.id
627
- })
628
-
629
- return ordersSorted
630
- }
631
-
632
- const filterByIdUnique = (array) => {
633
- if (!array) return []
634
-
635
- const tempObj = {}
636
- const status = ordersGroupStatus[currentTabSelected] ?? []
637
-
638
- return array.map((element) => {
639
- if (Array.isArray(element)) {
640
- const _array = element[0][1].map((item) => {
641
- if (!tempObj[item.id] && status.includes(item.status)) {
642
- tempObj[item.id] = true
643
- return item
644
- }
645
- return null
646
- }).filter((item) => item !== null)
647
- return _array.length ? [[_array[0]?.cart_group_id.toString(), _array]] : null
648
- } else {
649
- if (!tempObj[element.id] && status.includes(element.status)) {
650
- tempObj[element.id] = true
651
- return element
652
- }
653
- return null
654
- }
655
- }).filter((item) => Array.isArray(item) ? item.length : item)
656
- }
657
-
658
- const formatOrdersGrouped = (orders, options = {}) => {
659
- let totalOrders = orders
660
- const ordersGroupids = []
661
-
662
- totalOrders = totalOrders
663
- ?.map(item => {
664
- if (!item?.cart_group_id) return item
665
-
666
- const groupIds = totalOrders.filter(o => o.cart_group_id === item?.cart_group_id)
667
- const _item = !ordersGroupids.includes(item?.cart_group_id)
668
- ? Object.entries({ [item?.cart_group_id]: groupIds }) : ''
669
-
670
- if (_item) ordersGroupids.push(item?.cart_group_id)
671
- return _item
672
- }).filter(item => item)
673
- return options?.allStatusses ? totalOrders : filterByIdUnique(totalOrders)
674
- }
675
-
676
- const getStatusById = (id) => {
677
- if (!id && id !== 0) return
678
- const active = orderGroupStatusCustom?.active ?? [0, 3, 4, 7, 8, 9, 13, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26]
679
- const pending = orderGroupStatusCustom?.pending ?? [0, 13]
680
- const inProgress = orderGroupStatusCustom?.inProgress ?? [3, 4, 7, 8, 9, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26]
681
- const completed = orderGroupStatusCustom?.completed ?? [1, 11, 15]
682
- // const cancelled = orderGroupStatusCustom?.cancelled ?? [2, 5, 6, 10, 12, 16, 17]
683
-
684
- const status = pending.includes(id)
685
- ? 'pending'
686
- : inProgress.includes(id)
687
- ? 'inProgress'
688
- : completed.includes(id)
689
- ? 'completed'
690
- : 'cancelled'
691
-
692
- const combinedStatus = active.includes(id)
693
- ? 'active'
694
- : completed.includes(id)
695
- ? 'completed'
696
- : 'cancelled'
697
-
698
- return combineTabs ? combinedStatus : status
699
- }
700
-
701
- const actionOrderToTab = (orderAux, status, type) => {
702
- const orderList = ordersGroup[status]?.orders
703
- let orders
704
- const order = {
705
- ...orderAux,
706
- showNotification: true
707
- }
708
- if (type === 'update') {
709
- const indexToUpdate = orderList.findIndex((o) => o.id === order.id)
710
- orderList[indexToUpdate] = { ...order, action: type + order?.status }
711
- orders = orderList
712
- } else {
713
- orders = type === 'add'
714
- ? [{ ...order, action: type + order?.status }, ...orderList]
715
- : orderList.filter((_order) => _order.id !== order.id)
716
- }
717
- let _pagination = ordersGroup[status].pagination
718
- if (type !== 'update') {
719
- _pagination = {
720
- ...ordersGroup[status].pagination,
721
- total: ordersGroup[status].pagination.total + (type === 'add' ? 1 : -1)
722
- }
723
- }
724
- setOrdersGroup((prevState) => ({
725
- ...prevState,
726
- orders: filterByIdUnique(sortOrders(orders)),
727
- [status]: {
728
- ...prevState[status],
729
- orders: sortOrders(orders),
730
- pagination: _pagination
731
- },
732
- pagination: _pagination
733
- }))
734
- }
735
-
736
- const handleClickOrder = (orderAux) => {
737
- const order = {
738
- ...orderAux,
739
- showNotification: false
740
- }
741
- const ordersGroups = order?.order_group?.orders
742
- if (!ordersGroups) {
743
- const status = getStatusById(order?.status)
744
- const orderList = ordersGroup[status]?.orders
745
- const indexToUpdate = orderList?.findIndex((o) => o?.id === order?.id)
746
- orderList[indexToUpdate] = order
747
- setOrdersGroup({
748
- ...ordersGroup,
749
- [status]: {
750
- ...ordersGroup[status],
751
- orders: sortOrders(orderList)
752
- }
753
- })
754
- } else {
755
- const status = getStatusById(order?.order_group?.orders?.[0]?.status)
756
- let orderList
757
- ordersGroups?.map(order => {
758
- orderList = ordersGroup[status]?.orders
759
- const indexToUpdate = orderList?.findIndex((o) => o?.id === order?.id)
760
- orderList[indexToUpdate] = order
761
- })
762
- setOrdersGroup({
763
- ...ordersGroup,
764
- [status]: {
765
- ...ordersGroup[status],
766
- orders: sortOrders(orderList)
767
- }
768
- })
769
- }
770
- }
771
-
772
- const handleClickLogisticOrder = async (status, orderId) => {
773
- try {
774
- const response = await fetch(`${ordering.root}/drivers/${session.user?.id}/assign_requests/${orderId}`, {
775
- method: 'PUT',
776
- headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` },
777
- body: JSON.stringify({
778
- status,
779
- user_id: session.user?.id
780
- })
781
- })
782
- const { result, error } = await response.json()
783
- if (!error) {
784
- const order = logisticOrders?.orders?.find(order => order?.id === orderId)
785
- const newOrders = sortOrders(logisticOrders?.orders?.filter(_order => _order?.id !== orderId))
786
- setlogisticOrders({ ...logisticOrders, orders: newOrders })
787
- if (status === 1) {
788
- handleClickOrder(order?.order ?? order)
789
- showToast(
790
- ToastType.Success,
791
- t('SPECIFIC_ORDER_ACCEPTED', 'Your accepted the order number _NUMBER_').replace('_NUMBER_', order?.order?.id ?? order?.id)
792
- )
793
- } else {
794
- showToast(
795
- ToastType.Info,
796
- t('SPECIFIC_ORDER_REJECTED', 'Your rejected the order number _NUMBER_').replace('_NUMBER_', order?.order?.id ?? order?.id)
797
- )
798
- }
799
- return
800
- }
801
- showToast(ToastType.Error, result)
802
- } catch (err) {
803
- setlogisticOrders({ ...logisticOrders, error: err.message })
804
- showToast(ToastType.Error, err.message)
805
- }
806
- }
807
-
808
- const handleChangeOrderStatus = async (status, orderIds, body = {}) => {
809
- try {
810
- delete body.id
811
- const bodyToSend = Object.keys(body || {}).length > 0 ? body : { status }
812
- const setOrderStatus = async (id) => {
813
- try {
814
- const { content: { result, error } } = await ordering.setAccessToken(session?.token).orders(id).save({ ...bodyToSend, id })
815
- return error ? null : result
816
- } catch {
817
- return null
818
- }
819
- }
820
-
821
- const result = await Promise.all(orderIds?.map(id => setOrderStatus(id)))
822
- return result
823
- } catch (err) {
824
- return err?.message ?? err
825
- }
826
- }
827
-
828
- const handleSendCustomerReview = async ({ customerId, orderIds, body, onClose }) => {
829
- try {
830
- const setCustomerReview = async (body) => {
831
- try {
832
- const response = await fetch(`${ordering.root}/users/${customerId}/user_reviews`, {
833
- method: 'POST',
834
- headers: {
835
- Authorization: `Bearer ${session.token}`,
836
- 'Content-Type': 'application/json',
837
- 'X-App-X': ordering.appId,
838
- 'X-Socket-Id-X': socket?.getId()
839
- },
840
- body: JSON.stringify(body)
841
- })
842
- const { result, error } = await response.json()
843
- return error ? null : result
844
- } catch (err) {
845
- return null
846
- }
847
- }
848
-
849
- const result = await Promise.all(orderIds?.map(id => setCustomerReview({ ...body, order_id: id, user_id: customerId })))
850
- if (result?.length) {
851
- const orders = ordersGroup[currentTabSelected].orders
852
- result?.map(order => {
853
- let orderFound = orders.find(o => o.id === order.order_id)
854
- const idxOrderFound = orders.findIndex(o => o.id === order.order_id)
855
-
856
- if (orderFound) {
857
- orderFound = { ...orderFound, user_review: order }
858
- orders[idxOrderFound] = orderFound
859
- setOrdersGroup({ ...ordersGroup, orders })
860
- }
861
- })
862
- showToast(
863
- ToastType.Success,
864
- t('ORDERS_SUCCESSFULLY_REVIEWED', 'Orders successfully reviewed')
865
- )
866
- }
867
- onClose && onClose()
868
- return result
869
- } catch (err) {
870
- return err?.message ?? err
871
- }
872
- }
873
-
874
- const getBusinessesIDs = async () => {
875
- const propsToFetch = ['id', 'name']
876
- try {
877
- const { content: { error, result } } = await ordering.businesses().asDashboard().select(propsToFetch).get()
878
- if (!error) {
879
- const _businessIDs = result.length > 0 && result.map(({ id }) => id)
880
- setBusinessIDs(_businessIDs)
881
- }
882
- } catch (err) {
883
- if (err.constructor.name !== 'Cancel') {
884
- setOrdersGroup({
885
- ...ordersGroup,
886
- [currentTabSelected]: {
887
- ...ordersGroup[currentTabSelected],
888
- loading: false,
889
- error: [err?.message ?? 'ERROR']
890
- }
891
- })
892
- }
893
- }
894
- }
895
-
896
- useEffect(() => {
897
- if (session?.user?.level !== 2) return
898
- getBusinessesIDs()
899
- }, [])
900
-
901
- useEffect(() => {
902
- setCurrentFilters(ordersGroup[currentTabSelected]?.currentFilter)
903
- if (currentTabSelected === 'logisticOrders') {
904
- loadLogisticOrders(!!logisticOrders?.orders)
905
- } else if (!ordersGroup[currentTabSelected]?.fetched && props.isNetConnected) {
906
- loadOrders({ newFetchCurrent: true })
907
- }
908
- }, [currentTabSelected, props.isNetConnected])
909
-
910
- useEffect(() => {
911
- if (currentFilters && !isDriverApp) {
912
- loadOrders({ newFetchCurrent: true })
913
- }
914
- }, [currentFilters])
915
-
916
- useEffect(() => {
917
- if (!filtered) return
918
- loadOrders({ newFetch: true }, { allStatusses: true })
919
- }, [filtered])
920
-
921
- const handleActionEvent = (event, value) => {
922
- const evts = {
923
- order_added: 'order_added_notification',
924
- update_order: 'order_updated_notification',
925
- messages: 'message_added_notification',
926
- request_register: 'request_register_notification',
927
- request_update: 'request_update_notification'
928
- }
929
- events.emit(evts[event], value)
930
- }
931
-
932
- useEffect(() => {
933
- if (!socket?.socket) return
934
- const handleUpdateOrder = (order) => {
935
- const isGiftCard = order?.products?.some(product => product?.type === 'gift_card')
936
- if (isGiftCard && !isDriverApp) return
937
- if (session?.user?.level === 2 && businessIDs.length > 0 && !businessIDs.includes(order.business_id)) return
938
- events.emit('order_updated', order)
939
- let orderFound = null
940
- for (let i = 0; i < ordersStatusArray.length; i++) {
941
- const status = ordersStatusArray[i]
942
- if (order?.products) {
943
- orderFound = ordersGroup[status]?.orders?.find((_order) => _order.id === order.id)
944
- }
945
- if (orderFound) break
946
- }
947
- if (notificationStatusses.includes(order?.status)) {
948
- showToast(
949
- ToastType.Info,
950
- t('SPECIFIC_ORDER_UPDATED', 'Your order number _NUMBER_ has updated').replace('_NUMBER_', order.id),
951
- 1000
952
- )
953
- }
954
-
955
- if (!orderFound) {
956
- if (
957
- !order?.products ||
958
- !order?.summary ||
959
- typeof order?.status !== 'number' ||
960
- !order?.customer ||
961
- !order?.business ||
962
- ((!order?.paymethod && !order?.payment_events?.some(e => e.event === 'payment')) && order?.total !== 0)
963
- ) {
964
- return
965
- }
966
- delete order.total
967
- delete order.subtotal
968
- const currentFilter = ordersGroup[getStatusById(order?.status) ?? '']?.currentFilter
969
- !currentFilter.includes(order.status)
970
- ? actionOrderToTab(order, getStatusById(order?.status), 'remove')
971
- : actionOrderToTab(order, getStatusById(order?.status), 'add')
972
-
973
- return
974
- }
975
-
976
- if (
977
- orderFound.id === order.id &&
978
- orderFound?.driver?.id !== order?.driver?.id &&
979
- session?.user?.level === 4
980
- ) {
981
- actionOrderToTab(orderFound, getStatusById(orderFound.status), 'remove')
982
- }
983
-
984
- if (orderFound.id === order.id) {
985
- delete order.total
986
- delete order.subtotal
987
- }
988
-
989
- if (!order?.status && order?.status !== 0) {
990
- Object.assign(orderFound, order)
991
- } else {
992
- const newOrderStatus = getStatusById(order?.status) ?? ''
993
- const currentOrderStatus = getStatusById(orderFound?.status) ?? ''
994
-
995
- const currentFilter = ordersGroup[newOrderStatus]?.currentFilter
996
- Object.assign(orderFound, order)
997
-
998
- if (newOrderStatus !== currentOrderStatus) {
999
- actionOrderToTab(orderFound, currentOrderStatus, 'remove')
1000
-
1001
- const total = ordersGroup[newOrderStatus].pagination.total ?? null
1002
-
1003
- if (
1004
- currentFilter.includes(orderFound.status) &&
1005
- total !== null
1006
- ) {
1007
- actionOrderToTab(orderFound, newOrderStatus, 'add')
1008
- }
1009
- } else {
1010
- !currentFilter.includes(orderFound.status) || (orderFound?.driver === null && isDriverApp)
1011
- ? actionOrderToTab(orderFound, newOrderStatus, 'remove')
1012
- : actionOrderToTab(orderFound, newOrderStatus, 'update')
1013
- }
1014
- }
1015
- }
1016
-
1017
- const handleAddNewOrder = (order) => {
1018
- const isGiftCard = order?.products?.some(product => product?.type === 'gift_card')
1019
- if (isGiftCard && !isDriverApp) return
1020
- events.emit('order_added', order)
1021
- handleActionEvent('order_added', order)
1022
- if (notificationStatusses.includes(order?.status)) {
1023
- showToast(
1024
- ToastType.Info,
1025
- t('SPECIFIC_ORDER_ORDERED', 'Order _NUMBER_ has been ordered').replace('_NUMBER_', order.id),
1026
- 1000
1027
- )
1028
- }
1029
- const status = getStatusById(order?.status) ?? ''
1030
- actionOrderToTab(order, status, 'add')
1031
- }
1032
-
1033
- const handleReceiveMessage = (message) => {
1034
- if (message?.id !== recentlyReceivedMessage?.id) {
1035
- handleActionEvent('messages', message)
1036
- setRecentlyReceivedMessage(message)
1037
- }
1038
- }
1039
- socket.on('orders_register', handleAddNewOrder)
1040
- socket.on('order_assigned', handleAddNewOrder)
1041
- socket.on('update_order', handleUpdateOrder)
1042
- socket.on('message', handleReceiveMessage)
1043
-
1044
- return () => {
1045
- socket.off('orders_register', handleAddNewOrder)
1046
- socket.off('order_assigned', handleAddNewOrder)
1047
- socket.off('update_order', handleUpdateOrder)
1048
- socket.off('message', handleReceiveMessage)
1049
- }
1050
- }, [JSON.stringify(ordersGroup), socket?.socket, session])
1051
-
1052
- const handleAddAssignRequest = useCallback(
1053
- (order) => {
1054
- setOrderLogisticAdded(order)
1055
- const isSameEvent = orderLogisticAdded?.id === order?.id && orderLogisticAdded.status === order?.status
1056
- if (!order?.locked && !isSameEvent) {
1057
- handleActionEvent('request_register', order)
1058
- }
1059
- setlogisticOrders((prevState) => ({
1060
- ...prevState,
1061
- orders: sortOrders([...prevState?.orders, order].filter((order, index, hash) => { // remove possibles duplicates
1062
- const val = JSON.stringify(order)
1063
- return index === hash.findIndex(_order => {
1064
- return JSON.stringify(_order) === val
1065
- })
1066
- }))
1067
- }))
1068
- showToast(
1069
- ToastType.Info,
1070
- t('SPECIFIC_LOGISTIC_ORDER_ORDERED', 'Logisitc order _NUMBER_ has been ordered').replace('_NUMBER_', order?.order?.id ?? order.id),
1071
- 1000
1072
- )
1073
- },
1074
- [logisticOrders]
1075
- )
1076
-
1077
- const handleDeleteAssignRequest = useCallback(
1078
- (order) => {
1079
- setlogisticOrders(prevState => ({
1080
- ...prevState,
1081
- orders: prevState?.orders?.some(_order => _order?.id === order?.id)
1082
- ? sortOrders([...prevState?.orders?.filter(_order => _order?.id !== order?.id), { ...prevState?.orders?.find(_order => _order?.id === order?.id), expired: true }])
1083
- : sortOrders(prevState?.orders)
1084
- }))
1085
- },
1086
- [logisticOrders]
1087
- )
1088
-
1089
- const handleUpdateAssignRequest = useCallback(
1090
- (order) => {
1091
- setOrderLogisticUpdated(order)
1092
- const isSameEvent = orderLogisticUpdated?.id === order?.id && orderLogisticUpdated.status === order?.status
1093
- if (!order?.locked && !isSameEvent) {
1094
- handleActionEvent('request_update', order)
1095
- }
1096
- setlogisticOrders(prevState => ({
1097
- ...prevState,
1098
- orders: prevState?.orders?.some(_order => _order?.id === order?.id)
1099
- ? sortOrders([...prevState?.orders?.filter(_order => _order?.id !== order?.id), { ...prevState?.orders?.find(_order => _order?.id === order?.id), ...order }])
1100
- : sortOrders(prevState?.orders)
1101
- }))
1102
- showToast(
1103
- ToastType.Info,
1104
- t('SPECIFIC_LOGISTIC_ORDER_UPDATED', 'Your logisitc order number _NUMBER_ has updated').replace('_NUMBER_', order?.order?.id ?? order.id),
1105
- 1000
1106
- )
1107
- },
1108
- [logisticOrders]
1109
- )
1110
-
1111
- useEffect(() => {
1112
- if (isLogisticActivated) {
1113
- socket.on('request_register', handleAddAssignRequest)
1114
- socket.on('request_update', handleUpdateAssignRequest)
1115
- socket.on('request_cancel', handleDeleteAssignRequest)
1116
- }
1117
- return () => {
1118
- socket.off('request_register')
1119
- socket.off('request_update')
1120
- socket.off('request_cancel')
1121
- }
1122
- }, [socket, session, isLogisticActivated])
1123
-
1124
- useEffect(() => {
1125
- if (!session.user) return
1126
-
1127
- const userId = session.user.id
1128
- const userLevel = session.user.level
1129
-
1130
- const ordersRoom = !isDriverApp
1131
- ? {
1132
- project: ordering.project,
1133
- room: 'orders',
1134
- user_id: userId,
1135
- role: 'manager'
1136
- }
1137
- : userLevel === 0
1138
- ? 'orders'
1139
- : `orders_${userId}`
1140
-
1141
- const requestsRoom = `requests_${userId}`
1142
- const groupsRoom = `ordergroups_${userId}`
1143
- const messagesOrdersRoom = userLevel === 0 ? 'messages_orders' : `messages_orders_${userId}`
1144
- const joinRooms = () => {
1145
- socket.join(ordersRoom)
1146
- socket.join(requestsRoom)
1147
- socket.join(groupsRoom)
1148
- socket.join(messagesOrdersRoom)
1149
- }
1150
-
1151
- const leaveRooms = () => {
1152
- socket.leave(ordersRoom)
1153
- socket.leave(requestsRoom)
1154
- socket.leave(groupsRoom)
1155
- socket.leave(messagesOrdersRoom)
1156
- }
1157
-
1158
- socket.on('disconnect', joinRooms)
1159
-
1160
- joinRooms()
1161
-
1162
- return () => {
1163
- leaveRooms()
1164
- socket.off('disconnect', joinRooms)
1165
- }
1166
- }, [socket, session])
1167
-
1168
- useEffect(() => {
1169
- const request = requestsState?.orders
1170
- return () => {
1171
- request && request.cancel && request.cancel()
1172
- }
1173
- }, [requestsState?.orders])
1174
-
1175
- useEffect(() => {
1176
- const handleCustomerReviewed = (review) => {
1177
- let orderFound = null
1178
- for (let i = 0; i < ordersStatusArray.length; i++) {
1179
- const status = ordersStatusArray[i]
1180
- orderFound = ordersGroup[status]?.orders?.find((_order) => _order.id === review.order_id)
1181
- if (orderFound) break
1182
- }
1183
- if (orderFound) {
1184
- const newOrderStatus = getStatusById(orderFound?.status) ?? ''
1185
- orderFound.user_review = review
1186
- actionOrderToTab(orderFound, newOrderStatus, 'update')
1187
- }
1188
- }
1189
- events.on('customer_reviewed', handleCustomerReviewed)
1190
- return () => {
1191
- events.off('customer_reviewed', handleCustomerReviewed)
1192
- }
1193
- }, [ordersGroup])
1194
-
1195
- useEffect(() => {
1196
- setCurrentTabSelected(combineTabs ? 'active' : 'pending')
1197
- }, [combineTabs])
1198
-
1199
- return (
1200
- <>
1201
- {UIComponent && (
1202
- <UIComponent
1203
- {...props}
1204
- currentFilters={currentFilters}
1205
- setCurrentFilters={setCurrentFilters}
1206
- currentTabSelected={currentTabSelected}
1207
- setCurrentTabSelected={setCurrentTabSelected}
1208
- ordersGroup={ordersGroup}
1209
- setOrdersGroup={setOrdersGroup}
1210
- logisticOrders={logisticOrders}
1211
- messages={messages}
1212
- setCombineTabsState={setCombineTabsState}
1213
- ordersDeleted={ordersDeleted}
1214
- setOrdersDeleted={setOrdersDeleted}
1215
- setMessages={setMessages}
1216
- loadOrders={loadOrders}
1217
- loadLogisticOrders={loadLogisticOrders}
1218
- deleteOrders={deleteOrders}
1219
- loadMessages={loadMessages}
1220
- loadMoreOrders={loadMoreOrders}
1221
- handleClickOrder={handleClickOrder}
1222
- handleClickLogisticOrder={handleClickLogisticOrder}
1223
- filtered={filtered}
1224
- onFiltered={setFiltered}
1225
- handleChangeOrderStatus={handleChangeOrderStatus}
1226
- handleSendCustomerReview={handleSendCustomerReview}
1227
- ordersFormatted={formatOrdersGrouped(ordersGroup[currentTabSelected]?.orders)}
1228
- isLogisticActivated={isLogisticActivated}
1229
- ordersFiltered={ordersFiltered}
1230
- />
1231
- )}
1232
- </>
1233
- )
1234
- }
1235
-
1236
- OrderListGroups.defaultProps = {
1237
- orderBy: '-id',
1238
- orderDirection: 'desc',
1239
- isNetConnected: true,
1240
- paginationSettings: { initialPage: 1, pageSize: 10, controlType: 'infinity' },
1241
- beforeComponents: [],
1242
- afterComponents: [],
1243
- beforeElements: [],
1244
- afterElements: []
1245
- }
1
+ import React, { useEffect, useState, useCallback } from 'react'
2
+ import { useSession } from '../../contexts/SessionContext'
3
+ import { useApi } from '../../contexts/ApiContext'
4
+ import { useWebsocket } from '../../contexts/WebsocketContext'
5
+ import { ToastType, useToast } from '../../contexts/ToastContext'
6
+ import { useLanguage } from '../../contexts/LanguageContext'
7
+ import { useEvent } from '../../contexts/EventContext'
8
+ import { useConfig } from '../../contexts/ConfigContext'
9
+
10
+ export const OrderListGroups = (props) => {
11
+ const {
12
+ UIComponent,
13
+ orderBy,
14
+ isIos,
15
+ useDefualtSessionManager,
16
+ paginationSettings,
17
+ asDashboard,
18
+ orderGroupStatusCustom,
19
+ onOrdersDeleted,
20
+ customOrderTypes,
21
+ customPaymethods,
22
+ isDriverApp
23
+ } = props
24
+
25
+ const [ordering] = useApi()
26
+ const socket = useWebsocket()
27
+ const [session] = useSession()
28
+ const [events] = useEvent()
29
+ const [, t] = useLanguage()
30
+ const [, { showToast }] = useToast()
31
+ const [{ configs }] = useConfig()
32
+
33
+ const _combineTabs = props.combineTabs ?? configs?.combine_pending_and_progress_orders?.value === '1'
34
+ const [combineTabs, setCombineTabsState] = useState(_combineTabs)
35
+
36
+ const isLogisticActivated = configs?.logistic_module?.value
37
+ const ordersStatusArray = combineTabs ? ['active', 'completed', 'cancelled'] : ['pending', 'inProgress', 'completed', 'cancelled']
38
+ const notificationStatusses = props.isDriverApp
39
+ ? configs?.notification_driver_states?.value.split('|').map(value => Number(value)) || []
40
+ : configs?.notification_business_states?.value.split('|').map(value => Number(value)) || []
41
+ const ordersGroupStatus = {
42
+ active: orderGroupStatusCustom?.active ?? [0, 3, 4, 7, 8, 9, 13, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26],
43
+ pending: orderGroupStatusCustom?.pending ?? [0, 13],
44
+ inProgress: orderGroupStatusCustom?.inProgress ?? [3, 4, 7, 8, 9, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26],
45
+ completed: orderGroupStatusCustom?.completed ?? [1, 11, 15],
46
+ cancelled: orderGroupStatusCustom?.cancelled ?? [2, 5, 6, 10, 12, 16, 17]
47
+ }
48
+
49
+ const orderStructure = {
50
+ loading: false,
51
+ error: null,
52
+ orders: [],
53
+ pagination: {
54
+ currentPage: (paginationSettings.controlType === 'pages' && paginationSettings.initialPage && paginationSettings.initialPage >= 1)
55
+ ? paginationSettings.initialPage - 1
56
+ : 1,
57
+ pageSize: paginationSettings.pageSize ?? 10,
58
+ total: null
59
+ }
60
+ }
61
+
62
+ let [ordersGroup, setOrdersGroup] = useState({
63
+ active: {
64
+ ...orderStructure,
65
+ defaultFilter: ordersGroupStatus.active,
66
+ currentFilter: ordersGroupStatus.active,
67
+ fetched: false
68
+ },
69
+ pending: {
70
+ ...orderStructure,
71
+ defaultFilter: ordersGroupStatus.pending,
72
+ currentFilter: ordersGroupStatus.pending,
73
+ fetched: false
74
+ },
75
+ inProgress: {
76
+ ...orderStructure,
77
+ defaultFilter: ordersGroupStatus.inProgress,
78
+ currentFilter: ordersGroupStatus.inProgress,
79
+ fetched: false
80
+ },
81
+ completed: {
82
+ ...orderStructure,
83
+ defaultFilter: ordersGroupStatus.completed,
84
+ currentFilter: ordersGroupStatus.completed,
85
+ fetched: false
86
+ },
87
+ cancelled: {
88
+ ...orderStructure,
89
+ defaultFilter: ordersGroupStatus.cancelled,
90
+ currentFilter: ordersGroupStatus.cancelled,
91
+ fetched: false
92
+ }
93
+ })
94
+ const [currentTabSelected, setCurrentTabSelected] = useState(combineTabs ? 'active' : 'pending')
95
+ const [logisticOrders, setlogisticOrders] = useState({ loading: false, error: null, orders: [] })
96
+ const [messages, setMessages] = useState({ loading: false, error: null, messages: [] })
97
+ const [currentFilters, setCurrentFilters] = useState(null)
98
+ const [filtered, setFiltered] = useState(null)
99
+ const [ordersDeleted, setOrdersDeleted] = useState({ loading: false, error: null, result: [] })
100
+ const [controlsState, setControlsState] = useState({ loading: true, error: null, paymethods: [] })
101
+ const [businessIDs, setBusinessIDs] = useState([])
102
+ const [orderLogisticAdded, setOrderLogisticAdded] = useState(null)
103
+ const [orderLogisticUpdated, setOrderLogisticUpdated] = useState(null)
104
+ const [recentlyReceivedMessage, setRecentlyReceivedMessage] = useState(null)
105
+ const [ordersFiltered, setOrdersFiltered] = useState({
106
+ orders: [],
107
+ loading: false,
108
+ error: null,
109
+ pagination: {
110
+ currentPage: (paginationSettings.controlType === 'pages' && paginationSettings.initialPage && paginationSettings.initialPage >= 1)
111
+ ? paginationSettings.initialPage - 1
112
+ : 0,
113
+ pageSize: paginationSettings.pageSize ?? 10,
114
+ total: null
115
+ }
116
+ })
117
+
118
+ const accessToken = useDefualtSessionManager ? session.token : props.accessToken
119
+ const requestsState = {}
120
+
121
+ const getOrders = async ({
122
+ page,
123
+ pageSize = paginationSettings.pageSize,
124
+ orderStatus,
125
+ newFetch
126
+ }) => {
127
+ const options = {
128
+ query: {
129
+ orderBy,
130
+ page: page,
131
+ page_size: pageSize
132
+ }
133
+ }
134
+ options.query.where = []
135
+ if (orderStatus) {
136
+ if (!filtered?.state) {
137
+ options.query.where.push({ attribute: 'status', value: orderStatus })
138
+ }
139
+
140
+ if (ordersGroup[currentTabSelected]?.orders?.length > 0 && !newFetch) {
141
+ options.query = {
142
+ ...options.query,
143
+ page: 1
144
+ }
145
+ if (!filtered?.id) {
146
+ options.query.where.push({
147
+ attribute: 'id',
148
+ value: {
149
+ condition: '!=',
150
+ value: ordersGroup[currentTabSelected]?.orders?.map((o) => o.id)
151
+ }
152
+ })
153
+ }
154
+ }
155
+ }
156
+
157
+ if (filtered?.id) {
158
+ options.query.where.push({
159
+ attribute: 'id',
160
+ value: {
161
+ condition: 'ilike',
162
+ value: isIos ? `%${filtered?.id}%` : encodeURI(`%${filtered?.id}%`)
163
+ }
164
+ })
165
+ }
166
+
167
+ if (filtered?.external_id) {
168
+ options.query.where.push({
169
+ attribute: 'external_id',
170
+ value: {
171
+ condition: 'ilike',
172
+ value: isIos ? `%${filtered?.external_id}%` : encodeURI(`%${filtered?.external_id}%`)
173
+ }
174
+ })
175
+ }
176
+
177
+ if (filtered?.state) {
178
+ options.query.where.push({ attribute: 'status', value: filtered.state })
179
+ }
180
+
181
+ if (filtered?.city) {
182
+ options.query.where.push({
183
+ attribute: 'business',
184
+ conditions: [{
185
+ attribute: 'city_id',
186
+ value: filtered?.city
187
+ }]
188
+ })
189
+ }
190
+
191
+ if (filtered?.paymethod || customPaymethods) {
192
+ let paymethodResult = controlsState
193
+ if (!controlsState.paymethods.length) {
194
+ paymethodResult = await getControls()
195
+ }
196
+ options.query.where.push({
197
+ attribute: 'paymethod_id',
198
+ value: (!!filtered?.paymethod && filtered?.paymethod) || paymethodResult?.paymethods
199
+ })
200
+ }
201
+
202
+ if (filtered?.driver) {
203
+ options.query.where.push({ attribute: 'driver_id', value: filtered?.driver })
204
+ }
205
+
206
+ if (filtered?.driver_groups) {
207
+ options.query.where.push({ attribute: 'driver_id', value: filtered?.driver_groups?.drivers })
208
+ }
209
+
210
+ if (filtered?.customer?.email || filtered?.customer?.phone) {
211
+ const customerOptions = []
212
+ if (filtered?.customer?.email) {
213
+ customerOptions.push({
214
+ attribute: 'email',
215
+ value: {
216
+ condition: 'ilike',
217
+ value: isIos ? `%${filtered?.customer?.email}%` : encodeURI(`%${filtered?.customer?.email}%`)
218
+ }
219
+ })
220
+ }
221
+ if (filtered?.customer?.phone) {
222
+ customerOptions.push({
223
+ attribute: 'cellphone',
224
+ value: {
225
+ condition: 'ilike',
226
+ value: isIos ? `%${filtered?.customer?.phone}%` : encodeURI(`%${filtered?.customer?.phone}%`)
227
+ }
228
+ })
229
+ }
230
+
231
+ options.query.where.push({
232
+ attribute: 'customer',
233
+ conditions: customerOptions
234
+ })
235
+ }
236
+
237
+ if (filtered?.delivery_type || customOrderTypes) {
238
+ options.query.where.push({
239
+ attribute: 'delivery_type',
240
+ value: (!!filtered?.delivery_type && filtered?.delivery_type) || customOrderTypes
241
+ })
242
+ }
243
+
244
+ if (filtered?.date?.from) {
245
+ options.query.where.push({
246
+ attribute: 'delivery_datetime',
247
+ value: {
248
+ condition: '>=',
249
+ value: filtered?.date?.from
250
+ }
251
+ })
252
+ }
253
+ if (filtered?.date?.to) {
254
+ options.query.where.push({
255
+ attribute: 'delivery_datetime',
256
+ value: {
257
+ condition: '<=',
258
+ value: filtered?.date?.to
259
+ }
260
+ })
261
+ }
262
+
263
+ if (filtered?.timeStatus) {
264
+ options.query.where.push({
265
+ attribute: 'time_status',
266
+ value: filtered?.timeStatus
267
+ })
268
+ }
269
+
270
+ if (!isDriverApp) {
271
+ options.query.where.push({
272
+ attribute: 'products',
273
+ conditions: [{
274
+ attribute: 'type',
275
+ value: {
276
+ condition: '=',
277
+ value: 'item'
278
+ }
279
+ }]
280
+ })
281
+ }
282
+
283
+ const source = {}
284
+ requestsState.orders = source
285
+ options.cancelToken = source
286
+
287
+ const functionFetch = asDashboard
288
+ ? ordering.setAccessToken(accessToken).orders().asDashboard()
289
+ : ordering.setAccessToken(accessToken).orders()
290
+ return await functionFetch.get(options)
291
+ }
292
+
293
+ const getControls = async () => {
294
+ try {
295
+ setControlsState({ ...controlsState, loading: true })
296
+ const { content: { error, result } } = await ordering
297
+ .setAccessToken(accessToken)
298
+ .controls()
299
+ .get()
300
+ const obj = {
301
+ ...controlsState,
302
+ loading: false,
303
+ paymethods: result?.paymethods
304
+ ?.filter((p) => customPaymethods?.includes(p.name))
305
+ ?.map((pay) => pay.id),
306
+ error: error ? result : null
307
+ }
308
+ setControlsState(obj)
309
+ return obj
310
+ } catch (e) {
311
+ setControlsState({
312
+ ...controlsState,
313
+ loading: false,
314
+ error: e?.message ? controlsState.error?.push(e?.message) : ['ERROR']
315
+ })
316
+ }
317
+ }
318
+
319
+ const loadOrders = async ({ newFetch, newFetchCurrent } = {}, options = {}) => {
320
+ if (
321
+ !(newFetch || newFetchCurrent) &&
322
+ ordersGroup[currentTabSelected].pagination.currentPage === ordersGroup[currentTabSelected].pagination.totalPages &&
323
+ ordersGroup[currentTabSelected].pagination.total !== null
324
+ ) {
325
+ return
326
+ }
327
+
328
+ if (newFetch) {
329
+ ordersStatusArray?.map(tab => {
330
+ ordersGroup = {
331
+ ...ordersGroup,
332
+ [tab]: {
333
+ ...orderStructure,
334
+ defaultFilter: ordersGroupStatus[tab],
335
+ currentFilter: ordersGroup[tab].currentFilter,
336
+ orders: ordersGroup[tab].orders
337
+ }
338
+ }
339
+ })
340
+ } else if (newFetchCurrent) {
341
+ ordersGroup = {
342
+ ...ordersGroup,
343
+ [currentTabSelected]: {
344
+ ...orderStructure,
345
+ defaultFilter: ordersGroupStatus[currentTabSelected],
346
+ currentFilter: ordersGroup[currentTabSelected]?.currentFilter
347
+ }
348
+ }
349
+ }
350
+
351
+ const pageSize = paginationSettings.pageSize
352
+
353
+ try {
354
+ if (options?.allStatusses) {
355
+ setOrdersFiltered({
356
+ ...ordersFiltered,
357
+ loading: true
358
+ })
359
+ } else {
360
+ setOrdersGroup({
361
+ ...ordersGroup,
362
+ [currentTabSelected]: {
363
+ ...ordersGroup[currentTabSelected],
364
+ loading: true
365
+ }
366
+ })
367
+ }
368
+ const { content: { error, result, pagination } } = await getOrders({
369
+ page: 1,
370
+ pageSize,
371
+ orderStatus: options?.allStatusses ? null : ordersGroup[currentTabSelected]?.currentFilter,
372
+ newFetch: (newFetch || newFetchCurrent)
373
+ })
374
+ const _ordersCleaned = error
375
+ ? (newFetch || newFetchCurrent)
376
+ ? []
377
+ : sortOrders(ordersGroup[currentTabSelected]?.orders)
378
+ : (newFetch || newFetchCurrent)
379
+ ? sortOrders(result)
380
+ : sortOrders(ordersGroup[currentTabSelected]?.orders.concat(result))
381
+
382
+ if (options?.allStatusses) {
383
+ setOrdersFiltered({
384
+ error,
385
+ orders: formatOrdersGrouped(_ordersCleaned, { allStatusses: true }),
386
+ pagination: {
387
+ ...ordersFiltered.pagination,
388
+ currentPage: pagination.current_page,
389
+ pageSize: pagination.page_size,
390
+ totalPages: pagination.total_pages,
391
+ total: pagination.total,
392
+ from: pagination.from,
393
+ to: pagination.to
394
+ },
395
+ loading: false
396
+ })
397
+ return
398
+ }
399
+
400
+ setOrdersGroup({
401
+ ...ordersGroup,
402
+ [currentTabSelected]: {
403
+ ...ordersGroup[currentTabSelected],
404
+ loading: false,
405
+ orders: _ordersCleaned,
406
+ error: error ? result : null,
407
+ fetched: true,
408
+ pagination: {
409
+ ...ordersGroup[currentTabSelected].pagination,
410
+ currentPage: pagination.current_page,
411
+ pageSize: pagination.page_size,
412
+ totalPages: pagination.total_pages,
413
+ total: pagination.total,
414
+ from: pagination.from,
415
+ to: pagination.to
416
+ }
417
+ }
418
+ })
419
+ } catch (err) {
420
+ if (err.constructor.name !== 'Cancel') {
421
+ if (options?.allStatusses) {
422
+ setOrdersFiltered({
423
+ ...ordersFiltered,
424
+ loading: false,
425
+ error: [err?.message ?? 'ERROR']
426
+ })
427
+ } else {
428
+ setOrdersGroup({
429
+ ...ordersGroup,
430
+ [currentTabSelected]: {
431
+ ...ordersGroup[currentTabSelected],
432
+ loading: false,
433
+ error: [err?.message ?? 'ERROR']
434
+ }
435
+ })
436
+ }
437
+ }
438
+ }
439
+ }
440
+
441
+ const loadMoreOrders = async (options = {}) => {
442
+ if (!options?.allStatusses) {
443
+ setOrdersGroup({
444
+ ...ordersGroup,
445
+ [currentTabSelected]: {
446
+ ...ordersGroup[currentTabSelected],
447
+ loading: true
448
+ }
449
+ })
450
+ } else {
451
+ setOrdersFiltered({
452
+ ...ordersFiltered,
453
+ loading: true
454
+ })
455
+ }
456
+ try {
457
+ const { content: { error, result, pagination } } = await getOrders({
458
+ page: options?.allStatusses ? ordersFiltered.pagination.currentPage + 1 : ordersGroup[currentTabSelected].pagination.currentPage + 1,
459
+ orderStatus: options?.allStatusses ? null : ordersGroup[currentTabSelected]?.currentFilter,
460
+ newFetch: true
461
+ })
462
+
463
+ if (options?.allStatusses) {
464
+ setOrdersFiltered({
465
+ error,
466
+ orders: formatOrdersGrouped([
467
+ ...ordersFiltered?.orders,
468
+ ...sortOrders(result)
469
+ ], { allStatusses: true }),
470
+ pagination: {
471
+ ...ordersFiltered.pagination,
472
+ currentPage: pagination.current_page,
473
+ pageSize: pagination.page_size,
474
+ totalPages: pagination.total_pages,
475
+ total: pagination.total,
476
+ from: pagination.from,
477
+ to: pagination.to
478
+ },
479
+ loading: false
480
+ })
481
+ return
482
+ }
483
+
484
+ const _ordersCleaned = error
485
+ ? sortOrders(ordersGroup[currentTabSelected]?.orders)
486
+ : sortOrders(ordersGroup[currentTabSelected]?.orders?.concat(result))
487
+ setOrdersGroup({
488
+ ...ordersGroup,
489
+ [currentTabSelected]: {
490
+ ...ordersGroup[currentTabSelected],
491
+ loading: false,
492
+ orders: _ordersCleaned,
493
+ error: error ? result : null,
494
+ pagination: !error
495
+ ? {
496
+ ...ordersGroup[currentTabSelected].pagination,
497
+ currentPage: pagination.current_page,
498
+ pageSize: pagination.page_size,
499
+ totalPages: pagination.total_pages,
500
+ total: pagination.total,
501
+ from: pagination.from,
502
+ to: pagination.to
503
+ }
504
+ : ordersGroup[currentTabSelected].pagination
505
+ }
506
+ })
507
+ } catch (err) {
508
+ if (err.constructor.name !== 'Cancel') {
509
+ setOrdersGroup({
510
+ ...ordersGroup,
511
+ [currentTabSelected]: {
512
+ ...ordersGroup[currentTabSelected],
513
+ loading: false,
514
+ error: [err?.message ?? 'ERROR']
515
+ }
516
+ })
517
+ }
518
+ }
519
+ }
520
+
521
+ const loadMessages = async (orderId) => {
522
+ try {
523
+ setMessages({ ...messages, loading: true })
524
+ const url = `${ordering.root}/orders/${orderId}/messages?mode=dashboard`
525
+
526
+ const response = await fetch(url, {
527
+ method: 'GET',
528
+ headers: {
529
+ 'Content-Type': 'application/json',
530
+ Authorization: `Bearer ${accessToken}`,
531
+ 'X-App-X': ordering.appId,
532
+ 'X-Socket-Id-X': socket?.getId()
533
+ }
534
+ })
535
+ const { error, result } = await response.json()
536
+ if (!error) {
537
+ setMessages({
538
+ messages: result,
539
+ loading: false,
540
+ error: null
541
+ })
542
+ } else {
543
+ setMessages({
544
+ ...messages,
545
+ loading: false,
546
+ error: result
547
+ })
548
+ }
549
+ } catch (error) {
550
+ setMessages({ ...messages, loading: false, error: [error.Messages] })
551
+ }
552
+ }
553
+
554
+ const deleteOrders = async (orderIds) => {
555
+ try {
556
+ setOrdersDeleted({ ...ordersDeleted, loading: true })
557
+ const errorState = []
558
+
559
+ if (orderIds.length === 1) {
560
+ const { content: { error } } = await ordering.setAccessToken(accessToken).orders(orderIds[0]).delete()
561
+ errorState.push({ error, id: orderIds[0] })
562
+ } else if (orderIds.length > 1) {
563
+ for (const id of orderIds) {
564
+ const { content: { error: multiError } } = await ordering.setAccessToken(accessToken).orders(id).delete()
565
+ errorState.push({ error: multiError, id })
566
+ }
567
+ }
568
+
569
+ const isError = errorState.some((e) => e.error)
570
+ const idsDeleted = errorState?.map((obj) => !obj.error && obj.id)
571
+
572
+ onOrdersDeleted && onOrdersDeleted({ isError, list: idsDeleted })
573
+ setOrdersDeleted({ ...ordersDeleted, loading: false })
574
+ setOrdersGroup({
575
+ ...ordersGroup,
576
+ [currentTabSelected]: {
577
+ ...ordersGroup[currentTabSelected],
578
+ orders: idsDeleted.length
579
+ ? sortOrders(ordersGroup[currentTabSelected]?.orders?.filter((order) => !idsDeleted.includes(order.id)))
580
+ : sortOrders(ordersGroup[currentTabSelected]?.orders)
581
+ }
582
+ })
583
+ } catch (err) {
584
+ if (err.constructor.name !== 'Cancel') {
585
+ setOrdersGroup({
586
+ ...ordersGroup,
587
+ [currentTabSelected]: {
588
+ ...ordersGroup[currentTabSelected],
589
+ loading: false,
590
+ error: [err?.message ?? 'ERROR']
591
+ }
592
+ })
593
+ }
594
+ }
595
+ }
596
+
597
+ const loadLogisticOrders = async (isAlreadyFetched) => {
598
+ try {
599
+ setlogisticOrders({ ...logisticOrders, loading: true })
600
+ const url = `${ordering.root}/drivers/${session.user?.id}/assign_requests`
601
+ const response = await fetch(url, {
602
+ method: 'GET',
603
+ headers: {
604
+ 'Content-Type': 'application/json',
605
+ Authorization: `Bearer ${accessToken}`,
606
+ 'X-App-X': ordering.appId,
607
+ 'X-Socket-Id-X': socket?.getId()
608
+ }
609
+ })
610
+ const { result, error } = await response.json()
611
+ if (!error) {
612
+ setlogisticOrders({ ...logisticOrders, loading: false, orders: result.filter(order => !(order?.order_group && order?.order_group?.orders?.length === 0)) })
613
+ return
614
+ }
615
+ setlogisticOrders({ loading: false, orders: [], error: result })
616
+ } catch (err) {
617
+ setlogisticOrders({ loading: false, orders: [], error: err.message })
618
+ }
619
+ }
620
+
621
+ const sortOrders = (orders, sortBy = 'desc') => {
622
+ const ordersSorted = orders?.sort((a, b) => {
623
+ if (sortBy === 'desc') {
624
+ return b.id - a.id
625
+ }
626
+ return a.id - b.id
627
+ })
628
+
629
+ return ordersSorted
630
+ }
631
+
632
+ const filterByIdUnique = (array, currentTabSelected) => {
633
+ if (!array) return []
634
+
635
+ const tempObj = {}
636
+ const status = ordersGroupStatus[currentTabSelected] ?? []
637
+
638
+ return array.map((element) => {
639
+ if (Array.isArray(element)) {
640
+ const _array = element[0][1].map((item) => {
641
+ if (!tempObj[item.id] && status.includes(item.status)) {
642
+ tempObj[item.id] = true
643
+ return item
644
+ }
645
+ return null
646
+ }).filter((item) => item !== null)
647
+ return _array.length ? [[_array[0]?.cart_group_id.toString(), _array]] : null
648
+ } else {
649
+ if (!tempObj[element.id] && status.includes(element.status)) {
650
+ tempObj[element.id] = true
651
+ return element
652
+ }
653
+ return null
654
+ }
655
+ }).filter((item) => Array.isArray(item) ? item.length : item)
656
+ }
657
+
658
+ const formatOrdersGrouped = (orders, options = {}) => {
659
+ let totalOrders = orders
660
+ const ordersGroupids = []
661
+
662
+ totalOrders = totalOrders
663
+ ?.map(item => {
664
+ if (!item?.cart_group_id) return item
665
+
666
+ const groupIds = totalOrders.filter(o => o.cart_group_id === item?.cart_group_id)
667
+ const _item = !ordersGroupids.includes(item?.cart_group_id)
668
+ ? Object.entries({ [item?.cart_group_id]: groupIds }) : ''
669
+
670
+ if (_item) ordersGroupids.push(item?.cart_group_id)
671
+ return _item
672
+ }).filter(item => item)
673
+ return options?.allStatusses ? totalOrders : filterByIdUnique(totalOrders, currentTabSelected)
674
+ }
675
+
676
+ const getStatusById = (id) => {
677
+ if (!id && id !== 0) return
678
+ const active = orderGroupStatusCustom?.active ?? [0, 3, 4, 7, 8, 9, 13, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26]
679
+ const pending = orderGroupStatusCustom?.pending ?? [0, 13]
680
+ const inProgress = orderGroupStatusCustom?.inProgress ?? [3, 4, 7, 8, 9, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26]
681
+ const completed = orderGroupStatusCustom?.completed ?? [1, 11, 15]
682
+ // const cancelled = orderGroupStatusCustom?.cancelled ?? [2, 5, 6, 10, 12, 16, 17]
683
+
684
+ const status = pending.includes(id)
685
+ ? 'pending'
686
+ : inProgress.includes(id)
687
+ ? 'inProgress'
688
+ : completed.includes(id)
689
+ ? 'completed'
690
+ : 'cancelled'
691
+
692
+ const combinedStatus = active.includes(id)
693
+ ? 'active'
694
+ : completed.includes(id)
695
+ ? 'completed'
696
+ : 'cancelled'
697
+
698
+ return combineTabs ? combinedStatus : status
699
+ }
700
+
701
+ const actionOrderToTab = (orderAux, status, type) => {
702
+ const orderList = ordersGroup[status]?.orders
703
+ let orders
704
+ const order = {
705
+ ...orderAux,
706
+ showNotification: true
707
+ }
708
+ if (type === 'update') {
709
+ const indexToUpdate = orderList.findIndex((o) => o.id === order.id)
710
+ orderList[indexToUpdate] = { ...order, action: type + order?.status }
711
+ orders = orderList
712
+ } else {
713
+ orders = type === 'add'
714
+ ? [{ ...order, action: type + order?.status }, ...orderList]
715
+ : orderList.filter((_order) => _order.id !== order.id)
716
+ }
717
+ let _pagination = ordersGroup[status].pagination
718
+ if (type !== 'update') {
719
+ _pagination = {
720
+ ...ordersGroup[status].pagination,
721
+ total: ordersGroup[status].pagination.total + (type === 'add' ? 1 : -1)
722
+ }
723
+ }
724
+ setOrdersGroup((prevState) => ({
725
+ ...prevState,
726
+ orders: filterByIdUnique(sortOrders(orders), status),
727
+ [status]: {
728
+ ...prevState[status],
729
+ orders: sortOrders(orders),
730
+ pagination: _pagination
731
+ },
732
+ pagination: _pagination
733
+ }))
734
+ }
735
+
736
+ const handleClickOrder = (orderAux) => {
737
+ const order = {
738
+ ...orderAux,
739
+ showNotification: false
740
+ }
741
+ const ordersGroups = order?.order_group?.orders
742
+ if (!ordersGroups) {
743
+ const status = getStatusById(order?.status)
744
+ const orderList = ordersGroup[status]?.orders
745
+ const indexToUpdate = orderList?.findIndex((o) => o?.id === order?.id)
746
+ orderList[indexToUpdate] = order
747
+ setOrdersGroup({
748
+ ...ordersGroup,
749
+ [status]: {
750
+ ...ordersGroup[status],
751
+ orders: sortOrders(orderList)
752
+ }
753
+ })
754
+ } else {
755
+ const status = getStatusById(order?.order_group?.orders?.[0]?.status)
756
+ let orderList
757
+ ordersGroups?.map(order => {
758
+ orderList = ordersGroup[status]?.orders
759
+ const indexToUpdate = orderList?.findIndex((o) => o?.id === order?.id)
760
+ orderList[indexToUpdate] = order
761
+ })
762
+ setOrdersGroup({
763
+ ...ordersGroup,
764
+ [status]: {
765
+ ...ordersGroup[status],
766
+ orders: sortOrders(orderList)
767
+ }
768
+ })
769
+ }
770
+ }
771
+
772
+ const handleClickLogisticOrder = async (status, orderId) => {
773
+ try {
774
+ const response = await fetch(`${ordering.root}/drivers/${session.user?.id}/assign_requests/${orderId}`, {
775
+ method: 'PUT',
776
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` },
777
+ body: JSON.stringify({
778
+ status,
779
+ user_id: session.user?.id
780
+ })
781
+ })
782
+ const { result, error } = await response.json()
783
+ if (!error) {
784
+ const order = logisticOrders?.orders?.find(order => order?.id === orderId)
785
+ const newOrders = sortOrders(logisticOrders?.orders?.filter(_order => _order?.id !== orderId))
786
+ setlogisticOrders({ ...logisticOrders, orders: newOrders })
787
+ if (status === 1) {
788
+ handleClickOrder(order?.order ?? order)
789
+ showToast(
790
+ ToastType.Success,
791
+ t('SPECIFIC_ORDER_ACCEPTED', 'Your accepted the order number _NUMBER_').replace('_NUMBER_', order?.order?.id ?? order?.id)
792
+ )
793
+ } else {
794
+ showToast(
795
+ ToastType.Info,
796
+ t('SPECIFIC_ORDER_REJECTED', 'Your rejected the order number _NUMBER_').replace('_NUMBER_', order?.order?.id ?? order?.id)
797
+ )
798
+ }
799
+ return
800
+ }
801
+ showToast(ToastType.Error, result)
802
+ } catch (err) {
803
+ setlogisticOrders({ ...logisticOrders, error: err.message })
804
+ showToast(ToastType.Error, err.message)
805
+ }
806
+ }
807
+
808
+ const handleChangeOrderStatus = async (status, orderIds, body = {}) => {
809
+ try {
810
+ delete body.id
811
+ const bodyToSend = Object.keys(body || {}).length > 0 ? body : { status }
812
+ const setOrderStatus = async (id) => {
813
+ try {
814
+ const { content: { result, error } } = await ordering.setAccessToken(session?.token).orders(id).save({ ...bodyToSend, id })
815
+ return error ? null : result
816
+ } catch {
817
+ return null
818
+ }
819
+ }
820
+
821
+ const result = await Promise.all(orderIds?.map(id => setOrderStatus(id)))
822
+ return result
823
+ } catch (err) {
824
+ return err?.message ?? err
825
+ }
826
+ }
827
+
828
+ const handleSendCustomerReview = async ({ customerId, orderIds, body, onClose }) => {
829
+ try {
830
+ const setCustomerReview = async (body) => {
831
+ try {
832
+ const response = await fetch(`${ordering.root}/users/${customerId}/user_reviews`, {
833
+ method: 'POST',
834
+ headers: {
835
+ Authorization: `Bearer ${session.token}`,
836
+ 'Content-Type': 'application/json',
837
+ 'X-App-X': ordering.appId,
838
+ 'X-Socket-Id-X': socket?.getId()
839
+ },
840
+ body: JSON.stringify(body)
841
+ })
842
+ const { result, error } = await response.json()
843
+ return error ? null : result
844
+ } catch (err) {
845
+ return null
846
+ }
847
+ }
848
+
849
+ const result = await Promise.all(orderIds?.map(id => setCustomerReview({ ...body, order_id: id, user_id: customerId })))
850
+ if (result?.length) {
851
+ const orders = ordersGroup[currentTabSelected].orders
852
+ result?.map(order => {
853
+ let orderFound = orders.find(o => o.id === order.order_id)
854
+ const idxOrderFound = orders.findIndex(o => o.id === order.order_id)
855
+
856
+ if (orderFound) {
857
+ orderFound = { ...orderFound, user_review: order }
858
+ orders[idxOrderFound] = orderFound
859
+ setOrdersGroup({ ...ordersGroup, orders })
860
+ }
861
+ })
862
+ showToast(
863
+ ToastType.Success,
864
+ t('ORDERS_SUCCESSFULLY_REVIEWED', 'Orders successfully reviewed')
865
+ )
866
+ }
867
+ onClose && onClose()
868
+ return result
869
+ } catch (err) {
870
+ return err?.message ?? err
871
+ }
872
+ }
873
+
874
+ const getBusinessesIDs = async () => {
875
+ const propsToFetch = ['id', 'name']
876
+ try {
877
+ const { content: { error, result } } = await ordering.businesses().asDashboard().select(propsToFetch).get()
878
+ if (!error) {
879
+ const _businessIDs = result.length > 0 && result.map(({ id }) => id)
880
+ setBusinessIDs(_businessIDs)
881
+ }
882
+ } catch (err) {
883
+ if (err.constructor.name !== 'Cancel') {
884
+ setOrdersGroup({
885
+ ...ordersGroup,
886
+ [currentTabSelected]: {
887
+ ...ordersGroup[currentTabSelected],
888
+ loading: false,
889
+ error: [err?.message ?? 'ERROR']
890
+ }
891
+ })
892
+ }
893
+ }
894
+ }
895
+
896
+ useEffect(() => {
897
+ if (session?.user?.level !== 2) return
898
+ getBusinessesIDs()
899
+ }, [])
900
+
901
+ useEffect(() => {
902
+ setCurrentFilters(ordersGroup[currentTabSelected]?.currentFilter)
903
+ if (currentTabSelected === 'logisticOrders') {
904
+ loadLogisticOrders(!!logisticOrders?.orders)
905
+ } else if (!ordersGroup[currentTabSelected]?.fetched && props.isNetConnected) {
906
+ loadOrders({ newFetchCurrent: true })
907
+ }
908
+ }, [currentTabSelected, props.isNetConnected])
909
+
910
+ useEffect(() => {
911
+ if (currentFilters && !isDriverApp) {
912
+ loadOrders({ newFetchCurrent: true })
913
+ }
914
+ }, [currentFilters])
915
+
916
+ useEffect(() => {
917
+ if (!filtered) return
918
+ loadOrders({ newFetch: true }, { allStatusses: true })
919
+ }, [filtered])
920
+
921
+ const handleActionEvent = (event, value) => {
922
+ const evts = {
923
+ order_added: 'order_added_notification',
924
+ update_order: 'order_updated_notification',
925
+ messages: 'message_added_notification',
926
+ request_register: 'request_register_notification',
927
+ request_update: 'request_update_notification'
928
+ }
929
+ events.emit(evts[event], value)
930
+ }
931
+
932
+ useEffect(() => {
933
+ if (!socket?.socket) return
934
+ const handleUpdateOrder = (order) => {
935
+ const isGiftCard = order?.products?.some(product => product?.type === 'gift_card')
936
+ if (isGiftCard && !isDriverApp) return
937
+ if (session?.user?.level === 2 && businessIDs.length > 0 && !businessIDs.includes(order.business_id)) return
938
+ events.emit('order_updated', order)
939
+ let orderFound = null
940
+ for (let i = 0; i < ordersStatusArray.length; i++) {
941
+ const status = ordersStatusArray[i]
942
+ if (order?.products) {
943
+ orderFound = ordersGroup[status]?.orders?.find((_order) => _order.id === order.id)
944
+ }
945
+ if (orderFound) break
946
+ }
947
+ if (notificationStatusses.includes(order?.status)) {
948
+ showToast(
949
+ ToastType.Info,
950
+ t('SPECIFIC_ORDER_UPDATED', 'Your order number _NUMBER_ has updated').replace('_NUMBER_', order.id),
951
+ 1000
952
+ )
953
+ }
954
+
955
+ if (!orderFound) {
956
+ if (
957
+ !order?.products ||
958
+ !order?.summary ||
959
+ typeof order?.status !== 'number' ||
960
+ !order?.customer ||
961
+ !order?.business ||
962
+ ((!order?.paymethod && !order?.payment_events?.some(e => e.event === 'payment')) && order?.total !== 0)
963
+ ) {
964
+ return
965
+ }
966
+ delete order.total
967
+ delete order.subtotal
968
+ const currentFilter = ordersGroup[getStatusById(order?.status) ?? '']?.currentFilter
969
+ !currentFilter.includes(order.status)
970
+ ? actionOrderToTab(order, getStatusById(order?.status), 'remove')
971
+ : actionOrderToTab(order, getStatusById(order?.status), 'add')
972
+
973
+ return
974
+ }
975
+
976
+ if (
977
+ orderFound.id === order.id &&
978
+ orderFound?.driver?.id !== order?.driver?.id &&
979
+ session?.user?.level === 4
980
+ ) {
981
+ actionOrderToTab(orderFound, getStatusById(orderFound.status), 'remove')
982
+ }
983
+
984
+ if (orderFound.id === order.id) {
985
+ delete order.total
986
+ delete order.subtotal
987
+ }
988
+
989
+ if (!order?.status && order?.status !== 0) {
990
+ Object.assign(orderFound, order)
991
+ } else {
992
+ const newOrderStatus = getStatusById(order?.status) ?? ''
993
+ const currentOrderStatus = getStatusById(orderFound?.status) ?? ''
994
+
995
+ const currentFilter = ordersGroup[newOrderStatus]?.currentFilter
996
+ Object.assign(orderFound, order)
997
+
998
+ if (newOrderStatus !== currentOrderStatus) {
999
+ actionOrderToTab(orderFound, currentOrderStatus, 'remove')
1000
+
1001
+ const total = ordersGroup[newOrderStatus].pagination.total ?? null
1002
+
1003
+ if (
1004
+ currentFilter.includes(orderFound.status) &&
1005
+ total !== null
1006
+ ) {
1007
+ actionOrderToTab(orderFound, newOrderStatus, 'add')
1008
+ }
1009
+ } else {
1010
+ !currentFilter.includes(orderFound.status) || (orderFound?.driver === null && isDriverApp)
1011
+ ? actionOrderToTab(orderFound, newOrderStatus, 'remove')
1012
+ : actionOrderToTab(orderFound, newOrderStatus, 'update')
1013
+ }
1014
+ }
1015
+ }
1016
+
1017
+ const handleAddNewOrder = (order) => {
1018
+ const isGiftCard = order?.products?.some(product => product?.type === 'gift_card')
1019
+ if (isGiftCard && !isDriverApp) return
1020
+ events.emit('order_added', order)
1021
+ handleActionEvent('order_added', order)
1022
+ if (notificationStatusses.includes(order?.status)) {
1023
+ showToast(
1024
+ ToastType.Info,
1025
+ t('SPECIFIC_ORDER_ORDERED', 'Order _NUMBER_ has been ordered').replace('_NUMBER_', order.id),
1026
+ 1000
1027
+ )
1028
+ }
1029
+ const status = getStatusById(order?.status) ?? ''
1030
+ actionOrderToTab(order, status, 'add')
1031
+ }
1032
+
1033
+ const handleReceiveMessage = (message) => {
1034
+ if (message?.id !== recentlyReceivedMessage?.id) {
1035
+ handleActionEvent('messages', message)
1036
+ setRecentlyReceivedMessage(message)
1037
+ }
1038
+ }
1039
+ socket.on('orders_register', handleAddNewOrder)
1040
+ socket.on('order_assigned', handleAddNewOrder)
1041
+ socket.on('update_order', handleUpdateOrder)
1042
+ socket.on('message', handleReceiveMessage)
1043
+
1044
+ return () => {
1045
+ socket.off('orders_register', handleAddNewOrder)
1046
+ socket.off('order_assigned', handleAddNewOrder)
1047
+ socket.off('update_order', handleUpdateOrder)
1048
+ socket.off('message', handleReceiveMessage)
1049
+ }
1050
+ }, [JSON.stringify(ordersGroup), socket?.socket, session])
1051
+
1052
+ const handleAddAssignRequest = useCallback(
1053
+ (order) => {
1054
+ setOrderLogisticAdded(order)
1055
+ const isSameEvent = orderLogisticAdded?.id === order?.id && orderLogisticAdded.status === order?.status
1056
+ if (!order?.locked && !isSameEvent) {
1057
+ handleActionEvent('request_register', order)
1058
+ }
1059
+ setlogisticOrders((prevState) => ({
1060
+ ...prevState,
1061
+ orders: sortOrders([...prevState?.orders, order].filter((order, index, hash) => { // remove possibles duplicates
1062
+ const val = JSON.stringify(order)
1063
+ return index === hash.findIndex(_order => {
1064
+ return JSON.stringify(_order) === val
1065
+ })
1066
+ }))
1067
+ }))
1068
+ showToast(
1069
+ ToastType.Info,
1070
+ t('SPECIFIC_LOGISTIC_ORDER_ORDERED', 'Logisitc order _NUMBER_ has been ordered').replace('_NUMBER_', order?.order?.id ?? order.id),
1071
+ 1000
1072
+ )
1073
+ },
1074
+ [logisticOrders]
1075
+ )
1076
+
1077
+ const handleDeleteAssignRequest = useCallback(
1078
+ (order) => {
1079
+ setlogisticOrders(prevState => ({
1080
+ ...prevState,
1081
+ orders: prevState?.orders?.some(_order => _order?.id === order?.id)
1082
+ ? sortOrders([...prevState?.orders?.filter(_order => _order?.id !== order?.id), { ...prevState?.orders?.find(_order => _order?.id === order?.id), expired: true }])
1083
+ : sortOrders(prevState?.orders)
1084
+ }))
1085
+ },
1086
+ [logisticOrders]
1087
+ )
1088
+
1089
+ const handleUpdateAssignRequest = useCallback(
1090
+ (order) => {
1091
+ setOrderLogisticUpdated(order)
1092
+ const isSameEvent = orderLogisticUpdated?.id === order?.id && orderLogisticUpdated.status === order?.status
1093
+ if (!order?.locked && !isSameEvent) {
1094
+ handleActionEvent('request_update', order)
1095
+ }
1096
+ setlogisticOrders(prevState => ({
1097
+ ...prevState,
1098
+ orders: prevState?.orders?.some(_order => _order?.id === order?.id)
1099
+ ? sortOrders([...prevState?.orders?.filter(_order => _order?.id !== order?.id), { ...prevState?.orders?.find(_order => _order?.id === order?.id), ...order }])
1100
+ : sortOrders(prevState?.orders)
1101
+ }))
1102
+ showToast(
1103
+ ToastType.Info,
1104
+ t('SPECIFIC_LOGISTIC_ORDER_UPDATED', 'Your logisitc order number _NUMBER_ has updated').replace('_NUMBER_', order?.order?.id ?? order.id),
1105
+ 1000
1106
+ )
1107
+ },
1108
+ [logisticOrders]
1109
+ )
1110
+
1111
+ useEffect(() => {
1112
+ if (isLogisticActivated) {
1113
+ socket.on('request_register', handleAddAssignRequest)
1114
+ socket.on('request_update', handleUpdateAssignRequest)
1115
+ socket.on('request_cancel', handleDeleteAssignRequest)
1116
+ }
1117
+ return () => {
1118
+ socket.off('request_register')
1119
+ socket.off('request_update')
1120
+ socket.off('request_cancel')
1121
+ }
1122
+ }, [socket, session, isLogisticActivated])
1123
+
1124
+ useEffect(() => {
1125
+ if (!session.user) return
1126
+
1127
+ const userId = session.user.id
1128
+ const userLevel = session.user.level
1129
+
1130
+ const ordersRoom = !isDriverApp
1131
+ ? {
1132
+ project: ordering.project,
1133
+ room: 'orders',
1134
+ user_id: userId,
1135
+ role: 'manager'
1136
+ }
1137
+ : userLevel === 0
1138
+ ? 'orders'
1139
+ : `orders_${userId}`
1140
+
1141
+ const requestsRoom = `requests_${userId}`
1142
+ const groupsRoom = `ordergroups_${userId}`
1143
+ const messagesOrdersRoom = userLevel === 0 ? 'messages_orders' : `messages_orders_${userId}`
1144
+ const joinRooms = () => {
1145
+ socket.join(ordersRoom)
1146
+ socket.join(requestsRoom)
1147
+ socket.join(groupsRoom)
1148
+ socket.join(messagesOrdersRoom)
1149
+ }
1150
+
1151
+ const leaveRooms = () => {
1152
+ socket.leave(ordersRoom)
1153
+ socket.leave(requestsRoom)
1154
+ socket.leave(groupsRoom)
1155
+ socket.leave(messagesOrdersRoom)
1156
+ }
1157
+
1158
+ socket.on('disconnect', joinRooms)
1159
+
1160
+ joinRooms()
1161
+
1162
+ return () => {
1163
+ leaveRooms()
1164
+ socket.off('disconnect', joinRooms)
1165
+ }
1166
+ }, [socket, session])
1167
+
1168
+ useEffect(() => {
1169
+ const request = requestsState?.orders
1170
+ return () => {
1171
+ request && request.cancel && request.cancel()
1172
+ }
1173
+ }, [requestsState?.orders])
1174
+
1175
+ useEffect(() => {
1176
+ const handleCustomerReviewed = (review) => {
1177
+ let orderFound = null
1178
+ for (let i = 0; i < ordersStatusArray.length; i++) {
1179
+ const status = ordersStatusArray[i]
1180
+ orderFound = ordersGroup[status]?.orders?.find((_order) => _order.id === review.order_id)
1181
+ if (orderFound) break
1182
+ }
1183
+ if (orderFound) {
1184
+ const newOrderStatus = getStatusById(orderFound?.status) ?? ''
1185
+ orderFound.user_review = review
1186
+ actionOrderToTab(orderFound, newOrderStatus, 'update')
1187
+ }
1188
+ }
1189
+ events.on('customer_reviewed', handleCustomerReviewed)
1190
+ return () => {
1191
+ events.off('customer_reviewed', handleCustomerReviewed)
1192
+ }
1193
+ }, [ordersGroup])
1194
+
1195
+ useEffect(() => {
1196
+ setCurrentTabSelected(combineTabs ? 'active' : 'pending')
1197
+ }, [combineTabs])
1198
+
1199
+ return (
1200
+ <>
1201
+ {UIComponent && (
1202
+ <UIComponent
1203
+ {...props}
1204
+ currentFilters={currentFilters}
1205
+ setCurrentFilters={setCurrentFilters}
1206
+ currentTabSelected={currentTabSelected}
1207
+ setCurrentTabSelected={setCurrentTabSelected}
1208
+ ordersGroup={ordersGroup}
1209
+ setOrdersGroup={setOrdersGroup}
1210
+ logisticOrders={logisticOrders}
1211
+ messages={messages}
1212
+ setCombineTabsState={setCombineTabsState}
1213
+ ordersDeleted={ordersDeleted}
1214
+ setOrdersDeleted={setOrdersDeleted}
1215
+ setMessages={setMessages}
1216
+ loadOrders={loadOrders}
1217
+ loadLogisticOrders={loadLogisticOrders}
1218
+ deleteOrders={deleteOrders}
1219
+ loadMessages={loadMessages}
1220
+ loadMoreOrders={loadMoreOrders}
1221
+ handleClickOrder={handleClickOrder}
1222
+ handleClickLogisticOrder={handleClickLogisticOrder}
1223
+ filtered={filtered}
1224
+ onFiltered={setFiltered}
1225
+ handleChangeOrderStatus={handleChangeOrderStatus}
1226
+ handleSendCustomerReview={handleSendCustomerReview}
1227
+ ordersFormatted={formatOrdersGrouped(ordersGroup[currentTabSelected]?.orders)}
1228
+ isLogisticActivated={isLogisticActivated}
1229
+ ordersFiltered={ordersFiltered}
1230
+ />
1231
+ )}
1232
+ </>
1233
+ )
1234
+ }
1235
+
1236
+ OrderListGroups.defaultProps = {
1237
+ orderBy: '-id',
1238
+ orderDirection: 'desc',
1239
+ isNetConnected: true,
1240
+ paginationSettings: { initialPage: 1, pageSize: 10, controlType: 'infinity' },
1241
+ beforeComponents: [],
1242
+ afterComponents: [],
1243
+ beforeElements: [],
1244
+ afterElements: []
1245
+ }