ordering-components-external 13.1.2 → 13.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/.babelrc +22 -22
  2. package/.vscode/settings.json +3 -3
  3. package/_bundles/{0.ordering-component.b9d526043d34dfae1732.js → 0.ordering-component.30bb86a42f9281a57ad5.js} +1 -1
  4. package/_bundles/{1.ordering-component.b9d526043d34dfae1732.js → 1.ordering-component.30bb86a42f9281a57ad5.js} +1 -1
  5. package/_bundles/{7.ordering-component.b9d526043d34dfae1732.js → 7.ordering-component.30bb86a42f9281a57ad5.js} +1 -1
  6. package/_bundles/ordering-component.30bb86a42f9281a57ad5.js +2 -0
  7. package/_modules/components/AddressDetails/index.js +26 -26
  8. package/_modules/components/AddressForm/index.js +50 -50
  9. package/_modules/components/AddressList/index.js +40 -40
  10. package/_modules/components/Analitycs/index.js +6 -6
  11. package/_modules/components/AnalyticsSegment/index.js +3 -3
  12. package/_modules/components/AppleLogin/index.js +26 -26
  13. package/_modules/components/BaseComponent/index.js +14 -14
  14. package/_modules/components/BusinessAndProductList/index.js +16 -16
  15. package/_modules/components/BusinessBasicInformation/index.js +20 -20
  16. package/_modules/components/BusinessController/index.js +50 -50
  17. package/_modules/components/BusinessInformation/BusinessOption/index.js +20 -20
  18. package/_modules/components/BusinessInformation/index.js +18 -18
  19. package/_modules/components/BusinessList/index.js +42 -42
  20. package/_modules/components/BusinessMenuListing/index.js +20 -20
  21. package/_modules/components/BusinessProductsCategories/index.js +16 -16
  22. package/_modules/components/BusinessProductsSearch/index.js +14 -14
  23. package/_modules/components/BusinessReviews/index.js +27 -27
  24. package/_modules/components/BusinessSearchList/index.js +18 -18
  25. package/_modules/components/BusinessSortControl/index.js +28 -28
  26. package/_modules/components/BusinessTypeFilter/index.js +26 -26
  27. package/_modules/components/BusinessesMap/index.js +27 -27
  28. package/_modules/components/Cart/index.js +38 -38
  29. package/_modules/components/CartStoresListing/index.js +4 -4
  30. package/_modules/components/Checkout/index.js +60 -60
  31. package/_modules/components/CmsContent/index.js +20 -20
  32. package/_modules/components/Contacts/index.js +28 -28
  33. package/_modules/components/CouponControl/index.js +22 -22
  34. package/_modules/components/DriverList/index.js +22 -22
  35. package/_modules/components/DriverTips/index.js +35 -35
  36. package/_modules/components/FacebookLoginButton/index.js +40 -40
  37. package/_modules/components/FacebookPixel/index.js +3 -3
  38. package/_modules/components/FavoriteList/index.js +28 -28
  39. package/_modules/components/FirebaseGoogleLoginButton/index.js +10 -10
  40. package/_modules/components/FloatingButton/index.js +20 -20
  41. package/_modules/components/ForgotPasswordForm/index.js +43 -43
  42. package/_modules/components/GiftCard/GiftCardOrdersList/index.js +4 -4
  43. package/_modules/components/GiftCard/PurchaseGiftCard/index.js +6 -6
  44. package/_modules/components/GiftCard/RedeemGiftCard/index.js +4 -4
  45. package/_modules/components/GiftCard/SendGiftCard/index.js +4 -4
  46. package/_modules/components/GoogleAutocompleteInput/index.js +18 -18
  47. package/_modules/components/GoogleIdentity/index.js +28 -28
  48. package/_modules/components/GoogleLoginButton/index.js +49 -49
  49. package/_modules/components/GoogleMaps/index.js +37 -37
  50. package/_modules/components/GpsButton/index.js +20 -20
  51. package/_modules/components/LanguageSelector/index.js +28 -28
  52. package/_modules/components/LoginForm/index.js +58 -58
  53. package/_modules/components/LogoutAction/index.js +17 -17
  54. package/_modules/components/MainSearch/index.js +31 -31
  55. package/_modules/components/MenuControl/index.js +51 -51
  56. package/_modules/components/Messages/index.js +22 -22
  57. package/_modules/components/MomentOption/index.js +51 -51
  58. package/_modules/components/MultiCartCreate/index.js +2 -2
  59. package/_modules/components/MultiCartsPaymethodsAndWallets/index.js +8 -8
  60. package/_modules/components/MultiCheckout/index.js +12 -12
  61. package/_modules/components/MultiOrdersDetails/index.js +6 -6
  62. package/_modules/components/MyOrders/index.js +24 -24
  63. package/_modules/components/MyOrdersList/index.js +26 -26
  64. package/_modules/components/NewOrderNotification/index.js +2 -2
  65. package/_modules/components/OrderChange/index.js +20 -20
  66. package/_modules/components/OrderDetails/index.js +43 -43
  67. package/_modules/components/OrderList/index.js +44 -44
  68. package/_modules/components/OrderListGroups/index.js +140 -47
  69. package/_modules/components/OrderReview/index.js +22 -22
  70. package/_modules/components/OrderTypeControl/index.js +18 -18
  71. package/_modules/components/OrdersControlFilters/index.js +6 -6
  72. package/_modules/components/OrdersDashboardComponents/Appointments/index.js +4 -4
  73. package/_modules/components/OrdersDashboardComponents/BusinessProductsListing/index.js +26 -26
  74. package/_modules/components/OrdersDashboardComponents/CheckPassword/index.js +24 -24
  75. package/_modules/components/OrdersDashboardComponents/CityList/index.js +20 -20
  76. package/_modules/components/OrdersDashboardComponents/CountryList/index.js +20 -20
  77. package/_modules/components/OrdersDashboardComponents/CustomOrderDetails/index.js +12 -12
  78. package/_modules/components/OrdersDashboardComponents/DashboardBusinessList/index.js +54 -54
  79. package/_modules/components/OrdersDashboardComponents/DashboardOrdersList/index.js +60 -60
  80. package/_modules/components/OrdersDashboardComponents/DriversList/index.js +58 -58
  81. package/_modules/components/OrdersDashboardComponents/ExportCSV/index.js +16 -16
  82. package/_modules/components/OrdersDashboardComponents/GiftCardsList/index.js +6 -6
  83. package/_modules/components/OrdersDashboardComponents/GoogleMapsApiKeySetting/index.js +4 -4
  84. package/_modules/components/OrdersDashboardComponents/LogisticInformation/index.js +20 -20
  85. package/_modules/components/OrdersDashboardComponents/Logistics/index.js +20 -20
  86. package/_modules/components/OrdersDashboardComponents/Messages/index.js +27 -27
  87. package/_modules/components/OrdersDashboardComponents/MetaFields/index.js +26 -26
  88. package/_modules/components/OrdersDashboardComponents/OrderDetails/index.js +36 -36
  89. package/_modules/components/OrdersDashboardComponents/OrderNotification/index.js +14 -14
  90. package/_modules/components/OrdersDashboardComponents/OrdersFilter/index.js +62 -62
  91. package/_modules/components/OrdersDashboardComponents/OrdersManage/index.js +56 -56
  92. package/_modules/components/OrdersDashboardComponents/PointsWalletLevels/index.js +25 -25
  93. package/_modules/components/OrdersDashboardComponents/ReviewCustomer/index.js +16 -16
  94. package/_modules/components/OrdersDashboardComponents/Schedule/index.js +46 -46
  95. package/_modules/components/OrdersDashboardComponents/SettingsList/index.js +39 -39
  96. package/_modules/components/OrdersDashboardComponents/UserFormDetails/index.js +67 -67
  97. package/_modules/components/OrdersDashboardComponents/UsersList/index.js +54 -54
  98. package/_modules/components/OrdersDashboardComponents/WebsocketStatus/index.js +4 -4
  99. package/_modules/components/PageBanner/index.js +4 -4
  100. package/_modules/components/PaymentOptionCash/index.js +24 -24
  101. package/_modules/components/PaymentOptionPaypal/index.js +24 -24
  102. package/_modules/components/PaymentOptionSquare/index.js +2 -2
  103. package/_modules/components/PaymentOptionStripe/index.js +32 -32
  104. package/_modules/components/PaymentOptionStripeDirect/index.js +24 -24
  105. package/_modules/components/PaymentOptionStripeRedirect/StripeRedirectForm/index.js +19 -19
  106. package/_modules/components/PaymentOptionStripeRedirect/index.js +30 -30
  107. package/_modules/components/PaymentOptions/index.js +27 -27
  108. package/_modules/components/PaymethodList/index.js +20 -20
  109. package/_modules/components/PhoneAutocomplete/index.js +18 -18
  110. package/_modules/components/PlaceSpot/index.js +2 -2
  111. package/_modules/components/Popup/index.js +33 -33
  112. package/_modules/components/ProductComponent/index.js +27 -27
  113. package/_modules/components/ProductForm/index.js +117 -117
  114. package/_modules/components/ProductImages/index.js +18 -18
  115. package/_modules/components/ProductIngredient/index.js +17 -17
  116. package/_modules/components/ProductItemAccordion/index.js +8 -8
  117. package/_modules/components/ProductOption/index.js +8 -8
  118. package/_modules/components/ProductOptionSuboption/index.js +33 -33
  119. package/_modules/components/ProductShare/index.js +20 -20
  120. package/_modules/components/ProductsList/index.js +20 -20
  121. package/_modules/components/ProductsListing/index.js +39 -39
  122. package/_modules/components/ProfessionalInfo/index.js +24 -24
  123. package/_modules/components/QueryLoginSpoonity/index.js +20 -20
  124. package/_modules/components/ReCaptcha/index.js +4 -4
  125. package/_modules/components/ResetPassword/index.js +20 -20
  126. package/_modules/components/ReviewCustomer/index.js +16 -16
  127. package/_modules/components/ReviewDriver/index.js +20 -20
  128. package/_modules/components/ReviewProduct/index.js +22 -22
  129. package/_modules/components/SearchOptions/index.js +17 -17
  130. package/_modules/components/Sessions/index.js +21 -21
  131. package/_modules/components/SignupForm/index.js +57 -57
  132. package/_modules/components/SingleBusinessCard/index.js +28 -28
  133. package/_modules/components/SingleOrderCard/index.js +20 -20
  134. package/_modules/components/SingleProductCard/index.js +18 -18
  135. package/_modules/components/SingleProfessionalCard/index.js +18 -18
  136. package/_modules/components/SmartAppBanner/index.js +8 -8
  137. package/_modules/components/StoreProductList/index.js +22 -22
  138. package/_modules/components/StripeElementsForm/CardForm/index.js +25 -25
  139. package/_modules/components/StripeElementsForm/index.js +16 -16
  140. package/_modules/components/UpsellingPage/index.js +17 -17
  141. package/_modules/components/UserFormDetails/index.js +69 -69
  142. package/_modules/components/UserVerification/index.js +16 -16
  143. package/_modules/components/WebsocketStatus/index.js +4 -4
  144. package/_modules/components/WrapperGoogleMaps/index.js +3 -3
  145. package/_modules/contexts/ApiContext/index.js +8 -8
  146. package/_modules/contexts/BillingContext/index.js +7 -7
  147. package/_modules/contexts/BusinessContext/index.js +9 -9
  148. package/_modules/contexts/ConfigContext/index.js +9 -9
  149. package/_modules/contexts/EventContext/index.js +9 -9
  150. package/_modules/contexts/LanguageContext/index.js +13 -13
  151. package/_modules/contexts/OptimizationLoadContext/index.js +8 -8
  152. package/_modules/contexts/OrderContext/index.js +63 -63
  153. package/_modules/contexts/OrderingContext/index.js +7 -7
  154. package/_modules/contexts/OrderingThemeContext/index.js +11 -11
  155. package/_modules/contexts/ProductContext/index.js +13 -13
  156. package/_modules/contexts/SessionContext/index.js +9 -9
  157. package/_modules/contexts/SiteContext/index.js +9 -9
  158. package/_modules/contexts/UtilsContext/index.js +9 -9
  159. package/_modules/contexts/WebsocketContext/index.js +9 -9
  160. package/_modules/native/src/contexts/OrderingContext/index.js +7 -7
  161. package/cypress/fixtures/example.json +4 -4
  162. package/cypress/integration/naked/BusinessProductsCategories.spec.js +9 -9
  163. package/cypress/integration/naked/PhoneAutocomplete.spec.js +22 -22
  164. package/cypress/integration/naked/activeOrders.spec.js +15 -15
  165. package/cypress/integration/naked/addressDetails.spec.js +10 -10
  166. package/cypress/integration/naked/appleLogin.spec.js +14 -14
  167. package/cypress/integration/naked/businessBasicInformation.spec.js +14 -14
  168. package/cypress/integration/naked/businessController.spec.js +9 -9
  169. package/cypress/integration/naked/businessInformation.spec.js +19 -19
  170. package/cypress/integration/naked/businessProductsSearch.spec.js +9 -9
  171. package/cypress/integration/naked/businessReviews.spec.js +16 -16
  172. package/cypress/integration/naked/businessSortControl.spec.js +9 -9
  173. package/cypress/integration/naked/businessTypeFilter.spec.js +10 -10
  174. package/cypress/integration/naked/businessesMap.spec.js +13 -13
  175. package/cypress/integration/naked/cms.spec.js +9 -9
  176. package/cypress/integration/naked/config.spec.js +34 -34
  177. package/cypress/integration/naked/driverTips.spec.js +10 -10
  178. package/cypress/integration/naked/events.spec.js +13 -13
  179. package/cypress/integration/naked/facebookLogin.spec.js +13 -13
  180. package/cypress/integration/naked/floatingButton.spec.js +13 -13
  181. package/cypress/integration/naked/forgotPassword.spec.js +20 -20
  182. package/cypress/integration/naked/googleLogin.spec.js +11 -11
  183. package/cypress/integration/naked/languageExamples.spec.js +25 -25
  184. package/cypress/integration/naked/languageSelector.spec.js +10 -10
  185. package/cypress/integration/naked/login.spec.js +38 -38
  186. package/cypress/integration/naked/logout.spec.js +15 -15
  187. package/cypress/integration/naked/mainSearch.spec.js +9 -9
  188. package/cypress/integration/naked/menuControl.spec.js +9 -9
  189. package/cypress/integration/naked/messages.spec.js +25 -25
  190. package/cypress/integration/naked/momentOption.spec.js +10 -10
  191. package/cypress/integration/naked/myOrders.spec.js +11 -11
  192. package/cypress/integration/naked/myOrdersList.spec.js +9 -9
  193. package/cypress/integration/naked/orderContextAdvanced.spec.js +23 -23
  194. package/cypress/integration/naked/orderDetails.spec.js +11 -11
  195. package/cypress/integration/naked/paymentOptionCash.spec.js +21 -21
  196. package/cypress/integration/naked/paymentOptionStripe.spec.js +11 -11
  197. package/cypress/integration/naked/paymentOptionStripeDirect.spec.js +11 -11
  198. package/cypress/integration/naked/paymentOptions.spec.js +9 -9
  199. package/cypress/integration/naked/popupExample.spec.js +17 -17
  200. package/cypress/integration/naked/productImages.spec.js +11 -11
  201. package/cypress/integration/naked/productOptionExample.spec.js +21 -21
  202. package/cypress/integration/naked/productShare.spec.js +9 -9
  203. package/cypress/integration/naked/productsList.spec.js +9 -9
  204. package/cypress/integration/naked/resetPassword.spec.js +11 -11
  205. package/cypress/integration/naked/reviewOrders.spec.js +13 -13
  206. package/cypress/integration/naked/searchOptions.spec.js +18 -18
  207. package/cypress/integration/naked/signup.spec.js +31 -31
  208. package/cypress/integration/naked/upselling.spec.js +13 -13
  209. package/cypress/integration/naked/userDetails.spec.js +12 -12
  210. package/cypress/plugins/index.js +21 -21
  211. package/cypress/support/commands.js +35 -35
  212. package/cypress/support/index.js +20 -20
  213. package/cypress.json +12 -12
  214. package/example/App.js +263 -263
  215. package/example/components/ActiveOrdersUI/index.js +72 -72
  216. package/example/components/AddressDetailsUI/index.js +101 -101
  217. package/example/components/AddressFormUI/index.js +161 -161
  218. package/example/components/AddressListUI/index.js +33 -33
  219. package/example/components/AlertPopup/index.js +10 -10
  220. package/example/components/AlertUI/index.js +49 -49
  221. package/example/components/AlertUI/style.css +5 -5
  222. package/example/components/AppleLoginUI/index.js +40 -40
  223. package/example/components/BaseComponentUI/index.js +34 -34
  224. package/example/components/BusinessBasicInformationUI/index.js +118 -118
  225. package/example/components/BusinessControllerUI/index.js +89 -89
  226. package/example/components/BusinessInformationUI/BusinessOptionUI/index.js +83 -83
  227. package/example/components/BusinessInformationUI/index.js +83 -83
  228. package/example/components/BusinessProductsCategoriesUI/index.js +42 -42
  229. package/example/components/BusinessProductsSearchUI/index.js +38 -38
  230. package/example/components/BusinessReviewsUI/index.js +77 -77
  231. package/example/components/BusinessSortControlUI/index.js +47 -47
  232. package/example/components/BusinessTypeFilterUI/index.js +53 -53
  233. package/example/components/BusinessesMapUI/index.js +57 -57
  234. package/example/components/CartUI/index.js +154 -154
  235. package/example/components/ChangeView/index.js +19 -19
  236. package/example/components/CheckoutUI/index.js +206 -206
  237. package/example/components/CmsContentUI/index.js +52 -52
  238. package/example/components/ConfigsExample/index.js +118 -118
  239. package/example/components/CouponControlUI/index.js +63 -63
  240. package/example/components/DriverTipsUI/index.js +58 -58
  241. package/example/components/FacebookLoginButtonUI/index.js +48 -48
  242. package/example/components/FloatingButtonUI/index.js +145 -145
  243. package/example/components/ForgotPasswordFormUI/index.js +93 -93
  244. package/example/components/GoogleLoginUI/index.js +30 -30
  245. package/example/components/GpsButtonUI/index.js +22 -22
  246. package/example/components/Header/index.js +18 -18
  247. package/example/components/LanguageSelectorUI/index.js +57 -57
  248. package/example/components/LanguagesExample/index.js +51 -51
  249. package/example/components/LoginFormUI/index.js +159 -159
  250. package/example/components/LogoutButtonUI/index.js +21 -21
  251. package/example/components/MainSearchUI/index.js +131 -131
  252. package/example/components/MenuControlUI/index.js +103 -103
  253. package/example/components/MessagesUI/index.js +162 -162
  254. package/example/components/ModalUI/index.js +36 -36
  255. package/example/components/ModalUI/style.css +5 -5
  256. package/example/components/MomentOptionUI/index.js +68 -68
  257. package/example/components/MyOrdersListUI/index.js +51 -51
  258. package/example/components/MyOrdersUI/index.js +52 -52
  259. package/example/components/OrderChangeUI/index.js +54 -54
  260. package/example/components/OrderDetailsUI/index.js +174 -174
  261. package/example/components/OrderReviewUI/index.js +125 -125
  262. package/example/components/OrderTypeControlUI/index.js +32 -32
  263. package/example/components/PaymentOptionCashUI/index.js +60 -60
  264. package/example/components/PaymentOptionPaypalUI/index.js +50 -50
  265. package/example/components/PaymentOptionStripeDirectUI/index.js +89 -89
  266. package/example/components/PaymentOptionStripeRedirectUI/index.js +97 -97
  267. package/example/components/PaymentOptionStripeUI/index.js +129 -129
  268. package/example/components/PaymentOptionsUI/index.js +169 -169
  269. package/example/components/PhoneAutocompleteUI/index.js +67 -67
  270. package/example/components/PhoneAutocompleteUI/styles.css +49 -49
  271. package/example/components/ProductComponentUI/index.js +113 -113
  272. package/example/components/ProductFormUI/index.js +131 -131
  273. package/example/components/ProductImagesUI/index.js +82 -82
  274. package/example/components/ProductIngredientUI/index.js +21 -21
  275. package/example/components/ProductOptionSuboptionUI/index.js +65 -65
  276. package/example/components/ProductOptionUI/index.js +31 -31
  277. package/example/components/ProductShareUI/index.js +48 -48
  278. package/example/components/ProductsListUI/index.js +108 -108
  279. package/example/components/ProductsListingUI/index.js +42 -42
  280. package/example/components/ResetPasswordUI/index.js +121 -121
  281. package/example/components/SearchOptionsUI/index.js +82 -82
  282. package/example/components/SignupFormUI/index.js +117 -117
  283. package/example/components/SingleBusinessCardUI/index.js +82 -82
  284. package/example/components/SingleOrderCardUI/index.js +52 -52
  285. package/example/components/SingleProductCardUI/index.js +47 -47
  286. package/example/components/StripeElementsFormUI/CardFormUI/index.js +51 -51
  287. package/example/components/StripeElementsFormUI/CardFormUI/style.css +118 -118
  288. package/example/components/StripeElementsFormUI/index.js +38 -38
  289. package/example/components/StripeRedirectFormUI/index.js +99 -99
  290. package/example/components/TestComponent/index.js +5 -5
  291. package/example/components/UpsellingPageUI/index.js +26 -26
  292. package/example/components/UserDetailsUI/index.js +94 -94
  293. package/example/components/UserProfileUI/index.js +156 -156
  294. package/example/views/ActiveOrders/index.js +86 -86
  295. package/example/views/AddressDetailsExample/index.js +57 -57
  296. package/example/views/AppleLoginExample/index.js +51 -51
  297. package/example/views/BaseComponentExample/index.js +35 -35
  298. package/example/views/BusinessBasicInformationExample/index.js +43 -43
  299. package/example/views/BusinessControllerExample/index.js +55 -55
  300. package/example/views/BusinessInformationExample/index.js +68 -68
  301. package/example/views/BusinessProductsCategoriesExample/index.js +50 -50
  302. package/example/views/BusinessProductsSearchExample/index.js +39 -39
  303. package/example/views/BusinessReviewsExample/index.js +43 -43
  304. package/example/views/BusinessSortControlExample/index.js +53 -53
  305. package/example/views/BusinessTypeFilterExample/index.js +53 -53
  306. package/example/views/BusinessesMapExample/index.js +57 -57
  307. package/example/views/CheckoutExample/index.js +143 -143
  308. package/example/views/CmsContentExample/index.js +44 -44
  309. package/example/views/DriverTipsExample/index.js +47 -47
  310. package/example/views/EventsExample/index.js +26 -26
  311. package/example/views/FacebookLogin/index.js +63 -63
  312. package/example/views/FloatingButtonExample/index.js +47 -47
  313. package/example/views/ForgotPassword/index.js +77 -77
  314. package/example/views/GoogleLoginExample/index.js +85 -85
  315. package/example/views/Home/index.js +200 -200
  316. package/example/views/LanguageSelectorExample/index.js +55 -55
  317. package/example/views/Login/index.js +84 -84
  318. package/example/views/MainSearchExample/index.js +43 -43
  319. package/example/views/MenuControlExample/index.js +68 -68
  320. package/example/views/MessagesExample/index.js +58 -58
  321. package/example/views/MomentOptionExample/index.js +52 -52
  322. package/example/views/MyOrdersExample/index.js +35 -35
  323. package/example/views/MyOrdersListExample/index.js +50 -50
  324. package/example/views/OrderChangeExample/index.js +46 -46
  325. package/example/views/OrderContextExample/index.js +139 -139
  326. package/example/views/OrderDetailsExample/index.js +50 -50
  327. package/example/views/OrderReviewExample/index.js +64 -64
  328. package/example/views/PaymentOptionCashExample/index.js +51 -51
  329. package/example/views/PaymentOptionPaypalExample/index.js +71 -71
  330. package/example/views/PaymentOptionStripeDirectExample/index.js +43 -43
  331. package/example/views/PaymentOptionStripeExample/index.js +47 -47
  332. package/example/views/PaymentOptionStripeRedirectExample/index.js +56 -56
  333. package/example/views/PaymentOptionsExample/index.js +47 -47
  334. package/example/views/PhoneAutocompleteExample/index.js +34 -34
  335. package/example/views/PlacesExample/index.js +94 -94
  336. package/example/views/PopupExample/index.js +78 -78
  337. package/example/views/PopupExample/style.css +18 -18
  338. package/example/views/ProductDetail/index.js +323 -323
  339. package/example/views/ProductImagesExample/index.js +43 -43
  340. package/example/views/ProductOptionExample/index.js +88 -88
  341. package/example/views/ProductShareExample/index.js +51 -51
  342. package/example/views/ProductsListExample/index.js +77 -77
  343. package/example/views/ProductsListingExample/index.js +47 -47
  344. package/example/views/ResetPasswordExample/index.js +60 -60
  345. package/example/views/SearchOptionsExample/index.js +42 -42
  346. package/example/views/SessionManager/index.js +122 -122
  347. package/example/views/Signup/index.js +64 -64
  348. package/example/views/UpsellingPageExample/index.js +35 -35
  349. package/example/views/UserDetailsExample/index.js +69 -69
  350. package/example/views/UserProfile/index.js +73 -73
  351. package/index-example.js +23 -23
  352. package/index.html +13 -13
  353. package/native/index.js +257 -257
  354. package/native/src/NativeStrategy/index.js +20 -20
  355. package/native/src/contexts/OrderingContext/index.js +85 -85
  356. package/package.json +92 -92
  357. package/src/components/AddressDetails/index.js +149 -149
  358. package/src/components/AddressForm/index.js +372 -372
  359. package/src/components/AddressList/index.js +254 -254
  360. package/src/components/Analitycs/index.js +119 -119
  361. package/src/components/AnalyticsSegment/index.js +145 -145
  362. package/src/components/AppleLogin/index.js +164 -164
  363. package/src/components/BaseComponent/index.js +52 -52
  364. package/src/components/BusinessAndProductList/index.js +981 -981
  365. package/src/components/BusinessBasicInformation/index.js +119 -119
  366. package/src/components/BusinessController/index.js +351 -351
  367. package/src/components/BusinessInformation/BusinessOption/index.js +86 -86
  368. package/src/components/BusinessInformation/index.js +93 -93
  369. package/src/components/BusinessList/index.js +670 -670
  370. package/src/components/BusinessMenuListing/index.js +99 -99
  371. package/src/components/BusinessProductsCategories/index.js +60 -60
  372. package/src/components/BusinessProductsSearch/index.js +54 -54
  373. package/src/components/BusinessReviews/index.js +187 -187
  374. package/src/components/BusinessSearchList/index.js +363 -363
  375. package/src/components/BusinessSortControl/index.js +100 -100
  376. package/src/components/BusinessTypeFilter/index.js +142 -142
  377. package/src/components/BusinessesMap/index.js +110 -110
  378. package/src/components/Cart/index.js +210 -210
  379. package/src/components/CartStoresListing/index.js +157 -157
  380. package/src/components/Checkout/index.js +636 -636
  381. package/src/components/CmsContent/index.js +97 -97
  382. package/src/components/Contacts/index.js +512 -512
  383. package/src/components/CouponControl/index.js +171 -171
  384. package/src/components/DragAndDrop/index.js +41 -41
  385. package/src/components/DriverList/index.js +112 -112
  386. package/src/components/DriverTips/index.js +141 -141
  387. package/src/components/Emitter/index.js +36 -36
  388. package/src/components/ExamineClick/index.js +40 -40
  389. package/src/components/FacebookLoginButton/index.js +214 -214
  390. package/src/components/FacebookPixel/index.js +148 -148
  391. package/src/components/FavoriteList/index.js +278 -278
  392. package/src/components/FirebaseGoogleLoginButton/index.js +93 -93
  393. package/src/components/FloatingButton/index.js +70 -70
  394. package/src/components/ForgotPasswordForm/index.js +180 -180
  395. package/src/components/GiftCard/GiftCardOrdersList/index.js +155 -155
  396. package/src/components/GiftCard/PurchaseGiftCard/index.js +127 -127
  397. package/src/components/GiftCard/RedeemGiftCard/index.js +77 -77
  398. package/src/components/GiftCard/SendGiftCard/index.js +83 -83
  399. package/src/components/GoogleAutocompleteInput/index.js +154 -154
  400. package/src/components/GoogleIdentity/index.js +144 -144
  401. package/src/components/GoogleLoginButton/index.js +276 -276
  402. package/src/components/GoogleMaps/index.js +499 -499
  403. package/src/components/GpsButton/index.js +127 -127
  404. package/src/components/LanguageSelector/index.js +163 -163
  405. package/src/components/LoginForm/index.js +527 -527
  406. package/src/components/LogoutAction/index.js +165 -165
  407. package/src/components/MainSearch/index.js +149 -149
  408. package/src/components/MapView/index.js +110 -110
  409. package/src/components/MenuControl/index.js +238 -238
  410. package/src/components/Messages/index.js +166 -166
  411. package/src/components/MomentOption/index.js +322 -322
  412. package/src/components/MultiCartCreate/index.js +70 -70
  413. package/src/components/MultiCartsPaymethodsAndWallets/index.js +201 -201
  414. package/src/components/MultiCheckout/index.js +375 -375
  415. package/src/components/MultiOrdersDetails/index.js +109 -109
  416. package/src/components/MyOrders/index.js +150 -150
  417. package/src/components/MyOrdersList/index.js +104 -104
  418. package/src/components/NewOrderNotification/index.js +30 -30
  419. package/src/components/OrderChange/index.js +128 -128
  420. package/src/components/OrderDetails/index.js +684 -684
  421. package/src/components/OrderList/index.js +800 -800
  422. package/src/components/OrderListGroups/index.js +1240 -1168
  423. package/src/components/OrderReview/index.js +180 -180
  424. package/src/components/OrderTypeControl/index.js +75 -75
  425. package/src/components/OrderVerticalList/index.js +422 -422
  426. package/src/components/OrdersControlFilters/index.js +75 -75
  427. package/src/components/OrdersDashboardComponents/Appointments/index.js +72 -72
  428. package/src/components/OrdersDashboardComponents/BusinessProductsListing/index.js +629 -629
  429. package/src/components/OrdersDashboardComponents/CheckPassword/index.js +177 -177
  430. package/src/components/OrdersDashboardComponents/CityList/index.js +98 -98
  431. package/src/components/OrdersDashboardComponents/CountryList/index.js +162 -162
  432. package/src/components/OrdersDashboardComponents/CustomOrderDetails/index.js +238 -238
  433. package/src/components/OrdersDashboardComponents/DashboardBusinessList/index.js +617 -617
  434. package/src/components/OrdersDashboardComponents/DashboardOrdersList/index.js +943 -943
  435. package/src/components/OrdersDashboardComponents/DriversList/index.js +448 -448
  436. package/src/components/OrdersDashboardComponents/ExportCSV/index.js +192 -192
  437. package/src/components/OrdersDashboardComponents/GiftCardsList/index.js +189 -189
  438. package/src/components/OrdersDashboardComponents/GoogleMapsApiKeySetting/index.js +77 -77
  439. package/src/components/OrdersDashboardComponents/LogisticInformation/index.js +97 -97
  440. package/src/components/OrdersDashboardComponents/Logistics/index.js +174 -174
  441. package/src/components/OrdersDashboardComponents/Messages/index.js +384 -384
  442. package/src/components/OrdersDashboardComponents/MetaFields/index.js +186 -186
  443. package/src/components/OrdersDashboardComponents/OrderDetails/index.js +404 -404
  444. package/src/components/OrdersDashboardComponents/OrderNotification/index.js +70 -70
  445. package/src/components/OrdersDashboardComponents/OrdersFilter/index.js +362 -362
  446. package/src/components/OrdersDashboardComponents/OrdersManage/index.js +873 -873
  447. package/src/components/OrdersDashboardComponents/PointsWalletLevels/index.js +123 -123
  448. package/src/components/OrdersDashboardComponents/ReviewCustomer/index.js +113 -113
  449. package/src/components/OrdersDashboardComponents/Schedule/index.js +315 -315
  450. package/src/components/OrdersDashboardComponents/SettingsList/index.js +298 -298
  451. package/src/components/OrdersDashboardComponents/UserFormDetails/index.js +463 -463
  452. package/src/components/OrdersDashboardComponents/UsersList/index.js +944 -944
  453. package/src/components/OrdersDashboardComponents/WebsocketStatus/index.js +77 -77
  454. package/src/components/OrdersDashboardComponents/index.js +57 -57
  455. package/src/components/PageBanner/index.js +107 -107
  456. package/src/components/PaymentOptionCash/index.js +74 -74
  457. package/src/components/PaymentOptionPaypal/index.js +146 -146
  458. package/src/components/PaymentOptionSquare/index.js +336 -336
  459. package/src/components/PaymentOptionStripe/index.js +289 -289
  460. package/src/components/PaymentOptionStripeDirect/index.js +116 -116
  461. package/src/components/PaymentOptionStripeRedirect/StripeRedirectForm/index.js +71 -71
  462. package/src/components/PaymentOptionStripeRedirect/index.js +122 -122
  463. package/src/components/PaymentOptionWallet/index.js +185 -185
  464. package/src/components/PaymentOptions/index.js +262 -262
  465. package/src/components/PaymethodList/index.js +119 -119
  466. package/src/components/PhoneAutocomplete/index.js +318 -318
  467. package/src/components/PlaceSpot/index.js +183 -183
  468. package/src/components/Popup/index.js +169 -169
  469. package/src/components/ProductComponent/index.js +269 -269
  470. package/src/components/ProductForm/index.js +1101 -1101
  471. package/src/components/ProductImages/index.js +64 -64
  472. package/src/components/ProductIngredient/index.js +72 -72
  473. package/src/components/ProductItemAccordion/index.js +72 -72
  474. package/src/components/ProductOption/index.js +42 -42
  475. package/src/components/ProductOptionSuboption/index.js +181 -181
  476. package/src/components/ProductShare/index.js +97 -97
  477. package/src/components/ProductsList/index.js +74 -74
  478. package/src/components/ProductsListing/index.js +166 -166
  479. package/src/components/ProfessionalInfo/index.js +156 -156
  480. package/src/components/PromotionsController/index.js +123 -123
  481. package/src/components/QueryLoginSpoonity/index.js +159 -159
  482. package/src/components/ReCaptcha/index.js +53 -53
  483. package/src/components/ResetPassword/index.js +111 -111
  484. package/src/components/ReviewCustomer/index.js +117 -117
  485. package/src/components/ReviewDriver/index.js +157 -157
  486. package/src/components/ReviewProduct/index.js +162 -162
  487. package/src/components/SearchOptions/index.js +69 -69
  488. package/src/components/Sessions/index.js +217 -217
  489. package/src/components/SignupForm/index.js +555 -555
  490. package/src/components/SingleBusinessCard/index.js +80 -80
  491. package/src/components/SingleOrderCard/index.js +160 -160
  492. package/src/components/SingleProductCard/index.js +130 -130
  493. package/src/components/SingleProfessionalCard/index.js +121 -121
  494. package/src/components/SmartAppBanner/index.js +71 -71
  495. package/src/components/StoreProductList/index.js +303 -303
  496. package/src/components/StripeElementsForm/CardForm/index.js +248 -248
  497. package/src/components/StripeElementsForm/index.js +78 -78
  498. package/src/components/UpsellingPage/index.js +120 -120
  499. package/src/components/UserFormDetails/index.js +742 -742
  500. package/src/components/UserVerification/index.js +242 -242
  501. package/src/components/WalletList/index.js +160 -160
  502. package/src/components/WebsocketStatus/index.js +80 -80
  503. package/src/components/WrapperGoogleMaps/index.js +67 -67
  504. package/src/constants/code-numbers.js +218 -218
  505. package/src/constants/timezones.js +427 -427
  506. package/src/contexts/ApiContext/index.js +59 -59
  507. package/src/contexts/BillingContext/index.js +28 -28
  508. package/src/contexts/BusinessContext/index.js +71 -71
  509. package/src/contexts/ConfigContext/index.js +217 -217
  510. package/src/contexts/CustomerContext/index.js +69 -69
  511. package/src/contexts/EventContext/index.js +31 -31
  512. package/src/contexts/LanguageContext/index.js +144 -144
  513. package/src/contexts/OptimizationLoadContext/index.js +95 -95
  514. package/src/contexts/OrderContext/index.js +1426 -1426
  515. package/src/contexts/OrderingContext/index.js +86 -86
  516. package/src/contexts/OrderingThemeContext/index.js +107 -107
  517. package/src/contexts/ProductContext/index.js +62 -62
  518. package/src/contexts/SessionContext/index.js +172 -172
  519. package/src/contexts/SiteContext/index.js +79 -79
  520. package/src/contexts/ToastContext/index.js +42 -42
  521. package/src/contexts/UtilsContext/index.js +352 -352
  522. package/src/contexts/ValidationsFieldsContext/index.js +65 -65
  523. package/src/contexts/WebsocketContext/index.js +91 -91
  524. package/src/contexts/WebsocketContext/socket.js +92 -92
  525. package/src/index.js +371 -371
  526. package/src/utils/index.js +32 -32
  527. package/src/webStrategy/index.js +18 -18
  528. package/webpack.dev.js +41 -41
  529. package/webpack.prod.js +64 -64
  530. package/_bundles/ordering-component.b9d526043d34dfae1732.js +0 -2
  531. /package/_bundles/{2.ordering-component.b9d526043d34dfae1732.js → 2.ordering-component.30bb86a42f9281a57ad5.js} +0 -0
  532. /package/_bundles/{4.ordering-component.b9d526043d34dfae1732.js → 4.ordering-component.30bb86a42f9281a57ad5.js} +0 -0
  533. /package/_bundles/{5.ordering-component.b9d526043d34dfae1732.js → 5.ordering-component.30bb86a42f9281a57ad5.js} +0 -0
  534. /package/_bundles/{6.ordering-component.b9d526043d34dfae1732.js → 6.ordering-component.30bb86a42f9281a57ad5.js} +0 -0
  535. /package/_bundles/{7.ordering-component.b9d526043d34dfae1732.js.LICENSE.txt → 7.ordering-component.30bb86a42f9281a57ad5.js.LICENSE.txt} +0 -0
  536. /package/_bundles/{8.ordering-component.b9d526043d34dfae1732.js → 8.ordering-component.30bb86a42f9281a57ad5.js} +0 -0
  537. /package/_bundles/{ordering-component.b9d526043d34dfae1732.js.LICENSE.txt → ordering-component.30bb86a42f9281a57ad5.js.LICENSE.txt} +0 -0
@@ -1,1426 +1,1426 @@
1
- import React, { createContext, useContext, useState, useEffect } from 'react'
2
- import { useSession } from '../SessionContext'
3
- import { useApi } from '../ApiContext'
4
- import { useWebsocket } from '../WebsocketContext'
5
- import { useLanguage } from '../LanguageContext'
6
- import { useEvent } from '../EventContext'
7
- import { useConfig } from '../ConfigContext'
8
- import { useCustomer } from '../CustomerContext'
9
- import { ToastType, useToast } from '../ToastContext'
10
- import dayjs from 'dayjs'
11
- import utc from 'dayjs/plugin/utc'
12
-
13
- dayjs.extend(utc)
14
-
15
- /**
16
- * Create OrderContext
17
- * This context will manage the current order with options internally and provide an easy interface
18
- */
19
- export const OrderContext = createContext()
20
-
21
- /**
22
- * Custom provider to order manager
23
- * This provider has a reducer for manage order state
24
- * @param {props} props
25
- */
26
- export const OrderProvider = ({ Alert, children, strategy, isAlsea, isDisableToast, franchiseId, isDisabledDefaultOpts, businessSlug, userAgent }) => {
27
- const [confirmAlert, setConfirm] = useState({ show: false })
28
- const [alert, setAlert] = useState({ show: false })
29
- const [ordering] = useApi()
30
- const socket = useWebsocket()
31
- const [languageState, t] = useLanguage()
32
- const [events] = useEvent()
33
- const [configState] = useConfig()
34
- const [session, { logout }] = useSession()
35
- const [customerState, { setUserCustomer }] = useCustomer()
36
- const [, { showToast }] = useToast()
37
-
38
- const configTypes = configState?.configs?.order_types_allowed?.value.split('|').map(value => Number(value)) || []
39
-
40
- const orderTypes = {
41
- delivery: 1,
42
- pickup: 2,
43
- eatin: 3,
44
- curbside: 4,
45
- drivethru: 5,
46
- catering_delivery: 7,
47
- catering_pickup: 8
48
- }
49
-
50
- const [state, setState] = useState({
51
- loading: true,
52
- options: isDisabledDefaultOpts
53
- ? { type: null, moment: null, city_id: null }
54
- : {
55
- type: orderTypes[configState?.configs?.default_order_type?.value],
56
- moment: null,
57
- city_id: null
58
- },
59
- carts: {},
60
- confirmAlert,
61
- alert
62
- })
63
-
64
- /**
65
- * Refresh order options and carts from API
66
- */
67
- const refreshOrderOptions = async () => {
68
- try {
69
- if (!state.loading) {
70
- setState({ ...state, loading: true })
71
- }
72
- const countryCodeFromLocalStorage = await strategy.getItem('country-code')
73
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
74
- const userCustomerId = customerFromLocalStorage?.id
75
- const options = {}
76
- if (userCustomerId) {
77
- options.query = {
78
- user_id: userCustomerId
79
- }
80
- }
81
- if (franchiseId) {
82
- options.query = {
83
- ...options.query,
84
- franchise_id: franchiseId
85
- }
86
- }
87
-
88
- const countryCode = countryCodeFromLocalStorage && countryCodeFromLocalStorage !== state?.options?.address?.country_code
89
- ? countryCodeFromLocalStorage
90
- : state?.options?.address?.country_code
91
-
92
- if (countryCode) {
93
- options.headers = {
94
- 'X-Socket-Id-X': socket?.getId(),
95
- 'X-Country-Code-X': countryCode
96
- }
97
- }
98
-
99
- const res = await ordering.setAccessToken(session.token).orderOptions().get(options)
100
- const error = res?.content?.error
101
- const result = res?.content?.result
102
-
103
- if (!error) {
104
- const { carts, ...options } = result
105
- state.carts = {}
106
- carts.forEach(cart => {
107
- state.carts[`businessId:${cart.business_id}`] = cart
108
- })
109
- state.options = {
110
- ...state.options,
111
- ...options
112
- }
113
-
114
- if (!countryCodeFromLocalStorage && options?.address?.country_code) {
115
- await updateOrderOptions({ country_code: options?.address?.country_code })
116
- }
117
- }
118
- if (error) {
119
- setAlert({ show: true, content: result })
120
- if (res?.status === 401) {
121
- session.auth && logout()
122
- }
123
- }
124
- const localOptions = await strategy.getItem('options', true)
125
- if (localOptions) {
126
- const options = {}
127
- if (Object.keys(localOptions.address).length > 0) {
128
- const conditions = [
129
- { attribute: 'address', value: localOptions?.address?.address }
130
- ]
131
- const userId = userCustomerId || session.user.id
132
- const addressesResponse = await ordering.setAccessToken(session.token).users(userId).addresses().where(conditions).get()
133
- let address = addressesResponse.content.result.find(address => {
134
- localOptions.address.internal_number = localOptions.address?.internal_number || null
135
- localOptions.address.zipcode = localOptions.address?.zipcode || null
136
- localOptions.address.address_notes = localOptions.address?.address_notes || null
137
-
138
- return address?.location?.lat === localOptions?.address?.location.lat &&
139
- address?.location?.lng === localOptions?.address?.location?.lng &&
140
- address?.internal_number === localOptions?.address?.internal_number &&
141
- address?.zipcode === localOptions?.address?.zipcode &&
142
- address?.address_notes === localOptions?.address?.address_notes
143
- })
144
- if (!address) {
145
- Object.keys(localOptions.address).forEach(key => localOptions?.address?.[key] === null && delete localOptions?.address?.[key])
146
- const { content: { error, result } } = await ordering.setAccessToken(session.token).users(userId).addresses().save(localOptions.address)
147
- if (!error) {
148
- address = result
149
- }
150
- } else {
151
- await ordering.setAccessToken(session.token).users(userId).addresses(address.id).save({ default: true })
152
- }
153
- address && (options.address_id = address.id)
154
- }
155
- if (localOptions.type) {
156
- options.type = localOptions.type
157
- }
158
- if (localOptions.moment) {
159
- options.moment = dayjs.utc(localOptions.moment, 'YYYY-MM-DD HH:mm:ss').unix()
160
- }
161
- if (localOptions?.address_id) {
162
- options.address_id = localOptions?.address_id
163
- }
164
- if (localOptions?.city_id) {
165
- options.city_id = localOptions?.city_id
166
- }
167
- if (options && Object.keys(options).length > 0) {
168
- updateOrderOptions(options)
169
- } else {
170
- setState({ ...state, loading: false })
171
- }
172
- await strategy.removeItem('options')
173
- } else {
174
- setState({ ...state, loading: false })
175
- }
176
- } catch (err) {
177
- const message = err?.message?.includes('Internal error')
178
- ? 'INTERNAL_ERROR'
179
- : !err.message
180
- ? t('NETWORK_ERROR', 'Network error')
181
- : err.message
182
- setAlert({ show: true, content: [message] })
183
- setState({ ...state, loading: false })
184
- }
185
- }
186
-
187
- const checkAddress = (address) => {
188
- const props = ['address', 'address_notes', 'zipcode', 'location', 'internal_number']
189
- const values = []
190
- props.forEach(prop => {
191
- if (state.options?.address && state.options?.address?.[prop]) {
192
- if (prop === 'location') {
193
- values.push(address?.[prop]?.lat === state.options?.address?.[prop]?.lat &&
194
- address?.[prop]?.lng === state.options?.address?.[prop]?.lng)
195
- } else {
196
- values.push(address?.[prop] === state.options?.address?.[prop])
197
- }
198
- } else {
199
- values.push(!address?.[prop])
200
- }
201
- })
202
- return values.every(value => value)
203
- }
204
-
205
- /**
206
- * Change order address
207
- */
208
- const changeAddress = async (addressId, params) => {
209
- const isCountryCodeChanged = state.options?.address?.country_code !== params?.country_code
210
- if (typeof addressId === 'object') {
211
- const optionsStorage = await strategy.getItem('options', true)
212
- const options = {
213
- ...state.options,
214
- ...optionsStorage,
215
- address: {
216
- ...optionsStorage?.address,
217
- ...addressId
218
- }
219
- }
220
- if (!session.auth) {
221
- options.type = state?.options?.type
222
- }
223
- await strategy.setItem('options', options, true)
224
- setState({
225
- ...state,
226
- options
227
- })
228
- return
229
- }
230
-
231
- const _params = { country_code: params?.country_code }
232
-
233
- params?.type && (_params.type = params?.type)
234
-
235
- if (params && params?.address && !checkAddress(params?.address)) {
236
- _params.address_id = params?.address?.id
237
- await updateOrderOptions(_params)
238
- if (isCountryCodeChanged) {
239
- events.emit('country_code_changed', params?.country_code)
240
- }
241
- return
242
- }
243
- addressId && (_params.address_id = addressId)
244
- if (params && params?.isEdit) {
245
- if (addressId !== state.options.address_id) {
246
- return
247
- }
248
- await updateOrderOptions(_params)
249
- if (isCountryCodeChanged) {
250
- events.emit('country_code_changed', params?.country_code)
251
- }
252
- return
253
- }
254
- await updateOrderOptions(_params)
255
- if (isCountryCodeChanged) {
256
- events.emit('country_code_changed', params?.country_code)
257
- }
258
- }
259
-
260
- /**
261
- * Change order type
262
- */
263
- const changeType = async (type) => {
264
- const options = {
265
- ...state.options,
266
- type
267
- }
268
- if (state.options.type === type) {
269
- return
270
- }
271
-
272
- const cityId = state.options?.city_id
273
- const params = { type }
274
-
275
- if (cityId && type !== 2) {
276
- params.city_id = null
277
- }
278
-
279
- if (!session.auth) {
280
- const _options = { ...options, ...params }
281
- await strategy.setItem('options', _options, true)
282
- setState({
283
- ...state,
284
- options: _options
285
- })
286
- }
287
-
288
- updateOrderOptions(params)
289
- }
290
-
291
- /**
292
- * Change order moment
293
- */
294
- const changeMoment = async (moment) => {
295
- const momentUnix = moment ? moment.getTime() / 1000 : null
296
- const momentFormatted = momentUnix ? dayjs.unix(momentUnix).utc().format('YYYY-MM-DD HH:mm:ss') : null
297
-
298
- const options = {
299
- ...state.options,
300
- moment: momentFormatted
301
- }
302
- if (state.options.moment === momentFormatted) {
303
- return
304
- }
305
-
306
- if (!session.auth) {
307
- await strategy.setItem('options', options, true)
308
- setState({
309
- ...state,
310
- options
311
- })
312
- }
313
-
314
- updateOrderOptions({ moment: momentUnix })
315
- }
316
-
317
- /**
318
- * Change order city
319
- */
320
- const changeCityFilter = async (id) => {
321
- const options = {
322
- ...state.options,
323
- city_id: id
324
- }
325
- if (state.options.city_id === id) {
326
- return
327
- }
328
-
329
- if (!session.auth) {
330
- await strategy.setItem('options', options, true)
331
- setState({
332
- ...state,
333
- options
334
- })
335
- }
336
-
337
- updateOrderOptions({ city_id: id })
338
- }
339
- /**
340
- * Update order option data
341
- * @param {object} changes Changes to update order options
342
- */
343
- const updateOrderOptions = async (changes) => {
344
- if (session.auth) {
345
- const countryCodeFromLocalStorage = await strategy.getItem('country-code')
346
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
347
- const userCustomerId = customerFromLocalStorage?.id
348
- const body = {
349
- ...changes,
350
- user_id: userCustomerId || session.user.id
351
- }
352
- try {
353
- setState({ ...state, loading: true })
354
- const options = {}
355
- state.loading = true
356
- options.headers = {
357
- 'X-App-X': ordering.appId,
358
- 'X-Socket-Id-X': socket?.getId()
359
- }
360
- const countryCode = changes?.country_code && changes?.country_code !== state?.options?.address?.country_code
361
- ? changes?.country_code
362
- : countryCodeFromLocalStorage ?? changes?.country_code ?? state?.options?.address?.country_code
363
-
364
- if (countryCode) {
365
- options.headers = {
366
- ...options.headers,
367
- 'X-Country-Code-X': countryCode
368
- }
369
- await strategy.setItem('country-code', countryCode)
370
- }
371
- if (franchiseId) {
372
- options.query = {
373
- ...options.query,
374
- franchise_id: franchiseId
375
- }
376
- }
377
- if (body?.country_code) {
378
- delete body?.country_code
379
- }
380
- const { content: { error, result } } = await ordering
381
- .setAccessToken(session.token)
382
- .orderOptions()
383
- .save(body, options)
384
- if (!error) {
385
- const { carts, ...options } = result
386
- state.carts = {}
387
- carts.forEach(cart => {
388
- state.carts[`businessId:${cart.business_id}`] = cart
389
- })
390
- state.options = {
391
- ...state.options,
392
- ...options
393
- }
394
- } else {
395
- setAlert({ show: true, content: result })
396
- }
397
- setState({ ...state, loading: false })
398
- state.loading = false
399
- return !error
400
- } catch (err) {
401
- const message = err?.message?.includes('Internal error')
402
- ? 'INTERNAL_ERROR'
403
- : err.message
404
- setAlert({ show: true, content: [message] })
405
- setState({ ...state, loading: false })
406
- state.loading = false
407
- return false
408
- }
409
- }
410
- }
411
-
412
- /**
413
- * Add product to cart
414
- * @param {object} product product for add
415
- * @param {object} cart cart of the product
416
- * @param {boolean} isQuickAddProduct option to add product when clicks
417
- */
418
- const addProduct = async (
419
- product,
420
- cart,
421
- isQuickAddProduct,
422
- isPlatformProduct = false
423
- ) => {
424
- try {
425
- setState({ ...state, loading: true })
426
- const countryCode = await strategy.getItem('country-code')
427
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
428
- const userCustomerId = customerFromLocalStorage?.id
429
- let body
430
- const headers = {
431
- 'X-Socket-Id-X': socket?.getId(),
432
- 'X-Country-Code-X': countryCode
433
- }
434
- if (!isPlatformProduct) {
435
- body = {
436
- product,
437
- business_id: cart.business_id,
438
- user_id: userCustomerId || session.user.id
439
- }
440
- } else {
441
- body = {
442
- platform_product: { ...product }
443
- }
444
- }
445
-
446
- const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().addProduct(body, { headers })
447
-
448
- if (!error) {
449
- state.carts[`businessId:${result.business_id}`] = result
450
- events.emit('cart_product_added', product, result)
451
- if (product?.favorite) {
452
- events.emit('wishlist_product_added_to_cart', product, result)
453
- }
454
- events.emit('cart_updated', result)
455
- events.emit('product_added', product, result)
456
- isQuickAddProduct && !isDisableToast && showToast(ToastType.Success, t('PRODUCT_ADDED_NOTIFICATION', 'Product _PRODUCT_ added succesfully').replace('_PRODUCT_', product.name))
457
- } else {
458
- setAlert({ show: true, content: result })
459
- }
460
- setState({ ...state, loading: false })
461
- if (isPlatformProduct) {
462
- return { error, result }
463
- } else {
464
- return !error
465
- }
466
- } catch (err) {
467
- setState({ ...state, loading: false })
468
- if (isPlatformProduct) {
469
- return { error: true, result: err.message }
470
- } else {
471
- return false
472
- }
473
- }
474
- }
475
-
476
- /**
477
- * Add multi products to cart / (domino's)
478
- * @param {object} product product for add
479
- * @param {object} cart cart of the product
480
- * @param {boolean} isQuickAddProduct option to add product when clicks
481
- */
482
- const addMultiProduct = async (
483
- product,
484
- cart,
485
- isQuickAddProduct
486
- ) => {
487
- try {
488
- setState({ ...state, loading: true })
489
- const countryCode = await strategy.getItem('country-code')
490
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
491
- const userCustomerId = customerFromLocalStorage?.id
492
- const headers = {
493
- 'X-Socket-Id-X': socket?.getId(),
494
- 'X-Country-Code-X': countryCode
495
- }
496
- const body = {
497
- products: JSON.stringify(product),
498
- business_id: cart.business_id,
499
- user_id: userCustomerId || session.user.id
500
- }
501
- const response = await fetch(`${ordering.root}/carts/multi_product`, {
502
- method: 'POST',
503
- body: JSON.stringify({
504
- ...body,
505
- products: JSON.stringify([product])
506
- }),
507
- headers: {
508
- ...headers,
509
- Authorization: `Bearer ${session.token}`,
510
- 'Content-Type': 'application/json'
511
- }
512
- })
513
- const { result, error } = await response.json()
514
- if (!error) {
515
- state.carts[`businessId:${result.business_id}`] = result
516
- events.emit('cart_product_added', product, result)
517
- if (product?.favorite) {
518
- events.emit('wishlist_product_added_to_cart', product, result)
519
- }
520
- events.emit('cart_updated', result)
521
- events.emit('product_added', product, result)
522
- isQuickAddProduct && !isDisableToast && showToast(ToastType.Success, t('PRODUCT_ADDED_NOTIFICATION', 'Product _PRODUCT_ added succesfully').replace('_PRODUCT_', product.name))
523
- } else {
524
- setAlert({ show: true, content: result })
525
- }
526
- setState({ ...state, loading: false })
527
- return !error
528
- } catch (err) {
529
- setState({ ...state, loading: false })
530
- return false
531
- }
532
- }
533
-
534
- /**
535
- * Remove product to cart
536
- */
537
- const removeProduct = async (product, cart) => {
538
- try {
539
- setState({ ...state, loading: true })
540
- const countryCode = await strategy.getItem('country-code')
541
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
542
- const userCustomerId = customerFromLocalStorage?.id
543
- const body = {
544
- product: {
545
- id: product.id,
546
- code: product.code,
547
- business_id: product.business_id
548
- },
549
- business_id: cart.business_id,
550
- user_id: userCustomerId || session.user.id
551
- }
552
- const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().removeProduct(body, {
553
- headers: {
554
- 'X-App-X': ordering.appId,
555
- 'X-Socket-Id-X': socket?.getId(),
556
- 'X-Country-Code-X': countryCode
557
- }
558
- })
559
- if (!error) {
560
- state.carts[`businessId:${result.business_id}`] = result
561
- events.emit('cart_product_removed', product, result)
562
- events.emit('cart_updated', result)
563
- } else {
564
- setAlert({ show: true, content: result })
565
- }
566
- setState({ ...state, loading: false })
567
- return !error
568
- } catch (err) {
569
- setState({ ...state, loading: false })
570
- return false
571
- }
572
- }
573
-
574
- /**
575
- * Clear products of cart
576
- */
577
- const clearCart = async (uuid, configurations = {}) => {
578
- try {
579
- setState({ ...state, loading: !configurations?.disableLoading })
580
- const countryCode = await strategy.getItem('country-code')
581
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
582
- const userCustomerId = customerFromLocalStorage?.id
583
- const body = JSON.stringify({
584
- uuid,
585
- user_id: userCustomerId || session.user.id
586
- })
587
- const response = await fetch(`${ordering.root}/carts/clear`, {
588
- method: 'POST',
589
- headers: {
590
- 'Content-Type': 'application/json',
591
- Authorization: `Bearer ${session.token}`,
592
- 'X-App-X': ordering.appId,
593
- 'X-Socket-Id-X': socket?.getId(),
594
- 'X-Country-Code-X': countryCode
595
- },
596
- body
597
- })
598
- const { error, result } = await response.json()
599
- if (!error) {
600
- state.carts[`businessId:${result.business_id}`] = result
601
- } else {
602
- setAlert({ show: true, content: result })
603
- }
604
- setState({ ...state, loading: false })
605
- return { error, result }
606
- } catch (err) {
607
- setState({ ...state, loading: false })
608
- return false
609
- }
610
- }
611
-
612
- /**
613
- * Update product to cart
614
- */
615
- const updateProduct = async (product, cart, isQuickAddProduct) => {
616
- try {
617
- setState({ ...state, loading: true })
618
- const countryCode = await strategy.getItem('country-code')
619
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
620
- const userCustomerId = customerFromLocalStorage?.id
621
- const body = {
622
- product,
623
- business_id: cart.business_id,
624
- user_id: userCustomerId || session.user.id
625
- }
626
- const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().updateProduct(body, {
627
- headers: {
628
- 'X-Socket-Id-X': socket?.getId(),
629
- 'X-Country-Code-X': countryCode
630
- }
631
- })
632
- if (!error) {
633
- state.carts[`businessId:${result.business_id}`] = result
634
- events.emit('cart_product_updated', product, result)
635
- events.emit('cart_updated', result)
636
- isQuickAddProduct && !isDisableToast && showToast(ToastType.Success, t('PRODUCT_UPDATED_NOTIFICATION', 'Product _PRODUCT_ updated succesfully').replace('_PRODUCT_', product.name))
637
- } else {
638
- setAlert({ show: true, content: result })
639
- }
640
- setState({ ...state, loading: false })
641
- return !error
642
- } catch (err) {
643
- setState({ ...state, loading: false })
644
- return false
645
- }
646
- }
647
-
648
- /**
649
- * Apply coupon to cart
650
- */
651
- const applyCoupon = async (couponData, customParams) => {
652
- if (!couponData.business_id) {
653
- throw new Error('`business_id` is required.')
654
- }
655
- if (typeof couponData.coupon === 'undefined') {
656
- throw new Error('`coupon` is required.')
657
- }
658
- if (state.carts[`businessId:${couponData.business_id}`]?.coupon === couponData.coupon) {
659
- return
660
- }
661
-
662
- try {
663
- setState({ ...state, loading: true })
664
- const countryCode = await strategy.getItem('country-code')
665
- if (customParams && isAlsea) {
666
- const response = await fetch('https://alsea-plugins.ordering.co/alseaplatform/vcoupon2.php', {
667
- method: 'POST',
668
- body: JSON.stringify({
669
- userId: customParams.userId,
670
- businessId: customParams.businessId,
671
- couponId: couponData.coupon
672
- }),
673
- headers: {
674
- Accept: 'application/json',
675
- 'Content-Type': 'application/x-www-form-urlencoded',
676
- 'Access-Control-Allow-Origin': '*',
677
- 'X-App-X': ordering.appId,
678
- 'X-Socket-Id-X': socket?.getId(),
679
- 'X-Country-Code-X': countryCode
680
- }
681
- })
682
- const result = await response.json()
683
-
684
- if (result.message !== 'Cup\u00f3n v\u00e1lido') {
685
- setAlert({ show: true, content: result.message === 'Not found' ? ['ERROR_INVALID_COUPON'] : [result.message] })
686
- setState({ ...state, loading: false })
687
- return
688
- }
689
- }
690
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
691
- const userCustomerId = customerFromLocalStorage?.id
692
- const body = {
693
- business_id: couponData.business_id,
694
- coupon: couponData.coupon,
695
- user_id: userCustomerId || session.user.id
696
- }
697
- const { content } = await ordering
698
- .setAccessToken(session.token)
699
- .carts()
700
- .applyCoupon(body, {
701
- headers: {
702
- 'X-App-X': ordering.appId,
703
- 'X-Socket-Id-X': socket?.getId(),
704
- 'X-Country-Code-X': countryCode
705
- }
706
- })
707
- const result = content
708
- if (!result.error) {
709
- state.carts[`businessId:${result.result.business_id}`] = result.result
710
- events.emit('cart_updated', result.result)
711
- } else {
712
- setAlert({ show: true, content: result.result })
713
- }
714
- setState({ ...state, loading: false })
715
- return !result.error
716
- } catch (err) {
717
- setState({ ...state, loading: false })
718
- return false
719
- }
720
- }
721
-
722
- const applyOffer = async (offerData) => {
723
- if (!offerData.business_id) {
724
- throw new Error('`business_id` is required.')
725
- }
726
- if (typeof offerData.coupon === 'undefined') {
727
- throw new Error('`coupon` is required.')
728
- }
729
- try {
730
- setState({ ...state, loading: true })
731
- const countryCode = await strategy.getItem('country-code')
732
- const response = await fetch(`${ordering.root}/carts/add_offer`, {
733
- method: 'POST',
734
- body: JSON.stringify({
735
- user_id: offerData.userId,
736
- business_id: offerData.business_id,
737
- coupon: offerData.coupon,
738
- force: offerData.force ?? false
739
- }),
740
- headers: {
741
- 'Content-Type': 'application/json',
742
- Authorization: `Bearer ${session.token}`,
743
- 'X-App-X': ordering.appId,
744
- 'X-Socket-Id-X': socket?.getId(),
745
- 'X-Country-Code-X': countryCode
746
- }
747
- })
748
- const result = await response.json()
749
- if (!result.error) {
750
- state.carts[`businessId:${result.result.business_id}`] = result.result
751
- events.emit('cart_updated', result.result)
752
- events.emit('offer_applied', { ...result.result, ...offerData })
753
- } else {
754
- setAlert({ show: true, content: result.result })
755
- events.emit('offer_denied', { ...offerData, reason: result.result })
756
- }
757
- setState({ ...state, loading: false })
758
- return !result.error
759
- } catch (err) {
760
- setState({ ...state, loading: false })
761
- return false
762
- }
763
- }
764
-
765
- const removeOffer = async (offerData) => {
766
- if (!offerData.business_id) {
767
- throw new Error('`business_id` is required.')
768
- }
769
- if (typeof offerData.offer_id === 'undefined') {
770
- throw new Error('`offer_id` is required.')
771
- }
772
- try {
773
- const countryCode = await strategy.getItem('country-code')
774
- setState({ ...state, loading: true })
775
- const offerRemoveData = {
776
- business_id: offerData.business_id,
777
- offer_id: offerData.offer_id
778
- }
779
- if (offerData.user_id) offerRemoveData.user_id = offerData.user_id
780
- const response = await fetch(`${ordering.root}/carts/remove_offer`, {
781
- method: 'POST',
782
- body: JSON.stringify(offerRemoveData),
783
- headers: {
784
- 'Content-Type': 'application/json',
785
- Authorization: `Bearer ${session.token}`,
786
- 'X-App-X': ordering.appId,
787
- 'X-Socket-Id-X': socket?.getId(),
788
- 'X-Country-Code-X': countryCode
789
- }
790
- })
791
- const result = await response.json()
792
- if (!result.error) {
793
- state.carts[`businessId:${result.result.business_id}`] = result.result
794
- events.emit('cart_updated', result.result)
795
- events.emit('offer_removed', offerData)
796
- } else {
797
- setAlert({ show: true, content: result.result })
798
- }
799
- setState({ ...state, loading: false })
800
- return !result.error
801
- } catch (err) {
802
- setState({ ...state, loading: false })
803
- return false
804
- }
805
- }
806
-
807
- /**
808
- * Apply coupon to cart
809
- */
810
- const changeDriverTip = async (businessId, driverTipRate = 0, isFixedPrice) => {
811
- if (!businessId) {
812
- throw new Error('`businessId` is required.')
813
- }
814
- if (!driverTipRate && driverTipRate !== 0) {
815
- throw new Error('`driverTipRate` is required.')
816
- }
817
- if (!state.carts[`businessId:${businessId}`] || state.carts[`businessId:${businessId}`]?.driver_tip_rate === driverTipRate) {
818
- return
819
- }
820
- try {
821
- setState({ ...state, loading: true })
822
- const countryCode = await strategy.getItem('country-code')
823
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
824
- const userCustomerId = customerFromLocalStorage?.id
825
- const body = {
826
- business_id: businessId,
827
- [isFixedPrice ? 'driver_tip' : 'driver_tip_rate']: driverTipRate,
828
- user_id: userCustomerId || session.user.id
829
- }
830
- const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().changeDriverTip(body, {
831
- headers: {
832
- 'X-Socket-Id-X': socket?.getId(),
833
- 'X-Country-Code-X': countryCode
834
- }
835
- })
836
- if (!error) {
837
- state.carts[`businessId:${result.business_id}`] = result
838
- events.emit('cart_updated', result)
839
- } else {
840
- setAlert({ show: true, content: result })
841
- }
842
- setState({ ...state, loading: false })
843
- return !error
844
- } catch (err) {
845
- setState({ ...state, loading: false })
846
- return false
847
- }
848
- }
849
-
850
- /**
851
- * Change payment method
852
- */
853
- const changePaymethod = async (businessId, paymethodId, paymethodData) => {
854
- if (!businessId) {
855
- throw new Error('`businessId` is required.')
856
- }
857
- if (!paymethodId) {
858
- throw new Error('`paymethodId` is required.')
859
- }
860
- if (!paymethodData) {
861
- throw new Error('`paymethodData` is required.')
862
- }
863
- if (!state.carts[`businessId:${businessId}`] || state.carts[`businessId:${businessId}`]?.paymethodId === paymethodId) {
864
- return
865
- }
866
- try {
867
- setState({ ...state, loading: true })
868
- const countryCode = await strategy.getItem('country-code')
869
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
870
- const userCustomerId = customerFromLocalStorage?.id
871
- const body = {
872
- business_id: businessId,
873
- paymethod_id: paymethodId,
874
- paymethod_data: paymethodData,
875
- user_id: userCustomerId ?? session.user.id
876
- }
877
- const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().changePaymethod(body, {
878
- headers: {
879
- 'X-Socket-Id-X': socket?.getId(),
880
- 'X-Country-Code-X': countryCode
881
- }
882
- })
883
- if (!error) {
884
- state.carts[`businessId:${result.business_id}`] = result
885
- events.emit('cart_updated', result)
886
- }
887
- setState({ ...state, loading: false })
888
- return !error
889
- } catch (err) {
890
- refreshOrderOptions()
891
- setState({ ...state, loading: false })
892
- return false
893
- }
894
- }
895
-
896
- /**
897
- * Place cart
898
- */
899
- const placeCart = async (cardId, data) => {
900
- try {
901
- setState({ ...state, loading: true })
902
- const countryCode = await strategy.getItem('country-code')
903
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
904
- const userCustomerId = customerFromLocalStorage?.id
905
- const body = {
906
- ...data,
907
- user_id: userCustomerId || session.user.id
908
- }
909
- let headers = {
910
- 'X-Socket-Id-X': socket?.getId(),
911
- 'X-Country-Code-X': countryCode
912
- }
913
- if (userAgent) {
914
- headers = { ...headers, 'User-Agent': userAgent }
915
- }
916
- const { content: { error, result } } = await ordering.setAccessToken(session.token).carts(cardId).place(body, { headers: headers })
917
- if (!error) {
918
- if (result.status !== 1) {
919
- state.carts[`businessId:${result.business_id}`] = result
920
- events.emit('cart_updated', result)
921
- } else {
922
- delete state.carts[`businessId:${result.business_id}`]
923
- const orderObject = {
924
- id: result.order.uuid,
925
- business: { name: result.business.name },
926
- total: result.total,
927
- tax_total: result.tax,
928
- delivery_zone_price: result.delivery_price,
929
- business_id: result.business_id,
930
- paymethod: result.paymethod_data.gateway
931
- }
932
- events.emit('order_placed', orderObject)
933
- }
934
- } else {
935
- setAlert({ show: true, content: result })
936
- setState({ ...state, loading: false })
937
- return
938
- }
939
- setState({ ...state, loading: false })
940
- return { error, result }
941
- } catch (err) {
942
- setState({ ...state, loading: false })
943
- return {
944
- error: true,
945
- result: [err.message]
946
- }
947
- }
948
- }
949
-
950
- /**
951
- * Place multi carts
952
- */
953
- const placeMultiCarts = async (data, cartUuid) => {
954
- try {
955
- setState({ ...state, loading: true })
956
- const countryCode = await strategy.getItem('country-code')
957
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
958
- const userCustomerId = customerFromLocalStorage?.id
959
- const body = {
960
- ...data,
961
- user_id: userCustomerId || session.user.id
962
- }
963
- const requestOptions = {
964
- method: 'POST',
965
- headers: {
966
- 'Content-Type': 'application/json',
967
- Authorization: `bearer ${session.token}`,
968
- 'X-App-X': ordering.appId,
969
- 'X-Socket-Id-X': socket?.getId(),
970
- 'X-Country-Code-X': countryCode
971
- },
972
- body: JSON.stringify(body)
973
- }
974
-
975
- const response = await fetch(`${ordering.root}/cart_groups/${cartUuid}/place`, requestOptions)
976
- const { error, result } = await response.json()
977
- if (!error) {
978
- result.carts.forEach(cart => {
979
- delete state.carts[`businessId:${cart.business_id}`]
980
- const orderObject = {
981
- id: cart.uuid,
982
- business: { name: cart.business.name },
983
- total: cart.total,
984
- tax_total: cart.tax,
985
- delivery_zone_price: cart.delivery_price,
986
- business_id: cart.business_id
987
- }
988
- events.emit('order_placed', orderObject)
989
- })
990
- } else {
991
- setAlert({ show: true, content: result })
992
- }
993
- setState({ ...state, loading: false })
994
- return { error, result }
995
- } catch (err) {
996
- setState({ ...state, loading: false })
997
- return {
998
- error: true,
999
- result: [err.message]
1000
- }
1001
- }
1002
- }
1003
-
1004
- /**
1005
- * Confirm cart
1006
- */
1007
- const confirmCart = async (cardId, data) => {
1008
- try {
1009
- setState({ ...state, loading: true })
1010
- const countryCode = await strategy.getItem('country-code')
1011
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
1012
- const userCustomerId = customerFromLocalStorage?.id
1013
- const body = {
1014
- ...data,
1015
- user_id: userCustomerId || session.user.id
1016
- }
1017
- let fetchurl
1018
- if (body.user_id === userCustomerId || data) {
1019
- fetchurl = await ordering.setAccessToken(session.token).carts(cardId).confirmWithData(body, {
1020
- headers: {
1021
- 'X-App-X': ordering.appId,
1022
- 'X-Socket-Id-X': socket?.getId(),
1023
- 'X-Country-Code-X': countryCode
1024
- }
1025
- })
1026
- } else {
1027
- fetchurl = await ordering.setAccessToken(session.token).carts(cardId).confirm(body, {
1028
- headers: {
1029
- 'X-App-X': ordering.appId,
1030
- 'X-Socket-Id-X': socket?.getId(),
1031
- 'X-Country-Code-X': countryCode
1032
- }
1033
- })
1034
- }
1035
- const { content: { error, result, cart } } = fetchurl
1036
- if (!error) {
1037
- if (result.status !== 1) {
1038
- state.carts[`businessId:${result.business_id}`] = result
1039
- events.emit('cart_updated', result)
1040
- } else {
1041
- delete state.carts[`businessId:${result.business_id}`]
1042
- }
1043
- } else if (cart) {
1044
- state.carts[`businessId:${cart.business_id}`] = cart
1045
- events.emit('cart_updated', cart)
1046
- }
1047
- setState({ ...state, loading: false })
1048
- return { error, result }
1049
- } catch (err) {
1050
- setState({ ...state, loading: false })
1051
- return {
1052
- error: true,
1053
- result: [err.message]
1054
- }
1055
- }
1056
- }
1057
-
1058
- /**
1059
- * Confirm multi carts
1060
- */
1061
- const confirmMultiCarts = async (cartUuid) => {
1062
- try {
1063
- setState({ ...state, loading: true })
1064
- const countryCode = await strategy.getItem('country-code')
1065
- const requestOptions = {
1066
- method: 'POST',
1067
- headers: {
1068
- 'Content-Type': 'application/json',
1069
- Authorization: `bearer ${session.token}`,
1070
- 'X-App-X': ordering.appId,
1071
- 'X-Socket-Id-X': socket?.getId(),
1072
- 'X-Country-Code-X': countryCode
1073
- }
1074
- }
1075
- const response = await fetch(`${ordering.root}/cart_groups/${cartUuid}/confirm`, requestOptions)
1076
- const { result, error } = await response.json()
1077
- if (!error) {
1078
- result.carts.forEach(cart => {
1079
- if (result.status !== 'completed') {
1080
- state.carts[`businessId:${cart.business_id}`] = result
1081
- events.emit('cart_updated', result)
1082
- } else {
1083
- delete state.carts[`businessId:${cart.business_id}`]
1084
- }
1085
- })
1086
- }
1087
- setState({ ...state, loading: false })
1088
- return { error, result }
1089
- } catch (err) {
1090
- setState({ ...state, loading: false })
1091
- return {
1092
- error: true,
1093
- result: [err.message]
1094
- }
1095
- }
1096
- }
1097
-
1098
- /**
1099
- * Reorder an order and get cart
1100
- */
1101
- const reorder = async (orderId, offAlert, configurations = {}) => {
1102
- try {
1103
- setState({ ...state, loading: !configurations?.disableLoading })
1104
- const countryCode = await strategy.getItem('country-code')
1105
- const customerFromLocalStorage = await strategy.getItem('user-customer', true)
1106
- const userCustomerId = customerFromLocalStorage?.id
1107
- const query = userCustomerId
1108
- ? { user_id: userCustomerId }
1109
- : null
1110
- const options = {
1111
- headers: {
1112
- 'X-App-X': ordering.appId,
1113
- 'X-Socket-Id-X': socket?.getId(),
1114
- 'X-Country-Code-X': countryCode
1115
- }
1116
- }
1117
- if (query) {
1118
- options.query = query
1119
- }
1120
- const { content: { error, result } } = await ordering.setAccessToken(session.token).orders(orderId).reorder(options)
1121
- if (!error) {
1122
- state.carts[`businessId:${result.business_id}`] = result
1123
- events.emit('cart_added', result)
1124
- } else if (!offAlert) {
1125
- setAlert({ show: true, content: result })
1126
- }
1127
- setState({ ...state, loading: false })
1128
- return { error, result }
1129
- } catch (err) {
1130
- setState({ ...state, loading: false })
1131
- return { error: true, result: [err.message] }
1132
- }
1133
- }
1134
-
1135
- const setOptionFromLocalStorage = async () => {
1136
- const optionsLocalStorage = await strategy.getItem('options', true)
1137
- setState({
1138
- ...state,
1139
- loading: false,
1140
- options: isDisabledDefaultOpts
1141
- ? { type: null, moment: null }
1142
- : {
1143
- type: optionsLocalStorage?.type || orderTypes[configState?.configs?.default_order_type?.value],
1144
- moment: optionsLocalStorage?.moment || null,
1145
- address: optionsLocalStorage?.address || state?.options?.address || {},
1146
- city_id: optionsLocalStorage?.city_id || null
1147
- }
1148
- })
1149
- }
1150
-
1151
- /**
1152
- * get Latest past Order that has no review
1153
- */
1154
- const getLastOrderHasNoReview = async () => {
1155
- if (session?.token) {
1156
- const pastOrderTypes = [1, 2, 5, 6, 10, 11, 12, 15, 16, 17]
1157
- const where = [{ attribute: 'status', value: pastOrderTypes }]
1158
- if (franchiseId) {
1159
- where.push({
1160
- attribute: 'ref_business',
1161
- conditions: [
1162
- {
1163
- attribute: 'franchise_id',
1164
- value: {
1165
- condition: '=',
1166
- value: franchiseId
1167
- }
1168
- }
1169
- ]
1170
- })
1171
- }
1172
- if (typeof businessSlug === 'number' && businessSlug) {
1173
- where.push({
1174
- attribute: 'ref_business',
1175
- conditions: [
1176
- {
1177
- attribute: 'id',
1178
- value: {
1179
- condition: '=',
1180
- value: businessSlug
1181
- }
1182
- }
1183
- ]
1184
- })
1185
- }
1186
- if (typeof businessSlug === 'string' && businessSlug) {
1187
- where.push({
1188
- attribute: 'ref_business',
1189
- conditions: [
1190
- {
1191
- attribute: 'slug',
1192
- value: {
1193
- condition: '=',
1194
- value: businessSlug
1195
- }
1196
- }
1197
- ]
1198
- })
1199
- }
1200
- const options = {
1201
- query: {
1202
- orderBy: '-delivery_datetime',
1203
- page: 1,
1204
- page_size: 10,
1205
- where
1206
- }
1207
- }
1208
- const { content: { result, error } } = await ordering.setAccessToken(session?.token).orders().get(options)
1209
-
1210
- if (!error && result?.length > 0) {
1211
- const _noRviewOrder = result?.find(order => !order?.review)
1212
- if (_noRviewOrder?.cart_group_id) {
1213
- where.push({ attribute: 'cart_group_id', value: _noRviewOrder?.cart_group_id })
1214
- const options = {
1215
- query: {
1216
- where,
1217
- page: 1,
1218
- page_size: 10
1219
- }
1220
- }
1221
- const { content: { result, error } } = await ordering.setAccessToken(session?.token).orders().get(options)
1222
- if (!error) {
1223
- const noReviewOrders = result.filter(order => !order?.review)
1224
- return noReviewOrders
1225
- } else {
1226
- return null
1227
- }
1228
- } else {
1229
- return _noRviewOrder
1230
- }
1231
- } else {
1232
- return null
1233
- }
1234
- } else {
1235
- return null
1236
- }
1237
- }
1238
-
1239
- const setStateValues = (values) => {
1240
- setState({ ...state, ...values })
1241
- }
1242
-
1243
- const setUserCustomerOptions = async (params) => {
1244
- setState({ ...state, loading: true })
1245
- const options = params.options ?? {}
1246
- await setUserCustomer(params.customer ?? {}, true)
1247
- await updateOrderOptions(options)
1248
- setState({ ...state, loading: false })
1249
- }
1250
-
1251
- useEffect(() => {
1252
- if (session.loading || languageState.loading) return
1253
- if (session.auth) {
1254
- refreshOrderOptions()
1255
- }
1256
- }, [session.auth, session.loading, languageState.loading])
1257
-
1258
- useEffect(() => {
1259
- if (session.loading || configState.loading) return
1260
- if (!session.auth) {
1261
- setOptionFromLocalStorage()
1262
- }
1263
- }, [session.auth, session.loading, configState])
1264
-
1265
- useEffect(() => {
1266
- if (configTypes?.length > 0 && state.options.type && !configTypes.includes(state.options.type)) {
1267
- const validDefaultValue = configTypes.includes(configState?.configs?.default_order_type?.type)
1268
- updateOrderOptions(validDefaultValue ? { type: configState?.configs?.default_order_type?.type } : { type: configTypes[0] })
1269
- if (!session.auth && !state?.loading) {
1270
- changeType(validDefaultValue ? configState?.configs?.default_order_type?.type : configTypes[0])
1271
- }
1272
- }
1273
- }, [configTypes?.length, state.options.type])
1274
- /**
1275
- * Update carts from sockets
1276
- */
1277
- useEffect(() => {
1278
- const handleCartUpdate = (cart) => {
1279
- if (!isDisableToast) {
1280
- showToast(ToastType.Info, t('UPDATING_CART_INFO', 'Updating cart information...'))
1281
- }
1282
-
1283
- if (cart.status === 1) {
1284
- if (state.carts[`businessId:${cart.business_id}`]) {
1285
- delete state.carts[`businessId:${cart.business_id}`]
1286
- }
1287
- } else {
1288
- const cartFinded = Object.values(state.carts).find(_cart => _cart?.uuid === cart?.uuid)
1289
- const oldBusinessId = cartFinded?.business_id
1290
- const newBusinessId = cart?.business_id
1291
-
1292
- if (!oldBusinessId || oldBusinessId === newBusinessId) {
1293
- state.carts[`businessId:${cart.business_id}`] = {
1294
- ...state.carts[`businessId:${cart.business_id}`],
1295
- ...cart
1296
- }
1297
- } else {
1298
- delete state.carts[`businessId:${oldBusinessId}`]
1299
- state.carts[`businessId:${newBusinessId}`] = cart
1300
- }
1301
- }
1302
- }
1303
- const handleOrderOptionUpdate = ({ carts, ...options }) => {
1304
- if (!isDisableToast) {
1305
- showToast(ToastType.Info, t('UPDATING_ORDER_OPTIONS', 'Updating order options...'))
1306
- }
1307
-
1308
- const newCarts = {}
1309
- carts.forEach(cart => {
1310
- newCarts[`businessId:${cart.business_id}`] = cart
1311
- })
1312
- const newState = {
1313
- ...state,
1314
- options: {
1315
- ...state.options,
1316
- ...options
1317
- },
1318
- carts: {
1319
- ...state.carts,
1320
- ...newCarts
1321
- }
1322
- }
1323
- setState({ ...newState, loading: false })
1324
- }
1325
- socket.on('carts_update', handleCartUpdate)
1326
- socket.on('order_options_update', handleOrderOptionUpdate)
1327
- return () => {
1328
- socket.off('carts_update', handleCartUpdate)
1329
- socket.off('order_options_update', handleOrderOptionUpdate)
1330
- }
1331
- }, [state, socket])
1332
-
1333
- /**
1334
- * Join to carts room
1335
- */
1336
- useEffect(() => {
1337
- if (!session.auth || session.loading) return
1338
- socket.join(`carts_${customerState?.user?.id || session?.user?.id}`)
1339
- socket.join(`orderoptions_${customerState?.user?.id || session?.user?.id}`)
1340
- return () => {
1341
- socket.leave(`carts_${customerState?.user?.id || session?.user?.id}`)
1342
- socket.leave(`orderoptions_${customerState?.user?.id || session?.user?.id}`)
1343
- }
1344
- }, [socket, session.auth, session.loading, customerState?.user?.id, session?.user?.id])
1345
-
1346
- const functions = {
1347
- refreshOrderOptions,
1348
- changeAddress,
1349
- changeType,
1350
- changeMoment,
1351
- addProduct,
1352
- removeProduct,
1353
- updateProduct,
1354
- clearCart,
1355
- applyCoupon,
1356
- applyOffer,
1357
- removeOffer,
1358
- changeDriverTip,
1359
- placeCart,
1360
- confirmCart,
1361
- reorder,
1362
- setAlert,
1363
- setConfirm,
1364
- changePaymethod,
1365
- setUserCustomerOptions,
1366
- setStateValues,
1367
- placeMultiCarts,
1368
- getLastOrderHasNoReview,
1369
- changeCityFilter,
1370
- confirmMultiCarts,
1371
- addMultiProduct
1372
- }
1373
-
1374
- const copyState = JSON.parse(JSON.stringify(state))
1375
-
1376
- return (
1377
- <OrderContext.Provider value={[copyState, functions]}>
1378
- {
1379
- Alert && (
1380
- <Alert
1381
- open={alert.show}
1382
- title={alert.title || t('ERROR', 'Error')}
1383
- onAccept={() => setAlert({ show: false })}
1384
- onClose={() => setAlert({ show: false })}
1385
- content={alert.content}
1386
- />
1387
- )
1388
- }
1389
- {children}
1390
- </OrderContext.Provider>
1391
- )
1392
- }
1393
-
1394
- /**
1395
- * Hook to get and update order state
1396
- */
1397
- export const useOrder = () => {
1398
- const orderManager = useContext(OrderContext)
1399
- const warningMessage = () => {
1400
- console.warn('Must use OrderProvider to wrappe the app.')
1401
- }
1402
- /**
1403
- * Functions to avoid fails
1404
- */
1405
- const functionsPlaceholders = {
1406
- refreshOrderOptions: warningMessage,
1407
- changeAddress: warningMessage,
1408
- changeType: warningMessage,
1409
- changeMoment: warningMessage,
1410
- addProduct: warningMessage,
1411
- removeProduct: warningMessage,
1412
- updateProduct: warningMessage,
1413
- clearCart: warningMessage,
1414
- applyCoupon: warningMessage,
1415
- placeCart: warningMessage,
1416
- confirmCart: warningMessage,
1417
- setAlert: warningMessage,
1418
- setConfirm: warningMessage,
1419
- changeDriverTip: warningMessage,
1420
- reorder: warningMessage,
1421
- changePaymethod: warningMessage,
1422
- setStateValues: warningMessage,
1423
- getLastOrderHasNoReview: warningMessage
1424
- }
1425
- return orderManager || [{}, functionsPlaceholders]
1426
- }
1
+ import React, { createContext, useContext, useState, useEffect } from 'react'
2
+ import { useSession } from '../SessionContext'
3
+ import { useApi } from '../ApiContext'
4
+ import { useWebsocket } from '../WebsocketContext'
5
+ import { useLanguage } from '../LanguageContext'
6
+ import { useEvent } from '../EventContext'
7
+ import { useConfig } from '../ConfigContext'
8
+ import { useCustomer } from '../CustomerContext'
9
+ import { ToastType, useToast } from '../ToastContext'
10
+ import dayjs from 'dayjs'
11
+ import utc from 'dayjs/plugin/utc'
12
+
13
+ dayjs.extend(utc)
14
+
15
+ /**
16
+ * Create OrderContext
17
+ * This context will manage the current order with options internally and provide an easy interface
18
+ */
19
+ export const OrderContext = createContext()
20
+
21
+ /**
22
+ * Custom provider to order manager
23
+ * This provider has a reducer for manage order state
24
+ * @param {props} props
25
+ */
26
+ export const OrderProvider = ({ Alert, children, strategy, isAlsea, isDisableToast, franchiseId, isDisabledDefaultOpts, businessSlug, userAgent }) => {
27
+ const [confirmAlert, setConfirm] = useState({ show: false })
28
+ const [alert, setAlert] = useState({ show: false })
29
+ const [ordering] = useApi()
30
+ const socket = useWebsocket()
31
+ const [languageState, t] = useLanguage()
32
+ const [events] = useEvent()
33
+ const [configState] = useConfig()
34
+ const [session, { logout }] = useSession()
35
+ const [customerState, { setUserCustomer }] = useCustomer()
36
+ const [, { showToast }] = useToast()
37
+
38
+ const configTypes = configState?.configs?.order_types_allowed?.value.split('|').map(value => Number(value)) || []
39
+
40
+ const orderTypes = {
41
+ delivery: 1,
42
+ pickup: 2,
43
+ eatin: 3,
44
+ curbside: 4,
45
+ drivethru: 5,
46
+ catering_delivery: 7,
47
+ catering_pickup: 8
48
+ }
49
+
50
+ const [state, setState] = useState({
51
+ loading: true,
52
+ options: isDisabledDefaultOpts
53
+ ? { type: null, moment: null, city_id: null }
54
+ : {
55
+ type: orderTypes[configState?.configs?.default_order_type?.value],
56
+ moment: null,
57
+ city_id: null
58
+ },
59
+ carts: {},
60
+ confirmAlert,
61
+ alert
62
+ })
63
+
64
+ /**
65
+ * Refresh order options and carts from API
66
+ */
67
+ const refreshOrderOptions = async () => {
68
+ try {
69
+ if (!state.loading) {
70
+ setState({ ...state, loading: true })
71
+ }
72
+ const countryCodeFromLocalStorage = await strategy.getItem('country-code')
73
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
74
+ const userCustomerId = customerFromLocalStorage?.id
75
+ const options = {}
76
+ if (userCustomerId) {
77
+ options.query = {
78
+ user_id: userCustomerId
79
+ }
80
+ }
81
+ if (franchiseId) {
82
+ options.query = {
83
+ ...options.query,
84
+ franchise_id: franchiseId
85
+ }
86
+ }
87
+
88
+ const countryCode = countryCodeFromLocalStorage && countryCodeFromLocalStorage !== state?.options?.address?.country_code
89
+ ? countryCodeFromLocalStorage
90
+ : state?.options?.address?.country_code
91
+
92
+ if (countryCode) {
93
+ options.headers = {
94
+ 'X-Socket-Id-X': socket?.getId(),
95
+ 'X-Country-Code-X': countryCode
96
+ }
97
+ }
98
+
99
+ const res = await ordering.setAccessToken(session.token).orderOptions().get(options)
100
+ const error = res?.content?.error
101
+ const result = res?.content?.result
102
+
103
+ if (!error) {
104
+ const { carts, ...options } = result
105
+ state.carts = {}
106
+ carts.forEach(cart => {
107
+ state.carts[`businessId:${cart.business_id}`] = cart
108
+ })
109
+ state.options = {
110
+ ...state.options,
111
+ ...options
112
+ }
113
+
114
+ if (!countryCodeFromLocalStorage && options?.address?.country_code) {
115
+ await updateOrderOptions({ country_code: options?.address?.country_code })
116
+ }
117
+ }
118
+ if (error) {
119
+ setAlert({ show: true, content: result })
120
+ if (res?.status === 401) {
121
+ session.auth && logout()
122
+ }
123
+ }
124
+ const localOptions = await strategy.getItem('options', true)
125
+ if (localOptions) {
126
+ const options = {}
127
+ if (Object.keys(localOptions.address).length > 0) {
128
+ const conditions = [
129
+ { attribute: 'address', value: localOptions?.address?.address }
130
+ ]
131
+ const userId = userCustomerId || session.user.id
132
+ const addressesResponse = await ordering.setAccessToken(session.token).users(userId).addresses().where(conditions).get()
133
+ let address = addressesResponse.content.result.find(address => {
134
+ localOptions.address.internal_number = localOptions.address?.internal_number || null
135
+ localOptions.address.zipcode = localOptions.address?.zipcode || null
136
+ localOptions.address.address_notes = localOptions.address?.address_notes || null
137
+
138
+ return address?.location?.lat === localOptions?.address?.location.lat &&
139
+ address?.location?.lng === localOptions?.address?.location?.lng &&
140
+ address?.internal_number === localOptions?.address?.internal_number &&
141
+ address?.zipcode === localOptions?.address?.zipcode &&
142
+ address?.address_notes === localOptions?.address?.address_notes
143
+ })
144
+ if (!address) {
145
+ Object.keys(localOptions.address).forEach(key => localOptions?.address?.[key] === null && delete localOptions?.address?.[key])
146
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).users(userId).addresses().save(localOptions.address)
147
+ if (!error) {
148
+ address = result
149
+ }
150
+ } else {
151
+ await ordering.setAccessToken(session.token).users(userId).addresses(address.id).save({ default: true })
152
+ }
153
+ address && (options.address_id = address.id)
154
+ }
155
+ if (localOptions.type) {
156
+ options.type = localOptions.type
157
+ }
158
+ if (localOptions.moment) {
159
+ options.moment = dayjs.utc(localOptions.moment, 'YYYY-MM-DD HH:mm:ss').unix()
160
+ }
161
+ if (localOptions?.address_id) {
162
+ options.address_id = localOptions?.address_id
163
+ }
164
+ if (localOptions?.city_id) {
165
+ options.city_id = localOptions?.city_id
166
+ }
167
+ if (options && Object.keys(options).length > 0) {
168
+ updateOrderOptions(options)
169
+ } else {
170
+ setState({ ...state, loading: false })
171
+ }
172
+ await strategy.removeItem('options')
173
+ } else {
174
+ setState({ ...state, loading: false })
175
+ }
176
+ } catch (err) {
177
+ const message = err?.message?.includes('Internal error')
178
+ ? 'INTERNAL_ERROR'
179
+ : !err.message
180
+ ? t('NETWORK_ERROR', 'Network error')
181
+ : err.message
182
+ setAlert({ show: true, content: [message] })
183
+ setState({ ...state, loading: false })
184
+ }
185
+ }
186
+
187
+ const checkAddress = (address) => {
188
+ const props = ['address', 'address_notes', 'zipcode', 'location', 'internal_number']
189
+ const values = []
190
+ props.forEach(prop => {
191
+ if (state.options?.address && state.options?.address?.[prop]) {
192
+ if (prop === 'location') {
193
+ values.push(address?.[prop]?.lat === state.options?.address?.[prop]?.lat &&
194
+ address?.[prop]?.lng === state.options?.address?.[prop]?.lng)
195
+ } else {
196
+ values.push(address?.[prop] === state.options?.address?.[prop])
197
+ }
198
+ } else {
199
+ values.push(!address?.[prop])
200
+ }
201
+ })
202
+ return values.every(value => value)
203
+ }
204
+
205
+ /**
206
+ * Change order address
207
+ */
208
+ const changeAddress = async (addressId, params) => {
209
+ const isCountryCodeChanged = state.options?.address?.country_code !== params?.country_code
210
+ if (typeof addressId === 'object') {
211
+ const optionsStorage = await strategy.getItem('options', true)
212
+ const options = {
213
+ ...state.options,
214
+ ...optionsStorage,
215
+ address: {
216
+ ...optionsStorage?.address,
217
+ ...addressId
218
+ }
219
+ }
220
+ if (!session.auth) {
221
+ options.type = state?.options?.type
222
+ }
223
+ await strategy.setItem('options', options, true)
224
+ setState({
225
+ ...state,
226
+ options
227
+ })
228
+ return
229
+ }
230
+
231
+ const _params = { country_code: params?.country_code }
232
+
233
+ params?.type && (_params.type = params?.type)
234
+
235
+ if (params && params?.address && !checkAddress(params?.address)) {
236
+ _params.address_id = params?.address?.id
237
+ await updateOrderOptions(_params)
238
+ if (isCountryCodeChanged) {
239
+ events.emit('country_code_changed', params?.country_code)
240
+ }
241
+ return
242
+ }
243
+ addressId && (_params.address_id = addressId)
244
+ if (params && params?.isEdit) {
245
+ if (addressId !== state.options.address_id) {
246
+ return
247
+ }
248
+ await updateOrderOptions(_params)
249
+ if (isCountryCodeChanged) {
250
+ events.emit('country_code_changed', params?.country_code)
251
+ }
252
+ return
253
+ }
254
+ await updateOrderOptions(_params)
255
+ if (isCountryCodeChanged) {
256
+ events.emit('country_code_changed', params?.country_code)
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Change order type
262
+ */
263
+ const changeType = async (type) => {
264
+ const options = {
265
+ ...state.options,
266
+ type
267
+ }
268
+ if (state.options.type === type) {
269
+ return
270
+ }
271
+
272
+ const cityId = state.options?.city_id
273
+ const params = { type }
274
+
275
+ if (cityId && type !== 2) {
276
+ params.city_id = null
277
+ }
278
+
279
+ if (!session.auth) {
280
+ const _options = { ...options, ...params }
281
+ await strategy.setItem('options', _options, true)
282
+ setState({
283
+ ...state,
284
+ options: _options
285
+ })
286
+ }
287
+
288
+ updateOrderOptions(params)
289
+ }
290
+
291
+ /**
292
+ * Change order moment
293
+ */
294
+ const changeMoment = async (moment) => {
295
+ const momentUnix = moment ? moment.getTime() / 1000 : null
296
+ const momentFormatted = momentUnix ? dayjs.unix(momentUnix).utc().format('YYYY-MM-DD HH:mm:ss') : null
297
+
298
+ const options = {
299
+ ...state.options,
300
+ moment: momentFormatted
301
+ }
302
+ if (state.options.moment === momentFormatted) {
303
+ return
304
+ }
305
+
306
+ if (!session.auth) {
307
+ await strategy.setItem('options', options, true)
308
+ setState({
309
+ ...state,
310
+ options
311
+ })
312
+ }
313
+
314
+ updateOrderOptions({ moment: momentUnix })
315
+ }
316
+
317
+ /**
318
+ * Change order city
319
+ */
320
+ const changeCityFilter = async (id) => {
321
+ const options = {
322
+ ...state.options,
323
+ city_id: id
324
+ }
325
+ if (state.options.city_id === id) {
326
+ return
327
+ }
328
+
329
+ if (!session.auth) {
330
+ await strategy.setItem('options', options, true)
331
+ setState({
332
+ ...state,
333
+ options
334
+ })
335
+ }
336
+
337
+ updateOrderOptions({ city_id: id })
338
+ }
339
+ /**
340
+ * Update order option data
341
+ * @param {object} changes Changes to update order options
342
+ */
343
+ const updateOrderOptions = async (changes) => {
344
+ if (session.auth) {
345
+ const countryCodeFromLocalStorage = await strategy.getItem('country-code')
346
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
347
+ const userCustomerId = customerFromLocalStorage?.id
348
+ const body = {
349
+ ...changes,
350
+ user_id: userCustomerId || session.user.id
351
+ }
352
+ try {
353
+ setState({ ...state, loading: true })
354
+ const options = {}
355
+ state.loading = true
356
+ options.headers = {
357
+ 'X-App-X': ordering.appId,
358
+ 'X-Socket-Id-X': socket?.getId()
359
+ }
360
+ const countryCode = changes?.country_code && changes?.country_code !== state?.options?.address?.country_code
361
+ ? changes?.country_code
362
+ : countryCodeFromLocalStorage ?? changes?.country_code ?? state?.options?.address?.country_code
363
+
364
+ if (countryCode) {
365
+ options.headers = {
366
+ ...options.headers,
367
+ 'X-Country-Code-X': countryCode
368
+ }
369
+ await strategy.setItem('country-code', countryCode)
370
+ }
371
+ if (franchiseId) {
372
+ options.query = {
373
+ ...options.query,
374
+ franchise_id: franchiseId
375
+ }
376
+ }
377
+ if (body?.country_code) {
378
+ delete body?.country_code
379
+ }
380
+ const { content: { error, result } } = await ordering
381
+ .setAccessToken(session.token)
382
+ .orderOptions()
383
+ .save(body, options)
384
+ if (!error) {
385
+ const { carts, ...options } = result
386
+ state.carts = {}
387
+ carts.forEach(cart => {
388
+ state.carts[`businessId:${cart.business_id}`] = cart
389
+ })
390
+ state.options = {
391
+ ...state.options,
392
+ ...options
393
+ }
394
+ } else {
395
+ setAlert({ show: true, content: result })
396
+ }
397
+ setState({ ...state, loading: false })
398
+ state.loading = false
399
+ return !error
400
+ } catch (err) {
401
+ const message = err?.message?.includes('Internal error')
402
+ ? 'INTERNAL_ERROR'
403
+ : err.message
404
+ setAlert({ show: true, content: [message] })
405
+ setState({ ...state, loading: false })
406
+ state.loading = false
407
+ return false
408
+ }
409
+ }
410
+ }
411
+
412
+ /**
413
+ * Add product to cart
414
+ * @param {object} product product for add
415
+ * @param {object} cart cart of the product
416
+ * @param {boolean} isQuickAddProduct option to add product when clicks
417
+ */
418
+ const addProduct = async (
419
+ product,
420
+ cart,
421
+ isQuickAddProduct,
422
+ isPlatformProduct = false
423
+ ) => {
424
+ try {
425
+ setState({ ...state, loading: true })
426
+ const countryCode = await strategy.getItem('country-code')
427
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
428
+ const userCustomerId = customerFromLocalStorage?.id
429
+ let body
430
+ const headers = {
431
+ 'X-Socket-Id-X': socket?.getId(),
432
+ 'X-Country-Code-X': countryCode
433
+ }
434
+ if (!isPlatformProduct) {
435
+ body = {
436
+ product,
437
+ business_id: cart.business_id,
438
+ user_id: userCustomerId || session.user.id
439
+ }
440
+ } else {
441
+ body = {
442
+ platform_product: { ...product }
443
+ }
444
+ }
445
+
446
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().addProduct(body, { headers })
447
+
448
+ if (!error) {
449
+ state.carts[`businessId:${result.business_id}`] = result
450
+ events.emit('cart_product_added', product, result)
451
+ if (product?.favorite) {
452
+ events.emit('wishlist_product_added_to_cart', product, result)
453
+ }
454
+ events.emit('cart_updated', result)
455
+ events.emit('product_added', product, result)
456
+ isQuickAddProduct && !isDisableToast && showToast(ToastType.Success, t('PRODUCT_ADDED_NOTIFICATION', 'Product _PRODUCT_ added succesfully').replace('_PRODUCT_', product.name))
457
+ } else {
458
+ setAlert({ show: true, content: result })
459
+ }
460
+ setState({ ...state, loading: false })
461
+ if (isPlatformProduct) {
462
+ return { error, result }
463
+ } else {
464
+ return !error
465
+ }
466
+ } catch (err) {
467
+ setState({ ...state, loading: false })
468
+ if (isPlatformProduct) {
469
+ return { error: true, result: err.message }
470
+ } else {
471
+ return false
472
+ }
473
+ }
474
+ }
475
+
476
+ /**
477
+ * Add multi products to cart / (domino's)
478
+ * @param {object} product product for add
479
+ * @param {object} cart cart of the product
480
+ * @param {boolean} isQuickAddProduct option to add product when clicks
481
+ */
482
+ const addMultiProduct = async (
483
+ product,
484
+ cart,
485
+ isQuickAddProduct
486
+ ) => {
487
+ try {
488
+ setState({ ...state, loading: true })
489
+ const countryCode = await strategy.getItem('country-code')
490
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
491
+ const userCustomerId = customerFromLocalStorage?.id
492
+ const headers = {
493
+ 'X-Socket-Id-X': socket?.getId(),
494
+ 'X-Country-Code-X': countryCode
495
+ }
496
+ const body = {
497
+ products: JSON.stringify(product),
498
+ business_id: cart.business_id,
499
+ user_id: userCustomerId || session.user.id
500
+ }
501
+ const response = await fetch(`${ordering.root}/carts/multi_product`, {
502
+ method: 'POST',
503
+ body: JSON.stringify({
504
+ ...body,
505
+ products: JSON.stringify([product])
506
+ }),
507
+ headers: {
508
+ ...headers,
509
+ Authorization: `Bearer ${session.token}`,
510
+ 'Content-Type': 'application/json'
511
+ }
512
+ })
513
+ const { result, error } = await response.json()
514
+ if (!error) {
515
+ state.carts[`businessId:${result.business_id}`] = result
516
+ events.emit('cart_product_added', product, result)
517
+ if (product?.favorite) {
518
+ events.emit('wishlist_product_added_to_cart', product, result)
519
+ }
520
+ events.emit('cart_updated', result)
521
+ events.emit('product_added', product, result)
522
+ isQuickAddProduct && !isDisableToast && showToast(ToastType.Success, t('PRODUCT_ADDED_NOTIFICATION', 'Product _PRODUCT_ added succesfully').replace('_PRODUCT_', product.name))
523
+ } else {
524
+ setAlert({ show: true, content: result })
525
+ }
526
+ setState({ ...state, loading: false })
527
+ return !error
528
+ } catch (err) {
529
+ setState({ ...state, loading: false })
530
+ return false
531
+ }
532
+ }
533
+
534
+ /**
535
+ * Remove product to cart
536
+ */
537
+ const removeProduct = async (product, cart) => {
538
+ try {
539
+ setState({ ...state, loading: true })
540
+ const countryCode = await strategy.getItem('country-code')
541
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
542
+ const userCustomerId = customerFromLocalStorage?.id
543
+ const body = {
544
+ product: {
545
+ id: product.id,
546
+ code: product.code,
547
+ business_id: product.business_id
548
+ },
549
+ business_id: cart.business_id,
550
+ user_id: userCustomerId || session.user.id
551
+ }
552
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().removeProduct(body, {
553
+ headers: {
554
+ 'X-App-X': ordering.appId,
555
+ 'X-Socket-Id-X': socket?.getId(),
556
+ 'X-Country-Code-X': countryCode
557
+ }
558
+ })
559
+ if (!error) {
560
+ state.carts[`businessId:${result.business_id}`] = result
561
+ events.emit('cart_product_removed', product, result)
562
+ events.emit('cart_updated', result)
563
+ } else {
564
+ setAlert({ show: true, content: result })
565
+ }
566
+ setState({ ...state, loading: false })
567
+ return !error
568
+ } catch (err) {
569
+ setState({ ...state, loading: false })
570
+ return false
571
+ }
572
+ }
573
+
574
+ /**
575
+ * Clear products of cart
576
+ */
577
+ const clearCart = async (uuid, configurations = {}) => {
578
+ try {
579
+ setState({ ...state, loading: !configurations?.disableLoading })
580
+ const countryCode = await strategy.getItem('country-code')
581
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
582
+ const userCustomerId = customerFromLocalStorage?.id
583
+ const body = JSON.stringify({
584
+ uuid,
585
+ user_id: userCustomerId || session.user.id
586
+ })
587
+ const response = await fetch(`${ordering.root}/carts/clear`, {
588
+ method: 'POST',
589
+ headers: {
590
+ 'Content-Type': 'application/json',
591
+ Authorization: `Bearer ${session.token}`,
592
+ 'X-App-X': ordering.appId,
593
+ 'X-Socket-Id-X': socket?.getId(),
594
+ 'X-Country-Code-X': countryCode
595
+ },
596
+ body
597
+ })
598
+ const { error, result } = await response.json()
599
+ if (!error) {
600
+ state.carts[`businessId:${result.business_id}`] = result
601
+ } else {
602
+ setAlert({ show: true, content: result })
603
+ }
604
+ setState({ ...state, loading: false })
605
+ return { error, result }
606
+ } catch (err) {
607
+ setState({ ...state, loading: false })
608
+ return false
609
+ }
610
+ }
611
+
612
+ /**
613
+ * Update product to cart
614
+ */
615
+ const updateProduct = async (product, cart, isQuickAddProduct) => {
616
+ try {
617
+ setState({ ...state, loading: true })
618
+ const countryCode = await strategy.getItem('country-code')
619
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
620
+ const userCustomerId = customerFromLocalStorage?.id
621
+ const body = {
622
+ product,
623
+ business_id: cart.business_id,
624
+ user_id: userCustomerId || session.user.id
625
+ }
626
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().updateProduct(body, {
627
+ headers: {
628
+ 'X-Socket-Id-X': socket?.getId(),
629
+ 'X-Country-Code-X': countryCode
630
+ }
631
+ })
632
+ if (!error) {
633
+ state.carts[`businessId:${result.business_id}`] = result
634
+ events.emit('cart_product_updated', product, result)
635
+ events.emit('cart_updated', result)
636
+ isQuickAddProduct && !isDisableToast && showToast(ToastType.Success, t('PRODUCT_UPDATED_NOTIFICATION', 'Product _PRODUCT_ updated succesfully').replace('_PRODUCT_', product.name))
637
+ } else {
638
+ setAlert({ show: true, content: result })
639
+ }
640
+ setState({ ...state, loading: false })
641
+ return !error
642
+ } catch (err) {
643
+ setState({ ...state, loading: false })
644
+ return false
645
+ }
646
+ }
647
+
648
+ /**
649
+ * Apply coupon to cart
650
+ */
651
+ const applyCoupon = async (couponData, customParams) => {
652
+ if (!couponData.business_id) {
653
+ throw new Error('`business_id` is required.')
654
+ }
655
+ if (typeof couponData.coupon === 'undefined') {
656
+ throw new Error('`coupon` is required.')
657
+ }
658
+ if (state.carts[`businessId:${couponData.business_id}`]?.coupon === couponData.coupon) {
659
+ return
660
+ }
661
+
662
+ try {
663
+ setState({ ...state, loading: true })
664
+ const countryCode = await strategy.getItem('country-code')
665
+ if (customParams && isAlsea) {
666
+ const response = await fetch('https://alsea-plugins.ordering.co/alseaplatform/vcoupon2.php', {
667
+ method: 'POST',
668
+ body: JSON.stringify({
669
+ userId: customParams.userId,
670
+ businessId: customParams.businessId,
671
+ couponId: couponData.coupon
672
+ }),
673
+ headers: {
674
+ Accept: 'application/json',
675
+ 'Content-Type': 'application/x-www-form-urlencoded',
676
+ 'Access-Control-Allow-Origin': '*',
677
+ 'X-App-X': ordering.appId,
678
+ 'X-Socket-Id-X': socket?.getId(),
679
+ 'X-Country-Code-X': countryCode
680
+ }
681
+ })
682
+ const result = await response.json()
683
+
684
+ if (result.message !== 'Cup\u00f3n v\u00e1lido') {
685
+ setAlert({ show: true, content: result.message === 'Not found' ? ['ERROR_INVALID_COUPON'] : [result.message] })
686
+ setState({ ...state, loading: false })
687
+ return
688
+ }
689
+ }
690
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
691
+ const userCustomerId = customerFromLocalStorage?.id
692
+ const body = {
693
+ business_id: couponData.business_id,
694
+ coupon: couponData.coupon,
695
+ user_id: userCustomerId || session.user.id
696
+ }
697
+ const { content } = await ordering
698
+ .setAccessToken(session.token)
699
+ .carts()
700
+ .applyCoupon(body, {
701
+ headers: {
702
+ 'X-App-X': ordering.appId,
703
+ 'X-Socket-Id-X': socket?.getId(),
704
+ 'X-Country-Code-X': countryCode
705
+ }
706
+ })
707
+ const result = content
708
+ if (!result.error) {
709
+ state.carts[`businessId:${result.result.business_id}`] = result.result
710
+ events.emit('cart_updated', result.result)
711
+ } else {
712
+ setAlert({ show: true, content: result.result })
713
+ }
714
+ setState({ ...state, loading: false })
715
+ return !result.error
716
+ } catch (err) {
717
+ setState({ ...state, loading: false })
718
+ return false
719
+ }
720
+ }
721
+
722
+ const applyOffer = async (offerData) => {
723
+ if (!offerData.business_id) {
724
+ throw new Error('`business_id` is required.')
725
+ }
726
+ if (typeof offerData.coupon === 'undefined') {
727
+ throw new Error('`coupon` is required.')
728
+ }
729
+ try {
730
+ setState({ ...state, loading: true })
731
+ const countryCode = await strategy.getItem('country-code')
732
+ const response = await fetch(`${ordering.root}/carts/add_offer`, {
733
+ method: 'POST',
734
+ body: JSON.stringify({
735
+ user_id: offerData.userId,
736
+ business_id: offerData.business_id,
737
+ coupon: offerData.coupon,
738
+ force: offerData.force ?? false
739
+ }),
740
+ headers: {
741
+ 'Content-Type': 'application/json',
742
+ Authorization: `Bearer ${session.token}`,
743
+ 'X-App-X': ordering.appId,
744
+ 'X-Socket-Id-X': socket?.getId(),
745
+ 'X-Country-Code-X': countryCode
746
+ }
747
+ })
748
+ const result = await response.json()
749
+ if (!result.error) {
750
+ state.carts[`businessId:${result.result.business_id}`] = result.result
751
+ events.emit('cart_updated', result.result)
752
+ events.emit('offer_applied', { ...result.result, ...offerData })
753
+ } else {
754
+ setAlert({ show: true, content: result.result })
755
+ events.emit('offer_denied', { ...offerData, reason: result.result })
756
+ }
757
+ setState({ ...state, loading: false })
758
+ return !result.error
759
+ } catch (err) {
760
+ setState({ ...state, loading: false })
761
+ return false
762
+ }
763
+ }
764
+
765
+ const removeOffer = async (offerData) => {
766
+ if (!offerData.business_id) {
767
+ throw new Error('`business_id` is required.')
768
+ }
769
+ if (typeof offerData.offer_id === 'undefined') {
770
+ throw new Error('`offer_id` is required.')
771
+ }
772
+ try {
773
+ const countryCode = await strategy.getItem('country-code')
774
+ setState({ ...state, loading: true })
775
+ const offerRemoveData = {
776
+ business_id: offerData.business_id,
777
+ offer_id: offerData.offer_id
778
+ }
779
+ if (offerData.user_id) offerRemoveData.user_id = offerData.user_id
780
+ const response = await fetch(`${ordering.root}/carts/remove_offer`, {
781
+ method: 'POST',
782
+ body: JSON.stringify(offerRemoveData),
783
+ headers: {
784
+ 'Content-Type': 'application/json',
785
+ Authorization: `Bearer ${session.token}`,
786
+ 'X-App-X': ordering.appId,
787
+ 'X-Socket-Id-X': socket?.getId(),
788
+ 'X-Country-Code-X': countryCode
789
+ }
790
+ })
791
+ const result = await response.json()
792
+ if (!result.error) {
793
+ state.carts[`businessId:${result.result.business_id}`] = result.result
794
+ events.emit('cart_updated', result.result)
795
+ events.emit('offer_removed', offerData)
796
+ } else {
797
+ setAlert({ show: true, content: result.result })
798
+ }
799
+ setState({ ...state, loading: false })
800
+ return !result.error
801
+ } catch (err) {
802
+ setState({ ...state, loading: false })
803
+ return false
804
+ }
805
+ }
806
+
807
+ /**
808
+ * Apply coupon to cart
809
+ */
810
+ const changeDriverTip = async (businessId, driverTipRate = 0, isFixedPrice) => {
811
+ if (!businessId) {
812
+ throw new Error('`businessId` is required.')
813
+ }
814
+ if (!driverTipRate && driverTipRate !== 0) {
815
+ throw new Error('`driverTipRate` is required.')
816
+ }
817
+ if (!state.carts[`businessId:${businessId}`] || state.carts[`businessId:${businessId}`]?.driver_tip_rate === driverTipRate) {
818
+ return
819
+ }
820
+ try {
821
+ setState({ ...state, loading: true })
822
+ const countryCode = await strategy.getItem('country-code')
823
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
824
+ const userCustomerId = customerFromLocalStorage?.id
825
+ const body = {
826
+ business_id: businessId,
827
+ [isFixedPrice ? 'driver_tip' : 'driver_tip_rate']: driverTipRate,
828
+ user_id: userCustomerId || session.user.id
829
+ }
830
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().changeDriverTip(body, {
831
+ headers: {
832
+ 'X-Socket-Id-X': socket?.getId(),
833
+ 'X-Country-Code-X': countryCode
834
+ }
835
+ })
836
+ if (!error) {
837
+ state.carts[`businessId:${result.business_id}`] = result
838
+ events.emit('cart_updated', result)
839
+ } else {
840
+ setAlert({ show: true, content: result })
841
+ }
842
+ setState({ ...state, loading: false })
843
+ return !error
844
+ } catch (err) {
845
+ setState({ ...state, loading: false })
846
+ return false
847
+ }
848
+ }
849
+
850
+ /**
851
+ * Change payment method
852
+ */
853
+ const changePaymethod = async (businessId, paymethodId, paymethodData) => {
854
+ if (!businessId) {
855
+ throw new Error('`businessId` is required.')
856
+ }
857
+ if (!paymethodId) {
858
+ throw new Error('`paymethodId` is required.')
859
+ }
860
+ if (!paymethodData) {
861
+ throw new Error('`paymethodData` is required.')
862
+ }
863
+ if (!state.carts[`businessId:${businessId}`] || state.carts[`businessId:${businessId}`]?.paymethodId === paymethodId) {
864
+ return
865
+ }
866
+ try {
867
+ setState({ ...state, loading: true })
868
+ const countryCode = await strategy.getItem('country-code')
869
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
870
+ const userCustomerId = customerFromLocalStorage?.id
871
+ const body = {
872
+ business_id: businessId,
873
+ paymethod_id: paymethodId,
874
+ paymethod_data: paymethodData,
875
+ user_id: userCustomerId ?? session.user.id
876
+ }
877
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).carts().changePaymethod(body, {
878
+ headers: {
879
+ 'X-Socket-Id-X': socket?.getId(),
880
+ 'X-Country-Code-X': countryCode
881
+ }
882
+ })
883
+ if (!error) {
884
+ state.carts[`businessId:${result.business_id}`] = result
885
+ events.emit('cart_updated', result)
886
+ }
887
+ setState({ ...state, loading: false })
888
+ return !error
889
+ } catch (err) {
890
+ refreshOrderOptions()
891
+ setState({ ...state, loading: false })
892
+ return false
893
+ }
894
+ }
895
+
896
+ /**
897
+ * Place cart
898
+ */
899
+ const placeCart = async (cardId, data) => {
900
+ try {
901
+ setState({ ...state, loading: true })
902
+ const countryCode = await strategy.getItem('country-code')
903
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
904
+ const userCustomerId = customerFromLocalStorage?.id
905
+ const body = {
906
+ ...data,
907
+ user_id: userCustomerId || session.user.id
908
+ }
909
+ let headers = {
910
+ 'X-Socket-Id-X': socket?.getId(),
911
+ 'X-Country-Code-X': countryCode
912
+ }
913
+ if (userAgent) {
914
+ headers = { ...headers, 'User-Agent': userAgent }
915
+ }
916
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).carts(cardId).place(body, { headers: headers })
917
+ if (!error) {
918
+ if (result.status !== 1) {
919
+ state.carts[`businessId:${result.business_id}`] = result
920
+ events.emit('cart_updated', result)
921
+ } else {
922
+ delete state.carts[`businessId:${result.business_id}`]
923
+ const orderObject = {
924
+ id: result.order.uuid,
925
+ business: { name: result.business.name },
926
+ total: result.total,
927
+ tax_total: result.tax,
928
+ delivery_zone_price: result.delivery_price,
929
+ business_id: result.business_id,
930
+ paymethod: result.paymethod_data.gateway
931
+ }
932
+ events.emit('order_placed', orderObject)
933
+ }
934
+ } else {
935
+ setAlert({ show: true, content: result })
936
+ setState({ ...state, loading: false })
937
+ return
938
+ }
939
+ setState({ ...state, loading: false })
940
+ return { error, result }
941
+ } catch (err) {
942
+ setState({ ...state, loading: false })
943
+ return {
944
+ error: true,
945
+ result: [err.message]
946
+ }
947
+ }
948
+ }
949
+
950
+ /**
951
+ * Place multi carts
952
+ */
953
+ const placeMultiCarts = async (data, cartUuid) => {
954
+ try {
955
+ setState({ ...state, loading: true })
956
+ const countryCode = await strategy.getItem('country-code')
957
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
958
+ const userCustomerId = customerFromLocalStorage?.id
959
+ const body = {
960
+ ...data,
961
+ user_id: userCustomerId || session.user.id
962
+ }
963
+ const requestOptions = {
964
+ method: 'POST',
965
+ headers: {
966
+ 'Content-Type': 'application/json',
967
+ Authorization: `bearer ${session.token}`,
968
+ 'X-App-X': ordering.appId,
969
+ 'X-Socket-Id-X': socket?.getId(),
970
+ 'X-Country-Code-X': countryCode
971
+ },
972
+ body: JSON.stringify(body)
973
+ }
974
+
975
+ const response = await fetch(`${ordering.root}/cart_groups/${cartUuid}/place`, requestOptions)
976
+ const { error, result } = await response.json()
977
+ if (!error) {
978
+ result.carts.forEach(cart => {
979
+ delete state.carts[`businessId:${cart.business_id}`]
980
+ const orderObject = {
981
+ id: cart.uuid,
982
+ business: { name: cart.business.name },
983
+ total: cart.total,
984
+ tax_total: cart.tax,
985
+ delivery_zone_price: cart.delivery_price,
986
+ business_id: cart.business_id
987
+ }
988
+ events.emit('order_placed', orderObject)
989
+ })
990
+ } else {
991
+ setAlert({ show: true, content: result })
992
+ }
993
+ setState({ ...state, loading: false })
994
+ return { error, result }
995
+ } catch (err) {
996
+ setState({ ...state, loading: false })
997
+ return {
998
+ error: true,
999
+ result: [err.message]
1000
+ }
1001
+ }
1002
+ }
1003
+
1004
+ /**
1005
+ * Confirm cart
1006
+ */
1007
+ const confirmCart = async (cardId, data) => {
1008
+ try {
1009
+ setState({ ...state, loading: true })
1010
+ const countryCode = await strategy.getItem('country-code')
1011
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
1012
+ const userCustomerId = customerFromLocalStorage?.id
1013
+ const body = {
1014
+ ...data,
1015
+ user_id: userCustomerId || session.user.id
1016
+ }
1017
+ let fetchurl
1018
+ if (body.user_id === userCustomerId || data) {
1019
+ fetchurl = await ordering.setAccessToken(session.token).carts(cardId).confirmWithData(body, {
1020
+ headers: {
1021
+ 'X-App-X': ordering.appId,
1022
+ 'X-Socket-Id-X': socket?.getId(),
1023
+ 'X-Country-Code-X': countryCode
1024
+ }
1025
+ })
1026
+ } else {
1027
+ fetchurl = await ordering.setAccessToken(session.token).carts(cardId).confirm(body, {
1028
+ headers: {
1029
+ 'X-App-X': ordering.appId,
1030
+ 'X-Socket-Id-X': socket?.getId(),
1031
+ 'X-Country-Code-X': countryCode
1032
+ }
1033
+ })
1034
+ }
1035
+ const { content: { error, result, cart } } = fetchurl
1036
+ if (!error) {
1037
+ if (result.status !== 1) {
1038
+ state.carts[`businessId:${result.business_id}`] = result
1039
+ events.emit('cart_updated', result)
1040
+ } else {
1041
+ delete state.carts[`businessId:${result.business_id}`]
1042
+ }
1043
+ } else if (cart) {
1044
+ state.carts[`businessId:${cart.business_id}`] = cart
1045
+ events.emit('cart_updated', cart)
1046
+ }
1047
+ setState({ ...state, loading: false })
1048
+ return { error, result }
1049
+ } catch (err) {
1050
+ setState({ ...state, loading: false })
1051
+ return {
1052
+ error: true,
1053
+ result: [err.message]
1054
+ }
1055
+ }
1056
+ }
1057
+
1058
+ /**
1059
+ * Confirm multi carts
1060
+ */
1061
+ const confirmMultiCarts = async (cartUuid) => {
1062
+ try {
1063
+ setState({ ...state, loading: true })
1064
+ const countryCode = await strategy.getItem('country-code')
1065
+ const requestOptions = {
1066
+ method: 'POST',
1067
+ headers: {
1068
+ 'Content-Type': 'application/json',
1069
+ Authorization: `bearer ${session.token}`,
1070
+ 'X-App-X': ordering.appId,
1071
+ 'X-Socket-Id-X': socket?.getId(),
1072
+ 'X-Country-Code-X': countryCode
1073
+ }
1074
+ }
1075
+ const response = await fetch(`${ordering.root}/cart_groups/${cartUuid}/confirm`, requestOptions)
1076
+ const { result, error } = await response.json()
1077
+ if (!error) {
1078
+ result.carts.forEach(cart => {
1079
+ if (result.status !== 'completed') {
1080
+ state.carts[`businessId:${cart.business_id}`] = result
1081
+ events.emit('cart_updated', result)
1082
+ } else {
1083
+ delete state.carts[`businessId:${cart.business_id}`]
1084
+ }
1085
+ })
1086
+ }
1087
+ setState({ ...state, loading: false })
1088
+ return { error, result }
1089
+ } catch (err) {
1090
+ setState({ ...state, loading: false })
1091
+ return {
1092
+ error: true,
1093
+ result: [err.message]
1094
+ }
1095
+ }
1096
+ }
1097
+
1098
+ /**
1099
+ * Reorder an order and get cart
1100
+ */
1101
+ const reorder = async (orderId, offAlert, configurations = {}) => {
1102
+ try {
1103
+ setState({ ...state, loading: !configurations?.disableLoading })
1104
+ const countryCode = await strategy.getItem('country-code')
1105
+ const customerFromLocalStorage = await strategy.getItem('user-customer', true)
1106
+ const userCustomerId = customerFromLocalStorage?.id
1107
+ const query = userCustomerId
1108
+ ? { user_id: userCustomerId }
1109
+ : null
1110
+ const options = {
1111
+ headers: {
1112
+ 'X-App-X': ordering.appId,
1113
+ 'X-Socket-Id-X': socket?.getId(),
1114
+ 'X-Country-Code-X': countryCode
1115
+ }
1116
+ }
1117
+ if (query) {
1118
+ options.query = query
1119
+ }
1120
+ const { content: { error, result } } = await ordering.setAccessToken(session.token).orders(orderId).reorder(options)
1121
+ if (!error) {
1122
+ state.carts[`businessId:${result.business_id}`] = result
1123
+ events.emit('cart_added', result)
1124
+ } else if (!offAlert) {
1125
+ setAlert({ show: true, content: result })
1126
+ }
1127
+ setState({ ...state, loading: false })
1128
+ return { error, result }
1129
+ } catch (err) {
1130
+ setState({ ...state, loading: false })
1131
+ return { error: true, result: [err.message] }
1132
+ }
1133
+ }
1134
+
1135
+ const setOptionFromLocalStorage = async () => {
1136
+ const optionsLocalStorage = await strategy.getItem('options', true)
1137
+ setState({
1138
+ ...state,
1139
+ loading: false,
1140
+ options: isDisabledDefaultOpts
1141
+ ? { type: null, moment: null }
1142
+ : {
1143
+ type: optionsLocalStorage?.type || orderTypes[configState?.configs?.default_order_type?.value],
1144
+ moment: optionsLocalStorage?.moment || null,
1145
+ address: optionsLocalStorage?.address || state?.options?.address || {},
1146
+ city_id: optionsLocalStorage?.city_id || null
1147
+ }
1148
+ })
1149
+ }
1150
+
1151
+ /**
1152
+ * get Latest past Order that has no review
1153
+ */
1154
+ const getLastOrderHasNoReview = async () => {
1155
+ if (session?.token) {
1156
+ const pastOrderTypes = [1, 2, 5, 6, 10, 11, 12, 15, 16, 17]
1157
+ const where = [{ attribute: 'status', value: pastOrderTypes }]
1158
+ if (franchiseId) {
1159
+ where.push({
1160
+ attribute: 'ref_business',
1161
+ conditions: [
1162
+ {
1163
+ attribute: 'franchise_id',
1164
+ value: {
1165
+ condition: '=',
1166
+ value: franchiseId
1167
+ }
1168
+ }
1169
+ ]
1170
+ })
1171
+ }
1172
+ if (typeof businessSlug === 'number' && businessSlug) {
1173
+ where.push({
1174
+ attribute: 'ref_business',
1175
+ conditions: [
1176
+ {
1177
+ attribute: 'id',
1178
+ value: {
1179
+ condition: '=',
1180
+ value: businessSlug
1181
+ }
1182
+ }
1183
+ ]
1184
+ })
1185
+ }
1186
+ if (typeof businessSlug === 'string' && businessSlug) {
1187
+ where.push({
1188
+ attribute: 'ref_business',
1189
+ conditions: [
1190
+ {
1191
+ attribute: 'slug',
1192
+ value: {
1193
+ condition: '=',
1194
+ value: businessSlug
1195
+ }
1196
+ }
1197
+ ]
1198
+ })
1199
+ }
1200
+ const options = {
1201
+ query: {
1202
+ orderBy: '-delivery_datetime',
1203
+ page: 1,
1204
+ page_size: 10,
1205
+ where
1206
+ }
1207
+ }
1208
+ const { content: { result, error } } = await ordering.setAccessToken(session?.token).orders().get(options)
1209
+
1210
+ if (!error && result?.length > 0) {
1211
+ const _noRviewOrder = result?.find(order => !order?.review)
1212
+ if (_noRviewOrder?.cart_group_id) {
1213
+ where.push({ attribute: 'cart_group_id', value: _noRviewOrder?.cart_group_id })
1214
+ const options = {
1215
+ query: {
1216
+ where,
1217
+ page: 1,
1218
+ page_size: 10
1219
+ }
1220
+ }
1221
+ const { content: { result, error } } = await ordering.setAccessToken(session?.token).orders().get(options)
1222
+ if (!error) {
1223
+ const noReviewOrders = result.filter(order => !order?.review)
1224
+ return noReviewOrders
1225
+ } else {
1226
+ return null
1227
+ }
1228
+ } else {
1229
+ return _noRviewOrder
1230
+ }
1231
+ } else {
1232
+ return null
1233
+ }
1234
+ } else {
1235
+ return null
1236
+ }
1237
+ }
1238
+
1239
+ const setStateValues = (values) => {
1240
+ setState({ ...state, ...values })
1241
+ }
1242
+
1243
+ const setUserCustomerOptions = async (params) => {
1244
+ setState({ ...state, loading: true })
1245
+ const options = params.options ?? {}
1246
+ await setUserCustomer(params.customer ?? {}, true)
1247
+ await updateOrderOptions(options)
1248
+ setState({ ...state, loading: false })
1249
+ }
1250
+
1251
+ useEffect(() => {
1252
+ if (session.loading || languageState.loading) return
1253
+ if (session.auth) {
1254
+ refreshOrderOptions()
1255
+ }
1256
+ }, [session.auth, session.loading, languageState.loading])
1257
+
1258
+ useEffect(() => {
1259
+ if (session.loading || configState.loading) return
1260
+ if (!session.auth) {
1261
+ setOptionFromLocalStorage()
1262
+ }
1263
+ }, [session.auth, session.loading, configState])
1264
+
1265
+ useEffect(() => {
1266
+ if (configTypes?.length > 0 && state.options.type && !configTypes.includes(state.options.type)) {
1267
+ const validDefaultValue = configTypes.includes(configState?.configs?.default_order_type?.type)
1268
+ updateOrderOptions(validDefaultValue ? { type: configState?.configs?.default_order_type?.type } : { type: configTypes[0] })
1269
+ if (!session.auth && !state?.loading) {
1270
+ changeType(validDefaultValue ? configState?.configs?.default_order_type?.type : configTypes[0])
1271
+ }
1272
+ }
1273
+ }, [configTypes?.length, state.options.type])
1274
+ /**
1275
+ * Update carts from sockets
1276
+ */
1277
+ useEffect(() => {
1278
+ const handleCartUpdate = (cart) => {
1279
+ if (!isDisableToast) {
1280
+ showToast(ToastType.Info, t('UPDATING_CART_INFO', 'Updating cart information...'))
1281
+ }
1282
+
1283
+ if (cart.status === 1) {
1284
+ if (state.carts[`businessId:${cart.business_id}`]) {
1285
+ delete state.carts[`businessId:${cart.business_id}`]
1286
+ }
1287
+ } else {
1288
+ const cartFinded = Object.values(state.carts).find(_cart => _cart?.uuid === cart?.uuid)
1289
+ const oldBusinessId = cartFinded?.business_id
1290
+ const newBusinessId = cart?.business_id
1291
+
1292
+ if (!oldBusinessId || oldBusinessId === newBusinessId) {
1293
+ state.carts[`businessId:${cart.business_id}`] = {
1294
+ ...state.carts[`businessId:${cart.business_id}`],
1295
+ ...cart
1296
+ }
1297
+ } else {
1298
+ delete state.carts[`businessId:${oldBusinessId}`]
1299
+ state.carts[`businessId:${newBusinessId}`] = cart
1300
+ }
1301
+ }
1302
+ }
1303
+ const handleOrderOptionUpdate = ({ carts, ...options }) => {
1304
+ if (!isDisableToast) {
1305
+ showToast(ToastType.Info, t('UPDATING_ORDER_OPTIONS', 'Updating order options...'))
1306
+ }
1307
+
1308
+ const newCarts = {}
1309
+ carts.forEach(cart => {
1310
+ newCarts[`businessId:${cart.business_id}`] = cart
1311
+ })
1312
+ const newState = {
1313
+ ...state,
1314
+ options: {
1315
+ ...state.options,
1316
+ ...options
1317
+ },
1318
+ carts: {
1319
+ ...state.carts,
1320
+ ...newCarts
1321
+ }
1322
+ }
1323
+ setState({ ...newState, loading: false })
1324
+ }
1325
+ socket.on('carts_update', handleCartUpdate)
1326
+ socket.on('order_options_update', handleOrderOptionUpdate)
1327
+ return () => {
1328
+ socket.off('carts_update', handleCartUpdate)
1329
+ socket.off('order_options_update', handleOrderOptionUpdate)
1330
+ }
1331
+ }, [state, socket])
1332
+
1333
+ /**
1334
+ * Join to carts room
1335
+ */
1336
+ useEffect(() => {
1337
+ if (!session.auth || session.loading) return
1338
+ socket.join(`carts_${customerState?.user?.id || session?.user?.id}`)
1339
+ socket.join(`orderoptions_${customerState?.user?.id || session?.user?.id}`)
1340
+ return () => {
1341
+ socket.leave(`carts_${customerState?.user?.id || session?.user?.id}`)
1342
+ socket.leave(`orderoptions_${customerState?.user?.id || session?.user?.id}`)
1343
+ }
1344
+ }, [socket, session.auth, session.loading, customerState?.user?.id, session?.user?.id])
1345
+
1346
+ const functions = {
1347
+ refreshOrderOptions,
1348
+ changeAddress,
1349
+ changeType,
1350
+ changeMoment,
1351
+ addProduct,
1352
+ removeProduct,
1353
+ updateProduct,
1354
+ clearCart,
1355
+ applyCoupon,
1356
+ applyOffer,
1357
+ removeOffer,
1358
+ changeDriverTip,
1359
+ placeCart,
1360
+ confirmCart,
1361
+ reorder,
1362
+ setAlert,
1363
+ setConfirm,
1364
+ changePaymethod,
1365
+ setUserCustomerOptions,
1366
+ setStateValues,
1367
+ placeMultiCarts,
1368
+ getLastOrderHasNoReview,
1369
+ changeCityFilter,
1370
+ confirmMultiCarts,
1371
+ addMultiProduct
1372
+ }
1373
+
1374
+ const copyState = JSON.parse(JSON.stringify(state))
1375
+
1376
+ return (
1377
+ <OrderContext.Provider value={[copyState, functions]}>
1378
+ {
1379
+ Alert && (
1380
+ <Alert
1381
+ open={alert.show}
1382
+ title={alert.title || t('ERROR', 'Error')}
1383
+ onAccept={() => setAlert({ show: false })}
1384
+ onClose={() => setAlert({ show: false })}
1385
+ content={alert.content}
1386
+ />
1387
+ )
1388
+ }
1389
+ {children}
1390
+ </OrderContext.Provider>
1391
+ )
1392
+ }
1393
+
1394
+ /**
1395
+ * Hook to get and update order state
1396
+ */
1397
+ export const useOrder = () => {
1398
+ const orderManager = useContext(OrderContext)
1399
+ const warningMessage = () => {
1400
+ console.warn('Must use OrderProvider to wrappe the app.')
1401
+ }
1402
+ /**
1403
+ * Functions to avoid fails
1404
+ */
1405
+ const functionsPlaceholders = {
1406
+ refreshOrderOptions: warningMessage,
1407
+ changeAddress: warningMessage,
1408
+ changeType: warningMessage,
1409
+ changeMoment: warningMessage,
1410
+ addProduct: warningMessage,
1411
+ removeProduct: warningMessage,
1412
+ updateProduct: warningMessage,
1413
+ clearCart: warningMessage,
1414
+ applyCoupon: warningMessage,
1415
+ placeCart: warningMessage,
1416
+ confirmCart: warningMessage,
1417
+ setAlert: warningMessage,
1418
+ setConfirm: warningMessage,
1419
+ changeDriverTip: warningMessage,
1420
+ reorder: warningMessage,
1421
+ changePaymethod: warningMessage,
1422
+ setStateValues: warningMessage,
1423
+ getLastOrderHasNoReview: warningMessage
1424
+ }
1425
+ return orderManager || [{}, functionsPlaceholders]
1426
+ }