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,670 +1,670 @@
1
- import React, { useEffect, useLayoutEffect, useState } from 'react'
2
- import PropTypes, { string } from 'prop-types'
3
- import dayjs from 'dayjs'
4
- import utc from 'dayjs/plugin/utc'
5
- import { useApi } from '../../contexts/ApiContext'
6
- import { useOrder } from '../../contexts/OrderContext'
7
- import { useConfig } from '../../contexts/ConfigContext'
8
- import { useSession } from '../../contexts/SessionContext'
9
- import { useOrderingTheme } from '../../contexts/OrderingThemeContext'
10
- import { useWebsocket } from '../../contexts/WebsocketContext'
11
- dayjs.extend(utc)
12
-
13
- export const BusinessList = (props) => {
14
- const {
15
- UIComponent,
16
- initialBuisnessType,
17
- initialOrderType,
18
- initialOrderByValue,
19
- initialFilterKey,
20
- initialFilterValue,
21
- initialPricelevel,
22
- isOfferBusinesses,
23
- isSortByReview,
24
- isSearchByName,
25
- isSearchByDescription,
26
- isFeatured,
27
- isDoordash,
28
- asDashboard,
29
- paginationSettings,
30
- customLocation,
31
- propsToFetch,
32
- onBusinessClick,
33
- windowPathname,
34
- currentPageParam,
35
- franchiseId,
36
- businessId,
37
- cityId,
38
- actualSlug,
39
- searchValueCustom,
40
- isKiosk,
41
- isCustomerMode
42
- } = props
43
-
44
- const avoidFetchData = !token || isKiosk
45
- const [businessesList, setBusinessesList] = useState({ businesses: [], loading: true, error: null })
46
- const [paginationProps, setPaginationProps] = useState({
47
- currentPage: (paginationSettings.controlType === 'pages' && paginationSettings.initialPage && paginationSettings.initialPage >= 1) ? paginationSettings.initialPage - 1 : 0,
48
- pageSize: paginationSettings.pageSize ?? 10,
49
- totalItems: null,
50
- totalPages: null
51
- })
52
- const [businessTypeSelected, setBusinessTypeSelected] = useState(null)
53
- const [priceLevelSelected, setPriceLevelSelected] = useState(null)
54
- const [searchValue, setSearchValue] = useState('')
55
- const [timeLimitValue, setTimeLimitValue] = useState(null)
56
- const [orderByValue, setOrderByValue] = useState(initialOrderByValue ?? null)
57
- const [maxDeliveryFee, setMaxDeliveryFee] = useState(null)
58
- const [orderState] = useOrder()
59
- const [orderingTheme] = useOrderingTheme()
60
- const [ordering] = useApi()
61
- const socket = useWebsocket()
62
- const [{ auth, token }, { refreshUserInfo }] = useSession()
63
- const [requestsState, setRequestsState] = useState({})
64
- const [citiesState, setCitiesState] = useState({ loading: false, cities: [], error: null })
65
- const [{ configs }] = useConfig()
66
- const [franchiseEnabled, setFranchiseEnabled] = useState(false)
67
- const [firstLoad, setFirstLoad] = useState(false)
68
- const isValidMoment = (date, format) => dayjs.utc(date, format).format(format) === date
69
- const rex = new RegExp(/^[A-Za-z0-9\s]+$/g)
70
- const advancedSearchEnabled = configs?.advanced_business_search_enabled?.value === '1'
71
- const showCities = (!orderingTheme?.business_listing_view?.components?.cities?.hidden && orderState?.options?.type === 2 && !props.disabledCities) ?? false
72
- const unaddressedTypes = configs?.unaddressed_order_types_allowed?.value.split('|').map(value => Number(value)) || []
73
- const isAllowUnaddressOrderType = unaddressedTypes.includes(orderState?.options?.type)
74
-
75
- const sortBusinesses = (array, option) => {
76
- if (option === 'review') {
77
- return array.sort((a, b) => b.reviews.total - a.reviews.total)
78
- }
79
- return array
80
- }
81
- /**
82
- * Get businesses by params, order options and filters
83
- * @param {boolean} newFetch Make a new request or next page
84
- */
85
- const getBusinesses = async (newFetch, specificPagination, prev) => {
86
- try {
87
- setBusinessesList({
88
- ...businessesList,
89
- loading: true,
90
- businesses: newFetch ? [] : businessesList.businesses
91
- })
92
-
93
- const defaultLatitude = Number(configs?.location_default_latitude?.value)
94
- const defaultLongitude = Number(configs?.location_default_longitude?.value)
95
- const isInvalidDefaultLocation = isNaN(defaultLatitude) || isNaN(defaultLongitude)
96
- const defaultLocation = {
97
- lat: !isInvalidDefaultLocation ? defaultLatitude : 40.7744146,
98
- lng: !isInvalidDefaultLocation ? defaultLongitude : -73.9678064
99
- }
100
-
101
- let parameters = asDashboard ? {} : {
102
- location: !customLocation
103
- ? (isAllowUnaddressOrderType && !orderState.options?.address?.location)
104
- ? defaultLocation
105
- : `${orderState.options?.address?.location?.lat},${orderState.options?.address?.location?.lng}`
106
- : `${customLocation.lat},${customLocation.lng}`,
107
- type: !initialOrderType ? (orderState.options?.type || 1) : initialOrderType
108
- }
109
- if (isCustomerMode) {
110
- parameters.disabled_business = true
111
- }
112
- if (orderByValue) {
113
- parameters = {
114
- ...parameters,
115
- orderBy: orderByValue
116
- }
117
- }
118
- if (searchValue?.length >= 3 && advancedSearchEnabled) {
119
- parameters = {
120
- ...parameters,
121
- term: searchValue,
122
- order_type_id: orderState?.options?.type,
123
- location: JSON.stringify(
124
- (isAllowUnaddressOrderType && !orderState.options?.address?.location)
125
- ? defaultLocation
126
- : { lat: orderState.options?.address?.location?.lat, lng: orderState.options?.address?.location?.lng }
127
- )
128
- }
129
- }
130
- if (!isSortByReview && !isOfferBusinesses) {
131
- const paginationParams = {
132
- page: newFetch ? 1 : paginationProps.currentPage + 1,
133
- page_size: paginationProps.pageSize
134
- }
135
- parameters = { ...parameters, ...paginationParams }
136
- }
137
- if (orderState.options?.moment && isValidMoment(orderState.options?.moment, 'YYYY-MM-DD HH:mm:ss')) {
138
- const moment = dayjs.utc(orderState.options?.moment, 'YYYY-MM-DD HH:mm:ss').local().unix()
139
- parameters.timestamp = moment
140
- }
141
-
142
- let where = null
143
- const conditions = []
144
- if (initialBuisnessType || businessTypeSelected) {
145
- conditions.push({
146
- attribute: 'types',
147
- conditions: [{
148
- attribute: 'id',
149
- value: !initialBuisnessType ? businessTypeSelected : initialBuisnessType
150
- }]
151
- })
152
- }
153
- if (isFeatured) {
154
- conditions.push({ attribute: 'featured', value: true })
155
- }
156
-
157
- if (franchiseId) {
158
- conditions.push({ attribute: 'franchise_id', value: franchiseId })
159
- }
160
-
161
- if (priceLevelSelected || initialPricelevel) {
162
- conditions.push({ attribute: 'price_level', value: initialPricelevel ?? priceLevelSelected })
163
- }
164
-
165
- if (businessId) {
166
- conditions.push({
167
- attribute: typeof businessId === 'string' ? 'slug' : 'id',
168
- value: businessId
169
- })
170
- }
171
-
172
- if (timeLimitValue) {
173
- if (orderState.options?.type === 1) {
174
- conditions.push({
175
- attribute: 'delivery_time',
176
- value: {
177
- condition: '<=',
178
- value: timeLimitValue
179
- }
180
- })
181
- }
182
- if (orderState.options?.type === 2) {
183
- conditions.push({
184
- attribute: 'pickup_time',
185
- value: {
186
- condition: '<=',
187
- value: timeLimitValue
188
- }
189
- })
190
- }
191
- }
192
-
193
- if (maxDeliveryFee) {
194
- conditions.push({
195
- attribute: 'delivery_price',
196
- value: {
197
- condition: '<=',
198
- value: maxDeliveryFee
199
- }
200
- })
201
- }
202
-
203
- if (searchValue) {
204
- const searchConditions = []
205
- const isSpecialCharacter = rex.test(searchValue)
206
- if (isSearchByName) {
207
- searchConditions.push(
208
- {
209
- attribute: 'name',
210
- value: {
211
- condition: 'ilike',
212
- value: (!isSpecialCharacter || props?.isForceSearch) ? `%${searchValue}%` : encodeURI(`%${searchValue}%`)
213
- }
214
- }
215
- )
216
- }
217
- if (isSearchByDescription) {
218
- searchConditions.push(
219
- {
220
- attribute: 'description',
221
- value: {
222
- condition: 'ilike',
223
- value: (!isSpecialCharacter || props?.isForceSearch) ? `%${searchValue}%` : encodeURI(`%${searchValue}%`)
224
- }
225
- }
226
- )
227
- }
228
- conditions.push({
229
- conector: 'OR',
230
- conditions: searchConditions
231
- })
232
- }
233
-
234
- if (orderState?.options?.city_id || cityId) {
235
- conditions.push({
236
- attribute: 'city_id',
237
- value: cityId || orderState?.options?.city_id
238
- })
239
- }
240
-
241
- if (conditions.length) {
242
- where = {
243
- conditions,
244
- conector: 'AND'
245
- }
246
- }
247
-
248
- if (specificPagination || currentPageParam) {
249
- const paginationParams = {
250
- page: specificPagination || currentPageParam,
251
- page_size: paginationProps.pageSize
252
- }
253
- parameters = { ...parameters, ...paginationParams }
254
- }
255
-
256
- const source = {}
257
- requestsState.businesses = source
258
- setRequestsState({ ...requestsState })
259
-
260
- const fetchEndpoint = (advancedSearchEnabled && searchValue?.length >= 3) || (!where && !asDashboard)
261
- ? ordering.businesses().select(propsToFetch).parameters(parameters)
262
- : where && asDashboard
263
- ? ordering.businesses().select(propsToFetch).parameters(parameters).where(where).asDashboard()
264
- : where && !asDashboard
265
- ? ordering.businesses().select(propsToFetch).parameters(parameters).where(where)
266
- : ordering.businesses().select(propsToFetch).parameters(parameters).asDashboard()
267
-
268
- const { content: { error, result, pagination } } = await fetchEndpoint.get({ cancelToken: source, advancedSearch: advancedSearchEnabled && searchValue?.length >= 3 })
269
-
270
- if (!error) {
271
- if (isSortByReview) {
272
- const _result = sortBusinesses(result, 'review')
273
- businessesList.businesses = _result
274
- } else if (isOfferBusinesses) {
275
- const offerBuesinesses = result.filter(_business => _business?.offers.length > 0)
276
- businessesList.businesses = offerBuesinesses
277
- } else {
278
- businessesList.businesses = newFetch ? result : (prev ? [...result, ...businessesList.businesses] : [...businessesList.businesses, ...result])
279
- }
280
- let nextPageItems = 0
281
- if (pagination?.current_page !== pagination?.total_pages) {
282
- const remainingItems = pagination.total - businessesList.businesses.length
283
- nextPageItems = remainingItems < pagination.page_size ? remainingItems : pagination.page_size
284
- }
285
- setPaginationProps({
286
- ...paginationProps,
287
- currentPage: pagination?.current_page,
288
- totalPages: pagination?.total_pages,
289
- totalItems: pagination?.total,
290
- nextPageItems
291
- })
292
- }
293
-
294
- const businesses = businessesList.businesses
295
-
296
- if (actualSlug) {
297
- const fromIndex = businesses.findIndex(business => business.slug === actualSlug)
298
- const toIndex = 0
299
- if (fromIndex !== toIndex) {
300
- const element = businesses.splice(fromIndex, 1)[0]
301
- businesses.splice(toIndex, 0, element)
302
- }
303
- }
304
-
305
- setBusinessesList({
306
- ...businessesList,
307
- loading: false,
308
- error,
309
- businesses,
310
- result,
311
- fetched: true
312
- })
313
- setFirstLoad(true)
314
- } catch (err) {
315
- if (err.constructor.name !== 'Cancel') {
316
- setBusinessesList({
317
- ...businessesList,
318
- loading: false,
319
- error: true,
320
- fetched: true,
321
- result: [err.message]
322
- })
323
- setFirstLoad(true)
324
- }
325
- }
326
- }
327
-
328
- /**
329
- * Get franchise info from API
330
- */
331
- const getFranchise = async () => {
332
- try {
333
- setFranchiseEnabled(false)
334
- const requestOptions = {
335
- method: 'GET',
336
- headers: {
337
- 'Content-Type': 'application/json',
338
- Authorization: `Bearer ${token}`,
339
- 'X-App-X': ordering.appId,
340
- 'X-Socket-Id-X': socket?.getId()
341
- }
342
- }
343
- const functionFetch = `${ordering.root}/franchises/${franchiseId}`
344
-
345
- const response = await fetch(functionFetch, requestOptions)
346
- const { result } = await response.json()
347
- if (result?.enabled) setFranchiseEnabled(result?.enabled)
348
- else setBusinessesList({ ...businessesList, loading: false })
349
- } catch (err) {
350
- setBusinessesList({ ...businessesList, loading: false })
351
- }
352
- }
353
-
354
- const getCities = async () => {
355
- const requestOptions = {
356
- method: 'GET',
357
- headers: {
358
- 'Content-Type': 'application/json',
359
- Authorization: `Bearer ${token}`,
360
- 'X-App-X': ordering.appId,
361
- 'X-Socket-Id-X': socket?.getId()
362
- }
363
- }
364
- setCitiesState({ ...citiesState, loading: true })
365
- const response = await fetch(`${ordering.root}/countries`, requestOptions)
366
- const { result, error, pagination } = await response.json()
367
-
368
- if (!error) {
369
- setCitiesState({
370
- ...citiesState,
371
- loading: false,
372
- cities: result?.map(country => country?.cities).flat(),
373
- pagination
374
- })
375
- }
376
- }
377
-
378
- /**
379
- * Cancel businesses request
380
- */
381
- useEffect(() => {
382
- const request = requestsState.businesses
383
- return () => {
384
- request && request.cancel()
385
- }
386
- }, [requestsState.businesses])
387
-
388
- /**
389
- * Listening order option and filter changes
390
- */
391
- useEffect(() => {
392
- if ((orderState.loading || ((!orderState.options?.address?.location && !isAllowUnaddressOrderType) && !asDashboard && !customLocation)) || (auth && !orderState?.options?.user_id)) return
393
- if (!isDoordash && !franchiseId) {
394
- getBusinesses(true, currentPageParam)
395
- }
396
- }, [
397
- orderState.options?.type,
398
- orderState.options?.moment,
399
- orderState.options?.city_id,
400
- orderState.options?.address_id,
401
- orderState.options?.address?.address,
402
- JSON.stringify(orderState.options?.address?.location),
403
- ordering?.countryCode,
404
- orderState.loading,
405
- businessTypeSelected,
406
- priceLevelSelected,
407
- searchValue,
408
- initialPricelevel,
409
- initialBuisnessType,
410
- timeLimitValue,
411
- orderByValue,
412
- maxDeliveryFee,
413
- businessId
414
- ])
415
-
416
- useEffect(() => {
417
- if ((orderState.loading || (!orderState.options?.address?.location && !isAllowUnaddressOrderType && !asDashboard && !customLocation))) {
418
- setBusinessesList({ ...businessesList, loading: false })
419
- return
420
- }
421
- if (isDoordash || franchiseEnabled) {
422
- getBusinesses(true)
423
- }
424
- }, [JSON.stringify(orderState.options), orderState.loading, franchiseEnabled, businessTypeSelected, searchValue, priceLevelSelected, timeLimitValue, orderByValue, maxDeliveryFee, businessId])
425
-
426
- useLayoutEffect(() => {
427
- if (isDoordash) {
428
- getBusinesses(true)
429
- }
430
- }, [windowPathname])
431
-
432
- useEffect(() => {
433
- if (franchiseId) {
434
- getFranchise()
435
- }
436
- }, [franchiseId])
437
-
438
- /**
439
- * Listening initial filter
440
- */
441
- useEffect(() => {
442
- if (!initialFilterKey && !initialFilterValue) return
443
- switch (initialFilterKey) {
444
- case 'category':
445
- handleChangeBusinessType(initialFilterValue)
446
- break
447
- case 'timeLimit':
448
- handleChangeTimeLimit(initialFilterValue)
449
- break
450
- case 'search':
451
- handleChangeSearch(initialFilterValue)
452
- break
453
- case 'orderBy':
454
- handleChangeOrderBy(initialFilterValue)
455
- break
456
- case 'maxDeliveryFee':
457
- handleChangeMaxDeliveryFee(initialFilterValue)
458
- break
459
- }
460
- }, [initialFilterKey, initialFilterValue])
461
-
462
- useEffect(() => {
463
- if (citiesState.loading) return
464
- if (showCities) {
465
- getCities()
466
- }
467
- }, [showCities])
468
-
469
- useEffect(() => {
470
- if (firstLoad) {
471
- handleChangeSearch(searchValueCustom)
472
- }
473
- }, [searchValueCustom])
474
-
475
- /**
476
- * Default behavior business click
477
- * @param {object} business Business clicked
478
- */
479
- const handleBusinessClick = (business) => {
480
- onBusinessClick && onBusinessClick(business)
481
- }
482
-
483
- /**
484
- * Change business type
485
- * @param {object} businessType Business type
486
- */
487
- const handleChangeBusinessType = (businessType) => {
488
- if (businessType !== businessTypeSelected) {
489
- setBusinessesList({
490
- ...businessesList,
491
- businesses: [],
492
- loading: true
493
- })
494
- setBusinessTypeSelected(businessType)
495
- }
496
- }
497
-
498
- /**
499
- * Change price level
500
- * @param {string} priceLevel price level
501
- */
502
- const handleChangePriceLevel = (priceLevel) => {
503
- if (priceLevel === priceLevelSelected) {
504
- setPriceLevelSelected(null)
505
- return
506
- }
507
- setPriceLevelSelected(priceLevel)
508
- }
509
-
510
- /**
511
- * Change text to search
512
- * @param {string} search Search value
513
- */
514
- const handleChangeSearch = (search) => {
515
- if (!!search !== !!searchValue) {
516
- setBusinessesList({
517
- ...businessesList,
518
- businesses: [],
519
- loading: true
520
- })
521
- } else {
522
- setBusinessesList({
523
- ...businessesList,
524
- loading: false
525
- })
526
- }
527
- if (search !== undefined) {
528
- setSearchValue(search)
529
- }
530
- }
531
-
532
- /**
533
- * Change time limt value
534
- * @param {string} time time limt value (for example: 0:30)
535
- */
536
- const handleChangeTimeLimit = (time) => {
537
- if (!!time !== !!timeLimitValue) {
538
- setBusinessesList({
539
- ...businessesList,
540
- businesses: [],
541
- loading: true
542
- })
543
- } else {
544
- setBusinessesList({
545
- ...businessesList,
546
- loading: false
547
- })
548
- }
549
- setTimeLimitValue(time)
550
- }
551
-
552
- /**
553
- * Change orderBy value
554
- * @param {string} orderBy orderBy value
555
- */
556
- const handleChangeOrderBy = (orderBy) => {
557
- if (orderBy !== orderByValue) {
558
- setBusinessesList({
559
- ...businessesList,
560
- businesses: [],
561
- loading: true
562
- })
563
- } else {
564
- setBusinessesList({
565
- ...businessesList,
566
- loading: false
567
- })
568
- }
569
- setOrderByValue(orderBy)
570
- }
571
-
572
- /**
573
- * Change max delivery fee
574
- * @param {number} deliveryFee max delivery fee
575
- */
576
- const handleChangeMaxDeliveryFee = (deliveryFee) => {
577
- if (maxDeliveryFee !== deliveryFee) {
578
- setBusinessesList({
579
- ...businessesList,
580
- businesses: [],
581
- loading: true
582
- })
583
- } else {
584
- setBusinessesList({
585
- ...businessesList,
586
- loading: false
587
- })
588
- }
589
- setMaxDeliveryFee(deliveryFee)
590
- }
591
-
592
- /**
593
- * Method to update business list
594
- * @param {number} businessId business id
595
- * @param {object} changes business info
596
- */
597
- const handleUpdateBusinessList = (businessId, changes) => {
598
- const updatedBusinesses = businessesList?.businesses.map(business => {
599
- if (business?.id === businessId) {
600
- return {
601
- ...business,
602
- ...changes
603
- }
604
- }
605
- return business
606
- })
607
- setBusinessesList({
608
- ...businessesList,
609
- businesses: updatedBusinesses
610
- })
611
- }
612
-
613
- useEffect(() => {
614
- if (avoidFetchData) return
615
- refreshUserInfo()
616
- }, [auth])
617
-
618
- return (
619
- <>
620
- {
621
- UIComponent && (
622
- <UIComponent
623
- {...props}
624
- businessesList={businessesList}
625
- paginationProps={paginationProps}
626
- searchValue={searchValue}
627
- timeLimitValue={timeLimitValue}
628
- businessTypeSelected={businessTypeSelected}
629
- orderByValue={orderByValue}
630
- maxDeliveryFee={maxDeliveryFee}
631
- priceLevelSelected={priceLevelSelected}
632
- handleChangePriceLevel={handleChangePriceLevel}
633
- getBusinesses={getBusinesses}
634
- handleChangeSearch={handleChangeSearch}
635
- handleChangeTimeLimit={handleChangeTimeLimit}
636
- handleChangeOrderBy={handleChangeOrderBy}
637
- handleBusinessClick={handleBusinessClick}
638
- handleChangeBusinessType={handleChangeBusinessType}
639
- handleChangeMaxDeliveryFee={handleChangeMaxDeliveryFee}
640
- franchiseEnabled={franchiseEnabled}
641
- handleUpdateBusinessList={handleUpdateBusinessList}
642
- getCities={getCities}
643
- setPaginationProps={setPaginationProps}
644
- citiesState={citiesState}
645
- />
646
- )
647
- }
648
- </>
649
- )
650
- }
651
-
652
- BusinessList.propTypes = {
653
- /**
654
- * UI Component, this must be containt all graphic elements and use parent props
655
- */
656
- UIComponent: PropTypes.elementType,
657
- /**
658
- * Array of business props to fetch
659
- */
660
- propsToFetch: PropTypes.arrayOf(string),
661
- /**
662
- * Function to get business clicked
663
- */
664
- onBusinessClick: PropTypes.func
665
- }
666
-
667
- BusinessList.defaultProps = {
668
- propsToFetch: ['id', 'name', 'header', 'logo', 'location', 'schedule', 'open', 'ribbon', 'delivery_price', 'distance', 'delivery_time', 'pickup_time', 'reviews', 'featured', 'offers', 'food', 'laundry', 'alcohol', 'groceries', 'slug', 'city', 'city_id'],
669
- paginationSettings: { initialPage: 1, pageSize: 10, controlType: 'infinity' }
670
- }
1
+ import React, { useEffect, useLayoutEffect, useState } from 'react'
2
+ import PropTypes, { string } from 'prop-types'
3
+ import dayjs from 'dayjs'
4
+ import utc from 'dayjs/plugin/utc'
5
+ import { useApi } from '../../contexts/ApiContext'
6
+ import { useOrder } from '../../contexts/OrderContext'
7
+ import { useConfig } from '../../contexts/ConfigContext'
8
+ import { useSession } from '../../contexts/SessionContext'
9
+ import { useOrderingTheme } from '../../contexts/OrderingThemeContext'
10
+ import { useWebsocket } from '../../contexts/WebsocketContext'
11
+ dayjs.extend(utc)
12
+
13
+ export const BusinessList = (props) => {
14
+ const {
15
+ UIComponent,
16
+ initialBuisnessType,
17
+ initialOrderType,
18
+ initialOrderByValue,
19
+ initialFilterKey,
20
+ initialFilterValue,
21
+ initialPricelevel,
22
+ isOfferBusinesses,
23
+ isSortByReview,
24
+ isSearchByName,
25
+ isSearchByDescription,
26
+ isFeatured,
27
+ isDoordash,
28
+ asDashboard,
29
+ paginationSettings,
30
+ customLocation,
31
+ propsToFetch,
32
+ onBusinessClick,
33
+ windowPathname,
34
+ currentPageParam,
35
+ franchiseId,
36
+ businessId,
37
+ cityId,
38
+ actualSlug,
39
+ searchValueCustom,
40
+ isKiosk,
41
+ isCustomerMode
42
+ } = props
43
+
44
+ const avoidFetchData = !token || isKiosk
45
+ const [businessesList, setBusinessesList] = useState({ businesses: [], loading: true, error: null })
46
+ const [paginationProps, setPaginationProps] = useState({
47
+ currentPage: (paginationSettings.controlType === 'pages' && paginationSettings.initialPage && paginationSettings.initialPage >= 1) ? paginationSettings.initialPage - 1 : 0,
48
+ pageSize: paginationSettings.pageSize ?? 10,
49
+ totalItems: null,
50
+ totalPages: null
51
+ })
52
+ const [businessTypeSelected, setBusinessTypeSelected] = useState(null)
53
+ const [priceLevelSelected, setPriceLevelSelected] = useState(null)
54
+ const [searchValue, setSearchValue] = useState('')
55
+ const [timeLimitValue, setTimeLimitValue] = useState(null)
56
+ const [orderByValue, setOrderByValue] = useState(initialOrderByValue ?? null)
57
+ const [maxDeliveryFee, setMaxDeliveryFee] = useState(null)
58
+ const [orderState] = useOrder()
59
+ const [orderingTheme] = useOrderingTheme()
60
+ const [ordering] = useApi()
61
+ const socket = useWebsocket()
62
+ const [{ auth, token }, { refreshUserInfo }] = useSession()
63
+ const [requestsState, setRequestsState] = useState({})
64
+ const [citiesState, setCitiesState] = useState({ loading: false, cities: [], error: null })
65
+ const [{ configs }] = useConfig()
66
+ const [franchiseEnabled, setFranchiseEnabled] = useState(false)
67
+ const [firstLoad, setFirstLoad] = useState(false)
68
+ const isValidMoment = (date, format) => dayjs.utc(date, format).format(format) === date
69
+ const rex = new RegExp(/^[A-Za-z0-9\s]+$/g)
70
+ const advancedSearchEnabled = configs?.advanced_business_search_enabled?.value === '1'
71
+ const showCities = (!orderingTheme?.business_listing_view?.components?.cities?.hidden && orderState?.options?.type === 2 && !props.disabledCities) ?? false
72
+ const unaddressedTypes = configs?.unaddressed_order_types_allowed?.value.split('|').map(value => Number(value)) || []
73
+ const isAllowUnaddressOrderType = unaddressedTypes.includes(orderState?.options?.type)
74
+
75
+ const sortBusinesses = (array, option) => {
76
+ if (option === 'review') {
77
+ return array.sort((a, b) => b.reviews.total - a.reviews.total)
78
+ }
79
+ return array
80
+ }
81
+ /**
82
+ * Get businesses by params, order options and filters
83
+ * @param {boolean} newFetch Make a new request or next page
84
+ */
85
+ const getBusinesses = async (newFetch, specificPagination, prev) => {
86
+ try {
87
+ setBusinessesList({
88
+ ...businessesList,
89
+ loading: true,
90
+ businesses: newFetch ? [] : businessesList.businesses
91
+ })
92
+
93
+ const defaultLatitude = Number(configs?.location_default_latitude?.value)
94
+ const defaultLongitude = Number(configs?.location_default_longitude?.value)
95
+ const isInvalidDefaultLocation = isNaN(defaultLatitude) || isNaN(defaultLongitude)
96
+ const defaultLocation = {
97
+ lat: !isInvalidDefaultLocation ? defaultLatitude : 40.7744146,
98
+ lng: !isInvalidDefaultLocation ? defaultLongitude : -73.9678064
99
+ }
100
+
101
+ let parameters = asDashboard ? {} : {
102
+ location: !customLocation
103
+ ? (isAllowUnaddressOrderType && !orderState.options?.address?.location)
104
+ ? defaultLocation
105
+ : `${orderState.options?.address?.location?.lat},${orderState.options?.address?.location?.lng}`
106
+ : `${customLocation.lat},${customLocation.lng}`,
107
+ type: !initialOrderType ? (orderState.options?.type || 1) : initialOrderType
108
+ }
109
+ if (isCustomerMode) {
110
+ parameters.disabled_business = true
111
+ }
112
+ if (orderByValue) {
113
+ parameters = {
114
+ ...parameters,
115
+ orderBy: orderByValue
116
+ }
117
+ }
118
+ if (searchValue?.length >= 3 && advancedSearchEnabled) {
119
+ parameters = {
120
+ ...parameters,
121
+ term: searchValue,
122
+ order_type_id: orderState?.options?.type,
123
+ location: JSON.stringify(
124
+ (isAllowUnaddressOrderType && !orderState.options?.address?.location)
125
+ ? defaultLocation
126
+ : { lat: orderState.options?.address?.location?.lat, lng: orderState.options?.address?.location?.lng }
127
+ )
128
+ }
129
+ }
130
+ if (!isSortByReview && !isOfferBusinesses) {
131
+ const paginationParams = {
132
+ page: newFetch ? 1 : paginationProps.currentPage + 1,
133
+ page_size: paginationProps.pageSize
134
+ }
135
+ parameters = { ...parameters, ...paginationParams }
136
+ }
137
+ if (orderState.options?.moment && isValidMoment(orderState.options?.moment, 'YYYY-MM-DD HH:mm:ss')) {
138
+ const moment = dayjs.utc(orderState.options?.moment, 'YYYY-MM-DD HH:mm:ss').local().unix()
139
+ parameters.timestamp = moment
140
+ }
141
+
142
+ let where = null
143
+ const conditions = []
144
+ if (initialBuisnessType || businessTypeSelected) {
145
+ conditions.push({
146
+ attribute: 'types',
147
+ conditions: [{
148
+ attribute: 'id',
149
+ value: !initialBuisnessType ? businessTypeSelected : initialBuisnessType
150
+ }]
151
+ })
152
+ }
153
+ if (isFeatured) {
154
+ conditions.push({ attribute: 'featured', value: true })
155
+ }
156
+
157
+ if (franchiseId) {
158
+ conditions.push({ attribute: 'franchise_id', value: franchiseId })
159
+ }
160
+
161
+ if (priceLevelSelected || initialPricelevel) {
162
+ conditions.push({ attribute: 'price_level', value: initialPricelevel ?? priceLevelSelected })
163
+ }
164
+
165
+ if (businessId) {
166
+ conditions.push({
167
+ attribute: typeof businessId === 'string' ? 'slug' : 'id',
168
+ value: businessId
169
+ })
170
+ }
171
+
172
+ if (timeLimitValue) {
173
+ if (orderState.options?.type === 1) {
174
+ conditions.push({
175
+ attribute: 'delivery_time',
176
+ value: {
177
+ condition: '<=',
178
+ value: timeLimitValue
179
+ }
180
+ })
181
+ }
182
+ if (orderState.options?.type === 2) {
183
+ conditions.push({
184
+ attribute: 'pickup_time',
185
+ value: {
186
+ condition: '<=',
187
+ value: timeLimitValue
188
+ }
189
+ })
190
+ }
191
+ }
192
+
193
+ if (maxDeliveryFee) {
194
+ conditions.push({
195
+ attribute: 'delivery_price',
196
+ value: {
197
+ condition: '<=',
198
+ value: maxDeliveryFee
199
+ }
200
+ })
201
+ }
202
+
203
+ if (searchValue) {
204
+ const searchConditions = []
205
+ const isSpecialCharacter = rex.test(searchValue)
206
+ if (isSearchByName) {
207
+ searchConditions.push(
208
+ {
209
+ attribute: 'name',
210
+ value: {
211
+ condition: 'ilike',
212
+ value: (!isSpecialCharacter || props?.isForceSearch) ? `%${searchValue}%` : encodeURI(`%${searchValue}%`)
213
+ }
214
+ }
215
+ )
216
+ }
217
+ if (isSearchByDescription) {
218
+ searchConditions.push(
219
+ {
220
+ attribute: 'description',
221
+ value: {
222
+ condition: 'ilike',
223
+ value: (!isSpecialCharacter || props?.isForceSearch) ? `%${searchValue}%` : encodeURI(`%${searchValue}%`)
224
+ }
225
+ }
226
+ )
227
+ }
228
+ conditions.push({
229
+ conector: 'OR',
230
+ conditions: searchConditions
231
+ })
232
+ }
233
+
234
+ if (orderState?.options?.city_id || cityId) {
235
+ conditions.push({
236
+ attribute: 'city_id',
237
+ value: cityId || orderState?.options?.city_id
238
+ })
239
+ }
240
+
241
+ if (conditions.length) {
242
+ where = {
243
+ conditions,
244
+ conector: 'AND'
245
+ }
246
+ }
247
+
248
+ if (specificPagination || currentPageParam) {
249
+ const paginationParams = {
250
+ page: specificPagination || currentPageParam,
251
+ page_size: paginationProps.pageSize
252
+ }
253
+ parameters = { ...parameters, ...paginationParams }
254
+ }
255
+
256
+ const source = {}
257
+ requestsState.businesses = source
258
+ setRequestsState({ ...requestsState })
259
+
260
+ const fetchEndpoint = (advancedSearchEnabled && searchValue?.length >= 3) || (!where && !asDashboard)
261
+ ? ordering.businesses().select(propsToFetch).parameters(parameters)
262
+ : where && asDashboard
263
+ ? ordering.businesses().select(propsToFetch).parameters(parameters).where(where).asDashboard()
264
+ : where && !asDashboard
265
+ ? ordering.businesses().select(propsToFetch).parameters(parameters).where(where)
266
+ : ordering.businesses().select(propsToFetch).parameters(parameters).asDashboard()
267
+
268
+ const { content: { error, result, pagination } } = await fetchEndpoint.get({ cancelToken: source, advancedSearch: advancedSearchEnabled && searchValue?.length >= 3 })
269
+
270
+ if (!error) {
271
+ if (isSortByReview) {
272
+ const _result = sortBusinesses(result, 'review')
273
+ businessesList.businesses = _result
274
+ } else if (isOfferBusinesses) {
275
+ const offerBuesinesses = result.filter(_business => _business?.offers.length > 0)
276
+ businessesList.businesses = offerBuesinesses
277
+ } else {
278
+ businessesList.businesses = newFetch ? result : (prev ? [...result, ...businessesList.businesses] : [...businessesList.businesses, ...result])
279
+ }
280
+ let nextPageItems = 0
281
+ if (pagination?.current_page !== pagination?.total_pages) {
282
+ const remainingItems = pagination.total - businessesList.businesses.length
283
+ nextPageItems = remainingItems < pagination.page_size ? remainingItems : pagination.page_size
284
+ }
285
+ setPaginationProps({
286
+ ...paginationProps,
287
+ currentPage: pagination?.current_page,
288
+ totalPages: pagination?.total_pages,
289
+ totalItems: pagination?.total,
290
+ nextPageItems
291
+ })
292
+ }
293
+
294
+ const businesses = businessesList.businesses
295
+
296
+ if (actualSlug) {
297
+ const fromIndex = businesses.findIndex(business => business.slug === actualSlug)
298
+ const toIndex = 0
299
+ if (fromIndex !== toIndex) {
300
+ const element = businesses.splice(fromIndex, 1)[0]
301
+ businesses.splice(toIndex, 0, element)
302
+ }
303
+ }
304
+
305
+ setBusinessesList({
306
+ ...businessesList,
307
+ loading: false,
308
+ error,
309
+ businesses,
310
+ result,
311
+ fetched: true
312
+ })
313
+ setFirstLoad(true)
314
+ } catch (err) {
315
+ if (err.constructor.name !== 'Cancel') {
316
+ setBusinessesList({
317
+ ...businessesList,
318
+ loading: false,
319
+ error: true,
320
+ fetched: true,
321
+ result: [err.message]
322
+ })
323
+ setFirstLoad(true)
324
+ }
325
+ }
326
+ }
327
+
328
+ /**
329
+ * Get franchise info from API
330
+ */
331
+ const getFranchise = async () => {
332
+ try {
333
+ setFranchiseEnabled(false)
334
+ const requestOptions = {
335
+ method: 'GET',
336
+ headers: {
337
+ 'Content-Type': 'application/json',
338
+ Authorization: `Bearer ${token}`,
339
+ 'X-App-X': ordering.appId,
340
+ 'X-Socket-Id-X': socket?.getId()
341
+ }
342
+ }
343
+ const functionFetch = `${ordering.root}/franchises/${franchiseId}`
344
+
345
+ const response = await fetch(functionFetch, requestOptions)
346
+ const { result } = await response.json()
347
+ if (result?.enabled) setFranchiseEnabled(result?.enabled)
348
+ else setBusinessesList({ ...businessesList, loading: false })
349
+ } catch (err) {
350
+ setBusinessesList({ ...businessesList, loading: false })
351
+ }
352
+ }
353
+
354
+ const getCities = async () => {
355
+ const requestOptions = {
356
+ method: 'GET',
357
+ headers: {
358
+ 'Content-Type': 'application/json',
359
+ Authorization: `Bearer ${token}`,
360
+ 'X-App-X': ordering.appId,
361
+ 'X-Socket-Id-X': socket?.getId()
362
+ }
363
+ }
364
+ setCitiesState({ ...citiesState, loading: true })
365
+ const response = await fetch(`${ordering.root}/countries`, requestOptions)
366
+ const { result, error, pagination } = await response.json()
367
+
368
+ if (!error) {
369
+ setCitiesState({
370
+ ...citiesState,
371
+ loading: false,
372
+ cities: result?.map(country => country?.cities).flat(),
373
+ pagination
374
+ })
375
+ }
376
+ }
377
+
378
+ /**
379
+ * Cancel businesses request
380
+ */
381
+ useEffect(() => {
382
+ const request = requestsState.businesses
383
+ return () => {
384
+ request && request.cancel()
385
+ }
386
+ }, [requestsState.businesses])
387
+
388
+ /**
389
+ * Listening order option and filter changes
390
+ */
391
+ useEffect(() => {
392
+ if ((orderState.loading || ((!orderState.options?.address?.location && !isAllowUnaddressOrderType) && !asDashboard && !customLocation)) || (auth && !orderState?.options?.user_id)) return
393
+ if (!isDoordash && !franchiseId) {
394
+ getBusinesses(true, currentPageParam)
395
+ }
396
+ }, [
397
+ orderState.options?.type,
398
+ orderState.options?.moment,
399
+ orderState.options?.city_id,
400
+ orderState.options?.address_id,
401
+ orderState.options?.address?.address,
402
+ JSON.stringify(orderState.options?.address?.location),
403
+ ordering?.countryCode,
404
+ orderState.loading,
405
+ businessTypeSelected,
406
+ priceLevelSelected,
407
+ searchValue,
408
+ initialPricelevel,
409
+ initialBuisnessType,
410
+ timeLimitValue,
411
+ orderByValue,
412
+ maxDeliveryFee,
413
+ businessId
414
+ ])
415
+
416
+ useEffect(() => {
417
+ if ((orderState.loading || (!orderState.options?.address?.location && !isAllowUnaddressOrderType && !asDashboard && !customLocation))) {
418
+ setBusinessesList({ ...businessesList, loading: false })
419
+ return
420
+ }
421
+ if (isDoordash || franchiseEnabled) {
422
+ getBusinesses(true)
423
+ }
424
+ }, [JSON.stringify(orderState.options), orderState.loading, franchiseEnabled, businessTypeSelected, searchValue, priceLevelSelected, timeLimitValue, orderByValue, maxDeliveryFee, businessId])
425
+
426
+ useLayoutEffect(() => {
427
+ if (isDoordash) {
428
+ getBusinesses(true)
429
+ }
430
+ }, [windowPathname])
431
+
432
+ useEffect(() => {
433
+ if (franchiseId) {
434
+ getFranchise()
435
+ }
436
+ }, [franchiseId])
437
+
438
+ /**
439
+ * Listening initial filter
440
+ */
441
+ useEffect(() => {
442
+ if (!initialFilterKey && !initialFilterValue) return
443
+ switch (initialFilterKey) {
444
+ case 'category':
445
+ handleChangeBusinessType(initialFilterValue)
446
+ break
447
+ case 'timeLimit':
448
+ handleChangeTimeLimit(initialFilterValue)
449
+ break
450
+ case 'search':
451
+ handleChangeSearch(initialFilterValue)
452
+ break
453
+ case 'orderBy':
454
+ handleChangeOrderBy(initialFilterValue)
455
+ break
456
+ case 'maxDeliveryFee':
457
+ handleChangeMaxDeliveryFee(initialFilterValue)
458
+ break
459
+ }
460
+ }, [initialFilterKey, initialFilterValue])
461
+
462
+ useEffect(() => {
463
+ if (citiesState.loading) return
464
+ if (showCities) {
465
+ getCities()
466
+ }
467
+ }, [showCities])
468
+
469
+ useEffect(() => {
470
+ if (firstLoad) {
471
+ handleChangeSearch(searchValueCustom)
472
+ }
473
+ }, [searchValueCustom])
474
+
475
+ /**
476
+ * Default behavior business click
477
+ * @param {object} business Business clicked
478
+ */
479
+ const handleBusinessClick = (business) => {
480
+ onBusinessClick && onBusinessClick(business)
481
+ }
482
+
483
+ /**
484
+ * Change business type
485
+ * @param {object} businessType Business type
486
+ */
487
+ const handleChangeBusinessType = (businessType) => {
488
+ if (businessType !== businessTypeSelected) {
489
+ setBusinessesList({
490
+ ...businessesList,
491
+ businesses: [],
492
+ loading: true
493
+ })
494
+ setBusinessTypeSelected(businessType)
495
+ }
496
+ }
497
+
498
+ /**
499
+ * Change price level
500
+ * @param {string} priceLevel price level
501
+ */
502
+ const handleChangePriceLevel = (priceLevel) => {
503
+ if (priceLevel === priceLevelSelected) {
504
+ setPriceLevelSelected(null)
505
+ return
506
+ }
507
+ setPriceLevelSelected(priceLevel)
508
+ }
509
+
510
+ /**
511
+ * Change text to search
512
+ * @param {string} search Search value
513
+ */
514
+ const handleChangeSearch = (search) => {
515
+ if (!!search !== !!searchValue) {
516
+ setBusinessesList({
517
+ ...businessesList,
518
+ businesses: [],
519
+ loading: true
520
+ })
521
+ } else {
522
+ setBusinessesList({
523
+ ...businessesList,
524
+ loading: false
525
+ })
526
+ }
527
+ if (search !== undefined) {
528
+ setSearchValue(search)
529
+ }
530
+ }
531
+
532
+ /**
533
+ * Change time limt value
534
+ * @param {string} time time limt value (for example: 0:30)
535
+ */
536
+ const handleChangeTimeLimit = (time) => {
537
+ if (!!time !== !!timeLimitValue) {
538
+ setBusinessesList({
539
+ ...businessesList,
540
+ businesses: [],
541
+ loading: true
542
+ })
543
+ } else {
544
+ setBusinessesList({
545
+ ...businessesList,
546
+ loading: false
547
+ })
548
+ }
549
+ setTimeLimitValue(time)
550
+ }
551
+
552
+ /**
553
+ * Change orderBy value
554
+ * @param {string} orderBy orderBy value
555
+ */
556
+ const handleChangeOrderBy = (orderBy) => {
557
+ if (orderBy !== orderByValue) {
558
+ setBusinessesList({
559
+ ...businessesList,
560
+ businesses: [],
561
+ loading: true
562
+ })
563
+ } else {
564
+ setBusinessesList({
565
+ ...businessesList,
566
+ loading: false
567
+ })
568
+ }
569
+ setOrderByValue(orderBy)
570
+ }
571
+
572
+ /**
573
+ * Change max delivery fee
574
+ * @param {number} deliveryFee max delivery fee
575
+ */
576
+ const handleChangeMaxDeliveryFee = (deliveryFee) => {
577
+ if (maxDeliveryFee !== deliveryFee) {
578
+ setBusinessesList({
579
+ ...businessesList,
580
+ businesses: [],
581
+ loading: true
582
+ })
583
+ } else {
584
+ setBusinessesList({
585
+ ...businessesList,
586
+ loading: false
587
+ })
588
+ }
589
+ setMaxDeliveryFee(deliveryFee)
590
+ }
591
+
592
+ /**
593
+ * Method to update business list
594
+ * @param {number} businessId business id
595
+ * @param {object} changes business info
596
+ */
597
+ const handleUpdateBusinessList = (businessId, changes) => {
598
+ const updatedBusinesses = businessesList?.businesses.map(business => {
599
+ if (business?.id === businessId) {
600
+ return {
601
+ ...business,
602
+ ...changes
603
+ }
604
+ }
605
+ return business
606
+ })
607
+ setBusinessesList({
608
+ ...businessesList,
609
+ businesses: updatedBusinesses
610
+ })
611
+ }
612
+
613
+ useEffect(() => {
614
+ if (avoidFetchData) return
615
+ refreshUserInfo()
616
+ }, [auth])
617
+
618
+ return (
619
+ <>
620
+ {
621
+ UIComponent && (
622
+ <UIComponent
623
+ {...props}
624
+ businessesList={businessesList}
625
+ paginationProps={paginationProps}
626
+ searchValue={searchValue}
627
+ timeLimitValue={timeLimitValue}
628
+ businessTypeSelected={businessTypeSelected}
629
+ orderByValue={orderByValue}
630
+ maxDeliveryFee={maxDeliveryFee}
631
+ priceLevelSelected={priceLevelSelected}
632
+ handleChangePriceLevel={handleChangePriceLevel}
633
+ getBusinesses={getBusinesses}
634
+ handleChangeSearch={handleChangeSearch}
635
+ handleChangeTimeLimit={handleChangeTimeLimit}
636
+ handleChangeOrderBy={handleChangeOrderBy}
637
+ handleBusinessClick={handleBusinessClick}
638
+ handleChangeBusinessType={handleChangeBusinessType}
639
+ handleChangeMaxDeliveryFee={handleChangeMaxDeliveryFee}
640
+ franchiseEnabled={franchiseEnabled}
641
+ handleUpdateBusinessList={handleUpdateBusinessList}
642
+ getCities={getCities}
643
+ setPaginationProps={setPaginationProps}
644
+ citiesState={citiesState}
645
+ />
646
+ )
647
+ }
648
+ </>
649
+ )
650
+ }
651
+
652
+ BusinessList.propTypes = {
653
+ /**
654
+ * UI Component, this must be containt all graphic elements and use parent props
655
+ */
656
+ UIComponent: PropTypes.elementType,
657
+ /**
658
+ * Array of business props to fetch
659
+ */
660
+ propsToFetch: PropTypes.arrayOf(string),
661
+ /**
662
+ * Function to get business clicked
663
+ */
664
+ onBusinessClick: PropTypes.func
665
+ }
666
+
667
+ BusinessList.defaultProps = {
668
+ propsToFetch: ['id', 'name', 'header', 'logo', 'location', 'schedule', 'open', 'ribbon', 'delivery_price', 'distance', 'delivery_time', 'pickup_time', 'reviews', 'featured', 'offers', 'food', 'laundry', 'alcohol', 'groceries', 'slug', 'city', 'city_id'],
669
+ paginationSettings: { initialPage: 1, pageSize: 10, controlType: 'infinity' }
670
+ }