@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,130 @@
1
+ import { isBrowser } from 'browser-or-node';
2
+
3
+ export interface SavedCheckoutCustomer {
4
+ id?: number;
5
+ name?: string;
6
+ emailAddress?: string;
7
+ phoneNumbers?: Array<{ code?: string; number?: string }>;
8
+ }
9
+
10
+ export interface SavedCheckoutAddress {
11
+ city?: string;
12
+ country?: string;
13
+ lineOne?: string;
14
+ lineTwo?: string;
15
+ postcode?: string;
16
+ state?: string;
17
+ }
18
+
19
+ export interface SavedCheckoutDraft {
20
+ customer?: SavedCheckoutCustomer;
21
+ address?: SavedCheckoutAddress;
22
+ receiverNotes?: string;
23
+ }
24
+
25
+ function storageKey(domainId: number | string) {
26
+ return `merchi-cart-checkout-${domainId}`;
27
+ }
28
+
29
+ function readDraft(domainId?: number | string | null): SavedCheckoutDraft {
30
+ if (!isBrowser || domainId === undefined || domainId === null) {
31
+ return {};
32
+ }
33
+ try {
34
+ const raw = localStorage.getItem(storageKey(domainId));
35
+ if (!raw) return {};
36
+ const parsed = JSON.parse(raw);
37
+ return parsed && typeof parsed === 'object' ? parsed : {};
38
+ } catch {
39
+ return {};
40
+ }
41
+ }
42
+
43
+ function writeDraft(domainId: number | string | undefined | null, draft: SavedCheckoutDraft) {
44
+ if (!isBrowser || domainId === undefined || domainId === null) {
45
+ return;
46
+ }
47
+ try {
48
+ localStorage.setItem(storageKey(domainId), JSON.stringify(draft));
49
+ } catch {
50
+ // Ignore quota / private-mode failures.
51
+ }
52
+ }
53
+
54
+ export function getSavedCheckoutDraft(domainId?: number | string | null): SavedCheckoutDraft {
55
+ return readDraft(domainId);
56
+ }
57
+
58
+ export function getSavedCheckoutCustomer(
59
+ domainId?: number | string | null
60
+ ): SavedCheckoutCustomer | undefined {
61
+ return readDraft(domainId).customer;
62
+ }
63
+
64
+ export function getSavedCheckoutAddress(
65
+ domainId?: number | string | null
66
+ ): { address?: SavedCheckoutAddress; receiverNotes?: string } {
67
+ const draft = readDraft(domainId);
68
+ return {
69
+ address: draft.address,
70
+ receiverNotes: draft.receiverNotes,
71
+ };
72
+ }
73
+
74
+ export function saveCheckoutCustomer(
75
+ domainId: number | string | undefined | null,
76
+ customer: SavedCheckoutCustomer
77
+ ) {
78
+ const draft = readDraft(domainId);
79
+ const nextCustomer: SavedCheckoutCustomer = {
80
+ ...draft.customer,
81
+ ...customer,
82
+ };
83
+ // Drop empty phone entries.
84
+ if (nextCustomer.phoneNumbers) {
85
+ nextCustomer.phoneNumbers = nextCustomer.phoneNumbers.filter(
86
+ (phone) => phone && (phone.number || phone.code)
87
+ );
88
+ if (!nextCustomer.phoneNumbers.length) {
89
+ delete nextCustomer.phoneNumbers;
90
+ }
91
+ }
92
+ writeDraft(domainId, { ...draft, customer: nextCustomer });
93
+ }
94
+
95
+ export function saveCheckoutAddress(
96
+ domainId: number | string | undefined | null,
97
+ address: SavedCheckoutAddress | null | undefined,
98
+ receiverNotes?: string
99
+ ) {
100
+ if (!address) return;
101
+ const draft = readDraft(domainId);
102
+ const nextAddress: SavedCheckoutAddress = {
103
+ city: address.city || '',
104
+ country: address.country || '',
105
+ lineOne: address.lineOne || '',
106
+ lineTwo: address.lineTwo || '',
107
+ postcode: address.postcode || '',
108
+ state: address.state || '',
109
+ };
110
+ const next: SavedCheckoutDraft = {
111
+ ...draft,
112
+ address: nextAddress,
113
+ };
114
+ if (receiverNotes !== undefined) {
115
+ next.receiverNotes = receiverNotes;
116
+ }
117
+ writeDraft(domainId, next);
118
+ }
119
+
120
+ export function addressHasContent(address?: SavedCheckoutAddress | null) {
121
+ if (!address) return false;
122
+ return Boolean(
123
+ address.lineOne ||
124
+ address.lineTwo ||
125
+ address.city ||
126
+ address.state ||
127
+ address.postcode ||
128
+ address.country
129
+ );
130
+ }
@@ -0,0 +1,14 @@
1
+ import { Merchi } from '@merchi/sdk';
2
+ import pngProductNotFound from '../assets/product-not-found.png';
3
+
4
+ export function productFeatureImageUrl(product: any) {
5
+ const { featureImage } = product;
6
+ return featureImage && featureImage!.viewUrl ?
7
+ featureImage!.viewUrl : pngProductNotFound.src || pngProductNotFound;
8
+ }
9
+
10
+ export const makeProduct = (json: any, makeDirty?: boolean) => {
11
+ const merchi = new Merchi();
12
+ const product = new merchi.Product();
13
+ return product.fromJson(json, { makeDirty });
14
+ };
@@ -0,0 +1,11 @@
1
+ export const shipmentFormId = '_shipment-address-form-id';
2
+
3
+ export function cartItemsNeedShipment(cart: any) {
4
+ const { cartItems = [] } = cart;
5
+ for (let i = 0; i < cartItems.length; i++) {
6
+ if (cartItems[i].product && cartItems[i].product.needsShipping) {
7
+ return true;
8
+ }
9
+ }
10
+ return false;
11
+ }
@@ -0,0 +1,38 @@
1
+ import {
2
+ faCheckCircle,
3
+ faCreditCard,
4
+ faMapMarkerAlt,
5
+ faShoppingCart,
6
+ } from '@fortawesome/free-solid-svg-icons';
7
+ import { Tab } from '../types';
8
+
9
+ export const tabIdClearCart = -2;
10
+ export const tabIdItem = -1;
11
+ export const tabIdItems = 0;
12
+ export const tabIdShipment = 1;
13
+ export const tabIdCheckout = 2;
14
+ export const tabIdPaymentSuccess = 3;
15
+
16
+ export const tabItems: Tab = {disabled: false, icon: faShoppingCart, tabId: tabIdItems, name: 'Items'};
17
+ export const tabShipment: Tab = {disabled: true, icon: faMapMarkerAlt, tabId: tabIdShipment, name: 'Address'};
18
+ export const tabCheckout: Tab = {disabled: true, icon: faCreditCard, tabId: tabIdCheckout, name: 'Checkout'};
19
+ const tabCheckoutSuccess: Tab = {
20
+ disabled: true,
21
+ icon: faCheckCircle,
22
+ tabId: tabIdPaymentSuccess,
23
+ name: 'Success',
24
+ };
25
+
26
+ export const initTabs: Tab[] = [tabItems, tabCheckout, tabCheckoutSuccess];
27
+ export const tabsWithShipment: Tab[] = [tabItems, tabShipment, tabCheckout, tabCheckoutSuccess];
28
+
29
+ export function setDisableTab(tab: any, disabled: boolean) {
30
+ return {...tab, disabled};
31
+ }
32
+
33
+ export function cartHasShippmentGroupsAndAllHaveSelectedGroups(cart: any) {
34
+ const shipmentGroups = cart.shipmentGroups ? cart.shipmentGroups : [];
35
+ const haveSelectedQuotes = shipmentGroups.map((g: any) => Boolean(g.selectedQuote));
36
+ return shipmentGroups.length && !haveSelectedQuotes.includes(false);
37
+ }
38
+
@@ -0,0 +1,33 @@
1
+ import { Merchi } from '@merchi/sdk';
2
+
3
+ const merchi = new Merchi()
4
+
5
+ export function makeUser(userJson: any, makeDirty?: boolean) {
6
+ const user = new merchi.User();
7
+ return user.fromJson(userJson, { makeDirty });
8
+ }
9
+
10
+ export function primaryEmail(user: any) {
11
+ const { emailAddresses = [] } = user;
12
+ return emailAddresses[0] ? emailAddresses[0].emailAddress : '';
13
+ }
14
+
15
+ export function primaryPhone(user: any) {
16
+ const { phoneNumbers = [] } = user;
17
+ return phoneNumbers[0] ? phoneNumbers[0].internationalFormatNumber : '';
18
+ }
19
+
20
+
21
+ export async function tryReturningCustomerEmail(emailAddress: string) {
22
+ const merchi = new Merchi();
23
+ const query: Array<any> = [];
24
+ query.push(['email_address', emailAddress]);
25
+ return await merchi.authenticatedFetch('/user-check-email/', {method: 'POST', query});
26
+ }
27
+
28
+ export async function createNewCustomer(customerJson: any) {
29
+ const user = makeUser(customerJson, true);
30
+ return merchi.authenticatedFetch(
31
+ '/public_user_create/', {body: user.toFormData(), method: 'POST'}
32
+ )
33
+ }
@@ -0,0 +1,80 @@
1
+ import { formatAreaSummary, localePrefersImperial } from './area';
2
+
3
+ export enum FieldType {
4
+ TEXT_INPUT = 1,
5
+ SELECT = 2,
6
+ FILE_UPLOAD = 3,
7
+ TEXT_AREA = 4,
8
+ NUMBER_INPUT = 5,
9
+ CHECKBOX = 6,
10
+ RADIO = 7,
11
+ FIELD_INSTRUCTIONS = 8,
12
+ IMAGE_SELECT = 9,
13
+ COLOUR_PICKER = 10,
14
+ COLOUR_SELECT = 11,
15
+ TURNAROUND_TIME = 12,
16
+ COLOUR_EXTRACT = 13,
17
+ AREA = 14,
18
+ }
19
+
20
+
21
+ export function isSelectable(fieldType: number) {
22
+ return [
23
+ FieldType.SELECT,
24
+ FieldType.CHECKBOX,
25
+ FieldType.RADIO,
26
+ FieldType.IMAGE_SELECT,
27
+ FieldType.COLOUR_SELECT,
28
+ FieldType.COLOUR_EXTRACT,
29
+ ].includes(fieldType);
30
+ }
31
+
32
+ function concatinatedSelectedOptionValues(variation: any) {
33
+ const { selectableOptions, value } = variation;
34
+ const optionIds = value ? value.split(',') : [];
35
+ const optionIdsLength = optionIds.length - 1;
36
+ let option
37
+ let i = 0;
38
+ let val = '';
39
+ for (i; i < optionIds.length; i++) {
40
+ option = selectableOptions.find(
41
+ (o: any) => String(o.optionId) === String(optionIds[i]));
42
+ val += option ? option.value : '';
43
+ if (optionIdsLength > i) {
44
+ val += ', ';
45
+ }
46
+ }
47
+ return val;
48
+ }
49
+
50
+ export function valueString(variation: any) {
51
+ const {
52
+ variationField: field,
53
+ variationFiles,
54
+ value,
55
+ } = variation;
56
+ if (isSelectable(field.fieldType)) {
57
+ return concatinatedSelectedOptionValues(variation);
58
+ } else if (
59
+ (field.fieldType === FieldType.FILE_UPLOAD ||
60
+ field.fieldType === FieldType.COLOUR_EXTRACT) &&
61
+ variationFiles
62
+ ) {
63
+ if (field.fieldType === FieldType.COLOUR_EXTRACT) {
64
+ const colours = concatinatedSelectedOptionValues(variation);
65
+ const fileLabel =
66
+ variationFiles.length > 1 ? 'uploaded files' : 'uploaded file';
67
+ return colours ? `${fileLabel} (${colours})` : fileLabel;
68
+ }
69
+ return variationFiles.length > 1 ? 'uploaded files' : 'uploaded file';
70
+ } else if (field.fieldType === FieldType.AREA) {
71
+ return (
72
+ formatAreaSummary(
73
+ value,
74
+ localePrefersImperial() ? 'imperial' : 'metric',
75
+ field.areaUnit || 'mm'
76
+ ) || value
77
+ );
78
+ }
79
+ return value;
80
+ }