ordering-components-external 13.2.13 → 13.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/.babelrc +22 -22
  2. package/.vscode/settings.json +3 -3
  3. package/_bundles/0.ordering-component.71fcc1b93f7c954870c3.js +1 -0
  4. package/_bundles/{1.ordering-component.aa21761da1477298dd80.js → 1.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  5. package/_bundles/{2.ordering-component.aa21761da1477298dd80.js → 2.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  6. package/_bundles/{4.ordering-component.aa21761da1477298dd80.js → 4.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  7. package/_bundles/{5.ordering-component.aa21761da1477298dd80.js → 5.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  8. package/_bundles/{6.ordering-component.aa21761da1477298dd80.js → 6.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  9. package/_bundles/7.ordering-component.71fcc1b93f7c954870c3.js +2 -0
  10. package/_bundles/7.ordering-component.71fcc1b93f7c954870c3.js.LICENSE.txt +1 -0
  11. package/_bundles/{8.ordering-component.aa21761da1477298dd80.js → 8.ordering-component.71fcc1b93f7c954870c3.js} +1 -1
  12. package/_bundles/ordering-component.71fcc1b93f7c954870c3.js +2 -0
  13. package/_bundles/{ordering-component.aa21761da1477298dd80.js.LICENSE.txt → ordering-component.71fcc1b93f7c954870c3.js.LICENSE.txt} +0 -9
  14. package/_modules/components/AddressDetails/index.js +35 -35
  15. package/_modules/components/AddressForm/index.js +63 -63
  16. package/_modules/components/AddressList/index.js +56 -56
  17. package/_modules/components/Analitycs/index.js +11 -11
  18. package/_modules/components/AnalyticsSegment/index.js +11 -11
  19. package/_modules/components/AppleLogin/index.js +37 -37
  20. package/_modules/components/BaseComponent/index.js +15 -15
  21. package/_modules/components/BusinessAndProductList/index.js +43 -43
  22. package/_modules/components/BusinessBasicInformation/index.js +30 -30
  23. package/_modules/components/BusinessController/index.js +65 -65
  24. package/_modules/components/BusinessInformation/BusinessOption/index.js +22 -22
  25. package/_modules/components/BusinessInformation/index.js +24 -24
  26. package/_modules/components/BusinessList/index.js +57 -57
  27. package/_modules/components/BusinessMenuListing/index.js +30 -30
  28. package/_modules/components/BusinessProductsCategories/index.js +18 -18
  29. package/_modules/components/BusinessProductsSearch/index.js +16 -16
  30. package/_modules/components/BusinessReviews/index.js +37 -37
  31. package/_modules/components/BusinessSearchList/index.js +34 -34
  32. package/_modules/components/BusinessSortControl/index.js +34 -34
  33. package/_modules/components/BusinessTypeFilter/index.js +36 -36
  34. package/_modules/components/BusinessesMap/index.js +33 -33
  35. package/_modules/components/Cart/index.js +48 -48
  36. package/_modules/components/CartStoresListing/index.js +15 -15
  37. package/_modules/components/Checkout/index.js +83 -83
  38. package/_modules/components/CmsContent/index.js +30 -30
  39. package/_modules/components/Contacts/index.js +45 -45
  40. package/_modules/components/CouponControl/index.js +29 -29
  41. package/_modules/components/DragAndDrop/index.js +4 -4
  42. package/_modules/components/DriverList/index.js +31 -31
  43. package/_modules/components/DriverTips/index.js +41 -41
  44. package/_modules/components/Emitter/index.js +3 -3
  45. package/_modules/components/FacebookLoginButton/index.js +50 -50
  46. package/_modules/components/FacebookPixel/index.js +8 -8
  47. package/_modules/components/FavoriteList/index.js +43 -43
  48. package/_modules/components/FirebaseGoogleLoginButton/index.js +21 -21
  49. package/_modules/components/FloatingButton/index.js +22 -22
  50. package/_modules/components/ForgotPasswordForm/index.js +53 -53
  51. package/_modules/components/GiftCard/GiftCardOrdersList/index.js +16 -16
  52. package/_modules/components/GiftCard/PurchaseGiftCard/index.js +17 -17
  53. package/_modules/components/GiftCard/RedeemGiftCard/index.js +14 -14
  54. package/_modules/components/GiftCard/SendGiftCard/index.js +14 -14
  55. package/_modules/components/GoogleAutocompleteInput/index.js +25 -25
  56. package/_modules/components/GoogleIdentity/index.js +38 -38
  57. package/_modules/components/GoogleLoginButton/index.js +61 -61
  58. package/_modules/components/GoogleMaps/index.js +44 -44
  59. package/_modules/components/GpsButton/index.js +27 -27
  60. package/_modules/components/LanguageSelector/index.js +38 -38
  61. package/_modules/components/LoginForm/index.js +72 -72
  62. package/_modules/components/LogoutAction/index.js +28 -28
  63. package/_modules/components/MainSearch/index.js +41 -41
  64. package/_modules/components/MapView/index.js +12 -12
  65. package/_modules/components/MenuControl/index.js +58 -58
  66. package/_modules/components/Messages/index.js +35 -35
  67. package/_modules/components/MomentOption/index.js +57 -57
  68. package/_modules/components/MultiCartCreate/index.js +10 -10
  69. package/_modules/components/MultiCartsPaymethodsAndWallets/index.js +22 -22
  70. package/_modules/components/MultiCheckout/index.js +34 -34
  71. package/_modules/components/MultiOrdersDetails/index.js +19 -19
  72. package/_modules/components/MyOrders/index.js +35 -35
  73. package/_modules/components/MyOrdersList/index.js +35 -35
  74. package/_modules/components/NewOrderNotification/index.js +8 -8
  75. package/_modules/components/OrderChange/index.js +30 -30
  76. package/_modules/components/OrderDetails/index.js +66 -66
  77. package/_modules/components/OrderList/index.js +67 -67
  78. package/_modules/components/OrderListGroups/index.js +28 -28
  79. package/_modules/components/OrderReview/index.js +35 -35
  80. package/_modules/components/OrderTypeControl/index.js +23 -23
  81. package/_modules/components/OrderVerticalList/index.js +15 -15
  82. package/_modules/components/OrdersControlFilters/index.js +15 -15
  83. package/_modules/components/OrdersDashboardComponents/Appointments/index.js +14 -14
  84. package/_modules/components/OrdersDashboardComponents/BusinessProductsListing/index.js +51 -51
  85. package/_modules/components/OrdersDashboardComponents/CheckPassword/index.js +35 -35
  86. package/_modules/components/OrdersDashboardComponents/CityList/index.js +33 -33
  87. package/_modules/components/OrdersDashboardComponents/CountryList/index.js +32 -32
  88. package/_modules/components/OrdersDashboardComponents/CustomOrderDetails/index.js +25 -25
  89. package/_modules/components/OrdersDashboardComponents/DashboardBusinessList/index.js +75 -75
  90. package/_modules/components/OrdersDashboardComponents/DashboardOrdersList/index.js +77 -77
  91. package/_modules/components/OrdersDashboardComponents/DriversList/index.js +73 -73
  92. package/_modules/components/OrdersDashboardComponents/ExportCSV/index.js +26 -26
  93. package/_modules/components/OrdersDashboardComponents/GiftCardsList/index.js +16 -16
  94. package/_modules/components/OrdersDashboardComponents/GoogleMapsApiKeySetting/index.js +14 -14
  95. package/_modules/components/OrdersDashboardComponents/LogisticInformation/index.js +29 -29
  96. package/_modules/components/OrdersDashboardComponents/Logistics/index.js +29 -29
  97. package/_modules/components/OrdersDashboardComponents/Messages/index.js +42 -42
  98. package/_modules/components/OrdersDashboardComponents/MetaFields/index.js +40 -40
  99. package/_modules/components/OrdersDashboardComponents/OrderDetails/index.js +54 -54
  100. package/_modules/components/OrdersDashboardComponents/OrderNotification/index.js +19 -19
  101. package/_modules/components/OrdersDashboardComponents/OrdersFilter/index.js +73 -73
  102. package/_modules/components/OrdersDashboardComponents/OrdersManage/index.js +74 -74
  103. package/_modules/components/OrdersDashboardComponents/PointsWalletLevels/index.js +38 -38
  104. package/_modules/components/OrdersDashboardComponents/ReviewCustomer/index.js +26 -26
  105. package/_modules/components/OrdersDashboardComponents/Schedule/index.js +56 -56
  106. package/_modules/components/OrdersDashboardComponents/SettingsList/index.js +51 -51
  107. package/_modules/components/OrdersDashboardComponents/UserFormDetails/index.js +82 -82
  108. package/_modules/components/OrdersDashboardComponents/UsersList/index.js +72 -72
  109. package/_modules/components/OrdersDashboardComponents/WebsocketStatus/index.js +10 -10
  110. package/_modules/components/PageBanner/index.js +17 -17
  111. package/_modules/components/PaymentOptionCash/index.js +26 -26
  112. package/_modules/components/PaymentOptionPaypal/index.js +35 -35
  113. package/_modules/components/PaymentOptionSquare/index.js +22 -22
  114. package/_modules/components/PaymentOptionStripe/index.js +45 -45
  115. package/_modules/components/PaymentOptionStripeDirect/index.js +34 -34
  116. package/_modules/components/PaymentOptionStripeRedirect/StripeRedirectForm/index.js +24 -24
  117. package/_modules/components/PaymentOptionStripeRedirect/index.js +39 -39
  118. package/_modules/components/PaymentOptionWallet/index.js +11 -11
  119. package/_modules/components/PaymentOptions/index.js +37 -37
  120. package/_modules/components/PaymethodList/index.js +30 -30
  121. package/_modules/components/PhoneAutocomplete/index.js +30 -30
  122. package/_modules/components/PlaceSpot/index.js +15 -15
  123. package/_modules/components/Popup/index.js +39 -39
  124. package/_modules/components/ProductComponent/index.js +36 -36
  125. package/_modules/components/ProductForm/index.js +145 -145
  126. package/_modules/components/ProductImages/index.js +20 -20
  127. package/_modules/components/ProductIngredient/index.js +19 -19
  128. package/_modules/components/ProductItemAccordion/index.js +18 -18
  129. package/_modules/components/ProductOption/index.js +9 -9
  130. package/_modules/components/ProductOptionSuboption/index.js +36 -36
  131. package/_modules/components/ProductShare/index.js +26 -26
  132. package/_modules/components/ProductsList/index.js +26 -26
  133. package/_modules/components/ProductsListing/index.js +50 -50
  134. package/_modules/components/ProfessionalInfo/index.js +34 -34
  135. package/_modules/components/PromotionsController/index.js +10 -10
  136. package/_modules/components/QueryLoginSpoonity/index.js +30 -30
  137. package/_modules/components/ReCaptcha/index.js +9 -9
  138. package/_modules/components/ResetPassword/index.js +30 -30
  139. package/_modules/components/ReviewCustomer/index.js +26 -26
  140. package/_modules/components/ReviewDriver/index.js +33 -33
  141. package/_modules/components/ReviewProduct/index.js +38 -38
  142. package/_modules/components/SearchOptions/index.js +23 -23
  143. package/_modules/components/Sessions/index.js +33 -33
  144. package/_modules/components/SignupForm/index.js +71 -71
  145. package/_modules/components/SingleBusinessCard/index.js +29 -29
  146. package/_modules/components/SingleOrderCard/index.js +32 -32
  147. package/_modules/components/SingleProductCard/index.js +28 -28
  148. package/_modules/components/SingleProfessionalCard/index.js +28 -28
  149. package/_modules/components/SmartAppBanner/index.js +13 -13
  150. package/_modules/components/StoreProductList/index.js +46 -46
  151. package/_modules/components/StripeElementsForm/CardForm/index.js +36 -36
  152. package/_modules/components/StripeElementsForm/index.js +25 -25
  153. package/_modules/components/UpsellingPage/index.js +27 -27
  154. package/_modules/components/UserFormDetails/index.js +85 -85
  155. package/_modules/components/UserVerification/index.js +28 -28
  156. package/_modules/components/WalletList/index.js +11 -11
  157. package/_modules/components/WebsocketStatus/index.js +10 -10
  158. package/_modules/components/WrapperGoogleMaps/index.js +9 -9
  159. package/_modules/contexts/ApiContext/index.js +13 -13
  160. package/_modules/contexts/BillingContext/index.js +7 -7
  161. package/_modules/contexts/BusinessContext/index.js +18 -18
  162. package/_modules/contexts/ConfigContext/index.js +19 -19
  163. package/_modules/contexts/CustomerContext/index.js +10 -10
  164. package/_modules/contexts/EventContext/index.js +9 -9
  165. package/_modules/contexts/LanguageContext/index.js +28 -28
  166. package/_modules/contexts/OptimizationLoadContext/index.js +16 -16
  167. package/_modules/contexts/OrderContext/index.js +97 -97
  168. package/_modules/contexts/OrderingContext/index.js +7 -7
  169. package/_modules/contexts/OrderingThemeContext/index.js +19 -19
  170. package/_modules/contexts/ProductContext/index.js +14 -14
  171. package/_modules/contexts/SessionContext/index.js +23 -23
  172. package/_modules/contexts/SiteContext/index.js +18 -18
  173. package/_modules/contexts/ToastContext/index.js +4 -4
  174. package/_modules/contexts/UtilsContext/index.js +14 -14
  175. package/_modules/contexts/ValidationsFieldsContext/index.js +9 -9
  176. package/_modules/contexts/WebsocketContext/index.js +17 -17
  177. package/_modules/contexts/WebsocketContext/socket.js +4 -4
  178. package/_modules/native/src/NativeStrategy/index.js +9 -9
  179. package/_modules/native/src/contexts/OrderingContext/index.js +7 -7
  180. package/_modules/utils/index.js +2 -2
  181. package/_modules/webStrategy/index.js +8 -8
  182. package/cypress/fixtures/example.json +4 -4
  183. package/cypress/integration/naked/BusinessProductsCategories.spec.js +9 -9
  184. package/cypress/integration/naked/PhoneAutocomplete.spec.js +22 -22
  185. package/cypress/integration/naked/activeOrders.spec.js +15 -15
  186. package/cypress/integration/naked/addressDetails.spec.js +10 -10
  187. package/cypress/integration/naked/appleLogin.spec.js +14 -14
  188. package/cypress/integration/naked/businessBasicInformation.spec.js +14 -14
  189. package/cypress/integration/naked/businessController.spec.js +9 -9
  190. package/cypress/integration/naked/businessInformation.spec.js +19 -19
  191. package/cypress/integration/naked/businessProductsSearch.spec.js +9 -9
  192. package/cypress/integration/naked/businessReviews.spec.js +16 -16
  193. package/cypress/integration/naked/businessSortControl.spec.js +9 -9
  194. package/cypress/integration/naked/businessTypeFilter.spec.js +10 -10
  195. package/cypress/integration/naked/businessesMap.spec.js +13 -13
  196. package/cypress/integration/naked/cms.spec.js +9 -9
  197. package/cypress/integration/naked/config.spec.js +34 -34
  198. package/cypress/integration/naked/driverTips.spec.js +10 -10
  199. package/cypress/integration/naked/events.spec.js +13 -13
  200. package/cypress/integration/naked/facebookLogin.spec.js +13 -13
  201. package/cypress/integration/naked/floatingButton.spec.js +13 -13
  202. package/cypress/integration/naked/forgotPassword.spec.js +20 -20
  203. package/cypress/integration/naked/googleLogin.spec.js +11 -11
  204. package/cypress/integration/naked/languageExamples.spec.js +25 -25
  205. package/cypress/integration/naked/languageSelector.spec.js +10 -10
  206. package/cypress/integration/naked/login.spec.js +38 -38
  207. package/cypress/integration/naked/logout.spec.js +15 -15
  208. package/cypress/integration/naked/mainSearch.spec.js +9 -9
  209. package/cypress/integration/naked/menuControl.spec.js +9 -9
  210. package/cypress/integration/naked/messages.spec.js +25 -25
  211. package/cypress/integration/naked/momentOption.spec.js +10 -10
  212. package/cypress/integration/naked/myOrders.spec.js +11 -11
  213. package/cypress/integration/naked/myOrdersList.spec.js +9 -9
  214. package/cypress/integration/naked/orderContextAdvanced.spec.js +23 -23
  215. package/cypress/integration/naked/orderDetails.spec.js +11 -11
  216. package/cypress/integration/naked/paymentOptionCash.spec.js +21 -21
  217. package/cypress/integration/naked/paymentOptionStripe.spec.js +11 -11
  218. package/cypress/integration/naked/paymentOptionStripeDirect.spec.js +11 -11
  219. package/cypress/integration/naked/paymentOptions.spec.js +9 -9
  220. package/cypress/integration/naked/popupExample.spec.js +17 -17
  221. package/cypress/integration/naked/productImages.spec.js +11 -11
  222. package/cypress/integration/naked/productOptionExample.spec.js +21 -21
  223. package/cypress/integration/naked/productShare.spec.js +9 -9
  224. package/cypress/integration/naked/productsList.spec.js +9 -9
  225. package/cypress/integration/naked/resetPassword.spec.js +11 -11
  226. package/cypress/integration/naked/reviewOrders.spec.js +13 -13
  227. package/cypress/integration/naked/searchOptions.spec.js +18 -18
  228. package/cypress/integration/naked/signup.spec.js +31 -31
  229. package/cypress/integration/naked/upselling.spec.js +13 -13
  230. package/cypress/integration/naked/userDetails.spec.js +12 -12
  231. package/cypress/plugins/index.js +21 -21
  232. package/cypress/support/commands.js +35 -35
  233. package/cypress/support/index.js +20 -20
  234. package/cypress.json +12 -12
  235. package/example/App.js +263 -263
  236. package/example/components/ActiveOrdersUI/index.js +72 -72
  237. package/example/components/AddressDetailsUI/index.js +101 -101
  238. package/example/components/AddressFormUI/index.js +161 -161
  239. package/example/components/AddressListUI/index.js +33 -33
  240. package/example/components/AlertPopup/index.js +10 -10
  241. package/example/components/AlertUI/index.js +49 -49
  242. package/example/components/AlertUI/style.css +5 -5
  243. package/example/components/AppleLoginUI/index.js +40 -40
  244. package/example/components/BaseComponentUI/index.js +34 -34
  245. package/example/components/BusinessBasicInformationUI/index.js +118 -118
  246. package/example/components/BusinessControllerUI/index.js +89 -89
  247. package/example/components/BusinessInformationUI/BusinessOptionUI/index.js +83 -83
  248. package/example/components/BusinessInformationUI/index.js +83 -83
  249. package/example/components/BusinessProductsCategoriesUI/index.js +42 -42
  250. package/example/components/BusinessProductsSearchUI/index.js +38 -38
  251. package/example/components/BusinessReviewsUI/index.js +77 -77
  252. package/example/components/BusinessSortControlUI/index.js +47 -47
  253. package/example/components/BusinessTypeFilterUI/index.js +53 -53
  254. package/example/components/BusinessesMapUI/index.js +57 -57
  255. package/example/components/CartUI/index.js +154 -154
  256. package/example/components/ChangeView/index.js +19 -19
  257. package/example/components/CheckoutUI/index.js +206 -206
  258. package/example/components/CmsContentUI/index.js +52 -52
  259. package/example/components/ConfigsExample/index.js +118 -118
  260. package/example/components/CouponControlUI/index.js +63 -63
  261. package/example/components/DriverTipsUI/index.js +58 -58
  262. package/example/components/FacebookLoginButtonUI/index.js +48 -48
  263. package/example/components/FloatingButtonUI/index.js +145 -145
  264. package/example/components/ForgotPasswordFormUI/index.js +93 -93
  265. package/example/components/GoogleLoginUI/index.js +30 -30
  266. package/example/components/GpsButtonUI/index.js +22 -22
  267. package/example/components/Header/index.js +18 -18
  268. package/example/components/LanguageSelectorUI/index.js +57 -57
  269. package/example/components/LanguagesExample/index.js +51 -51
  270. package/example/components/LoginFormUI/index.js +159 -159
  271. package/example/components/LogoutButtonUI/index.js +21 -21
  272. package/example/components/MainSearchUI/index.js +131 -131
  273. package/example/components/MenuControlUI/index.js +103 -103
  274. package/example/components/MessagesUI/index.js +162 -162
  275. package/example/components/ModalUI/index.js +36 -36
  276. package/example/components/ModalUI/style.css +5 -5
  277. package/example/components/MomentOptionUI/index.js +68 -68
  278. package/example/components/MyOrdersListUI/index.js +51 -51
  279. package/example/components/MyOrdersUI/index.js +52 -52
  280. package/example/components/OrderChangeUI/index.js +54 -54
  281. package/example/components/OrderDetailsUI/index.js +174 -174
  282. package/example/components/OrderReviewUI/index.js +125 -125
  283. package/example/components/OrderTypeControlUI/index.js +32 -32
  284. package/example/components/PaymentOptionCashUI/index.js +60 -60
  285. package/example/components/PaymentOptionPaypalUI/index.js +50 -50
  286. package/example/components/PaymentOptionStripeDirectUI/index.js +89 -89
  287. package/example/components/PaymentOptionStripeRedirectUI/index.js +97 -97
  288. package/example/components/PaymentOptionStripeUI/index.js +129 -129
  289. package/example/components/PaymentOptionsUI/index.js +169 -169
  290. package/example/components/PhoneAutocompleteUI/index.js +67 -67
  291. package/example/components/PhoneAutocompleteUI/styles.css +49 -49
  292. package/example/components/ProductComponentUI/index.js +113 -113
  293. package/example/components/ProductFormUI/index.js +131 -131
  294. package/example/components/ProductImagesUI/index.js +82 -82
  295. package/example/components/ProductIngredientUI/index.js +21 -21
  296. package/example/components/ProductOptionSuboptionUI/index.js +65 -65
  297. package/example/components/ProductOptionUI/index.js +31 -31
  298. package/example/components/ProductShareUI/index.js +48 -48
  299. package/example/components/ProductsListUI/index.js +108 -108
  300. package/example/components/ProductsListingUI/index.js +42 -42
  301. package/example/components/ResetPasswordUI/index.js +121 -121
  302. package/example/components/SearchOptionsUI/index.js +82 -82
  303. package/example/components/SignupFormUI/index.js +117 -117
  304. package/example/components/SingleBusinessCardUI/index.js +82 -82
  305. package/example/components/SingleOrderCardUI/index.js +52 -52
  306. package/example/components/SingleProductCardUI/index.js +47 -47
  307. package/example/components/StripeElementsFormUI/CardFormUI/index.js +51 -51
  308. package/example/components/StripeElementsFormUI/CardFormUI/style.css +118 -118
  309. package/example/components/StripeElementsFormUI/index.js +38 -38
  310. package/example/components/StripeRedirectFormUI/index.js +99 -99
  311. package/example/components/TestComponent/index.js +5 -5
  312. package/example/components/UpsellingPageUI/index.js +26 -26
  313. package/example/components/UserDetailsUI/index.js +94 -94
  314. package/example/components/UserProfileUI/index.js +156 -156
  315. package/example/views/ActiveOrders/index.js +86 -86
  316. package/example/views/AddressDetailsExample/index.js +57 -57
  317. package/example/views/AppleLoginExample/index.js +51 -51
  318. package/example/views/BaseComponentExample/index.js +35 -35
  319. package/example/views/BusinessBasicInformationExample/index.js +43 -43
  320. package/example/views/BusinessControllerExample/index.js +55 -55
  321. package/example/views/BusinessInformationExample/index.js +68 -68
  322. package/example/views/BusinessProductsCategoriesExample/index.js +50 -50
  323. package/example/views/BusinessProductsSearchExample/index.js +39 -39
  324. package/example/views/BusinessReviewsExample/index.js +43 -43
  325. package/example/views/BusinessSortControlExample/index.js +53 -53
  326. package/example/views/BusinessTypeFilterExample/index.js +53 -53
  327. package/example/views/BusinessesMapExample/index.js +57 -57
  328. package/example/views/CheckoutExample/index.js +143 -143
  329. package/example/views/CmsContentExample/index.js +44 -44
  330. package/example/views/DriverTipsExample/index.js +47 -47
  331. package/example/views/EventsExample/index.js +26 -26
  332. package/example/views/FacebookLogin/index.js +63 -63
  333. package/example/views/FloatingButtonExample/index.js +47 -47
  334. package/example/views/ForgotPassword/index.js +77 -77
  335. package/example/views/GoogleLoginExample/index.js +85 -85
  336. package/example/views/Home/index.js +200 -200
  337. package/example/views/LanguageSelectorExample/index.js +55 -55
  338. package/example/views/Login/index.js +84 -84
  339. package/example/views/MainSearchExample/index.js +43 -43
  340. package/example/views/MenuControlExample/index.js +68 -68
  341. package/example/views/MessagesExample/index.js +58 -58
  342. package/example/views/MomentOptionExample/index.js +52 -52
  343. package/example/views/MyOrdersExample/index.js +35 -35
  344. package/example/views/MyOrdersListExample/index.js +50 -50
  345. package/example/views/OrderChangeExample/index.js +46 -46
  346. package/example/views/OrderContextExample/index.js +139 -139
  347. package/example/views/OrderDetailsExample/index.js +50 -50
  348. package/example/views/OrderReviewExample/index.js +64 -64
  349. package/example/views/PaymentOptionCashExample/index.js +51 -51
  350. package/example/views/PaymentOptionPaypalExample/index.js +71 -71
  351. package/example/views/PaymentOptionStripeDirectExample/index.js +43 -43
  352. package/example/views/PaymentOptionStripeExample/index.js +47 -47
  353. package/example/views/PaymentOptionStripeRedirectExample/index.js +56 -56
  354. package/example/views/PaymentOptionsExample/index.js +47 -47
  355. package/example/views/PhoneAutocompleteExample/index.js +34 -34
  356. package/example/views/PlacesExample/index.js +94 -94
  357. package/example/views/PopupExample/index.js +78 -78
  358. package/example/views/PopupExample/style.css +18 -18
  359. package/example/views/ProductDetail/index.js +323 -323
  360. package/example/views/ProductImagesExample/index.js +43 -43
  361. package/example/views/ProductOptionExample/index.js +88 -88
  362. package/example/views/ProductShareExample/index.js +51 -51
  363. package/example/views/ProductsListExample/index.js +77 -77
  364. package/example/views/ProductsListingExample/index.js +47 -47
  365. package/example/views/ResetPasswordExample/index.js +60 -60
  366. package/example/views/SearchOptionsExample/index.js +42 -42
  367. package/example/views/SessionManager/index.js +122 -122
  368. package/example/views/Signup/index.js +64 -64
  369. package/example/views/UpsellingPageExample/index.js +35 -35
  370. package/example/views/UserDetailsExample/index.js +69 -69
  371. package/example/views/UserProfile/index.js +73 -73
  372. package/index-example.js +23 -23
  373. package/index.html +13 -13
  374. package/native/index.js +257 -257
  375. package/native/src/NativeStrategy/index.js +20 -20
  376. package/native/src/contexts/OrderingContext/index.js +85 -85
  377. package/package.json +92 -92
  378. package/src/components/AddressDetails/index.js +149 -149
  379. package/src/components/AddressForm/index.js +372 -372
  380. package/src/components/AddressList/index.js +254 -254
  381. package/src/components/Analitycs/index.js +119 -119
  382. package/src/components/AnalyticsSegment/index.js +145 -145
  383. package/src/components/AppleLogin/index.js +164 -164
  384. package/src/components/BaseComponent/index.js +52 -52
  385. package/src/components/BusinessAndProductList/index.js +986 -986
  386. package/src/components/BusinessBasicInformation/index.js +119 -119
  387. package/src/components/BusinessController/index.js +351 -351
  388. package/src/components/BusinessInformation/BusinessOption/index.js +86 -86
  389. package/src/components/BusinessInformation/index.js +93 -93
  390. package/src/components/BusinessList/index.js +670 -670
  391. package/src/components/BusinessMenuListing/index.js +99 -99
  392. package/src/components/BusinessProductsCategories/index.js +60 -60
  393. package/src/components/BusinessProductsSearch/index.js +54 -54
  394. package/src/components/BusinessReviews/index.js +187 -187
  395. package/src/components/BusinessSearchList/index.js +364 -364
  396. package/src/components/BusinessSortControl/index.js +100 -100
  397. package/src/components/BusinessTypeFilter/index.js +142 -142
  398. package/src/components/BusinessesMap/index.js +110 -110
  399. package/src/components/Cart/index.js +211 -211
  400. package/src/components/CartStoresListing/index.js +157 -157
  401. package/src/components/Checkout/index.js +636 -636
  402. package/src/components/CmsContent/index.js +97 -97
  403. package/src/components/Contacts/index.js +512 -512
  404. package/src/components/CouponControl/index.js +171 -171
  405. package/src/components/DragAndDrop/index.js +41 -41
  406. package/src/components/DriverList/index.js +112 -112
  407. package/src/components/DriverTips/index.js +141 -141
  408. package/src/components/Emitter/index.js +36 -36
  409. package/src/components/ExamineClick/index.js +40 -40
  410. package/src/components/FacebookLoginButton/index.js +214 -214
  411. package/src/components/FacebookPixel/index.js +148 -148
  412. package/src/components/FavoriteList/index.js +278 -278
  413. package/src/components/FirebaseGoogleLoginButton/index.js +93 -93
  414. package/src/components/FloatingButton/index.js +70 -70
  415. package/src/components/ForgotPasswordForm/index.js +180 -180
  416. package/src/components/GiftCard/GiftCardOrdersList/index.js +155 -155
  417. package/src/components/GiftCard/PurchaseGiftCard/index.js +127 -127
  418. package/src/components/GiftCard/RedeemGiftCard/index.js +77 -77
  419. package/src/components/GiftCard/SendGiftCard/index.js +83 -83
  420. package/src/components/GoogleAutocompleteInput/index.js +154 -154
  421. package/src/components/GoogleIdentity/index.js +144 -144
  422. package/src/components/GoogleLoginButton/index.js +276 -276
  423. package/src/components/GoogleMaps/index.js +499 -499
  424. package/src/components/GpsButton/index.js +127 -127
  425. package/src/components/LanguageSelector/index.js +163 -163
  426. package/src/components/LoginForm/index.js +527 -527
  427. package/src/components/LogoutAction/index.js +211 -211
  428. package/src/components/MainSearch/index.js +149 -149
  429. package/src/components/MapView/index.js +116 -116
  430. package/src/components/MenuControl/index.js +238 -238
  431. package/src/components/Messages/index.js +166 -166
  432. package/src/components/MomentOption/index.js +322 -322
  433. package/src/components/MultiCartCreate/index.js +70 -70
  434. package/src/components/MultiCartsPaymethodsAndWallets/index.js +201 -201
  435. package/src/components/MultiCheckout/index.js +378 -378
  436. package/src/components/MultiOrdersDetails/index.js +109 -109
  437. package/src/components/MyOrders/index.js +150 -150
  438. package/src/components/MyOrdersList/index.js +104 -104
  439. package/src/components/NewOrderNotification/index.js +30 -30
  440. package/src/components/OrderChange/index.js +128 -128
  441. package/src/components/OrderDetails/index.js +684 -684
  442. package/src/components/OrderList/index.js +814 -814
  443. package/src/components/OrderListGroups/index.js +1245 -1245
  444. package/src/components/OrderReview/index.js +180 -180
  445. package/src/components/OrderTypeControl/index.js +75 -75
  446. package/src/components/OrderVerticalList/index.js +422 -422
  447. package/src/components/OrdersControlFilters/index.js +75 -75
  448. package/src/components/OrdersDashboardComponents/Appointments/index.js +72 -72
  449. package/src/components/OrdersDashboardComponents/BusinessProductsListing/index.js +629 -629
  450. package/src/components/OrdersDashboardComponents/CheckPassword/index.js +177 -177
  451. package/src/components/OrdersDashboardComponents/CityList/index.js +98 -98
  452. package/src/components/OrdersDashboardComponents/CountryList/index.js +162 -162
  453. package/src/components/OrdersDashboardComponents/CustomOrderDetails/index.js +238 -238
  454. package/src/components/OrdersDashboardComponents/DashboardBusinessList/index.js +617 -617
  455. package/src/components/OrdersDashboardComponents/DashboardOrdersList/index.js +943 -943
  456. package/src/components/OrdersDashboardComponents/DriversList/index.js +448 -448
  457. package/src/components/OrdersDashboardComponents/ExportCSV/index.js +192 -192
  458. package/src/components/OrdersDashboardComponents/GiftCardsList/index.js +189 -189
  459. package/src/components/OrdersDashboardComponents/GoogleMapsApiKeySetting/index.js +77 -77
  460. package/src/components/OrdersDashboardComponents/LogisticInformation/index.js +97 -97
  461. package/src/components/OrdersDashboardComponents/Logistics/index.js +174 -174
  462. package/src/components/OrdersDashboardComponents/Messages/index.js +384 -384
  463. package/src/components/OrdersDashboardComponents/MetaFields/index.js +186 -186
  464. package/src/components/OrdersDashboardComponents/OrderDetails/index.js +404 -404
  465. package/src/components/OrdersDashboardComponents/OrderNotification/index.js +70 -70
  466. package/src/components/OrdersDashboardComponents/OrdersFilter/index.js +362 -362
  467. package/src/components/OrdersDashboardComponents/OrdersManage/index.js +873 -873
  468. package/src/components/OrdersDashboardComponents/PointsWalletLevels/index.js +123 -123
  469. package/src/components/OrdersDashboardComponents/ReviewCustomer/index.js +113 -113
  470. package/src/components/OrdersDashboardComponents/Schedule/index.js +315 -315
  471. package/src/components/OrdersDashboardComponents/SettingsList/index.js +298 -298
  472. package/src/components/OrdersDashboardComponents/UserFormDetails/index.js +463 -463
  473. package/src/components/OrdersDashboardComponents/UsersList/index.js +944 -944
  474. package/src/components/OrdersDashboardComponents/WebsocketStatus/index.js +77 -77
  475. package/src/components/OrdersDashboardComponents/index.js +57 -57
  476. package/src/components/PageBanner/index.js +107 -107
  477. package/src/components/PaymentOptionCash/index.js +74 -74
  478. package/src/components/PaymentOptionPaypal/index.js +146 -146
  479. package/src/components/PaymentOptionSquare/index.js +336 -336
  480. package/src/components/PaymentOptionStripe/index.js +289 -289
  481. package/src/components/PaymentOptionStripeDirect/index.js +116 -116
  482. package/src/components/PaymentOptionStripeRedirect/StripeRedirectForm/index.js +71 -71
  483. package/src/components/PaymentOptionStripeRedirect/index.js +122 -122
  484. package/src/components/PaymentOptionWallet/index.js +185 -185
  485. package/src/components/PaymentOptions/index.js +262 -262
  486. package/src/components/PaymethodList/index.js +119 -119
  487. package/src/components/PhoneAutocomplete/index.js +318 -318
  488. package/src/components/PlaceSpot/index.js +183 -183
  489. package/src/components/Popup/index.js +169 -169
  490. package/src/components/ProductComponent/index.js +269 -269
  491. package/src/components/ProductForm/index.js +1105 -1105
  492. package/src/components/ProductImages/index.js +64 -64
  493. package/src/components/ProductIngredient/index.js +72 -72
  494. package/src/components/ProductItemAccordion/index.js +72 -72
  495. package/src/components/ProductOption/index.js +42 -42
  496. package/src/components/ProductOptionSuboption/index.js +181 -181
  497. package/src/components/ProductShare/index.js +97 -97
  498. package/src/components/ProductsList/index.js +74 -74
  499. package/src/components/ProductsListing/index.js +166 -166
  500. package/src/components/ProfessionalInfo/index.js +156 -156
  501. package/src/components/PromotionsController/index.js +123 -123
  502. package/src/components/QueryLoginSpoonity/index.js +159 -159
  503. package/src/components/ReCaptcha/index.js +53 -53
  504. package/src/components/ResetPassword/index.js +111 -111
  505. package/src/components/ReviewCustomer/index.js +117 -117
  506. package/src/components/ReviewDriver/index.js +157 -157
  507. package/src/components/ReviewProduct/index.js +162 -162
  508. package/src/components/SearchOptions/index.js +69 -69
  509. package/src/components/Sessions/index.js +217 -217
  510. package/src/components/SignupForm/index.js +555 -555
  511. package/src/components/SingleBusinessCard/index.js +80 -80
  512. package/src/components/SingleOrderCard/index.js +160 -160
  513. package/src/components/SingleProductCard/index.js +130 -130
  514. package/src/components/SingleProfessionalCard/index.js +121 -121
  515. package/src/components/SmartAppBanner/index.js +71 -71
  516. package/src/components/StoreProductList/index.js +303 -303
  517. package/src/components/StripeElementsForm/CardForm/index.js +248 -248
  518. package/src/components/StripeElementsForm/index.js +78 -78
  519. package/src/components/UpsellingPage/index.js +120 -120
  520. package/src/components/UserFormDetails/index.js +742 -742
  521. package/src/components/UserVerification/index.js +242 -242
  522. package/src/components/WalletList/index.js +160 -160
  523. package/src/components/WebsocketStatus/index.js +80 -80
  524. package/src/components/WrapperGoogleMaps/index.js +67 -67
  525. package/src/constants/code-numbers.js +219 -219
  526. package/src/constants/timezones.js +427 -427
  527. package/src/contexts/ApiContext/index.js +59 -59
  528. package/src/contexts/BillingContext/index.js +28 -28
  529. package/src/contexts/BusinessContext/index.js +71 -71
  530. package/src/contexts/ConfigContext/index.js +217 -217
  531. package/src/contexts/CustomerContext/index.js +69 -69
  532. package/src/contexts/EventContext/index.js +31 -31
  533. package/src/contexts/LanguageContext/index.js +144 -144
  534. package/src/contexts/OptimizationLoadContext/index.js +95 -95
  535. package/src/contexts/OrderContext/index.js +1450 -1450
  536. package/src/contexts/OrderingContext/index.js +86 -86
  537. package/src/contexts/OrderingThemeContext/index.js +107 -107
  538. package/src/contexts/ProductContext/index.js +62 -62
  539. package/src/contexts/SessionContext/index.js +172 -172
  540. package/src/contexts/SiteContext/index.js +79 -79
  541. package/src/contexts/ToastContext/index.js +42 -42
  542. package/src/contexts/UtilsContext/index.js +352 -352
  543. package/src/contexts/ValidationsFieldsContext/index.js +65 -65
  544. package/src/contexts/WebsocketContext/index.js +91 -91
  545. package/src/contexts/WebsocketContext/socket.js +92 -92
  546. package/src/index.js +371 -371
  547. package/src/utils/index.js +32 -32
  548. package/src/webStrategy/index.js +18 -18
  549. package/webpack.dev.js +41 -41
  550. package/webpack.prod.js +64 -64
  551. package/_bundles/0.ordering-component.aa21761da1477298dd80.js +0 -1
  552. package/_bundles/7.ordering-component.aa21761da1477298dd80.js +0 -2
  553. package/_bundles/7.ordering-component.aa21761da1477298dd80.js.LICENSE.txt +0 -53
  554. package/_bundles/ordering-component.aa21761da1477298dd80.js +0 -2
@@ -1,629 +1,629 @@
1
- import React, { useEffect, useState } from 'react'
2
- import PropTypes from 'prop-types'
3
- import { useSession } from '../../../contexts/SessionContext'
4
- import { useEvent } from '../../../contexts/EventContext'
5
-
6
- export const BusinessProductsListing = (props) => {
7
- const {
8
- isSearchByName,
9
- isSearchByDescription,
10
- slug,
11
- categoryId,
12
- productId,
13
- isAllCategoryProducts,
14
- isInitialRender,
15
- ordering,
16
- UIComponent
17
- } = props
18
-
19
- const [{ token }] = useSession()
20
- const [events] = useEvent()
21
- const [categorySelected, setCategorySelected] = useState(null)
22
- const [searchValue, setSearchValue] = useState(null)
23
- const [businessState, setBusinessState] = useState({ business: {}, menus: null, loading: true, error: null })
24
- const [categoriesState, setCategoriesState] = useState({})
25
- const [requestsState, setRequestsState] = useState({})
26
- const [productModal, setProductModal] = useState({ product: null, loading: false, error: null })
27
- const [openCategories, setOpenCategories] = useState({ values: [] })
28
- const [businessSlug, setBusinessSlug] = useState(slug)
29
- const [isUpdateMode, setIsUpdateMode] = useState(false)
30
- const [taxes, setTaxes] = useState({})
31
- const [fees, setFees] = useState({})
32
- const [formTaxState, setFormTaxState] = useState({ loading: false, changes: {}, result: { error: false } })
33
- const [formFeeState, setFormFeeState] = useState({ loading: false, changes: {}, result: { error: false } })
34
- const [businessTypes, setBusinessTypes] = useState([])
35
- const [siteState, setSiteState] = useState({ site: null, loading: false, error: null })
36
- const categoryStateDefault = {
37
- loading: true,
38
- pagination: { currentPage: 0, pageSize: 10, totalItems: null, totalPages: 0, nextPageItems: 10 },
39
- products: []
40
- }
41
-
42
- const [categoryState, setCategoryState] = useState(categoryStateDefault)
43
- const [errors, setErrors] = useState(null)
44
- const [errorQuantityProducts, setErrorQuantityProducts] = useState(false)
45
-
46
- /**
47
- * Change category selected
48
- * @param {Object} category Category object
49
- */
50
- const handleChangeCategory = (e, category) => {
51
- if (e === null && category === null) {
52
- setCategorySelected(null)
53
- }
54
- const isInvalid = e?.target?.closest && (e?.target?.closest('.business_enable_control') || e.target.closest('.business_actions'))
55
- if (isInvalid || category?.id === categorySelected?.id) return
56
- setIsUpdateMode(false)
57
- if (category?.subcategories?.length) {
58
- if (!category?.parent_category_id) {
59
- openCategories.values = []
60
- }
61
- if (openCategories.values.includes(category?.id)) {
62
- openCategories.values = openCategories.values.filter(categoryId => categoryId !== category?.id)
63
- } else {
64
- openCategories.values.push(category?.id)
65
- }
66
- setOpenCategories({
67
- ...openCategories,
68
- values: openCategories.values
69
- })
70
- }
71
- if (category?.id === null) {
72
- setOpenCategories({ ...openCategories, values: [] })
73
- }
74
- setCategorySelected(category)
75
- }
76
-
77
- /**
78
- * Change search value
79
- * @param {string} search search string
80
- */
81
- const handleChangeSearch = (search) => {
82
- setSearchValue(search)
83
- }
84
-
85
- const isMatchSearch = (name, description) => {
86
- if (!searchValue) return true
87
- return (name && (name.toLowerCase().includes(searchValue.toLowerCase()) && isSearchByName)) ||
88
- (description && (description.toLowerCase().includes(searchValue.toLowerCase()) && isSearchByDescription))
89
- }
90
-
91
- const getProducts = async (newFetch, currentPage, currentPageSize) => {
92
- if (!businessState?.business?.lazy_load_products_recommended) {
93
- const categoryState = {
94
- ...categoryStateDefault,
95
- loading: false
96
- }
97
- if (categorySelected) {
98
- let categoryFinded
99
- const _categories = [...businessState?.business?.categories]
100
- _categories.forEach(function iterate (category) {
101
- if (category?.id === categorySelected?.id) {
102
- categoryFinded = category
103
- }
104
- Array.isArray(category?.subcategories) && category.subcategories.forEach(iterate)
105
- })
106
-
107
- let productsFinded = [...categoryFinded?.products]
108
- if (categoryFinded && categoryFinded?.subcategories) {
109
- categoryFinded.subcategories.forEach(function iterate (category) {
110
- productsFinded = [...productsFinded, ...category.products]
111
- Array.isArray(category?.subcategories) && category.subcategories.forEach(iterate)
112
- })
113
- }
114
-
115
- let productsFiltered = productsFinded?.filter(
116
- product => isMatchSearch(product.name, product.description)
117
- )
118
-
119
- if (!productsFiltered) {
120
- productsFiltered = categorySelected?.products?.filter(
121
- product => isMatchSearch(product.name, product.description)
122
- )
123
- }
124
- categoryState.products = productsFiltered || []
125
- } else {
126
- const productsFiltered = businessState?.business?.categories?.reduce(
127
- (products, category) => {
128
- if (category.products) {
129
- return [...products, ...category.products]
130
- }
131
- return [...products]
132
- }
133
- , []
134
- ).filter(
135
- product => isMatchSearch(product.name, product.description)
136
- )
137
- categoryState.products = productsFiltered || []
138
- }
139
-
140
- setCategoryState({
141
- ...categoryState,
142
- products: [...new Map(categoryState.products.map(item => [item.id, item])).values()]
143
- })
144
- return
145
- }
146
-
147
- const categoryKey = searchValue
148
- ? 'search'
149
- : categorySelected?.id === 'featured'
150
- ? 'featured'
151
- : categorySelected?.id
152
- ? `categoryId:${categorySelected?.id}`
153
- : 'all'
154
-
155
- const categoryState = categoriesState[categoryKey] || categoryStateDefault
156
- const pagination = categoryState.pagination
157
-
158
- if (!isUpdateMode) {
159
- setCategoryState({ ...categoryState, loading: true })
160
- }
161
-
162
- const parameters = {
163
- page: currentPage || (newFetch ? 1 : pagination.currentPage + 1),
164
- page_size: currentPageSize || pagination.pageSize
165
- }
166
-
167
- let where = null
168
- const searchConditions = []
169
- if (searchValue) {
170
- if (isSearchByName) {
171
- searchConditions.push(
172
- {
173
- attribute: 'name',
174
- value: {
175
- condition: 'ilike',
176
- value: encodeURI(`%${searchValue}%`)
177
- }
178
- }
179
- )
180
- }
181
- if (isSearchByDescription) {
182
- searchConditions.push(
183
- {
184
- attribute: 'description',
185
- value: {
186
- condition: 'ilike',
187
- value: encodeURI(`%${searchValue}%`)
188
- }
189
- }
190
- )
191
- }
192
- }
193
-
194
- where = {
195
- conditions: searchConditions,
196
- conector: 'OR'
197
- }
198
-
199
- try {
200
- const functionFetch = categorySelected?.id && categorySelected?.id !== 'featured'
201
- ? ordering.businesses(businessState.business?.id).categories(categorySelected?.id).products()
202
- : ordering.businesses(businessState.business?.id).products()
203
- const source = {}
204
- requestsState.products = source
205
- setRequestsState({ ...requestsState })
206
- const productEndpoint = where.conditions.length > 0
207
- ? functionFetch.parameters(parameters).where(where)
208
- : functionFetch.parameters(parameters)
209
- const { content: { error, result, pagination } } = await productEndpoint.get({ cancelToken: source })
210
- if (!error) {
211
- const newcategoryState = {
212
- pagination: {
213
- ...categoryState.pagination,
214
- pageSize: pagination.page_size === 0 ? categoryState.pagination.pageSize : pagination.page_size,
215
- currentPage: pagination.current_page,
216
- totalItems: pagination.total,
217
- totalPages: pagination.total_pages
218
- },
219
- loading: false,
220
- products: newFetch ? [...result] : [...categoryState.products, ...result]
221
- }
222
-
223
- categoriesState[categoryKey] = newcategoryState
224
- setCategoryState({
225
- ...newcategoryState,
226
- products: [...new Map(newcategoryState.products.map(item => [item.id, item])).values()]
227
- })
228
- setCategoriesState({ ...categoriesState })
229
- } else {
230
- setErrors(result)
231
- }
232
- } catch (err) {
233
- setErrors([err.message])
234
- }
235
- }
236
-
237
- const getProduct = async () => {
238
- if (categoryId && productId && businessState.business?.id) {
239
- try {
240
- setProductModal({
241
- ...productModal,
242
- loading: true
243
- })
244
- const source = {}
245
- requestsState.product = source
246
-
247
- const { content: { result } } = await ordering
248
- .businesses(businessState.business?.id)
249
- .categories(categoryId)
250
- .products(productId)
251
- .get({ cancelToken: source })
252
- const product = Array.isArray(result) ? null : result
253
- setProductModal({
254
- ...productModal,
255
- product,
256
- loading: false
257
- })
258
- } catch (e) {
259
- setProductModal({
260
- ...productModal,
261
- loading: false,
262
- error: [e]
263
- })
264
- }
265
- }
266
- }
267
-
268
- const getTaxes = async () => {
269
- const taxesObject = {}
270
- setFormTaxState({
271
- ...formTaxState,
272
- loading: true
273
- })
274
- const response = await fetch(`${ordering.root}/taxes`, {
275
- method: 'GET',
276
- headers: {
277
- 'Content-Type': 'application/json',
278
- Authorization: `Bearer ${token}`
279
- }
280
- })
281
- const { error, result } = await response.json()
282
- if (!error) {
283
- result.forEach(tax => (taxesObject[`id:${tax?.id}`] = tax))
284
- setTaxes(taxesObject)
285
- return
286
- }
287
- setFormTaxState({
288
- ...formTaxState,
289
- result: {
290
- error: true,
291
- result: taxesObject
292
- },
293
- loading: false
294
- })
295
- }
296
-
297
- const getFees = async () => {
298
- const feesObject = {}
299
- setFormFeeState({
300
- ...formFeeState,
301
- loading: true
302
- })
303
- const response = await fetch(`${ordering.root}/fees`, {
304
- method: 'GET',
305
- headers: {
306
- 'Content-Type': 'application/json',
307
- Authorization: `Bearer ${token}`
308
- }
309
- })
310
- const { error, result } = await response.json()
311
- if (!error) {
312
- result.forEach(fee => (feesObject[`id:${fee?.id}`] = fee))
313
- setFees(feesObject)
314
- return
315
- }
316
- setFormFeeState({
317
- ...formFeeState,
318
- result: {
319
- error: true,
320
- result: feesObject
321
- },
322
- loading: false
323
- })
324
- }
325
-
326
- /**
327
- * Method to get the themes from API
328
- */
329
- const getSites = async () => {
330
- try {
331
- setSiteState({ ...siteState, loading: true })
332
- const requestOptions = {
333
- method: 'GET',
334
- headers: {
335
- 'Content-Type': 'application/json',
336
- Authorization: `Bearer ${token}`
337
- }
338
- }
339
- const response = await fetch(`${ordering.root}/sites`, requestOptions)
340
- const { error, result } = await response.json()
341
- if (!error) {
342
- const site = result.find(site => site.code === 'website')
343
- setSiteState({ ...siteState, loading: false, site: site })
344
- } else {
345
- setSiteState({ ...siteState, loading: false, error: result })
346
- }
347
- } catch (err) {
348
- setSiteState({ ...siteState, loading: false, error: [err.message] })
349
- }
350
- }
351
-
352
- const getBusinessTypes = async () => {
353
- try {
354
- const response = await fetch(`${ordering.root}/business_types?where=[{"attribute":"enabled","value":true}]`, {
355
- method: 'GET',
356
- headers: { 'Content-Type': 'application/json' }
357
- })
358
- const { error, result } = await response.json()
359
- if (!error) {
360
- setBusinessTypes(result)
361
- }
362
- } catch (error) {
363
- console.log(error?.message)
364
- }
365
- }
366
-
367
- useEffect(() => {
368
- if (isInitialRender) {
369
- getProduct()
370
- }
371
- }, [JSON.stringify(businessState.business?.id), isInitialRender])
372
-
373
- useEffect(() => {
374
- setBusinessSlug(slug)
375
- }, [slug])
376
-
377
- const getBusiness = async () => {
378
- try {
379
- setBusinessState({ ...businessState, loading: true })
380
- const source = {}
381
- requestsState.business = source
382
- setRequestsState({ ...requestsState })
383
-
384
- const { content: { result } } = await ordering.businesses(businessSlug).asDashboard().get()
385
-
386
- if (!result?.categories || result?.categories?.length === 0) {
387
- setErrorQuantityProducts(true)
388
- }
389
-
390
- setBusinessState({
391
- ...businessState,
392
- business: result,
393
- loading: false
394
- })
395
- } catch (err) {
396
- setBusinessState({
397
- ...businessState,
398
- loading: false,
399
- error: [err.message]
400
- })
401
- }
402
- }
403
-
404
- /**
405
- * Method to update the business
406
- */
407
- const handleUpdateBusinessState = (result) => {
408
- setIsUpdateMode(true)
409
- const business = { ...businessState?.business }
410
- Object.assign(business, result)
411
- if (categorySelected) {
412
- business.categories.forEach(function iterate (category) {
413
- if (category?.id === categorySelected?.id) {
414
- setCategorySelected(category)
415
- }
416
- Array.isArray(category?.subcategories) && category.subcategories.forEach(iterate)
417
- })
418
- }
419
- setBusinessState({
420
- ...businessState,
421
- business: business
422
- })
423
- }
424
-
425
- /**
426
- * Method to update the category state
427
- */
428
- const handleUpdateCategoryState = (updatedCategory) => {
429
- setCategoryState(updatedCategory)
430
- }
431
-
432
- const handleUpdateTaxesProducts = ({ tax, isRemove, id }) => {
433
- const _categories = [...businessState?.business?.categories]
434
- const replaceSameTaxes = (categories, tax) => {
435
- for (let i = 0; i < categories?.length; i++) {
436
- const category = categories[i]
437
- for (let j = 0; j < category.products.length; j++) {
438
- const product = category.products[j]
439
- if (isRemove && product.tax?.id === tax?.id) {
440
- product.tax = null
441
- product.tax_id = null
442
- } else if (product.tax && product.tax?.id === tax?.id) {
443
- Object.assign(product.tax, tax)
444
- product.tax_id = tax?.id
445
- }
446
- }
447
- if (category.subcategories?.length > 0) {
448
- categories.subcategories = replaceSameTaxes(categories.subcategories, tax)
449
- }
450
- }
451
- return categories
452
- }
453
- setBusinessState({
454
- ...businessState,
455
- business: {
456
- ...businessState.business,
457
- categories: replaceSameTaxes(_categories, tax)
458
- }
459
- })
460
- }
461
-
462
- const handleUpdateFeesProducts = ({ fee, isRemove }) => {
463
- const _categories = [...businessState?.business?.categories]
464
- const replaceSameFees = (categories, fee) => {
465
- for (let i = 0; i < categories?.length; i++) {
466
- const category = categories[i]
467
- for (let j = 0; j < category.products.length; j++) {
468
- const product = category.products[j]
469
- if (isRemove && product.fee?.id === fee?.id) {
470
- product.fee = null
471
- product.fee_id = null
472
- } else if (product.fee && product.fee?.id === fee?.id) {
473
- Object.assign(product.fee, fee)
474
- product.fee_id = fee?.id
475
- }
476
- }
477
- if (category.subcategories?.length > 0) {
478
- categories.subcategories = replaceSameFees(categories.subcategories, fee)
479
- }
480
- }
481
- return categories
482
- }
483
- setBusinessState({
484
- ...businessState,
485
- business: {
486
- ...businessState.business,
487
- categories: replaceSameFees(_categories, fee)
488
- }
489
- })
490
- }
491
-
492
- useEffect(() => {
493
- if (businessState.loading) return
494
- if (!businessState.loading && (categorySelected || isAllCategoryProducts)) {
495
- getProducts(true)
496
- }
497
- }, [businessState])
498
-
499
- useEffect(() => {
500
- if (searchValue !== null) getProducts(!!searchValue)
501
- }, [searchValue])
502
-
503
- useEffect(() => {
504
- getProducts(!!searchValue, 1)
505
- }, [categorySelected?.id])
506
-
507
- useEffect(() => {
508
- if (businessSlug) {
509
- getBusiness()
510
- } else {
511
- setBusinessState({ ...businessState, loading: false, business: {} })
512
- setCategoriesState({})
513
- setCategoryState({ ...categoryStateDefault, loading: false })
514
- setCategorySelected(null)
515
- }
516
- }, [businessSlug])
517
-
518
- useEffect(() => {
519
- if (!businessState?.business) return
520
- if (Object.keys(businessState?.business)?.length > 0) {
521
- events.on('tax_changed', handleUpdateTaxesProducts)
522
- events.on('fee_changed', handleUpdateFeesProducts)
523
- events.on('tax_deleted', handleUpdateTaxesProducts)
524
- events.on('fee_deleted', handleUpdateFeesProducts)
525
- return () => {
526
- events.off('tax_changed', handleUpdateTaxesProducts)
527
- events.off('fee_changed', handleUpdateFeesProducts)
528
- events.off('tax_deleted', handleUpdateFeesProducts)
529
- events.off('fee_deleted', handleUpdateFeesProducts)
530
- }
531
- }
532
- }, [businessState?.business])
533
-
534
- /**
535
- * Cancel business request
536
- */
537
- useEffect(() => {
538
- const request = requestsState.business
539
- return () => {
540
- request && request.cancel && request.cancel()
541
- }
542
- }, [requestsState.business])
543
-
544
- /**
545
- * Cancel products request on unmount and pagination
546
- */
547
- useEffect(() => {
548
- const request = requestsState.products
549
- return () => {
550
- request && request.cancel && request.cancel()
551
- }
552
- }, [requestsState.products])
553
-
554
- useEffect(() => {
555
- getTaxes()
556
- getFees()
557
- getBusinessTypes()
558
- getSites()
559
- }, [])
560
-
561
- return (
562
- <>
563
- {UIComponent && (
564
- <UIComponent
565
- {...props}
566
- errors={errors}
567
- categorySelected={categorySelected}
568
- searchValue={searchValue}
569
- categoryState={categoryState}
570
- businessState={businessState}
571
- productModal={productModal}
572
- errorQuantityProducts={errorQuantityProducts}
573
- handleChangeCategory={handleChangeCategory}
574
- handleChangeSearch={handleChangeSearch}
575
- getPageProducts={getProducts}
576
- getBusiness={getBusiness}
577
- setCategorySelected={setCategorySelected}
578
- setBusinessState={setBusinessState}
579
- handleUpdateBusinessState={handleUpdateBusinessState}
580
- updateProductModal={(val) => setProductModal({ ...productModal, product: val })}
581
- openCategories={openCategories.values}
582
- setOpenCategories={setOpenCategories}
583
- setBusinessSlug={setBusinessSlug}
584
- handleUpdateCategoryState={handleUpdateCategoryState}
585
- setFormTaxState={setFormTaxState}
586
- formTaxState={formTaxState}
587
- taxes={taxes}
588
- setTaxes={setTaxes}
589
- fees={fees}
590
- setFees={setFees}
591
- businessTypes={businessTypes}
592
- setBusinessTypes={setBusinessTypes}
593
- siteState={siteState}
594
- />
595
- )}
596
- </>
597
- )
598
- }
599
-
600
- BusinessProductsListing.propTypes = {
601
- /**
602
- * UI Component, this must be containt all graphic elements and use parent props
603
- */
604
- UIComponent: PropTypes.elementType,
605
- /**
606
- * true, flag to decide search parmeter
607
- */
608
- isSearchByName: PropTypes.bool,
609
- /**
610
- * true, flag to decide search parmeter
611
- */
612
- isSearchByDescription: PropTypes.bool,
613
- /**
614
- * Slug from Store
615
- */
616
- slug: PropTypes.string,
617
- /**
618
- * True, flag to make initial API call
619
- */
620
- isInitialRender: PropTypes.bool
621
-
622
- }
623
-
624
- BusinessProductsListing.defaultProps = {
625
- beforeComponents: [],
626
- afterComponents: [],
627
- beforeElements: [],
628
- afterElements: []
629
- }
1
+ import React, { useEffect, useState } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import { useSession } from '../../../contexts/SessionContext'
4
+ import { useEvent } from '../../../contexts/EventContext'
5
+
6
+ export const BusinessProductsListing = (props) => {
7
+ const {
8
+ isSearchByName,
9
+ isSearchByDescription,
10
+ slug,
11
+ categoryId,
12
+ productId,
13
+ isAllCategoryProducts,
14
+ isInitialRender,
15
+ ordering,
16
+ UIComponent
17
+ } = props
18
+
19
+ const [{ token }] = useSession()
20
+ const [events] = useEvent()
21
+ const [categorySelected, setCategorySelected] = useState(null)
22
+ const [searchValue, setSearchValue] = useState(null)
23
+ const [businessState, setBusinessState] = useState({ business: {}, menus: null, loading: true, error: null })
24
+ const [categoriesState, setCategoriesState] = useState({})
25
+ const [requestsState, setRequestsState] = useState({})
26
+ const [productModal, setProductModal] = useState({ product: null, loading: false, error: null })
27
+ const [openCategories, setOpenCategories] = useState({ values: [] })
28
+ const [businessSlug, setBusinessSlug] = useState(slug)
29
+ const [isUpdateMode, setIsUpdateMode] = useState(false)
30
+ const [taxes, setTaxes] = useState({})
31
+ const [fees, setFees] = useState({})
32
+ const [formTaxState, setFormTaxState] = useState({ loading: false, changes: {}, result: { error: false } })
33
+ const [formFeeState, setFormFeeState] = useState({ loading: false, changes: {}, result: { error: false } })
34
+ const [businessTypes, setBusinessTypes] = useState([])
35
+ const [siteState, setSiteState] = useState({ site: null, loading: false, error: null })
36
+ const categoryStateDefault = {
37
+ loading: true,
38
+ pagination: { currentPage: 0, pageSize: 10, totalItems: null, totalPages: 0, nextPageItems: 10 },
39
+ products: []
40
+ }
41
+
42
+ const [categoryState, setCategoryState] = useState(categoryStateDefault)
43
+ const [errors, setErrors] = useState(null)
44
+ const [errorQuantityProducts, setErrorQuantityProducts] = useState(false)
45
+
46
+ /**
47
+ * Change category selected
48
+ * @param {Object} category Category object
49
+ */
50
+ const handleChangeCategory = (e, category) => {
51
+ if (e === null && category === null) {
52
+ setCategorySelected(null)
53
+ }
54
+ const isInvalid = e?.target?.closest && (e?.target?.closest('.business_enable_control') || e.target.closest('.business_actions'))
55
+ if (isInvalid || category?.id === categorySelected?.id) return
56
+ setIsUpdateMode(false)
57
+ if (category?.subcategories?.length) {
58
+ if (!category?.parent_category_id) {
59
+ openCategories.values = []
60
+ }
61
+ if (openCategories.values.includes(category?.id)) {
62
+ openCategories.values = openCategories.values.filter(categoryId => categoryId !== category?.id)
63
+ } else {
64
+ openCategories.values.push(category?.id)
65
+ }
66
+ setOpenCategories({
67
+ ...openCategories,
68
+ values: openCategories.values
69
+ })
70
+ }
71
+ if (category?.id === null) {
72
+ setOpenCategories({ ...openCategories, values: [] })
73
+ }
74
+ setCategorySelected(category)
75
+ }
76
+
77
+ /**
78
+ * Change search value
79
+ * @param {string} search search string
80
+ */
81
+ const handleChangeSearch = (search) => {
82
+ setSearchValue(search)
83
+ }
84
+
85
+ const isMatchSearch = (name, description) => {
86
+ if (!searchValue) return true
87
+ return (name && (name.toLowerCase().includes(searchValue.toLowerCase()) && isSearchByName)) ||
88
+ (description && (description.toLowerCase().includes(searchValue.toLowerCase()) && isSearchByDescription))
89
+ }
90
+
91
+ const getProducts = async (newFetch, currentPage, currentPageSize) => {
92
+ if (!businessState?.business?.lazy_load_products_recommended) {
93
+ const categoryState = {
94
+ ...categoryStateDefault,
95
+ loading: false
96
+ }
97
+ if (categorySelected) {
98
+ let categoryFinded
99
+ const _categories = [...businessState?.business?.categories]
100
+ _categories.forEach(function iterate (category) {
101
+ if (category?.id === categorySelected?.id) {
102
+ categoryFinded = category
103
+ }
104
+ Array.isArray(category?.subcategories) && category.subcategories.forEach(iterate)
105
+ })
106
+
107
+ let productsFinded = [...categoryFinded?.products]
108
+ if (categoryFinded && categoryFinded?.subcategories) {
109
+ categoryFinded.subcategories.forEach(function iterate (category) {
110
+ productsFinded = [...productsFinded, ...category.products]
111
+ Array.isArray(category?.subcategories) && category.subcategories.forEach(iterate)
112
+ })
113
+ }
114
+
115
+ let productsFiltered = productsFinded?.filter(
116
+ product => isMatchSearch(product.name, product.description)
117
+ )
118
+
119
+ if (!productsFiltered) {
120
+ productsFiltered = categorySelected?.products?.filter(
121
+ product => isMatchSearch(product.name, product.description)
122
+ )
123
+ }
124
+ categoryState.products = productsFiltered || []
125
+ } else {
126
+ const productsFiltered = businessState?.business?.categories?.reduce(
127
+ (products, category) => {
128
+ if (category.products) {
129
+ return [...products, ...category.products]
130
+ }
131
+ return [...products]
132
+ }
133
+ , []
134
+ ).filter(
135
+ product => isMatchSearch(product.name, product.description)
136
+ )
137
+ categoryState.products = productsFiltered || []
138
+ }
139
+
140
+ setCategoryState({
141
+ ...categoryState,
142
+ products: [...new Map(categoryState.products.map(item => [item.id, item])).values()]
143
+ })
144
+ return
145
+ }
146
+
147
+ const categoryKey = searchValue
148
+ ? 'search'
149
+ : categorySelected?.id === 'featured'
150
+ ? 'featured'
151
+ : categorySelected?.id
152
+ ? `categoryId:${categorySelected?.id}`
153
+ : 'all'
154
+
155
+ const categoryState = categoriesState[categoryKey] || categoryStateDefault
156
+ const pagination = categoryState.pagination
157
+
158
+ if (!isUpdateMode) {
159
+ setCategoryState({ ...categoryState, loading: true })
160
+ }
161
+
162
+ const parameters = {
163
+ page: currentPage || (newFetch ? 1 : pagination.currentPage + 1),
164
+ page_size: currentPageSize || pagination.pageSize
165
+ }
166
+
167
+ let where = null
168
+ const searchConditions = []
169
+ if (searchValue) {
170
+ if (isSearchByName) {
171
+ searchConditions.push(
172
+ {
173
+ attribute: 'name',
174
+ value: {
175
+ condition: 'ilike',
176
+ value: encodeURI(`%${searchValue}%`)
177
+ }
178
+ }
179
+ )
180
+ }
181
+ if (isSearchByDescription) {
182
+ searchConditions.push(
183
+ {
184
+ attribute: 'description',
185
+ value: {
186
+ condition: 'ilike',
187
+ value: encodeURI(`%${searchValue}%`)
188
+ }
189
+ }
190
+ )
191
+ }
192
+ }
193
+
194
+ where = {
195
+ conditions: searchConditions,
196
+ conector: 'OR'
197
+ }
198
+
199
+ try {
200
+ const functionFetch = categorySelected?.id && categorySelected?.id !== 'featured'
201
+ ? ordering.businesses(businessState.business?.id).categories(categorySelected?.id).products()
202
+ : ordering.businesses(businessState.business?.id).products()
203
+ const source = {}
204
+ requestsState.products = source
205
+ setRequestsState({ ...requestsState })
206
+ const productEndpoint = where.conditions.length > 0
207
+ ? functionFetch.parameters(parameters).where(where)
208
+ : functionFetch.parameters(parameters)
209
+ const { content: { error, result, pagination } } = await productEndpoint.get({ cancelToken: source })
210
+ if (!error) {
211
+ const newcategoryState = {
212
+ pagination: {
213
+ ...categoryState.pagination,
214
+ pageSize: pagination.page_size === 0 ? categoryState.pagination.pageSize : pagination.page_size,
215
+ currentPage: pagination.current_page,
216
+ totalItems: pagination.total,
217
+ totalPages: pagination.total_pages
218
+ },
219
+ loading: false,
220
+ products: newFetch ? [...result] : [...categoryState.products, ...result]
221
+ }
222
+
223
+ categoriesState[categoryKey] = newcategoryState
224
+ setCategoryState({
225
+ ...newcategoryState,
226
+ products: [...new Map(newcategoryState.products.map(item => [item.id, item])).values()]
227
+ })
228
+ setCategoriesState({ ...categoriesState })
229
+ } else {
230
+ setErrors(result)
231
+ }
232
+ } catch (err) {
233
+ setErrors([err.message])
234
+ }
235
+ }
236
+
237
+ const getProduct = async () => {
238
+ if (categoryId && productId && businessState.business?.id) {
239
+ try {
240
+ setProductModal({
241
+ ...productModal,
242
+ loading: true
243
+ })
244
+ const source = {}
245
+ requestsState.product = source
246
+
247
+ const { content: { result } } = await ordering
248
+ .businesses(businessState.business?.id)
249
+ .categories(categoryId)
250
+ .products(productId)
251
+ .get({ cancelToken: source })
252
+ const product = Array.isArray(result) ? null : result
253
+ setProductModal({
254
+ ...productModal,
255
+ product,
256
+ loading: false
257
+ })
258
+ } catch (e) {
259
+ setProductModal({
260
+ ...productModal,
261
+ loading: false,
262
+ error: [e]
263
+ })
264
+ }
265
+ }
266
+ }
267
+
268
+ const getTaxes = async () => {
269
+ const taxesObject = {}
270
+ setFormTaxState({
271
+ ...formTaxState,
272
+ loading: true
273
+ })
274
+ const response = await fetch(`${ordering.root}/taxes`, {
275
+ method: 'GET',
276
+ headers: {
277
+ 'Content-Type': 'application/json',
278
+ Authorization: `Bearer ${token}`
279
+ }
280
+ })
281
+ const { error, result } = await response.json()
282
+ if (!error) {
283
+ result.forEach(tax => (taxesObject[`id:${tax?.id}`] = tax))
284
+ setTaxes(taxesObject)
285
+ return
286
+ }
287
+ setFormTaxState({
288
+ ...formTaxState,
289
+ result: {
290
+ error: true,
291
+ result: taxesObject
292
+ },
293
+ loading: false
294
+ })
295
+ }
296
+
297
+ const getFees = async () => {
298
+ const feesObject = {}
299
+ setFormFeeState({
300
+ ...formFeeState,
301
+ loading: true
302
+ })
303
+ const response = await fetch(`${ordering.root}/fees`, {
304
+ method: 'GET',
305
+ headers: {
306
+ 'Content-Type': 'application/json',
307
+ Authorization: `Bearer ${token}`
308
+ }
309
+ })
310
+ const { error, result } = await response.json()
311
+ if (!error) {
312
+ result.forEach(fee => (feesObject[`id:${fee?.id}`] = fee))
313
+ setFees(feesObject)
314
+ return
315
+ }
316
+ setFormFeeState({
317
+ ...formFeeState,
318
+ result: {
319
+ error: true,
320
+ result: feesObject
321
+ },
322
+ loading: false
323
+ })
324
+ }
325
+
326
+ /**
327
+ * Method to get the themes from API
328
+ */
329
+ const getSites = async () => {
330
+ try {
331
+ setSiteState({ ...siteState, loading: true })
332
+ const requestOptions = {
333
+ method: 'GET',
334
+ headers: {
335
+ 'Content-Type': 'application/json',
336
+ Authorization: `Bearer ${token}`
337
+ }
338
+ }
339
+ const response = await fetch(`${ordering.root}/sites`, requestOptions)
340
+ const { error, result } = await response.json()
341
+ if (!error) {
342
+ const site = result.find(site => site.code === 'website')
343
+ setSiteState({ ...siteState, loading: false, site: site })
344
+ } else {
345
+ setSiteState({ ...siteState, loading: false, error: result })
346
+ }
347
+ } catch (err) {
348
+ setSiteState({ ...siteState, loading: false, error: [err.message] })
349
+ }
350
+ }
351
+
352
+ const getBusinessTypes = async () => {
353
+ try {
354
+ const response = await fetch(`${ordering.root}/business_types?where=[{"attribute":"enabled","value":true}]`, {
355
+ method: 'GET',
356
+ headers: { 'Content-Type': 'application/json' }
357
+ })
358
+ const { error, result } = await response.json()
359
+ if (!error) {
360
+ setBusinessTypes(result)
361
+ }
362
+ } catch (error) {
363
+ console.log(error?.message)
364
+ }
365
+ }
366
+
367
+ useEffect(() => {
368
+ if (isInitialRender) {
369
+ getProduct()
370
+ }
371
+ }, [JSON.stringify(businessState.business?.id), isInitialRender])
372
+
373
+ useEffect(() => {
374
+ setBusinessSlug(slug)
375
+ }, [slug])
376
+
377
+ const getBusiness = async () => {
378
+ try {
379
+ setBusinessState({ ...businessState, loading: true })
380
+ const source = {}
381
+ requestsState.business = source
382
+ setRequestsState({ ...requestsState })
383
+
384
+ const { content: { result } } = await ordering.businesses(businessSlug).asDashboard().get()
385
+
386
+ if (!result?.categories || result?.categories?.length === 0) {
387
+ setErrorQuantityProducts(true)
388
+ }
389
+
390
+ setBusinessState({
391
+ ...businessState,
392
+ business: result,
393
+ loading: false
394
+ })
395
+ } catch (err) {
396
+ setBusinessState({
397
+ ...businessState,
398
+ loading: false,
399
+ error: [err.message]
400
+ })
401
+ }
402
+ }
403
+
404
+ /**
405
+ * Method to update the business
406
+ */
407
+ const handleUpdateBusinessState = (result) => {
408
+ setIsUpdateMode(true)
409
+ const business = { ...businessState?.business }
410
+ Object.assign(business, result)
411
+ if (categorySelected) {
412
+ business.categories.forEach(function iterate (category) {
413
+ if (category?.id === categorySelected?.id) {
414
+ setCategorySelected(category)
415
+ }
416
+ Array.isArray(category?.subcategories) && category.subcategories.forEach(iterate)
417
+ })
418
+ }
419
+ setBusinessState({
420
+ ...businessState,
421
+ business: business
422
+ })
423
+ }
424
+
425
+ /**
426
+ * Method to update the category state
427
+ */
428
+ const handleUpdateCategoryState = (updatedCategory) => {
429
+ setCategoryState(updatedCategory)
430
+ }
431
+
432
+ const handleUpdateTaxesProducts = ({ tax, isRemove, id }) => {
433
+ const _categories = [...businessState?.business?.categories]
434
+ const replaceSameTaxes = (categories, tax) => {
435
+ for (let i = 0; i < categories?.length; i++) {
436
+ const category = categories[i]
437
+ for (let j = 0; j < category.products.length; j++) {
438
+ const product = category.products[j]
439
+ if (isRemove && product.tax?.id === tax?.id) {
440
+ product.tax = null
441
+ product.tax_id = null
442
+ } else if (product.tax && product.tax?.id === tax?.id) {
443
+ Object.assign(product.tax, tax)
444
+ product.tax_id = tax?.id
445
+ }
446
+ }
447
+ if (category.subcategories?.length > 0) {
448
+ categories.subcategories = replaceSameTaxes(categories.subcategories, tax)
449
+ }
450
+ }
451
+ return categories
452
+ }
453
+ setBusinessState({
454
+ ...businessState,
455
+ business: {
456
+ ...businessState.business,
457
+ categories: replaceSameTaxes(_categories, tax)
458
+ }
459
+ })
460
+ }
461
+
462
+ const handleUpdateFeesProducts = ({ fee, isRemove }) => {
463
+ const _categories = [...businessState?.business?.categories]
464
+ const replaceSameFees = (categories, fee) => {
465
+ for (let i = 0; i < categories?.length; i++) {
466
+ const category = categories[i]
467
+ for (let j = 0; j < category.products.length; j++) {
468
+ const product = category.products[j]
469
+ if (isRemove && product.fee?.id === fee?.id) {
470
+ product.fee = null
471
+ product.fee_id = null
472
+ } else if (product.fee && product.fee?.id === fee?.id) {
473
+ Object.assign(product.fee, fee)
474
+ product.fee_id = fee?.id
475
+ }
476
+ }
477
+ if (category.subcategories?.length > 0) {
478
+ categories.subcategories = replaceSameFees(categories.subcategories, fee)
479
+ }
480
+ }
481
+ return categories
482
+ }
483
+ setBusinessState({
484
+ ...businessState,
485
+ business: {
486
+ ...businessState.business,
487
+ categories: replaceSameFees(_categories, fee)
488
+ }
489
+ })
490
+ }
491
+
492
+ useEffect(() => {
493
+ if (businessState.loading) return
494
+ if (!businessState.loading && (categorySelected || isAllCategoryProducts)) {
495
+ getProducts(true)
496
+ }
497
+ }, [businessState])
498
+
499
+ useEffect(() => {
500
+ if (searchValue !== null) getProducts(!!searchValue)
501
+ }, [searchValue])
502
+
503
+ useEffect(() => {
504
+ getProducts(!!searchValue, 1)
505
+ }, [categorySelected?.id])
506
+
507
+ useEffect(() => {
508
+ if (businessSlug) {
509
+ getBusiness()
510
+ } else {
511
+ setBusinessState({ ...businessState, loading: false, business: {} })
512
+ setCategoriesState({})
513
+ setCategoryState({ ...categoryStateDefault, loading: false })
514
+ setCategorySelected(null)
515
+ }
516
+ }, [businessSlug])
517
+
518
+ useEffect(() => {
519
+ if (!businessState?.business) return
520
+ if (Object.keys(businessState?.business)?.length > 0) {
521
+ events.on('tax_changed', handleUpdateTaxesProducts)
522
+ events.on('fee_changed', handleUpdateFeesProducts)
523
+ events.on('tax_deleted', handleUpdateTaxesProducts)
524
+ events.on('fee_deleted', handleUpdateFeesProducts)
525
+ return () => {
526
+ events.off('tax_changed', handleUpdateTaxesProducts)
527
+ events.off('fee_changed', handleUpdateFeesProducts)
528
+ events.off('tax_deleted', handleUpdateFeesProducts)
529
+ events.off('fee_deleted', handleUpdateFeesProducts)
530
+ }
531
+ }
532
+ }, [businessState?.business])
533
+
534
+ /**
535
+ * Cancel business request
536
+ */
537
+ useEffect(() => {
538
+ const request = requestsState.business
539
+ return () => {
540
+ request && request.cancel && request.cancel()
541
+ }
542
+ }, [requestsState.business])
543
+
544
+ /**
545
+ * Cancel products request on unmount and pagination
546
+ */
547
+ useEffect(() => {
548
+ const request = requestsState.products
549
+ return () => {
550
+ request && request.cancel && request.cancel()
551
+ }
552
+ }, [requestsState.products])
553
+
554
+ useEffect(() => {
555
+ getTaxes()
556
+ getFees()
557
+ getBusinessTypes()
558
+ getSites()
559
+ }, [])
560
+
561
+ return (
562
+ <>
563
+ {UIComponent && (
564
+ <UIComponent
565
+ {...props}
566
+ errors={errors}
567
+ categorySelected={categorySelected}
568
+ searchValue={searchValue}
569
+ categoryState={categoryState}
570
+ businessState={businessState}
571
+ productModal={productModal}
572
+ errorQuantityProducts={errorQuantityProducts}
573
+ handleChangeCategory={handleChangeCategory}
574
+ handleChangeSearch={handleChangeSearch}
575
+ getPageProducts={getProducts}
576
+ getBusiness={getBusiness}
577
+ setCategorySelected={setCategorySelected}
578
+ setBusinessState={setBusinessState}
579
+ handleUpdateBusinessState={handleUpdateBusinessState}
580
+ updateProductModal={(val) => setProductModal({ ...productModal, product: val })}
581
+ openCategories={openCategories.values}
582
+ setOpenCategories={setOpenCategories}
583
+ setBusinessSlug={setBusinessSlug}
584
+ handleUpdateCategoryState={handleUpdateCategoryState}
585
+ setFormTaxState={setFormTaxState}
586
+ formTaxState={formTaxState}
587
+ taxes={taxes}
588
+ setTaxes={setTaxes}
589
+ fees={fees}
590
+ setFees={setFees}
591
+ businessTypes={businessTypes}
592
+ setBusinessTypes={setBusinessTypes}
593
+ siteState={siteState}
594
+ />
595
+ )}
596
+ </>
597
+ )
598
+ }
599
+
600
+ BusinessProductsListing.propTypes = {
601
+ /**
602
+ * UI Component, this must be containt all graphic elements and use parent props
603
+ */
604
+ UIComponent: PropTypes.elementType,
605
+ /**
606
+ * true, flag to decide search parmeter
607
+ */
608
+ isSearchByName: PropTypes.bool,
609
+ /**
610
+ * true, flag to decide search parmeter
611
+ */
612
+ isSearchByDescription: PropTypes.bool,
613
+ /**
614
+ * Slug from Store
615
+ */
616
+ slug: PropTypes.string,
617
+ /**
618
+ * True, flag to make initial API call
619
+ */
620
+ isInitialRender: PropTypes.bool
621
+
622
+ }
623
+
624
+ BusinessProductsListing.defaultProps = {
625
+ beforeComponents: [],
626
+ afterComponents: [],
627
+ beforeElements: [],
628
+ afterElements: []
629
+ }