ordering-components-external 13.2.13 → 13.2.15

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