@merchi/cart 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/esm/Cart.js +62 -0
  4. package/esm/CartAlert.js +47 -0
  5. package/esm/CartHeader.js +29 -0
  6. package/esm/CartProvider.js +1101 -0
  7. package/esm/CartTotals.js +89 -0
  8. package/esm/assets/merchi-monster-loader.gif +0 -0
  9. package/esm/assets/merchi-swipe-outline.png +0 -0
  10. package/esm/assets/product-not-found.png +0 -0
  11. package/esm/assets/stripe-payment-secure.png +0 -0
  12. package/esm/buttons/Button.js +23 -0
  13. package/esm/buttons/ButtonBack.js +35 -0
  14. package/esm/buttons/ButtonClearCart.js +17 -0
  15. package/esm/buttons/ButtonInvoiceDownload.js +88 -0
  16. package/esm/buttons/ButtonNext.js +39 -0
  17. package/esm/buttons/ButtonNextDynamic.js +19 -0
  18. package/esm/buttons/ButtonOpenCartMerchiCartModal.js +47 -0
  19. package/esm/buttons/ButtonPay.js +26 -0
  20. package/esm/buttons/ButtonShipmentTabNext.js +28 -0
  21. package/esm/buttons/index.js +7 -0
  22. package/esm/components/Alert.js +26 -0
  23. package/esm/components/CartBody.js +14 -0
  24. package/esm/components/CartClient.js +62 -0
  25. package/esm/components/CartFooter.js +12 -0
  26. package/esm/components/CartItemRow.js +230 -0
  27. package/esm/components/CartPaymentSettingsInvalid.js +13 -0
  28. package/esm/components/CartShipment.js +52 -0
  29. package/esm/components/CartTabContent.js +12 -0
  30. package/esm/components/CartTabPanel.js +25 -0
  31. package/esm/components/CartTableContainer.js +12 -0
  32. package/esm/components/CartTitle.js +26 -0
  33. package/esm/components/CartTotalsListGroup.js +71 -0
  34. package/esm/components/Collapse.js +32 -0
  35. package/esm/components/CustomCartProductForm.js +128 -0
  36. package/esm/components/CustomerCheckoutMethodTabs.js +94 -0
  37. package/esm/components/DiscountInputGroup.js +293 -0
  38. package/esm/components/LoadingTemplate.js +23 -0
  39. package/esm/components/NoCartItems.js +20 -0
  40. package/esm/components/ShipmentGroupCard.js +207 -0
  41. package/esm/components/Table.js +13 -0
  42. package/esm/components/containers.js +31 -0
  43. package/esm/components/index.js +18 -0
  44. package/esm/components/product-form-sdk-externals.js +36 -0
  45. package/esm/forms/FormNewCustomer.js +243 -0
  46. package/esm/forms/FormReturningCustomer.js +165 -0
  47. package/esm/forms/FormShipmentAddressAndNotes.js +195 -0
  48. package/esm/forms/FormSquarePayment.js +19 -0
  49. package/esm/forms/FormStripePayment.js +19 -0
  50. package/esm/forms/FormWhatsappCustomer.js +253 -0
  51. package/esm/forms/InputAcceptUserTermsAndConditions.js +35 -0
  52. package/esm/forms/InputError.js +16 -0
  53. package/esm/forms/InputSelect.js +48 -0
  54. package/esm/forms/InputText.js +56 -0
  55. package/esm/forms/InputsAddress.js +476 -0
  56. package/esm/forms/index.js +8 -0
  57. package/esm/index.js +13 -0
  58. package/esm/modals.js +51 -0
  59. package/esm/panels/PanelCartItems.js +49 -0
  60. package/esm/panels/PanelCartShipment.js +66 -0
  61. package/esm/panels/PanelClearCart.js +56 -0
  62. package/esm/panels/PanelClientCheckout.js +81 -0
  63. package/esm/panels/PanelEditCartItem.js +199 -0
  64. package/esm/panels/PanelPaymentSuccess.js +63 -0
  65. package/esm/panels/index.js +7 -0
  66. package/esm/square/SquareCard.js +106 -0
  67. package/esm/stripe/LegacyStripeCardForm.js +157 -0
  68. package/esm/stripe/StripeCardFields.js +126 -0
  69. package/esm/stripe/StripeCardForm.js +33 -0
  70. package/esm/stripe/StripePaymentButtons.js +98 -0
  71. package/esm/stripe/actions.js +192 -0
  72. package/esm/stripe/utils.js +20 -0
  73. package/esm/styles/globals.css +463 -0
  74. package/esm/styles/globals.css.map +1 -0
  75. package/esm/tabs/CartNav.js +28 -0
  76. package/esm/tabs/NavTab.js +31 -0
  77. package/esm/types/assets.d.js +0 -0
  78. package/esm/types/index.js +1 -0
  79. package/esm/types/merchi_product_form/index.d.js +0 -0
  80. package/esm/types/merchi_sdk_ts/index.d.js +0 -0
  81. package/esm/types/react-redux/index.d.js +0 -0
  82. package/esm/utilities/address.js +457 -0
  83. package/esm/utilities/area.js +297 -0
  84. package/esm/utilities/cart.js +95 -0
  85. package/esm/utilities/company.js +6 -0
  86. package/esm/utilities/cookie.js +156 -0
  87. package/esm/utilities/currency.js +219 -0
  88. package/esm/utilities/customForm.js +57 -0
  89. package/esm/utilities/helpers.js +229 -0
  90. package/esm/utilities/index.js +14 -0
  91. package/esm/utilities/invoice.js +112 -0
  92. package/esm/utilities/job.js +9 -0
  93. package/esm/utilities/local_storage.js +85 -0
  94. package/esm/utilities/product.js +13 -0
  95. package/esm/utilities/shipment.js +11 -0
  96. package/esm/utilities/tabs.js +51 -0
  97. package/esm/utilities/user.js +65 -0
  98. package/esm/utilities/variations.js +58 -0
  99. package/lib/Cart.d.ts +9 -0
  100. package/lib/Cart.js +69 -0
  101. package/lib/CartAlert.d.ts +3 -0
  102. package/lib/CartAlert.js +53 -0
  103. package/lib/CartHeader.d.ts +3 -0
  104. package/lib/CartHeader.js +37 -0
  105. package/lib/CartProvider.d.ts +236 -0
  106. package/lib/CartProvider.js +1107 -0
  107. package/lib/CartTotals.d.ts +7 -0
  108. package/lib/CartTotals.js +96 -0
  109. package/lib/assets/merchi-monster-loader.gif +0 -0
  110. package/lib/assets/merchi-swipe-outline.png +0 -0
  111. package/lib/assets/product-not-found.png +0 -0
  112. package/lib/assets/stripe-payment-secure.png +0 -0
  113. package/lib/buttons/Button.d.ts +11 -0
  114. package/lib/buttons/Button.js +31 -0
  115. package/lib/buttons/ButtonBack.d.ts +6 -0
  116. package/lib/buttons/ButtonBack.js +44 -0
  117. package/lib/buttons/ButtonClearCart.d.ts +3 -0
  118. package/lib/buttons/ButtonClearCart.js +24 -0
  119. package/lib/buttons/ButtonInvoiceDownload.d.ts +3 -0
  120. package/lib/buttons/ButtonInvoiceDownload.js +96 -0
  121. package/lib/buttons/ButtonNext.d.ts +3 -0
  122. package/lib/buttons/ButtonNext.js +48 -0
  123. package/lib/buttons/ButtonNextDynamic.d.ts +3 -0
  124. package/lib/buttons/ButtonNextDynamic.js +28 -0
  125. package/lib/buttons/ButtonOpenCartMerchiCartModal.d.ts +9 -0
  126. package/lib/buttons/ButtonOpenCartMerchiCartModal.js +57 -0
  127. package/lib/buttons/ButtonPay.d.ts +7 -0
  128. package/lib/buttons/ButtonPay.js +35 -0
  129. package/lib/buttons/ButtonShipmentTabNext.d.ts +2 -0
  130. package/lib/buttons/ButtonShipmentTabNext.js +37 -0
  131. package/lib/buttons/index.d.ts +7 -0
  132. package/lib/buttons/index.js +48 -0
  133. package/lib/components/Alert.d.ts +7 -0
  134. package/lib/components/Alert.js +34 -0
  135. package/lib/components/CartBody.d.ts +7 -0
  136. package/lib/components/CartBody.js +22 -0
  137. package/lib/components/CartClient.d.ts +4 -0
  138. package/lib/components/CartClient.js +71 -0
  139. package/lib/components/CartFooter.d.ts +6 -0
  140. package/lib/components/CartFooter.js +20 -0
  141. package/lib/components/CartItemRow.d.ts +7 -0
  142. package/lib/components/CartItemRow.js +236 -0
  143. package/lib/components/CartPaymentSettingsInvalid.d.ts +2 -0
  144. package/lib/components/CartPaymentSettingsInvalid.js +21 -0
  145. package/lib/components/CartShipment.d.ts +6 -0
  146. package/lib/components/CartShipment.js +59 -0
  147. package/lib/components/CartTabContent.d.ts +6 -0
  148. package/lib/components/CartTabContent.js +20 -0
  149. package/lib/components/CartTabPanel.d.ts +7 -0
  150. package/lib/components/CartTabPanel.js +31 -0
  151. package/lib/components/CartTableContainer.d.ts +6 -0
  152. package/lib/components/CartTableContainer.js +20 -0
  153. package/lib/components/CartTitle.d.ts +2 -0
  154. package/lib/components/CartTitle.js +34 -0
  155. package/lib/components/CartTotalsListGroup.d.ts +3 -0
  156. package/lib/components/CartTotalsListGroup.js +78 -0
  157. package/lib/components/Collapse.d.ts +3 -0
  158. package/lib/components/Collapse.js +40 -0
  159. package/lib/components/CustomCartProductForm.d.ts +18 -0
  160. package/lib/components/CustomCartProductForm.js +136 -0
  161. package/lib/components/CustomerCheckoutMethodTabs.d.ts +6 -0
  162. package/lib/components/CustomerCheckoutMethodTabs.js +103 -0
  163. package/lib/components/DiscountInputGroup.d.ts +2 -0
  164. package/lib/components/DiscountInputGroup.js +301 -0
  165. package/lib/components/LoadingTemplate.d.ts +7 -0
  166. package/lib/components/LoadingTemplate.js +30 -0
  167. package/lib/components/NoCartItems.d.ts +3 -0
  168. package/lib/components/NoCartItems.js +27 -0
  169. package/lib/components/ShipmentGroupCard.d.ts +7 -0
  170. package/lib/components/ShipmentGroupCard.js +215 -0
  171. package/lib/components/Table.d.ts +7 -0
  172. package/lib/components/Table.js +19 -0
  173. package/lib/components/containers.d.ts +14 -0
  174. package/lib/components/containers.js +40 -0
  175. package/lib/components/index.d.ts +18 -0
  176. package/lib/components/index.js +133 -0
  177. package/lib/components/product-form-sdk-externals.d.ts +46 -0
  178. package/lib/components/product-form-sdk-externals.js +43 -0
  179. package/lib/forms/FormNewCustomer.d.ts +4 -0
  180. package/lib/forms/FormNewCustomer.js +252 -0
  181. package/lib/forms/FormReturningCustomer.d.ts +3 -0
  182. package/lib/forms/FormReturningCustomer.js +173 -0
  183. package/lib/forms/FormShipmentAddressAndNotes.d.ts +15 -0
  184. package/lib/forms/FormShipmentAddressAndNotes.js +203 -0
  185. package/lib/forms/FormSquarePayment.d.ts +3 -0
  186. package/lib/forms/FormSquarePayment.js +27 -0
  187. package/lib/forms/FormStripePayment.d.ts +3 -0
  188. package/lib/forms/FormStripePayment.js +27 -0
  189. package/lib/forms/FormWhatsappCustomer.d.ts +3 -0
  190. package/lib/forms/FormWhatsappCustomer.js +261 -0
  191. package/lib/forms/InputAcceptUserTermsAndConditions.d.ts +7 -0
  192. package/lib/forms/InputAcceptUserTermsAndConditions.js +41 -0
  193. package/lib/forms/InputError.d.ts +8 -0
  194. package/lib/forms/InputError.js +24 -0
  195. package/lib/forms/InputSelect.d.ts +14 -0
  196. package/lib/forms/InputSelect.js +55 -0
  197. package/lib/forms/InputText.d.ts +12 -0
  198. package/lib/forms/InputText.js +63 -0
  199. package/lib/forms/InputsAddress.d.ts +11 -0
  200. package/lib/forms/InputsAddress.js +485 -0
  201. package/lib/forms/index.d.ts +8 -0
  202. package/lib/forms/index.js +63 -0
  203. package/lib/index.d.ts +13 -0
  204. package/lib/index.js +93 -0
  205. package/lib/modals.d.ts +17 -0
  206. package/lib/modals.js +59 -0
  207. package/lib/panels/PanelCartItems.d.ts +3 -0
  208. package/lib/panels/PanelCartItems.js +56 -0
  209. package/lib/panels/PanelCartShipment.d.ts +3 -0
  210. package/lib/panels/PanelCartShipment.js +72 -0
  211. package/lib/panels/PanelClearCart.d.ts +3 -0
  212. package/lib/panels/PanelClearCart.js +62 -0
  213. package/lib/panels/PanelClientCheckout.d.ts +3 -0
  214. package/lib/panels/PanelClientCheckout.js +88 -0
  215. package/lib/panels/PanelEditCartItem.d.ts +6 -0
  216. package/lib/panels/PanelEditCartItem.js +206 -0
  217. package/lib/panels/PanelPaymentSuccess.d.ts +3 -0
  218. package/lib/panels/PanelPaymentSuccess.js +69 -0
  219. package/lib/panels/index.d.ts +7 -0
  220. package/lib/panels/index.js +48 -0
  221. package/lib/square/SquareCard.d.ts +3 -0
  222. package/lib/square/SquareCard.js +114 -0
  223. package/lib/stripe/LegacyStripeCardForm.d.ts +3 -0
  224. package/lib/stripe/LegacyStripeCardForm.js +166 -0
  225. package/lib/stripe/StripeCardFields.d.ts +15 -0
  226. package/lib/stripe/StripeCardFields.js +135 -0
  227. package/lib/stripe/StripeCardForm.d.ts +2 -0
  228. package/lib/stripe/StripeCardForm.js +42 -0
  229. package/lib/stripe/StripePaymentButtons.d.ts +8 -0
  230. package/lib/stripe/StripePaymentButtons.js +106 -0
  231. package/lib/stripe/actions.d.ts +4 -0
  232. package/lib/stripe/actions.js +200 -0
  233. package/lib/stripe/utils.d.ts +18 -0
  234. package/lib/stripe/utils.js +27 -0
  235. package/lib/styles/globals.css +463 -0
  236. package/lib/styles/globals.css.map +1 -0
  237. package/lib/tabs/CartNav.d.ts +3 -0
  238. package/lib/tabs/CartNav.js +36 -0
  239. package/lib/tabs/NavTab.d.ts +9 -0
  240. package/lib/tabs/NavTab.js +39 -0
  241. package/lib/types/index.d.ts +13 -0
  242. package/lib/types/index.js +1 -0
  243. package/lib/utilities/address.d.ts +30 -0
  244. package/lib/utilities/address.js +468 -0
  245. package/lib/utilities/area.d.ts +77 -0
  246. package/lib/utilities/area.js +328 -0
  247. package/lib/utilities/cart.d.ts +9 -0
  248. package/lib/utilities/cart.js +108 -0
  249. package/lib/utilities/company.d.ts +2 -0
  250. package/lib/utilities/company.js +13 -0
  251. package/lib/utilities/cookie.d.ts +4 -0
  252. package/lib/utilities/cookie.js +165 -0
  253. package/lib/utilities/currency.d.ts +5 -0
  254. package/lib/utilities/currency.js +229 -0
  255. package/lib/utilities/customForm.d.ts +17 -0
  256. package/lib/utilities/customForm.js +64 -0
  257. package/lib/utilities/helpers.d.ts +24 -0
  258. package/lib/utilities/helpers.js +240 -0
  259. package/lib/utilities/index.d.ts +14 -0
  260. package/lib/utilities/index.js +159 -0
  261. package/lib/utilities/invoice.d.ts +3 -0
  262. package/lib/utilities/invoice.js +118 -0
  263. package/lib/utilities/job.d.ts +1 -0
  264. package/lib/utilities/job.js +15 -0
  265. package/lib/utilities/local_storage.d.ts +31 -0
  266. package/lib/utilities/local_storage.js +96 -0
  267. package/lib/utilities/product.d.ts +2 -0
  268. package/lib/utilities/product.js +21 -0
  269. package/lib/utilities/shipment.d.ts +2 -0
  270. package/lib/utilities/shipment.js +18 -0
  271. package/lib/utilities/tabs.d.ts +14 -0
  272. package/lib/utilities/tabs.js +60 -0
  273. package/lib/utilities/user.d.ts +5 -0
  274. package/lib/utilities/user.js +75 -0
  275. package/lib/utilities/variations.d.ts +18 -0
  276. package/lib/utilities/variations.js +66 -0
  277. package/package.json +109 -0
  278. package/src/Cart.tsx +96 -0
  279. package/src/CartAlert.tsx +35 -0
  280. package/src/CartHeader.tsx +28 -0
  281. package/src/CartProvider.tsx +992 -0
  282. package/src/CartTotals.tsx +102 -0
  283. package/src/assets/merchi-monster-loader.gif +0 -0
  284. package/src/assets/merchi-swipe-outline.png +0 -0
  285. package/src/assets/product-not-found.png +0 -0
  286. package/src/assets/stripe-payment-secure.png +0 -0
  287. package/src/buttons/Button.tsx +35 -0
  288. package/src/buttons/ButtonBack.tsx +42 -0
  289. package/src/buttons/ButtonClearCart.tsx +17 -0
  290. package/src/buttons/ButtonInvoiceDownload.tsx +60 -0
  291. package/src/buttons/ButtonNext.tsx +35 -0
  292. package/src/buttons/ButtonNextDynamic.tsx +31 -0
  293. package/src/buttons/ButtonOpenCartMerchiCartModal.tsx +61 -0
  294. package/src/buttons/ButtonPay.tsx +32 -0
  295. package/src/buttons/ButtonShipmentTabNext.tsx +24 -0
  296. package/src/buttons/index.ts +15 -0
  297. package/src/components/Alert.tsx +31 -0
  298. package/src/components/CartBody.tsx +16 -0
  299. package/src/components/CartClient.tsx +52 -0
  300. package/src/components/CartFooter.tsx +15 -0
  301. package/src/components/CartItemRow.tsx +212 -0
  302. package/src/components/CartPaymentSettingsInvalid.tsx +12 -0
  303. package/src/components/CartShipment.tsx +56 -0
  304. package/src/components/CartTabContent.tsx +15 -0
  305. package/src/components/CartTabPanel.tsx +25 -0
  306. package/src/components/CartTableContainer.tsx +15 -0
  307. package/src/components/CartTitle.tsx +22 -0
  308. package/src/components/CartTotalsListGroup.tsx +58 -0
  309. package/src/components/Collapse.tsx +23 -0
  310. package/src/components/CustomCartProductForm.tsx +123 -0
  311. package/src/components/CustomerCheckoutMethodTabs.tsx +106 -0
  312. package/src/components/DiscountInputGroup.tsx +160 -0
  313. package/src/components/LoadingTemplate.tsx +22 -0
  314. package/src/components/NoCartItems.tsx +20 -0
  315. package/src/components/ShipmentGroupCard.tsx +170 -0
  316. package/src/components/Table.tsx +15 -0
  317. package/src/components/containers.tsx +40 -0
  318. package/src/components/index.ts +38 -0
  319. package/src/components/product-form-sdk-externals.ts +67 -0
  320. package/src/forms/FormNewCustomer.tsx +170 -0
  321. package/src/forms/FormReturningCustomer.tsx +117 -0
  322. package/src/forms/FormShipmentAddressAndNotes.tsx +165 -0
  323. package/src/forms/FormSquarePayment.tsx +19 -0
  324. package/src/forms/FormStripePayment.tsx +19 -0
  325. package/src/forms/FormWhatsappCustomer.tsx +179 -0
  326. package/src/forms/InputAcceptUserTermsAndConditions.tsx +43 -0
  327. package/src/forms/InputError.tsx +23 -0
  328. package/src/forms/InputSelect.tsx +58 -0
  329. package/src/forms/InputText.tsx +56 -0
  330. package/src/forms/InputsAddress.tsx +438 -0
  331. package/src/forms/index.ts +18 -0
  332. package/src/index.ts +31 -0
  333. package/src/modals.tsx +65 -0
  334. package/src/panels/PanelCartItems.tsx +56 -0
  335. package/src/panels/PanelCartShipment.tsx +86 -0
  336. package/src/panels/PanelClearCart.tsx +50 -0
  337. package/src/panels/PanelClientCheckout.tsx +102 -0
  338. package/src/panels/PanelEditCartItem.tsx +172 -0
  339. package/src/panels/PanelPaymentSuccess.tsx +66 -0
  340. package/src/panels/index.ts +15 -0
  341. package/src/square/SquareCard.tsx +84 -0
  342. package/src/stripe/LegacyStripeCardForm.tsx +91 -0
  343. package/src/stripe/StripeCardFields.tsx +173 -0
  344. package/src/stripe/StripeCardForm.tsx +18 -0
  345. package/src/stripe/StripePaymentButtons.tsx +117 -0
  346. package/src/stripe/actions.ts +94 -0
  347. package/src/stripe/utils.ts +22 -0
  348. package/src/styles/globals.scss +475 -0
  349. package/src/tabs/CartNav.tsx +18 -0
  350. package/src/tabs/NavTab.tsx +36 -0
  351. package/src/types/assets.d.ts +4 -0
  352. package/src/types/index.ts +15 -0
  353. package/src/types/merchi_product_form/index.d.ts +1 -0
  354. package/src/types/merchi_sdk_ts/index.d.ts +1 -0
  355. package/src/types/react-redux/index.d.ts +0 -0
  356. package/src/utilities/address.ts +463 -0
  357. package/src/utilities/area.ts +359 -0
  358. package/src/utilities/cart.ts +80 -0
  359. package/src/utilities/company.ts +8 -0
  360. package/src/utilities/cookie.ts +58 -0
  361. package/src/utilities/currency.ts +216 -0
  362. package/src/utilities/customForm.ts +71 -0
  363. package/src/utilities/helpers.ts +213 -0
  364. package/src/utilities/index.ts +14 -0
  365. package/src/utilities/invoice.ts +60 -0
  366. package/src/utilities/job.ts +13 -0
  367. package/src/utilities/local_storage.ts +130 -0
  368. package/src/utilities/product.ts +14 -0
  369. package/src/utilities/shipment.ts +11 -0
  370. package/src/utilities/tabs.ts +38 -0
  371. package/src/utilities/user.ts +33 -0
  372. package/src/utilities/variations.ts +80 -0
@@ -0,0 +1,992 @@
1
+ import * as React from 'react';
2
+ import { createContext, ReactNode, useContext, useEffect, useState } from 'react';
3
+ import { faCheckCircle, faExclamationTriangle, faInfoCircle } from '@fortawesome/free-solid-svg-icons';
4
+ import { Alert, Tab } from './types';
5
+ import {
6
+ makeCart,
7
+ makeCartItem,
8
+ stripeIsValidAndActive,
9
+ } from './utilities/cart';
10
+ import { cartEmbed } from './utilities/helpers';
11
+ import { initTabs, tabIdItems, tabShipment } from './utilities/tabs';
12
+ import { Merchi } from '@merchi/sdk';
13
+ import { getCartCookie, getCartCookieToken, setCartCookie } from './utilities/cookie';
14
+ import { makeAddress, sanitizeAddressFields } from './utilities/address';
15
+ import { appendStyleSheetText } from './utilities/helpers';
16
+ import { makeJob } from './utilities/job';
17
+ import { makeProduct } from './utilities/product';
18
+ import {
19
+ getSavedCheckoutCustomer,
20
+ saveCheckoutAddress,
21
+ } from './utilities/local_storage';
22
+ import { makeUser } from './utilities/user';
23
+
24
+ export interface PropsCart {
25
+ cart: any;
26
+ cartClient?: any;
27
+ setCart: (cartJson: any) => void;
28
+ setCartClient: (client: any) => void;
29
+ activeTabIndex: number;
30
+ setActiveTabIndex: (index: number) => void;
31
+
32
+ alert: Alert;
33
+ alertError: (message: string) => void;
34
+ alertSuccess: (message: string) => void;
35
+ setAlert: (alert: Alert) => void;
36
+ cartItem: any;
37
+ classNameAlertError?: string;
38
+ classNameAlertInfo?: string;
39
+ classNameAlertSuccess?: string;
40
+ classNameAlertWarning?: string;
41
+ classNameBtn?: string;
42
+ classNameBtnBack?: string;
43
+ classNameBtnCartClear?: string;
44
+ classNameBtnClose?: string;
45
+ classNameBtnDanger?: string;
46
+ classNameBtnDefault?: string;
47
+ classNameBtnDownloadInvoice?: string;
48
+ classNameBtnEditCartItem?: string;
49
+ classNameBtnPrimary?: string;
50
+ classNameBtnLink?: string;
51
+ classNameBtnNext?: string;
52
+ classNameBtnNextComplete?: string;
53
+ classNameBtnPay?: string;
54
+ classNameCartBody?: string;
55
+ classNameCartFooter?: string;
56
+
57
+ classNameCartFormCheckbox?: string;
58
+ classNameCartFormGroup?: string;
59
+ classNameCartFormGroupButton?: string;
60
+ classNameCartFormGroupCheckbox?: string;
61
+ classNameCartFormInput?: string;
62
+ classNameCartFormLabelCheckbox?: string;
63
+ classNameCartInputError?: string;
64
+ classNameCartNav?: string;
65
+ classNameCartRow?: string;
66
+ classNameCartRowColumn?: string;
67
+ classNameCartTabItem?: string;
68
+ classNameCartTabItemLink?: string;
69
+ classNameCartGoogleSuggestList?: string;
70
+ classNameCartGoogleSuggestListItem?: string;
71
+
72
+ classNameCartHeader?: string;
73
+ classNameCartItemFeatureImage?: string;
74
+ classNameCartItemInfo?: string;
75
+ classNameCartItemInfoCell?: string;
76
+ classNameCartItemInfoCellRight?: string;
77
+ classNameCartItemInfoContainer?: string;
78
+ classNameCartTab?: string;
79
+ classNameCartTabPanel?: string;
80
+ classNameCartTitle?: string;
81
+ classNameCartTotalContainer?: string;
82
+ classNameCartTotalItem?: string;
83
+ classNameCartTotaListContainer?: string;
84
+ classNameCartTotalItemPrice?: string;
85
+ classNameClearCartContainer?: string;
86
+ classNameClearCartText?: string;
87
+ classNameCartToggleIconButton?: string;
88
+ classNameListClientInfo?: string;
89
+ classNameListContainer?: string;
90
+ classNameListItem?: string;
91
+ classNameListItemCartTotals?: string;
92
+ classNameList?: string;
93
+ classNameListInline?: string;
94
+ classNameListUnstyled?: string;
95
+ classNameLoadingTemplate?: string;
96
+ classNameLoadingTemplateContainer?: string;
97
+ classNameNoItems?: string;
98
+ classNameShipmentOption?: string;
99
+ classNameTable?: string;
100
+ classNameTableContainer?: string;
101
+ classNameVariationsList?: string;
102
+ customSuccessMessage?: string;
103
+
104
+ // Discount code input props
105
+ discountButtonText?: string;
106
+ discountClassName?: string;
107
+ discountClassNameMainContainer?: string;
108
+ discountClassNameButtonItemRemove?: string;
109
+ discountClassNameButton?: string;
110
+ discountClassNameButtonContainer?: string;
111
+ discountClassNameErrorMessage?: string;
112
+ discountClassNameInput?: string;
113
+ discountClassNameListItem?: string;
114
+ discountClassNameListItems?: string;
115
+ discountClassNameInputContainer?: string;
116
+ discountShowAppliedItems?: boolean;
117
+ showDiscountCode?: boolean;
118
+
119
+ domainId?: number;
120
+
121
+ footer?: React.ReactElement;
122
+
123
+ /** @deprecated No longer used; address lookup goes through the Merchi API. */
124
+ googlePlacesLoaded?: boolean;
125
+ hideHead?: boolean;
126
+
127
+ invoiceJson: any;
128
+ setInvoiceJson: (invoiceJson: any) => void;
129
+
130
+ includeTheme?: boolean,
131
+ initialiseCart?: boolean;
132
+
133
+ cartSettingsInvalid: boolean;
134
+
135
+ fetchingCart: boolean;
136
+ setFetchingCart: (fetchingCart: boolean) => void;
137
+
138
+ fetchingShipmentGroups: boolean;
139
+
140
+ isCartModalOpen?: boolean;
141
+ setIsCartModalOpen?: (isOpen: boolean) => void;
142
+ onClickClose?: () => void;
143
+ toggleCartModal: () => void;
144
+
145
+ showCartItemInfo?: boolean;
146
+ showUserTermsAndConditions?: boolean;
147
+ productFormClassNames?: any;
148
+ apiUrl?: string;
149
+
150
+ updateCartShipmentAddress: (addressJson: any) => void;
151
+
152
+ urlFrontend?: string;
153
+ urlTrackingPage?: string;
154
+ setCartItem: (cartItem: any) => void;
155
+
156
+ tabs: Tab[];
157
+ setTabs: (tabs: Tab[] | ((prev: Tab[]) => Tab[])) => void;
158
+
159
+ clearCart: () => void;
160
+ closeClearCart: () => void;
161
+
162
+ setCartComplete: () => void;
163
+ refetchCart: () => void;
164
+
165
+ createCartAndCookie: (callback?: () => void) => void;
166
+
167
+ loadingTotals: boolean;
168
+ setLoadingTotals: (loading: boolean) => void;
169
+
170
+ setActiveTabAndEditDisabled: (nextTab: {tabId: number, tabIndexToSet: number, disabled: boolean}) => void;
171
+ loading: boolean;
172
+
173
+ getCartShipmentOptions?: () => void;
174
+ }
175
+
176
+ const CartContext = createContext<PropsCart>({
177
+ cart: {},
178
+ cartClient: {},
179
+ setCart: console.log,
180
+ setCartClient: console.log,
181
+ activeTabIndex: 0,
182
+ setActiveTabIndex: console.log,
183
+
184
+ alert: ({} as Alert),
185
+ alertError: console.log,
186
+ alertSuccess: console.log,
187
+ setAlert: console.log,
188
+ cartItem: {},
189
+ classNameAlertError: undefined,
190
+ classNameAlertInfo: undefined,
191
+ classNameAlertSuccess: undefined,
192
+ classNameAlertWarning: undefined,
193
+ classNameBtn: undefined,
194
+ classNameBtnBack: undefined,
195
+ classNameBtnCartClear: undefined,
196
+ classNameBtnClose: undefined,
197
+ classNameBtnDanger: undefined,
198
+ classNameBtnDefault: undefined,
199
+ classNameBtnDownloadInvoice: undefined,
200
+ classNameBtnEditCartItem: undefined,
201
+ classNameBtnPrimary: undefined,
202
+ classNameBtnLink: undefined,
203
+ classNameBtnNext: undefined,
204
+ classNameBtnNextComplete: undefined,
205
+ classNameBtnPay: undefined,
206
+ classNameCartBody: undefined,
207
+ classNameCartFooter: undefined,
208
+ classNameCartFormCheckbox: undefined,
209
+ classNameCartFormGroup: undefined,
210
+ classNameCartFormGroupButton: undefined,
211
+ classNameCartFormGroupCheckbox: undefined,
212
+ classNameCartFormInput: undefined,
213
+ classNameCartInputError: undefined,
214
+ classNameCartFormLabelCheckbox: undefined,
215
+ classNameCartRow: undefined,
216
+ classNameCartRowColumn: undefined,
217
+ classNameCartTabItem: undefined,
218
+ classNameCartTabItemLink: undefined,
219
+ classNameCartGoogleSuggestList: undefined,
220
+ classNameCartGoogleSuggestListItem: undefined,
221
+ classNameCartHeader: undefined,
222
+ classNameCartItemFeatureImage: undefined,
223
+ classNameCartItemInfo: undefined,
224
+ classNameCartItemInfoCell: undefined,
225
+ classNameCartItemInfoCellRight: undefined,
226
+ classNameCartItemInfoContainer: undefined,
227
+ classNameCartNav: undefined,
228
+ classNameCartTab: undefined,
229
+ classNameCartTabPanel: undefined,
230
+ classNameCartTitle: undefined,
231
+ classNameCartTotalContainer: undefined,
232
+ classNameCartTotalItem: undefined,
233
+ classNameCartTotaListContainer: undefined,
234
+ classNameCartTotalItemPrice: undefined,
235
+ classNameCartToggleIconButton: undefined,
236
+ classNameClearCartContainer: undefined,
237
+ classNameClearCartText: undefined,
238
+ classNameListClientInfo: undefined,
239
+ classNameListContainer: undefined,
240
+ classNameListItem: undefined,
241
+ classNameListItemCartTotals: undefined,
242
+ classNameList: undefined,
243
+ classNameListInline: undefined,
244
+ classNameListUnstyled: undefined,
245
+ classNameLoadingTemplate: undefined,
246
+ classNameLoadingTemplateContainer: undefined,
247
+ classNameNoItems: undefined,
248
+ classNameShipmentOption: undefined,
249
+ classNameTable: undefined,
250
+ classNameTableContainer: undefined,
251
+ classNameVariationsList: undefined,
252
+ customSuccessMessage: undefined,
253
+
254
+ // Discount code input props
255
+ discountButtonText: undefined,
256
+ discountClassName: undefined,
257
+ discountClassNameButton: undefined,
258
+ discountClassNameButtonContainer: undefined,
259
+ discountClassNameButtonItemRemove: undefined,
260
+ discountClassNameErrorMessage: undefined,
261
+ discountClassNameInput: undefined,
262
+ discountClassNameInputContainer: undefined,
263
+ discountClassNameListItem: undefined,
264
+ discountClassNameListItems: undefined,
265
+ discountClassNameMainContainer: undefined,
266
+ discountShowAppliedItems: true,
267
+ showDiscountCode: true,
268
+
269
+ domainId: undefined,
270
+ googlePlacesLoaded: false,
271
+ hideHead: false,
272
+
273
+ invoiceJson: {},
274
+ setInvoiceJson: console.log,
275
+
276
+ includeTheme: false,
277
+ initialiseCart: true,
278
+
279
+ cartSettingsInvalid: false,
280
+
281
+ fetchingCart: false,
282
+ setFetchingCart: console.log,
283
+
284
+ fetchingShipmentGroups: false,
285
+
286
+ isCartModalOpen: false,
287
+ setIsCartModalOpen: console.log,
288
+ onClickClose: undefined,
289
+ toggleCartModal: console.log,
290
+
291
+ productFormClassNames: {},
292
+ showCartItemInfo: undefined,
293
+ showUserTermsAndConditions: undefined,
294
+ apiUrl: undefined,
295
+
296
+ updateCartShipmentAddress: console.log,
297
+
298
+ urlFrontend: undefined,
299
+ urlTrackingPage: undefined,
300
+ setCartItem: console.log,
301
+ tabs: [tabShipment],
302
+ setTabs: console.log,
303
+
304
+ clearCart: console.log,
305
+ closeClearCart: console.log,
306
+
307
+ setCartComplete: console.log,
308
+ refetchCart: console.log,
309
+ createCartAndCookie: console.log,
310
+
311
+ loadingTotals: false,
312
+ setLoadingTotals: console.log,
313
+ setActiveTabAndEditDisabled: console.log,
314
+ loading: false,
315
+
316
+ getCartShipmentOptions: console.log,
317
+ });
318
+
319
+ export const useCartContext = () => useContext(CartContext);
320
+
321
+ interface PropsCartProvider {
322
+ cart?: any;
323
+ cartClient?: any;
324
+ children: ReactNode;
325
+ classNameAlertError?: string;
326
+ classNameAlertInfo?: string;
327
+ classNameAlertSuccess?: string;
328
+ classNameAlertWarning?: string;
329
+ classNameBtn?: string;
330
+ classNameBtnBack?: string;
331
+ classNameBtnCartClear?: string;
332
+ classNameBtnClose?: string;
333
+ classNameBtnDanger?: string;
334
+ classNameBtnDefault?: string;
335
+ classNameBtnDownloadInvoice?: string;
336
+ classNameBtnEditCartItem?: string;
337
+ classNameBtnPrimary?: string;
338
+ classNameBtnNext?: string;
339
+ classNameBtnNextComplete?: string;
340
+ classNameBtnLink?: string;
341
+ classNameBtnPay?: string;
342
+ classNameCartBody?: string;
343
+ classNameCartFooter?: string;
344
+ classNameCartFormCheckbox?: string;
345
+ classNameCartFormGroup?: string;
346
+ classNameCartFormGroupButton?: string;
347
+ classNameCartFormGroupCheckbox?: string;
348
+ classNameCartFormInput?: string;
349
+ classNameCartFormLabelCheckbox?: string;
350
+ classNameCartInputError?: string;
351
+ classNameCartRow?: string;
352
+ classNameCartRowColumn?: string;
353
+ classNameCartTabItem?: string;
354
+ classNameCartTabItemLink?: string;
355
+ classNameCartGoogleSuggestList?: string;
356
+ classNameCartGoogleSuggestListItem?: string;
357
+ classNameCartHeader?: string;
358
+ classNameCartItemFeatureImage?: string;
359
+ classNameCartItemInfo?: string;
360
+ classNameCartItemInfoCell?: string;
361
+ classNameCartItemInfoCellRight?: string;
362
+ classNameCartNav?: string;
363
+ classNameCartTab?: string;
364
+ classNameCartTabPanel?: string;
365
+ classNameCartTitle?: string;
366
+ classNameCartTotalContainer?: string;
367
+ classNameCartTotalItem?: string;
368
+ classNameCartTotaListContainer?: string;
369
+ classNameCartTotalItemPrice?: string;
370
+ classNameCartToggleIconButton?: string;
371
+ classNameClearCartContainer?: string;
372
+ classNameClearCartText?: string;
373
+ classNameListClientInfo?: string;
374
+ classNameCartItemInfoContainer?: string;
375
+ classNameList?: string;
376
+ classNameListInline?: string;
377
+ classNameListContainer?: string;
378
+ classNameListItem?: string;
379
+ classNameListItemCartTotals?: string;
380
+ classNameListUnstyled?: string;
381
+ classNameLoadingTemplate?: string;
382
+ classNameLoadingTemplateContainer?: string;
383
+ classNameNoItems?: string;
384
+ classNameShipmentOption?: string;
385
+ classNameTable?: string;
386
+ classNameTableContainer?: string;
387
+ classNameVariationsList?: string;
388
+ customSuccessMessage?: string;
389
+
390
+ // Discount code input props
391
+ discountButtonText?: string;
392
+ discountClassName?: string;
393
+ discountClassNameMainContainer?: string;
394
+ discountClassNameButtonItemRemove?: string;
395
+ discountClassNameButton?: string;
396
+ discountClassNameButtonContainer?: string;
397
+ discountClassNameErrorMessage?: string;
398
+ discountClassNameInput?: string;
399
+ discountClassNameListItem?: string;
400
+ discountClassNameListItems?: string;
401
+ discountClassNameInputContainer?: string;
402
+ discountShowAppliedItems?: boolean;
403
+ showDiscountCode?: boolean;
404
+
405
+ domainId?: number;
406
+ /** @deprecated No longer used; address lookup goes through the Merchi API. */
407
+ googlePlacesLoaded?: boolean;
408
+ hideHead?: boolean;
409
+ includeTheme?: boolean;
410
+ initialiseCart?: boolean;
411
+
412
+ isCartModalOpen?: boolean;
413
+ setIsCartModalOpen?: (isOpen: boolean) => void;
414
+ createCartAndCookie: (callback?: () => void) => void;
415
+
416
+ onClickClose?: () => void;
417
+ productFormClassNames?: any;
418
+ showCartItemInfo?: boolean;
419
+ showUserTermsAndConditions?: boolean;
420
+ apiUrl?: string;
421
+ urlFrontend?: string;
422
+ urlTrackingPage?: string;
423
+
424
+ getCartShipmentOptions?: () => void;
425
+ }
426
+
427
+ const CartProvider = ({
428
+ cart: initCart = {},
429
+ children,
430
+ classNameAlertError = 'alert-danger',
431
+ classNameAlertInfo = 'alert-info',
432
+ classNameAlertSuccess = 'alert-success',
433
+ classNameAlertWarning = 'alert-warning',
434
+ classNameBtn = 'btn',
435
+ classNameBtnBack = 'btn-lg btn-default',
436
+ classNameBtnCartClear = 'btn-lg btn-danger',
437
+ classNameBtnClose = 'merchi-btn-close',
438
+ classNameBtnDanger = 'btn btn-md btn-danger',
439
+ classNameBtnDefault = 'btn btn-md btn-default',
440
+ classNameBtnDownloadInvoice = 'btn btn-lg btn-primary',
441
+ classNameBtnEditCartItem = 'btn btn-lg btn-primary ml-auto',
442
+ classNameBtnPrimary = 'btn btn-md btn-primary',
443
+ classNameBtnLink = 'btn-md btn-link',
444
+ classNameBtnNext = 'btn-lg btn-primary ml-auto',
445
+ classNameBtnNextComplete = 'btn-lg btn-success ml-auto',
446
+ classNameBtnPay = 'btn-lg btn-primary width-full',
447
+ classNameCartBody = 'merchi-cart-body',
448
+ classNameCartFooter = 'merchi-cart-footer',
449
+ classNameCartFormCheckbox = 'form-check-input',
450
+ classNameCartFormGroup = 'form-group merchi-form-group',
451
+ classNameCartFormGroupButton = 'merchi-form-group-button',
452
+ classNameCartFormGroupCheckbox = 'form-check',
453
+ classNameCartFormInput = 'form-control',
454
+ classNameCartFormLabelCheckbox = '',
455
+ classNameCartInputError = 'text-danger',
456
+ classNameCartNav = 'nav merchi-nav-tabs merchi-nav merchi-nav-fill merchi-nav-pills',
457
+ classNameCartRow = 'merchi-row',
458
+ classNameCartRowColumn = 'merchi-column',
459
+ classNameCartTabItem = 'nav-item merchi-nav-item',
460
+ classNameCartTabItemLink = 'merchi-nav-link',
461
+ classNameCartToggleIconButton = 'cart-icon-button-class',
462
+ classNameCartGoogleSuggestList = 'merchi-cart-google-suggest-list',
463
+ classNameCartGoogleSuggestListItem = 'merchi-cart-google-suggest-list-item',
464
+ classNameCartHeader = 'merchi-cart-header',
465
+ classNameCartItemFeatureImage = 'img-rounded m-10',
466
+ classNameCartItemInfo = 'text-muted font-weight-normal font-italic',
467
+ classNameCartItemInfoCell = 'border-0 align-middle',
468
+ classNameCartItemInfoCellRight = 'border-0 align-middle text-right',
469
+ classNameCartItemInfoContainer = 'ml-3 d-inline-block align-middle',
470
+ classNameCartTab = 'merchi-tab-content',
471
+ classNameCartTabPanel = 'merchi-tab-panel',
472
+ classNameCartTitle = 'merchi-cart-title',
473
+ classNameCartTotalContainer = 'merchi-cart-total-container',
474
+ classNameCartTotaListContainer = 'merchi-cart-total-list-container',
475
+ classNameCartTotalItem = 'merchi-cart-total-item',
476
+ classNameCartTotalItemPrice = 'merchi-cart-total-item-price',
477
+ classNameClearCartContainer = 'merchi-cart-clear-container',
478
+ classNameClearCartText = 'merchi-cart-clear-text',
479
+ classNameListClientInfo = 'merchi-cart-client-info-list',
480
+ classNameList = 'list-group',
481
+ classNameListInline = 'list-inline',
482
+ classNameListUnstyled = 'list-unstyled',
483
+ classNameListContainer = 'pb-2',
484
+ classNameListItem = 'list-group-item',
485
+ classNameListItemCartTotals = 'list-group-item d-flex justify-content-between align-items-center',
486
+ classNameLoadingTemplate = 'merchi-loading-template',
487
+ classNameLoadingTemplateContainer = 'merchi-loading-template-container',
488
+ classNameNoItems = 'merchi-no-cart-items',
489
+ classNameShipmentOption = 'merchi-shipment-option',
490
+ classNameTable = 'table',
491
+ classNameTableContainer = 'table-responsive',
492
+ classNameVariationsList = 'list-unstyled list-inline',
493
+ customSuccessMessage,
494
+ domainId,
495
+
496
+ // Discount code input props
497
+ discountButtonText = 'Apply',
498
+ discountClassName = 'merchi-discount-group-container',
499
+ discountClassNameButton = 'btn btn-primary btn-lg',
500
+ discountClassNameButtonContainer = 'col-auto',
501
+ discountClassNameButtonItemRemove = 'btn btn-sm btn-link',
502
+ discountClassNameErrorMessage = 'text-danger',
503
+ discountClassNameInput = 'form-control input-lg',
504
+ discountClassNameInputContainer,
505
+ discountClassNameListItem = 'list-group-item d-flex align-items-center justify-content-between mt-2',
506
+ discountClassNameListItems = 'list-group',
507
+ discountClassNameMainContainer,
508
+ discountShowAppliedItems = true,
509
+ showDiscountCode = true,
510
+
511
+ googlePlacesLoaded = false,
512
+ hideHead = false,
513
+ includeTheme = false,
514
+ initialiseCart = true,
515
+
516
+ isCartModalOpen,
517
+ setIsCartModalOpen,
518
+ onClickClose,
519
+
520
+ productFormClassNames = {},
521
+ showUserTermsAndConditions = true,
522
+ showCartItemInfo = true,
523
+ apiUrl = 'https://api.merchi.co/v6/',
524
+ urlFrontend = 'https://merchi.co/',
525
+ urlTrackingPage,
526
+ }: PropsCartProvider) => {
527
+ const merchi = new Merchi();
528
+ const [cart, setCart] = useState(({...initCart} as any));
529
+ const [cartClient, setCartClient] = useState((null as any));
530
+
531
+ const [isOpen, setIsOpen] = useState(false);
532
+
533
+ const [activeTabIndex, setActiveTabIndex] = useState(0);
534
+ const [tabs, setTabs] = useState([...initTabs]);
535
+
536
+ function setActiveTabAndEditDisabled(nextTab: {tabId: number, tabIndexToSet: number, disabled: boolean}) {
537
+ const { tabId, tabIndexToSet, disabled } = nextTab;
538
+ setTabs((prev) => {
539
+ const index =
540
+ tabIndexToSet >= 0 && tabIndexToSet < prev.length
541
+ ? tabIndexToSet
542
+ : prev.findIndex((t) => t.tabId === tabId);
543
+ if (index < 0 || index >= prev.length) {
544
+ return prev;
545
+ }
546
+ const next = [...prev];
547
+ next[index] = { ...next[index], disabled };
548
+ return next;
549
+ });
550
+ setActiveTabIndex(tabId);
551
+ }
552
+
553
+ const [cartItem, setCartItem] = useState(({} as any));
554
+
555
+ const [alert, setAlert] = useState(({
556
+ icon: faInfoCircle,
557
+ message: '',
558
+ show: false,
559
+ title: '',
560
+ type: 'info',
561
+ } as Alert));
562
+
563
+ function alertSuccess(message: string) {
564
+ setAlert({
565
+ icon: faCheckCircle,
566
+ message,
567
+ show: true,
568
+ title: 'Success!',
569
+ type: 'success',
570
+ });
571
+ }
572
+
573
+ function alertError(message: string) {
574
+ setAlert({
575
+ icon: faExclamationTriangle,
576
+ message,
577
+ show: true,
578
+ title: 'Error!',
579
+ type: 'danger',
580
+ });
581
+ }
582
+
583
+ function closeClearCart() {
584
+ setActiveTabIndex(tabIdItems);
585
+ }
586
+
587
+ const [fetchingCart, setFetchingCart] = useState(false);
588
+ const [cartSettingsInvalid, setCartSettingsInvalid] = useState(false);
589
+
590
+ async function attachSavedClientIfNeeded(cartJson: any) {
591
+ if (cartJson?.client?.id) {
592
+ setCartClient(cartJson.client);
593
+ return cartJson;
594
+ }
595
+ const savedCustomer = getSavedCheckoutCustomer(domainId);
596
+ if (!savedCustomer?.id) {
597
+ setCartClient(null);
598
+ return cartJson;
599
+ }
600
+ try {
601
+ const cartToken =
602
+ cartJson.token || (await getCartCookieToken(domainId as number));
603
+ const clientEnt = makeUser({ id: savedCustomer.id }, true);
604
+ const cartEnt = makeCart({ ...cartJson }, false, cartToken);
605
+ cartEnt.client = clientEnt;
606
+ const savedCart = await cartEnt.save({ embed: cartEmbed });
607
+ const nextCart = savedCart.toJson();
608
+ if (nextCart?.client?.id) {
609
+ setCartClient(nextCart.client);
610
+ return nextCart;
611
+ }
612
+ } catch {
613
+ // Stale saved customer id — leave customer forms available.
614
+ }
615
+ setCartClient(null);
616
+ return cartJson;
617
+ }
618
+
619
+ // Create cart and save cart cookie
620
+ async function createCartAndCookie(callback?: () => void) {
621
+ setFetchingCart(true);
622
+ try {
623
+ const cart = makeCart({domain: {id: domainId}}, true);
624
+ await cart.create({embed: cartEmbed});
625
+ let cartJson = await cart.toJson();
626
+ if (domainId) setCartCookie(Number(domainId), cartJson, undefined);
627
+ cartJson = await attachSavedClientIfNeeded(cartJson);
628
+ setCart({...cartJson});
629
+ if (callback) callback();
630
+ } catch (e: any) {
631
+ alertError(e.errorMessage || e.message || 'Unable to fetch cart.');
632
+ } finally {
633
+ setFetchingCart(false);
634
+ }
635
+ }
636
+
637
+ async function getCart(cartIdAndToken: Array<string>) {
638
+ const id = Number(cartIdAndToken[0]);
639
+
640
+ // Set the cart token on the merchi entity
641
+ if (cartIdAndToken[1]) merchi.cartToken = cartIdAndToken[1];
642
+ setFetchingCart(true);
643
+ try {
644
+ const cart = await merchi.Cart.get(id, {embed: cartEmbed});
645
+ let cartJson = await cart.toJson();
646
+ if (stripeIsValidAndActive(cartJson)) {
647
+ cartJson = await attachSavedClientIfNeeded(cartJson);
648
+ setCart({...cartJson});
649
+ } else {
650
+ console.error(
651
+ `MErhci cart error: Stripe payment ` +
652
+ `options have not been correctly set up. ` +
653
+ `Check the company profile payment options tab ` +
654
+ `to set and edit stripe payment options.`
655
+ );
656
+ setCartSettingsInvalid(true);
657
+ }
658
+ } catch(e: any){
659
+ await createCartAndCookie();
660
+ } finally {
661
+ setFetchingCart(false);
662
+ }
663
+ }
664
+
665
+ async function actionGetMerchiCart() {
666
+ const cartIdAndToken = await getCartCookie((domainId as number));
667
+ if (cartIdAndToken) {
668
+ getCart(cartIdAndToken);
669
+ } else {
670
+ createCartAndCookie();
671
+ }
672
+ }
673
+
674
+ async function clearCart(callback?: () => void) {
675
+ await createCartAndCookie();
676
+ if (callback) callback();
677
+ closeClearCart();
678
+ }
679
+
680
+ const [fetchingShipmentGroups, setFetchingShipmentGroups] = useState(false);
681
+ async function updateCartShipmentAddress(address: any) {
682
+ // Updates the receiver address on cart and fetches new shipment quotes
683
+ const token = await getCartCookieToken((domainId as string | number));
684
+ const addressFields = sanitizeAddressFields(address);
685
+ const receiverAddress = makeAddress(addressFields, true);
686
+ let cartEnt = makeCart(cart, false, token);
687
+ setFetchingShipmentGroups(true);
688
+ try {
689
+ cartEnt.receiverAddress = receiverAddress;
690
+ cartEnt = await cartEnt.save({embed: cartEmbed});
691
+ const cartJson = cartEnt.toJson();
692
+ saveCheckoutAddress(domainId, addressFields);
693
+ const query: Array<any> = [];
694
+ query.push(['cart_token', cart.token]);
695
+ const cartWithShipmentGroups = await merchi.authenticatedFetch(
696
+ `/generate-cart-shipment-quotes/${cart.id}/`,
697
+ {method: 'GET', query}
698
+ );
699
+
700
+ setCart({
701
+ ...cartJson,
702
+ shipmentGroups: cartWithShipmentGroups.shipmentGroups || []
703
+ });
704
+ } catch (e: any) {
705
+ alertError(e.errorMessage || e.message || 'Unable to set address');
706
+ } finally {
707
+ setFetchingShipmentGroups(false);
708
+ }
709
+ }
710
+
711
+ async function getCartShipmentOptions() {
712
+ setFetchingShipmentGroups(true);
713
+ try {
714
+ const query: Array<any> = [];
715
+ query.push(['cart_token', cart.token]);
716
+ const cartWithGroups = await merchi.authenticatedFetch(
717
+ `/generate-cart-shipment-quotes/${cart.id}/`,
718
+ {method: 'GET', query}
719
+ );
720
+ setCart({
721
+ ...cart,
722
+ shipmentGroups: cartWithGroups.shipmentGroups || []
723
+ });
724
+ } catch (e: any) {
725
+ alertError(e.errorMessage || e.message || 'Unable to fetch shipment options');
726
+ } finally {
727
+ setFetchingShipmentGroups(false);
728
+ }
729
+ }
730
+
731
+ async function getMerchiCartValues() {
732
+ const { cartItems, currency, subtotalCost, taxAmount, totalCost } = (cart as any);
733
+ const cartItemsCount = cartItems ? cartItems.length : 0;
734
+ return {
735
+ cart,
736
+ cartItemsCount,
737
+ currency: currency || '',
738
+ subtotalCost: subtotalCost || 0,
739
+ taxAmount: taxAmount || 0,
740
+ totalCost: totalCost || 0,
741
+ };
742
+ }
743
+
744
+ async function isMerchiCartFetching() {
745
+ return fetchingCart;
746
+ }
747
+
748
+ const [loading, setLoading] = useState(false);
749
+
750
+ // Fetch the associated cart theme via the cart domain.
751
+ async function actionFetchTheme() {
752
+ setLoading(true);
753
+ try {
754
+ const domain = await merchi.Domain.get(domainId, {embed: {activeTheme: {mainCss: {}}}});
755
+ const theme = domain.activeTheme;
756
+ await appendStyleSheetText(theme.mainCss, () => setLoading(false));
757
+ } catch (e: any) {
758
+ alertError(e.errorMessage || e.message || 'Error fetching domain theme.');
759
+ setLoading(false);
760
+ }
761
+ }
762
+
763
+ async function setCartComplete() {
764
+ await createCartAndCookie();
765
+ location.reload();
766
+ }
767
+
768
+ async function refetchCart() {
769
+ await actionGetMerchiCart();
770
+ }
771
+
772
+ const [invoiceJson, setInvoiceJson] = useState({});
773
+
774
+ const [loadingTotals, setLoadingTotals] = useState(false);
775
+
776
+ async function addCartItem(
777
+ jobJson: any,
778
+ onSuccess: (cartItem: any) => void,
779
+ onError: (e: any) => void,
780
+ ) {
781
+ setFetchingCart(true);
782
+ const jobEnt = makeJob(jobJson, true);
783
+ const cartToken = await getCartCookieToken((domainId as number));
784
+ const cartEnt = makeCart(cart, false, cartToken);
785
+ const cartItemEnt = makeCartItem({}, true);
786
+ const cartItemProduct = makeProduct({ id: (jobEnt.product as any).id });
787
+
788
+ cartItemEnt.cart = cartEnt;
789
+ cartItemEnt.quantity = jobEnt.quantity;
790
+ cartItemEnt.product = cartItemProduct;
791
+ cartItemEnt.variations = jobEnt.variations;
792
+ cartItemEnt.variationsGroups = jobEnt.variationsGroups;
793
+ cartItemEnt.taxType = jobEnt.taxType;
794
+ cartItemEnt.ownDrafts = jobEnt.ownDrafts;
795
+ cartItemEnt.tags = jobEnt.tags;
796
+ try {
797
+ const item = await cartItemEnt.create();
798
+ const itemJson = await item.toJson();
799
+ onSuccess(itemJson);
800
+ } catch(e: any) {
801
+ onError(e);
802
+ } finally {
803
+ setFetchingCart(false);
804
+ }
805
+ }
806
+
807
+ const toggleCartModal = () => {
808
+ const newIsOpen = setIsCartModalOpen ? !isCartModalOpen : !isOpen;
809
+
810
+ // Toggle the modal state
811
+ if (setIsCartModalOpen) {
812
+ setIsCartModalOpen(newIsOpen);
813
+ } else {
814
+ setIsOpen(newIsOpen);
815
+ }
816
+
817
+ // Refetch the cart if the modal is opening
818
+ if (newIsOpen) {
819
+ refetchCart();
820
+ }
821
+ };
822
+
823
+ // Set a global toggle function for cart wrapper
824
+ if (typeof window !== 'undefined') {
825
+ (window as any).addCartItem = addCartItem;
826
+ (window as any).toggleCartOpen = toggleCartModal;
827
+ (window as any).getCart = () => actionGetMerchiCart();
828
+ (window as any).getMerchiCartValues = getMerchiCartValues;
829
+ (window as any).isMerchiCartFetching = isMerchiCartFetching;
830
+ (window as any).setCartComplete = setCartComplete;
831
+ (window as any).refetchCart = refetchCart;
832
+ (window as any).createCartAndCookie = createCartAndCookie;
833
+ }
834
+
835
+ useEffect(() => {
836
+ if (domainId) actionGetMerchiCart();
837
+ if (domainId && includeTheme) actionFetchTheme();
838
+ }, [domainId]);
839
+ return (
840
+ <CartContext.Provider
841
+ value={{
842
+ cart,
843
+ setCart,
844
+
845
+ cartClient,
846
+ setCartClient,
847
+
848
+ cartSettingsInvalid, // if true do show error to user about settings
849
+
850
+ activeTabIndex,
851
+ setActiveTabIndex,
852
+ alert,
853
+ alertSuccess,
854
+ alertError,
855
+ setAlert,
856
+ cartItem,
857
+ setCartItem,
858
+ classNameAlertError,
859
+ classNameAlertInfo,
860
+ classNameAlertSuccess,
861
+ classNameAlertWarning,
862
+ classNameBtn,
863
+ classNameBtnBack,
864
+ classNameBtnCartClear,
865
+ classNameBtnClose,
866
+ classNameBtnDanger,
867
+ classNameBtnDefault,
868
+ classNameBtnDownloadInvoice,
869
+ classNameBtnEditCartItem,
870
+ classNameBtnPrimary,
871
+ classNameBtnLink,
872
+ classNameBtnNext,
873
+ classNameBtnNextComplete,
874
+ classNameBtnPay,
875
+ classNameCartBody,
876
+ classNameCartFooter,
877
+ classNameCartFormCheckbox,
878
+ classNameCartFormGroup,
879
+ classNameCartFormGroupButton,
880
+ classNameCartFormGroupCheckbox,
881
+ classNameCartFormInput,
882
+ classNameCartFormLabelCheckbox,
883
+ classNameCartInputError,
884
+ classNameCartNav,
885
+ classNameCartRow,
886
+ classNameCartRowColumn,
887
+ classNameCartTabItem,
888
+ classNameCartTabItemLink,
889
+ classNameCartToggleIconButton,
890
+ classNameCartGoogleSuggestList,
891
+ classNameCartGoogleSuggestListItem,
892
+ classNameCartHeader,
893
+ classNameCartItemFeatureImage,
894
+ classNameCartItemInfo,
895
+ classNameCartItemInfoCell,
896
+ classNameCartItemInfoCellRight,
897
+ classNameCartItemInfoContainer,
898
+ classNameCartTab,
899
+ classNameCartTabPanel,
900
+ classNameCartTitle,
901
+ classNameCartTotalContainer,
902
+ classNameCartTotalItem,
903
+ classNameCartTotaListContainer,
904
+ classNameCartTotalItemPrice,
905
+ classNameClearCartContainer,
906
+ classNameClearCartText,
907
+ classNameListClientInfo,
908
+ classNameList,
909
+ classNameListInline,
910
+ classNameListContainer,
911
+ classNameListItem,
912
+ classNameListItemCartTotals,
913
+ classNameListUnstyled,
914
+ classNameLoadingTemplate,
915
+ classNameLoadingTemplateContainer,
916
+ classNameNoItems,
917
+ classNameShipmentOption,
918
+ classNameTable,
919
+ classNameTableContainer,
920
+ classNameVariationsList,
921
+ customSuccessMessage,
922
+
923
+ discountButtonText,
924
+ discountClassName,
925
+ discountClassNameButton,
926
+ discountClassNameButtonContainer,
927
+ discountClassNameButtonItemRemove,
928
+ discountClassNameErrorMessage,
929
+ discountClassNameInput,
930
+ discountClassNameInputContainer,
931
+ discountClassNameListItem,
932
+ discountClassNameListItems,
933
+ discountClassNameMainContainer,
934
+ discountShowAppliedItems,
935
+ showDiscountCode,
936
+
937
+ fetchingCart, // boolean indicator true when fetching cart
938
+ setFetchingCart,
939
+
940
+ fetchingShipmentGroups, // boolean for fetching shipment groups
941
+
942
+ domainId,
943
+ googlePlacesLoaded,
944
+ hideHead,
945
+
946
+ invoiceJson,
947
+ setInvoiceJson,
948
+
949
+ includeTheme,
950
+ initialiseCart,
951
+
952
+ isCartModalOpen: typeof isCartModalOpen !== 'undefined' ? isCartModalOpen : isOpen, // Control the cart modal open and closed
953
+ toggleCartModal,
954
+
955
+ onClickClose,
956
+ productFormClassNames,
957
+ showUserTermsAndConditions,
958
+ apiUrl,
959
+
960
+ updateCartShipmentAddress,
961
+
962
+ urlFrontend,
963
+ urlTrackingPage,
964
+
965
+ tabs,
966
+ setTabs,
967
+
968
+ clearCart, // Resets the cart and it's values
969
+ closeClearCart,
970
+
971
+ setCartComplete, // creates a token and cart and then reloads the page
972
+ refetchCart, // used to refetch the cart
973
+ createCartAndCookie, // creates a new cart and cookie
974
+
975
+ loading,
976
+
977
+ showCartItemInfo,
978
+
979
+ loadingTotals,
980
+ setLoadingTotals,
981
+
982
+ setActiveTabAndEditDisabled,
983
+
984
+ getCartShipmentOptions, // refetch of the shipment quote options
985
+ } as PropsCart}
986
+ >
987
+ {children}
988
+ </CartContext.Provider>
989
+ );
990
+ };
991
+
992
+ export default CartProvider;