ordering-components-external 13.2.11 → 13.2.13

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