ordering-components-external 13.1.2 → 13.1.3

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