ordering-components-external 13.1.5 → 13.1.7

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