@libreapps/commerce 7.5.1

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 (327) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +13 -0
  3. package/LICENSE.md +21 -0
  4. package/components/Icons.tsx +35 -0
  5. package/components/add-to-cart-widget.tsx +183 -0
  6. package/components/buy/buy-card.tsx +259 -0
  7. package/components/buy/carousel-buy-card.tsx +242 -0
  8. package/components/buy/multi-family/all-variants-carousel.tsx +261 -0
  9. package/components/buy/multi-family/family-carousel/index.tsx +77 -0
  10. package/components/buy/multi-family/family-carousel/slide.tsx +83 -0
  11. package/components/buy/multi-family/family-carousel/state.ts +87 -0
  12. package/components/buy/multi-family/index.ts +2 -0
  13. package/components/buy/single-family-selector.tsx +90 -0
  14. package/components/buy/title-and-byline.tsx +25 -0
  15. package/components/cart/cart-panel/cart-line-item.tsx +76 -0
  16. package/components/cart/cart-panel/index.tsx +154 -0
  17. package/components/cart/cart-panel/promo-code.tsx +109 -0
  18. package/components/cart/cart-panel/total-area.tsx +60 -0
  19. package/components/checkout/payment-step-form/card-icon-row.tsx +26 -0
  20. package/components/checkout/payment-step-form/card-icons/amex.tsx +32 -0
  21. package/components/checkout/payment-step-form/card-icons/diners-club.tsx +13 -0
  22. package/components/checkout/payment-step-form/card-icons/discover.tsx +25 -0
  23. package/components/checkout/payment-step-form/card-icons/jcb.tsx +26 -0
  24. package/components/checkout/payment-step-form/card-icons/mastercard.tsx +27 -0
  25. package/components/checkout/payment-step-form/card-icons/visa.tsx +25 -0
  26. package/components/checkout/payment-step-form/cc-button.tsx +17 -0
  27. package/components/checkout/payment-step-form/contact-form.tsx +50 -0
  28. package/components/checkout/payment-step-form/crypto-icons/btc.tsx +11 -0
  29. package/components/checkout/payment-step-form/crypto-icons/eth.tsx +20 -0
  30. package/components/checkout/payment-step-form/crypto-icons/usdt.tsx +13 -0
  31. package/components/checkout/payment-step-form/index.tsx +122 -0
  32. package/components/checkout/payment-step-form/methods/bank-transfer.tsx +79 -0
  33. package/components/checkout/payment-step-form/methods/card.tsx +232 -0
  34. package/components/checkout/payment-step-form/methods/crypto.tsx +227 -0
  35. package/components/checkout/payment-step-form/methods/index.ts +23 -0
  36. package/components/checkout/shipping-step-form.tsx +175 -0
  37. package/components/index.ts +11 -0
  38. package/components/item/product-card.tsx +48 -0
  39. package/components/item-selector/button.tsx +188 -0
  40. package/components/item-selector/carousel/index.tsx +197 -0
  41. package/components/item-selector/carousel/slider.tsx +40 -0
  42. package/components/item-selector/index.ts +5 -0
  43. package/components/item-selector/quantity-indicator.tsx +48 -0
  44. package/components/node-tabs/index.tsx +91 -0
  45. package/components/node-tabs/node-image.tsx +31 -0
  46. package/dist/components/Icons.d.ts +18 -0
  47. package/dist/components/Icons.js +19 -0
  48. package/dist/components/Icons.js.map +1 -0
  49. package/dist/components/add-to-cart-widget.d.ts +11 -0
  50. package/dist/components/add-to-cart-widget.js +85 -0
  51. package/dist/components/add-to-cart-widget.js.map +1 -0
  52. package/dist/components/buy/buy-card.d.ts +30 -0
  53. package/dist/components/buy/buy-card.js +109 -0
  54. package/dist/components/buy/buy-card.js.map +1 -0
  55. package/dist/components/buy/carousel-buy-card.d.ts +12 -0
  56. package/dist/components/buy/carousel-buy-card.js +94 -0
  57. package/dist/components/buy/carousel-buy-card.js.map +1 -0
  58. package/dist/components/buy/multi-family/all-variants-carousel.d.ts +4 -0
  59. package/dist/components/buy/multi-family/all-variants-carousel.js +115 -0
  60. package/dist/components/buy/multi-family/all-variants-carousel.js.map +1 -0
  61. package/dist/components/buy/multi-family/family-carousel/index.d.ts +4 -0
  62. package/dist/components/buy/multi-family/family-carousel/index.js +27 -0
  63. package/dist/components/buy/multi-family/family-carousel/index.js.map +1 -0
  64. package/dist/components/buy/multi-family/family-carousel/slide.d.ts +11 -0
  65. package/dist/components/buy/multi-family/family-carousel/slide.js +35 -0
  66. package/dist/components/buy/multi-family/family-carousel/slide.js.map +1 -0
  67. package/dist/components/buy/multi-family/family-carousel/state.d.ts +20 -0
  68. package/dist/components/buy/multi-family/family-carousel/state.js +59 -0
  69. package/dist/components/buy/multi-family/family-carousel/state.js.map +1 -0
  70. package/dist/components/buy/multi-family/index.d.ts +2 -0
  71. package/dist/components/buy/multi-family/index.js +3 -0
  72. package/dist/components/buy/multi-family/index.js.map +1 -0
  73. package/dist/components/buy/single-family-selector.d.ts +15 -0
  74. package/dist/components/buy/single-family-selector.js +28 -0
  75. package/dist/components/buy/single-family-selector.js.map +1 -0
  76. package/dist/components/buy/title-and-byline.d.ts +8 -0
  77. package/dist/components/buy/title-and-byline.js +7 -0
  78. package/dist/components/buy/title-and-byline.js.map +1 -0
  79. package/dist/components/cart/cart-panel/cart-line-item.d.ts +11 -0
  80. package/dist/components/cart/cart-panel/cart-line-item.js +25 -0
  81. package/dist/components/cart/cart-panel/cart-line-item.js.map +1 -0
  82. package/dist/components/cart/cart-panel/index.d.ts +19 -0
  83. package/dist/components/cart/cart-panel/index.js +65 -0
  84. package/dist/components/cart/cart-panel/index.js.map +1 -0
  85. package/dist/components/cart/cart-panel/promo-code.d.ts +4 -0
  86. package/dist/components/cart/cart-panel/promo-code.js +62 -0
  87. package/dist/components/cart/cart-panel/promo-code.js.map +1 -0
  88. package/dist/components/cart/cart-panel/total-area.d.ts +7 -0
  89. package/dist/components/cart/cart-panel/total-area.js +14 -0
  90. package/dist/components/cart/cart-panel/total-area.js.map +1 -0
  91. package/dist/components/checkout/payment-step-form/card-icon-row.d.ts +2 -0
  92. package/dist/components/checkout/payment-step-form/card-icon-row.js +14 -0
  93. package/dist/components/checkout/payment-step-form/card-icon-row.js.map +1 -0
  94. package/dist/components/checkout/payment-step-form/card-icons/amex.d.ts +4 -0
  95. package/dist/components/checkout/payment-step-form/card-icons/amex.js +6 -0
  96. package/dist/components/checkout/payment-step-form/card-icons/amex.js.map +1 -0
  97. package/dist/components/checkout/payment-step-form/card-icons/diners-club.d.ts +4 -0
  98. package/dist/components/checkout/payment-step-form/card-icons/diners-club.js +6 -0
  99. package/dist/components/checkout/payment-step-form/card-icons/diners-club.js.map +1 -0
  100. package/dist/components/checkout/payment-step-form/card-icons/discover.d.ts +4 -0
  101. package/dist/components/checkout/payment-step-form/card-icons/discover.js +6 -0
  102. package/dist/components/checkout/payment-step-form/card-icons/discover.js.map +1 -0
  103. package/dist/components/checkout/payment-step-form/card-icons/jcb.d.ts +4 -0
  104. package/dist/components/checkout/payment-step-form/card-icons/jcb.js +6 -0
  105. package/dist/components/checkout/payment-step-form/card-icons/jcb.js.map +1 -0
  106. package/dist/components/checkout/payment-step-form/card-icons/mastercard.d.ts +4 -0
  107. package/dist/components/checkout/payment-step-form/card-icons/mastercard.js +6 -0
  108. package/dist/components/checkout/payment-step-form/card-icons/mastercard.js.map +1 -0
  109. package/dist/components/checkout/payment-step-form/card-icons/visa.d.ts +4 -0
  110. package/dist/components/checkout/payment-step-form/card-icons/visa.js +6 -0
  111. package/dist/components/checkout/payment-step-form/card-icons/visa.js.map +1 -0
  112. package/dist/components/checkout/payment-step-form/cc-button.d.ts +3 -0
  113. package/dist/components/checkout/payment-step-form/cc-button.js +6 -0
  114. package/dist/components/checkout/payment-step-form/cc-button.js.map +1 -0
  115. package/dist/components/checkout/payment-step-form/contact-form.d.ts +5 -0
  116. package/dist/components/checkout/payment-step-form/contact-form.js +6 -0
  117. package/dist/components/checkout/payment-step-form/contact-form.js.map +1 -0
  118. package/dist/components/checkout/payment-step-form/crypto-icons/btc.d.ts +4 -0
  119. package/dist/components/checkout/payment-step-form/crypto-icons/btc.js +6 -0
  120. package/dist/components/checkout/payment-step-form/crypto-icons/btc.js.map +1 -0
  121. package/dist/components/checkout/payment-step-form/crypto-icons/eth.d.ts +4 -0
  122. package/dist/components/checkout/payment-step-form/crypto-icons/eth.js +6 -0
  123. package/dist/components/checkout/payment-step-form/crypto-icons/eth.js.map +1 -0
  124. package/dist/components/checkout/payment-step-form/crypto-icons/usdt.d.ts +4 -0
  125. package/dist/components/checkout/payment-step-form/crypto-icons/usdt.js +6 -0
  126. package/dist/components/checkout/payment-step-form/crypto-icons/usdt.js.map +1 -0
  127. package/dist/components/checkout/payment-step-form/index.d.ts +4 -0
  128. package/dist/components/checkout/payment-step-form/index.js +77 -0
  129. package/dist/components/checkout/payment-step-form/index.js.map +1 -0
  130. package/dist/components/checkout/payment-step-form/methods/bank-transfer.d.ts +4 -0
  131. package/dist/components/checkout/payment-step-form/methods/bank-transfer.js +24 -0
  132. package/dist/components/checkout/payment-step-form/methods/bank-transfer.js.map +1 -0
  133. package/dist/components/checkout/payment-step-form/methods/card.d.ts +4 -0
  134. package/dist/components/checkout/payment-step-form/methods/card.js +160 -0
  135. package/dist/components/checkout/payment-step-form/methods/card.js.map +1 -0
  136. package/dist/components/checkout/payment-step-form/methods/crypto.d.ts +9 -0
  137. package/dist/components/checkout/payment-step-form/methods/crypto.js +137 -0
  138. package/dist/components/checkout/payment-step-form/methods/crypto.js.map +1 -0
  139. package/dist/components/checkout/payment-step-form/methods/index.d.ts +6 -0
  140. package/dist/components/checkout/payment-step-form/methods/index.js +21 -0
  141. package/dist/components/checkout/payment-step-form/methods/index.js.map +1 -0
  142. package/dist/components/checkout/shipping-step-form.d.ts +3 -0
  143. package/dist/components/checkout/shipping-step-form.js +53 -0
  144. package/dist/components/checkout/shipping-step-form.js.map +1 -0
  145. package/dist/components/index.d.ts +8 -0
  146. package/dist/components/index.js +9 -0
  147. package/dist/components/index.js.map +1 -0
  148. package/dist/components/item/product-card.d.ts +7 -0
  149. package/dist/components/item/product-card.js +9 -0
  150. package/dist/components/item/product-card.js.map +1 -0
  151. package/dist/components/item-selector/button.d.ts +4 -0
  152. package/dist/components/item-selector/button.js +47 -0
  153. package/dist/components/item-selector/button.js.map +1 -0
  154. package/dist/components/item-selector/carousel/index.d.ts +12 -0
  155. package/dist/components/item-selector/carousel/index.js +74 -0
  156. package/dist/components/item-selector/carousel/index.js.map +1 -0
  157. package/dist/components/item-selector/carousel/slider.d.ts +8 -0
  158. package/dist/components/item-selector/carousel/slider.js +12 -0
  159. package/dist/components/item-selector/carousel/slider.js.map +1 -0
  160. package/dist/components/item-selector/index.d.ts +2 -0
  161. package/dist/components/item-selector/index.js +3 -0
  162. package/dist/components/item-selector/index.js.map +1 -0
  163. package/dist/components/item-selector/quantity-indicator.d.ts +9 -0
  164. package/dist/components/item-selector/quantity-indicator.js +16 -0
  165. package/dist/components/item-selector/quantity-indicator.js.map +1 -0
  166. package/dist/components/node-tabs/index.d.ts +14 -0
  167. package/dist/components/node-tabs/index.js +42 -0
  168. package/dist/components/node-tabs/index.js.map +1 -0
  169. package/dist/components/node-tabs/node-image.d.ts +6 -0
  170. package/dist/components/node-tabs/node-image.js +13 -0
  171. package/dist/components/node-tabs/node-image.js.map +1 -0
  172. package/dist/index.d.ts +5 -0
  173. package/dist/index.js +5 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/service/context.d.ts +8 -0
  176. package/dist/service/context.js +19 -0
  177. package/dist/service/context.js.map +1 -0
  178. package/dist/service/debug.d.ts +10 -0
  179. package/dist/service/debug.js +30 -0
  180. package/dist/service/debug.js.map +1 -0
  181. package/dist/service/impls/standalone/actual-line-item.d.ts +40 -0
  182. package/dist/service/impls/standalone/actual-line-item.js +84 -0
  183. package/dist/service/impls/standalone/actual-line-item.js.map +1 -0
  184. package/dist/service/impls/standalone/get-instance.d.ts +2 -0
  185. package/dist/service/impls/standalone/get-instance.js +39 -0
  186. package/dist/service/impls/standalone/get-instance.js.map +1 -0
  187. package/dist/service/impls/standalone/index.d.ts +67 -0
  188. package/dist/service/impls/standalone/index.js +416 -0
  189. package/dist/service/impls/standalone/index.js.map +1 -0
  190. package/dist/service/impls/standalone/order/firebase.d.ts +2 -0
  191. package/dist/service/impls/standalone/order/firebase.js +13 -0
  192. package/dist/service/impls/standalone/order/firebase.js.map +1 -0
  193. package/dist/service/impls/standalone/order/index.d.ts +24 -0
  194. package/dist/service/impls/standalone/order/index.js +61 -0
  195. package/dist/service/impls/standalone/order/index.js.map +1 -0
  196. package/dist/service/impls/standalone/persistence.d.ts +4 -0
  197. package/dist/service/impls/standalone/persistence.js +22 -0
  198. package/dist/service/impls/standalone/persistence.js.map +1 -0
  199. package/dist/service/path-utils.d.ts +7 -0
  200. package/dist/service/path-utils.js +16 -0
  201. package/dist/service/path-utils.js.map +1 -0
  202. package/dist/service/sep.d.ts +6 -0
  203. package/dist/service/sep.js +6 -0
  204. package/dist/service/sep.js.map +1 -0
  205. package/dist/types/category-node.d.ts +36 -0
  206. package/dist/types/category-node.js +2 -0
  207. package/dist/types/category-node.js.map +1 -0
  208. package/dist/types/checkout.d.ts +33 -0
  209. package/dist/types/checkout.js +2 -0
  210. package/dist/types/checkout.js.map +1 -0
  211. package/dist/types/commerce-config.d.ts +11 -0
  212. package/dist/types/commerce-config.js +2 -0
  213. package/dist/types/commerce-config.js.map +1 -0
  214. package/dist/types/commerce-service.d.ts +109 -0
  215. package/dist/types/commerce-service.js +2 -0
  216. package/dist/types/commerce-service.js.map +1 -0
  217. package/dist/types/family.d.ts +16 -0
  218. package/dist/types/family.js +2 -0
  219. package/dist/types/family.js.map +1 -0
  220. package/dist/types/index.d.ts +13 -0
  221. package/dist/types/index.js +8 -0
  222. package/dist/types/index.js.map +1 -0
  223. package/dist/types/item-selector.d.ts +72 -0
  224. package/dist/types/item-selector.js +2 -0
  225. package/dist/types/item-selector.js.map +1 -0
  226. package/dist/types/line-item.d.ts +14 -0
  227. package/dist/types/line-item.js +2 -0
  228. package/dist/types/line-item.js.map +1 -0
  229. package/dist/types/multi-family-selector-props.d.ts +16 -0
  230. package/dist/types/multi-family-selector-props.js +2 -0
  231. package/dist/types/multi-family-selector-props.js.map +1 -0
  232. package/dist/types/product.d.ts +15 -0
  233. package/dist/types/product.js +2 -0
  234. package/dist/types/product.js.map +1 -0
  235. package/dist/types/promo.d.ts +7 -0
  236. package/dist/types/promo.js +2 -0
  237. package/dist/types/promo.js.map +1 -0
  238. package/dist/types/selection-ui-specifier.d.ts +40 -0
  239. package/dist/types/selection-ui-specifier.js +2 -0
  240. package/dist/types/selection-ui-specifier.js.map +1 -0
  241. package/dist/types/string-mutator.d.ts +9 -0
  242. package/dist/types/string-mutator.js +2 -0
  243. package/dist/types/string-mutator.js.map +1 -0
  244. package/dist/types/token-separators.d.ts +6 -0
  245. package/dist/types/token-separators.js +2 -0
  246. package/dist/types/token-separators.js.map +1 -0
  247. package/dist/util/analytics.d.ts +9 -0
  248. package/dist/util/analytics.js +10 -0
  249. package/dist/util/analytics.js.map +1 -0
  250. package/dist/util/countries.d.ts +7 -0
  251. package/dist/util/countries.js +197 -0
  252. package/dist/util/countries.js.map +1 -0
  253. package/dist/util/error.d.ts +1 -0
  254. package/dist/util/error.js +22 -0
  255. package/dist/util/error.js.map +1 -0
  256. package/dist/util/index.d.ts +15 -0
  257. package/dist/util/index.js +54 -0
  258. package/dist/util/index.js.map +1 -0
  259. package/dist/util/item-selector-options-accessor.d.ts +3 -0
  260. package/dist/util/item-selector-options-accessor.js +27 -0
  261. package/dist/util/item-selector-options-accessor.js.map +1 -0
  262. package/dist/util/line-item-ref.d.ts +8 -0
  263. package/dist/util/line-item-ref.js +15 -0
  264. package/dist/util/line-item-ref.js.map +1 -0
  265. package/dist/util/multi-family-selector-options-accessor.d.ts +3 -0
  266. package/dist/util/multi-family-selector-options-accessor.js +11 -0
  267. package/dist/util/multi-family-selector-options-accessor.js.map +1 -0
  268. package/dist/util/obs-string-mutator.d.ts +8 -0
  269. package/dist/util/obs-string-mutator.js +15 -0
  270. package/dist/util/obs-string-mutator.js.map +1 -0
  271. package/dist/util/product-media-accessor.d.ts +29 -0
  272. package/dist/util/product-media-accessor.js +22 -0
  273. package/dist/util/product-media-accessor.js.map +1 -0
  274. package/dist/util/promo-codes.d.ts +3 -0
  275. package/dist/util/promo-codes.js +100 -0
  276. package/dist/util/promo-codes.js.map +1 -0
  277. package/dist/util/selection-ui-specifiers.d.ts +3 -0
  278. package/dist/util/selection-ui-specifiers.js +24 -0
  279. package/dist/util/selection-ui-specifiers.js.map +1 -0
  280. package/dist/util/square-payment.d.ts +7 -0
  281. package/dist/util/square-payment.js +37 -0
  282. package/dist/util/square-payment.js.map +1 -0
  283. package/dist/util/use-sync-sku-param-w-current-item.d.ts +2 -0
  284. package/dist/util/use-sync-sku-param-w-current-item.js +61 -0
  285. package/dist/util/use-sync-sku-param-w-current-item.js.map +1 -0
  286. package/index.ts +13 -0
  287. package/libreapps-ui.d.ts +108 -0
  288. package/package.json +67 -0
  289. package/service/context.tsx +45 -0
  290. package/service/debug.ts +41 -0
  291. package/service/impls/standalone/actual-line-item.ts +136 -0
  292. package/service/impls/standalone/get-instance.ts +64 -0
  293. package/service/impls/standalone/index.ts +579 -0
  294. package/service/impls/standalone/order/firebase.ts +14 -0
  295. package/service/impls/standalone/order/index.ts +129 -0
  296. package/service/impls/standalone/persistence.ts +33 -0
  297. package/service/path-utils.ts +26 -0
  298. package/service/sep.ts +7 -0
  299. package/tsconfig.json +17 -0
  300. package/types/README.md +2 -0
  301. package/types/category-node.ts +50 -0
  302. package/types/checkout.ts +47 -0
  303. package/types/commerce-config.ts +13 -0
  304. package/types/commerce-service.ts +128 -0
  305. package/types/family.ts +26 -0
  306. package/types/index.ts +15 -0
  307. package/types/item-selector.ts +97 -0
  308. package/types/line-item.ts +29 -0
  309. package/types/multi-family-selector-props.ts +20 -0
  310. package/types/product.ts +21 -0
  311. package/types/promo.ts +10 -0
  312. package/types/selection-ui-specifier.ts +52 -0
  313. package/types/string-mutator.ts +14 -0
  314. package/types/token-separators.ts +7 -0
  315. package/util/analytics.ts +21 -0
  316. package/util/countries.ts +196 -0
  317. package/util/error.ts +34 -0
  318. package/util/index.ts +71 -0
  319. package/util/item-selector-options-accessor.ts +35 -0
  320. package/util/line-item-ref.ts +23 -0
  321. package/util/multi-family-selector-options-accessor.ts +15 -0
  322. package/util/obs-string-mutator.ts +22 -0
  323. package/util/product-media-accessor.ts +58 -0
  324. package/util/promo-codes.ts +106 -0
  325. package/util/selection-ui-specifiers.ts +30 -0
  326. package/util/square-payment.ts +50 -0
  327. package/util/use-sync-sku-param-w-current-item.ts +88 -0
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import { type LucideProps } from 'lucide-react'
3
+
4
+ const Discover: React.FC<LucideProps> = (props: LucideProps) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ role="img"
8
+ viewBox="0 0 38 24"
9
+ aria-labelledby="pi-discover"
10
+ {...props}
11
+ >
12
+ <title id="pi-discover">Discover</title>
13
+ <path
14
+ d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"
15
+ fill="#000"
16
+ opacity=".07"
17
+ />
18
+ <path d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32" fill="#FFF" />
19
+ <path d="M37 16.95V21c0 1.1-.9 2-2 2H23.228c7.896-1.815 12.043-4.601 13.772-6.05z" fill="#EDA024" />
20
+ <path fill="#494949" d="M9 11h20v2H9z" />
21
+ <path d="M22 12c0 1.7-1.3 3-3 3s-3-1.4-3-3 1.4-3 3-3c1.7 0 3 1.3 3 3z" fill="#EDA024" />
22
+ </svg>
23
+ )
24
+
25
+ export default Discover
@@ -0,0 +1,26 @@
1
+ import React from 'react'
2
+ import { type LucideProps } from 'lucide-react'
3
+
4
+ const Jcb: React.FC<LucideProps> = (props: LucideProps) => (
5
+ <svg viewBox="0 0 750 471" xmlns="http://www.w3.org/2000/svg" {...props}>
6
+ <linearGradient id="a" x1=".031608%" x2="99.974315%" y1="49.999857%" y2="49.999857%">
7
+ <stop offset="0" stopColor="#007b40"/>
8
+ <stop offset="1" stopColor="#55b330"/>
9
+ </linearGradient>
10
+ <linearGradient id="b" x1=".471693%" x2="99.986009%" y1="49.999826%" y2="49.999826%">
11
+ <stop offset="0" stopColor="#1d2970"/><stop offset="1" stopColor="#006dba"/>
12
+ </linearGradient>
13
+ <linearGradient id="c" x1=".113881%" x2="99.986%" y1="50.000896%" y2="50.000896%">
14
+ <stop offset="0" stopColor="#6e2b2f"/><stop offset="1" stopColor="#e30138"/>
15
+ </linearGradient>
16
+ <g fill="none">
17
+ <rect fill="#0e4c96" height="471" rx="40" width="750"/>
18
+ <path d="m617.243183 346.766281c0 41.614606-33.728291 75.359693-75.359693 75.359693h-409.126667v-297.881058c0-41.6262334 33.733028-75.3704593 75.36486-75.3704593l409.1215-.0004307-.000431 297.892255z" fill="#fff"/>
19
+ <path d="m483.858874 242.044797c11.683825.253488 23.437314-.515991 35.07713.400086 11.78724 2.200795 14.627911 20.042991 4.156336 25.887628-7.141594 3.849604-15.632844 1.432185-23.379012 2.113697h-15.854454zm41.832952-32.14431c2.596665 9.164192-6.237923 17.391631-15.065909 16.130079h-26.767043c.184884-8.642125-.367529-18.021593.272179-26.208903 10.723889.301723 21.548523-.615814 32.209341.48019 4.581405 1.149705 8.413541 4.915859 9.351432 9.598634zm64.428586-135.9032616c.49746 17.5012286.071059 35.9264246.213178 53.7829666-.034453 72.596166.072352 145.193982-.054694 217.789111-.468476 27.207289-24.582372 50.844375-51.600147 51.387391-27.045829.111757-54.094452.015934-81.141353.047803v-109.751206c29.469604-.153488 58.958644.307709 88.416125-.231697 13.667199-.858825 28.632506-9.875899 29.269759-24.91422 1.610381-15.101891-12.631152-25.550189-26.152184-27.20169-5.198323-.135142-5.043964-1.514838 0-2.116712 12.891974-2.786489 23.019579-16.133185 19.22569-29.498743-3.236266-14.057855-18.772947-19.498809-31.69642-19.472461-26.351818-.179156-52.709067-.025409-79.06297-.076658.171189-20.488702-.35448-41.000457.285314-61.473746 2.087651-26.7159874 26.805893-48.7478321 53.447049-48.269708 26.283407-.0002868 52.567978.0005741 78.850653-.0004306z" fill="url(#a)"/>
20
+ <path d="m159.740429 125.040498c.67326-27.1638388 24.88819-50.6114681 51.874368-51.0079582 26.944696-.0825712 53.891407-.0116279 80.836874-.0353144-.074031 90.8852626.148234 181.7764466-.11137 272.6579966-1.038003 26.83358-24.989753 49.833439-51.678945 50.30707-26.996341.098665-53.995081.013782-80.992344.042205v-113.453622c26.222611 6.194616 53.722126 8.831643 80.473394 4.721367 15.992103-2.574874 33.487529-10.424216 38.901855-27.014675 3.985861-14.1913 1.741462-29.125965 2.333766-43.691102v-33.824924h-46.296781c-.20814 22.370604.426012 44.780906-.3351 67.125566-1.248296 13.734107-14.845999 22.459889-27.799718 21.994694-16.066681.168734-47.898878-11.640005-47.898878-11.640005-.080058-41.916996.466764-94.407411.692879-136.181298z" fill="url(#b)"/>
21
+ <path d="m309.719995 197.390136c-2.434207.517244-.490854-8.300677-1.113697-11.646172.165935-21.150327-.346253-42.323013.28342-63.458137 2.082823-26.8287443 26.991544-48.9157165 53.73903-48.288171h78.765812c-.073902 90.88469.147933 181.775284-.111154 272.656278-1.038994 26.834093-24.992062 49.833168-51.681319 50.308358-26.997482.099699-53.99738.014212-80.995789.042636v-124.297304c18.440112 15.128222 43.49944 17.484624 66.471655 17.52586 17.317057-.006029 34.533908-2.675619 51.35019-6.67055v-22.772637c-18.953485 9.446312-41.233335 15.445518-62.243398 10.017669-14.655694-3.650599-25.293855-17.811283-25.056232-32.935762-1.698503-15.72852 7.524118-32.335319 22.981724-37.011349 19.190686-6.00831 40.10755-1.412401 58.096107 6.39794 3.854182 2.018155 7.764316 4.521547 6.221799-1.920751v-17.899686c-30.084562-7.157407-62.101499-9.791953-92.328705-2.004739-8.748245 2.468155-17.271248 6.211028-24.379443 11.956517z" fill="url(#c)"/>
22
+ </g>
23
+ </svg>
24
+ )
25
+
26
+ export default Jcb
@@ -0,0 +1,27 @@
1
+ import React from 'react'
2
+ import { type LucideProps } from 'lucide-react'
3
+
4
+ const Mastercard: React.FC<LucideProps> = (props: LucideProps) => (
5
+ <svg
6
+ viewBox="0 0 38 24"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ role="img"
9
+ aria-labelledby="pi-master"
10
+ {...props}
11
+ >
12
+ <title id="pi-master">Mastercard</title>
13
+ <path
14
+ opacity=".07"
15
+ d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"
16
+ />
17
+ <path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32" />
18
+ <circle fill="#EB001B" cx="15" cy="12" r="7" />
19
+ <circle fill="#F79E1B" cx="23" cy="12" r="7" />
20
+ <path
21
+ fill="#FF5F00"
22
+ d="M22 12c0-2.4-1.2-4.5-3-5.7-1.8 1.3-3 3.4-3 5.7s1.2 4.5 3 5.7c1.8-1.2 3-3.3 3-5.7z"
23
+ />
24
+ </svg>
25
+ )
26
+
27
+ export default Mastercard
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import { type LucideProps } from 'lucide-react'
3
+
4
+ const Visa: React.FC<LucideProps> = (props: LucideProps) => (
5
+ <svg
6
+ viewBox="0 0 38 24"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ role="img"
9
+ aria-labelledby="pi-visa"
10
+ {...props}
11
+ >
12
+ <title id="pi-visa">Visa</title>
13
+ <path
14
+ opacity=".07"
15
+ d="M35 0H3C1.3 0 0 1.3 0 3v18c0 1.7 1.4 3 3 3h32c1.7 0 3-1.3 3-3V3c0-1.7-1.4-3-3-3z"
16
+ />
17
+ <path fill="#fff" d="M35 1c1.1 0 2 .9 2 2v18c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2h32" />
18
+ <path
19
+ d="M28.3 10.1H28c-.4 1-.7 1.5-1 3h1.9c-.3-1.5-.3-2.2-.6-3zm2.9 5.9h-1.7c-.1 0-.1 0-.2-.1l-.2-.9-.1-.2h-2.4c-.1 0-.2 0-.2.2l-.3.9c0 .1-.1.1-.1.1h-2.1l.2-.5L27 8.7c0-.5.3-.7.8-.7h1.5c.1 0 .2 0 .2.2l1.4 6.5c.1.4.2.7.2 1.1.1.1.1.1.1.2zm-13.4-.3l.4-1.8c.1 0 .2.1.2.1.7.3 1.4.5 2.1.4.2 0 .5-.1.7-.2.5-.2.5-.7.1-1.1-.2-.2-.5-.3-.8-.5-.4-.2-.8-.4-1.1-.7-1.2-1-.8-2.4-.1-3.1.6-.4.9-.8 1.7-.8 1.2 0 2.5 0 3.1.2h.1c-.1.6-.2 1.1-.4 1.7-.5-.2-1-.4-1.5-.4-.3 0-.6 0-.9.1-.2 0-.3.1-.4.2-.2.2-.2.5 0 .7l.5.4c.4.2.8.4 1.1.6.5.3 1 .8 1.1 1.4.2.9-.1 1.7-.9 2.3-.5.4-.7.6-1.4.6-1.4 0-2.5.1-3.4-.2-.1.2-.1.2-.2.1zm-3.5.3c.1-.7.1-.7.2-1 .5-2.2 1-4.5 1.4-6.7.1-.2.1-.3.3-.3H18c-.2 1.2-.4 2.1-.7 3.2-.3 1.5-.6 3-1 4.5 0 .2-.1.2-.3.2M5 8.2c0-.1.2-.2.3-.2h3.4c.5 0 .9.3 1 .8l.9 4.4c0 .1 0 .1.1.2 0-.1.1-.1.1-.1l2.1-5.1c-.1-.1 0-.2.1-.2h2.1c0 .1 0 .1-.1.2l-3.1 7.3c-.1.2-.1.3-.2.4-.1.1-.3 0-.5 0H9.7c-.1 0-.2 0-.2-.2L7.9 9.5c-.2-.2-.5-.5-.9-.6-.6-.3-1.7-.5-1.9-.5L5 8.2z"
20
+ fill="#142688"
21
+ />
22
+ </svg>
23
+ )
24
+
25
+ export default Visa
@@ -0,0 +1,17 @@
1
+ import { Button } from '@libreapps/ui/primitives'
2
+
3
+ import PaymentMethods from './card-icon-row'
4
+ import type { PropsWithChildren } from 'react'
5
+
6
+ const CCButton: React.FC<PropsWithChildren> = ({
7
+ children
8
+ }) => (
9
+ <Button variant='outline' size='lg' className='flex items-center' >
10
+ <div className='font-sans text-base mr-2 text-muted'>CC</div>
11
+ <PaymentMethods />
12
+ {children}
13
+ </Button>
14
+ )
15
+
16
+
17
+ export default CCButton
@@ -0,0 +1,50 @@
1
+ import { Input } from '@libreapps/ui/primitives'
2
+
3
+ import {
4
+ Form,
5
+ FormControl,
6
+ FormField,
7
+ FormItem,
8
+ FormMessage,
9
+ } from '@libreapps/ui/form'
10
+
11
+ import type { ContactFormType } from '../../../types'
12
+
13
+ const ContactForm: React.FC<{
14
+ form: ContactFormType,
15
+ }> = ({
16
+ form,
17
+ }) => (
18
+ <Form {...form}>
19
+ <form className='text-left'>
20
+ <div className='flex flex-col gap-1 sm:gap-2'>
21
+ <FormField
22
+ control={form.control}
23
+ name='name'
24
+ render={({ field }) => (
25
+ <FormItem className='w-full'>
26
+ <FormControl>
27
+ <Input {...field} placeholder='Full name'/>
28
+ </FormControl>
29
+ <FormMessage className='py-0 space-y-0 !m-0'/>
30
+ </FormItem>
31
+ )}
32
+ />
33
+ <FormField
34
+ control={form.control}
35
+ name='email'
36
+ render={({ field }) => (
37
+ <FormItem className='w-full'>
38
+ <FormControl>
39
+ <Input {...field} placeholder='Email'/>
40
+ </FormControl>
41
+ <FormMessage className='py-0 space-y-0 !m-0'/>
42
+ </FormItem>
43
+ )}
44
+ />
45
+ </div>
46
+ </form>
47
+ </Form>
48
+ )
49
+
50
+ export default ContactForm
@@ -0,0 +1,11 @@
1
+ import React from 'react'
2
+ import { type LucideProps } from 'lucide-react'
3
+
4
+ const Btc: React.FC<LucideProps> = (props: LucideProps) => (
5
+ <svg viewBox="0.004 0 64 64" {...props}>
6
+ <path d="M63.04 39.741c-4.274 17.143-21.638 27.575-38.783 23.301C7.12 58.768-3.313 41.404.962 24.262 5.234 7.117 22.597-3.317 39.737.957c17.144 4.274 27.576 21.64 23.302 38.784z" fill="#f7931a"/>
7
+ <path d="M46.11 27.441c.636-4.258-2.606-6.547-7.039-8.074l1.438-5.768-3.512-.875-1.4 5.616c-.922-.23-1.87-.447-2.812-.662l1.41-5.653-3.509-.875-1.439 5.766c-.764-.174-1.514-.346-2.242-.527l.004-.018-4.842-1.209-.934 3.75s2.605.597 2.55.634c1.422.355 1.68 1.296 1.636 2.042l-1.638 6.571c.098.025.225.061.365.117l-.37-.092-2.297 9.205c-.174.432-.615 1.08-1.609.834.035.051-2.552-.637-2.552-.637l-1.743 4.02 4.57 1.139c.85.213 1.683.436 2.502.646l-1.453 5.835 3.507.875 1.44-5.772c.957.26 1.887.5 2.797.726L27.504 50.8l3.511.875 1.453-5.823c5.987 1.133 10.49.676 12.383-4.738 1.527-4.36-.075-6.875-3.225-8.516 2.294-.531 4.022-2.04 4.483-5.157zM38.087 38.69c-1.086 4.36-8.426 2.004-10.807 1.412l1.928-7.729c2.38.594 10.011 1.77 8.88 6.317zm1.085-11.312c-.99 3.966-7.1 1.951-9.083 1.457l1.748-7.01c1.983.494 8.367 1.416 7.335 5.553z" fill="#ffffff"/>
8
+ </svg>
9
+ )
10
+
11
+ export default Btc
@@ -0,0 +1,20 @@
1
+ import React from 'react'
2
+ import { type LucideProps } from 'lucide-react'
3
+
4
+ const Eth: React.FC<LucideProps> = (props: LucideProps) => (
5
+ <svg viewBox="0 0 32 32" {...props}>
6
+ <g fill="none" fillRule="evenodd">
7
+ <circle cx="16" cy="16" r="16" fill="#627EEA"/>
8
+ <g fill="#FFF" fillRule="nonzero">
9
+ <path fillOpacity=".602" d="M16.498 4v8.87l7.497 3.35z"/>
10
+ <path d="M16.498 4L9 16.22l7.498-3.35z"/>
11
+ <path fillOpacity=".602" d="M16.498 21.968v6.027L24 17.616z"/>
12
+ <path d="M16.498 27.995v-6.028L9 17.616z"/>
13
+ <path fillOpacity=".2" d="M16.498 20.573l7.497-4.353-7.497-3.348z"/>
14
+ <path fillOpacity=".602" d="M9 16.22l7.498 4.353v-7.701z"/>
15
+ </g>
16
+ </g>
17
+ </svg>
18
+ )
19
+
20
+ export default Eth
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { type LucideProps } from 'lucide-react'
3
+
4
+ const Usdt: React.FC<LucideProps> = (props: LucideProps) => (
5
+ <svg viewBox="0 0 32 32" {...props}>
6
+ <g fill="none" fill-rule="evenodd">
7
+ <circle cx="16" cy="16" r="16" fill="#26A17B"/>
8
+ <path fill="#FFF" d="M17.922 17.383v-.002c-.11.008-.677.042-1.942.042-1.01 0-1.721-.03-1.971-.042v.003c-3.888-.171-6.79-.848-6.79-1.658 0-.809 2.902-1.486 6.79-1.66v2.644c.254.018.982.061 1.988.061 1.207 0 1.812-.05 1.925-.06v-2.643c3.88.173 6.775.85 6.775 1.658 0 .81-2.895 1.485-6.775 1.657m0-3.59v-2.366h5.414V7.819H8.595v3.608h5.414v2.365c-4.4.202-7.709 1.074-7.709 2.118 0 1.044 3.309 1.915 7.709 2.118v7.582h3.913v-7.584c4.393-.202 7.694-1.073 7.694-2.116 0-1.043-3.301-1.914-7.694-2.117"/>
9
+ </g>
10
+ </svg>
11
+ )
12
+
13
+ export default Usdt
@@ -0,0 +1,122 @@
1
+ 'use client'
2
+ import React, { useEffect, useState } from 'react'
3
+ import { observer } from 'mobx-react-lite'
4
+
5
+ import { zodResolver } from '@hookform/resolvers/zod'
6
+ import * as z from 'zod'
7
+ import { useForm } from 'react-hook-form'
8
+
9
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@libreapps/ui/primitives'
10
+ import { useAuth } from '@libreapps/auth/service'
11
+
12
+ import { useCommerce } from '../../../service/context'
13
+ import { sendFBEvent, sendGAEvent } from '../../../util/analytics'
14
+ import type { CheckoutStepComponentProps, TransactionStatus } from '../../../types'
15
+
16
+ import METHODS from './methods'
17
+
18
+ const contactFormSchema = z.object({
19
+ name: z.string().min(1, 'Enter your full name.'),
20
+ email: z.string().email(),
21
+ })
22
+
23
+ const PaymentStepForm: React.FC<CheckoutStepComponentProps> = observer(({
24
+ onDone,
25
+ orderId,
26
+ setOrderId
27
+ }) => {
28
+ const cmmc = useCommerce()
29
+ const auth = useAuth() // may be null in some cases
30
+
31
+ const [transactionStatus, setTransactionStatus] = useState<TransactionStatus>('unpaid')
32
+
33
+ if (!auth) {
34
+ console.log("PAYMENT STEP FORM: auth service is null! ")
35
+ }
36
+
37
+ const contactForm = useForm<z.infer<typeof contactFormSchema>>({
38
+ resolver: zodResolver(contactFormSchema),
39
+ defaultValues: {
40
+ name: auth?.user?.displayName ?? '',
41
+ email: auth?.user?.email ?? '',
42
+ },
43
+ })
44
+
45
+ useEffect(() => {
46
+ if (auth?.loggedIn) {
47
+ contactForm.setValue('name', auth!.user?.displayName ?? '')
48
+ contactForm.setValue('email', auth!.user?.email ?? '')
49
+ }
50
+ }, [auth?.loggedIn])
51
+
52
+ const storePaymentInfo = async (paymentInfo: any) => {
53
+ const {name, email} = contactForm.getValues()
54
+ let id: string | undefined = undefined
55
+ if (!orderId) {
56
+ id = await cmmc.createOrder(email, name)
57
+ setOrderId(id)
58
+ }
59
+ if (id) {
60
+ sendGAEvent('add_payment_info', {
61
+ items: cmmc.cartItems.map((item) => ({
62
+ item_id: item.sku,
63
+ item_name: item.title,
64
+ item_category: item.familyId,
65
+ price: item.price,
66
+ quantity: item.quantity
67
+ })),
68
+ value: cmmc.promoAppliedCartTotal,
69
+ currency: 'USD',
70
+ payment_type: paymentInfo.paymentMethod ?? ''
71
+ })
72
+ sendFBEvent('AddPaymentInfo', {
73
+ contents: cmmc.cartItems.map(item => ({
74
+ id: item.sku,
75
+ quantity: item.quantity
76
+ })),
77
+ value: cmmc.promoAppliedCartTotal,
78
+ currency: 'USD'
79
+ })
80
+ await cmmc.updateOrderPaymentInfo(id, paymentInfo)
81
+ }
82
+ }
83
+
84
+ const groupClx = 'grid w-full grid-cols-3 mx-auto ' +
85
+ 'p-0 h-auto overflow-hidden ' +
86
+ 'border-2 bg-background border-level-2 md:bg-level-1 md:border-level-3 '
87
+
88
+ const tabClx = 'whitespace-normal h-full text-xs sm:text-base px-1 text-muted ' +
89
+ 'data-[state=active]:text-accent data-[state=active]:bg-level-2 md:data-[state=active]:bg-level-3'
90
+
91
+ const disabled = transactionStatus === 'paid' || transactionStatus === 'confirmed'
92
+
93
+ return (
94
+ <Tabs defaultValue='card' className='w-full'>
95
+ <TabsList className={groupClx}>
96
+ {METHODS.map(({ label, value }) => (
97
+ <TabsTrigger
98
+ value={value}
99
+ className={tabClx}
100
+ disabled={disabled}
101
+ key={`tabs-${value}`}
102
+ >
103
+ {label}
104
+ </TabsTrigger>
105
+ ))}
106
+ </TabsList>
107
+ {METHODS.map(({Comp: PaymentMethodComp, value}) => (
108
+ <TabsContent value={value} key={`content-${value}`}>
109
+ <PaymentMethodComp
110
+ onDone={onDone}
111
+ transactionStatus={transactionStatus}
112
+ setTransactionStatus={setTransactionStatus}
113
+ storePaymentInfo={storePaymentInfo}
114
+ contactForm={contactForm}
115
+ />
116
+ </TabsContent>
117
+ ))}
118
+ </Tabs>
119
+ )
120
+ })
121
+
122
+ export default PaymentStepForm
@@ -0,0 +1,79 @@
1
+ 'use client'
2
+
3
+ import React from 'react'
4
+ import { Copy } from 'lucide-react'
5
+
6
+ import { Button, toast } from '@libreapps/ui/primitives'
7
+
8
+ import type { PaymentMethodComponentProps } from '../../../../types'
9
+
10
+ import ContactForm from '../contact-form'
11
+
12
+ const InfoField: React.FC<{
13
+ label: string,
14
+ value: React.ReactNode,
15
+ copyValue: string
16
+ }> = ({
17
+ label,
18
+ value,
19
+ copyValue
20
+ }) => {
21
+
22
+ const copyToClipboard = (label: string, text: string) => {
23
+ navigator.clipboard.writeText(text)
24
+ toast(`${label} copied to clipboard.`)
25
+ }
26
+
27
+ return (
28
+ <div className='flex flex-col gap-1'>
29
+ <p className='text-xs'>{label}</p>
30
+ <div className='flex items-center justify-between sm:text-lg border rounded-lg py-2 px-4'>
31
+ {value}
32
+ <Button variant='ghost' size='icon' onClick={() => copyToClipboard(label, copyValue)}>
33
+ <Copy className='h-4 w-4'/>
34
+ </Button>
35
+ </div>
36
+ </div>
37
+ )
38
+ }
39
+
40
+ const PayWithBankTransfer: React.FC<PaymentMethodComponentProps> = ({
41
+ onDone,
42
+ storePaymentInfo,
43
+ contactForm
44
+ }) => {
45
+
46
+ const payByBankTransfer = async () => {
47
+ contactForm.handleSubmit( async () => {
48
+ await storePaymentInfo({paymentMethod: 'bank-transfer'})
49
+ onDone()
50
+ })()
51
+ }
52
+
53
+ return (
54
+ <div className='flex flex-col gap-2 mt-6'>
55
+ <ContactForm form={contactForm}/>
56
+ <div className='w-full mx-auto max-w-[50rem]'>
57
+ <div className='flex flex-col gap-4 w-full'>
58
+ <InfoField
59
+ label='Beneficiary Bank'
60
+ value={<div>Bank of America<br/>NA 222 Broadway<br/>New York, New York. 10038</div>}
61
+ copyValue='Bank of America, NA 222 Broadway, New York, New York. 10038'
62
+ />
63
+ <InfoField
64
+ label='Beneficiary'
65
+ value={<div>LibreApps, Inc<br/>4811 Mastin Street<br/>Merriam, KS 66203</div>}
66
+ copyValue='LibreApps, Inc, 4811 Mastin Street, Merriam, KS 66203'
67
+ />
68
+ <InfoField label='Routing Number - ACH' value='113000023 / 111000025' copyValue='113000023 / 111000025'/>
69
+ <InfoField label='Routing Number - Wire' value='026009593' copyValue='026009593'/>
70
+ <InfoField label='Routing Number - SWIFT' value='BOFAUS3N' copyValue='BOFAUS3N'/>
71
+ <InfoField label='Reference' value='Lux' copyValue='Lux'/>
72
+ </div>
73
+ </div>
74
+ <Button onClick={payByBankTransfer} className='mx-auto w-full mt-4'>Continue</Button>
75
+ </div>
76
+ )
77
+ }
78
+
79
+ export default PayWithBankTransfer
@@ -0,0 +1,232 @@
1
+ 'use client'
2
+ import React, { useEffect, useState } from 'react'
3
+
4
+ // @ts-ignore
5
+ import { ApplePay, GooglePay, CreditCard, PaymentForm } from 'react-square-web-payments-sdk'
6
+
7
+ import { observer } from 'mobx-react-lite'
8
+
9
+ import {
10
+ ApplyTypography,
11
+ Button,
12
+ Separator,
13
+ Skeleton,
14
+ } from '@libreapps/ui/primitives'
15
+
16
+ import { cn } from '@libreapps/ui/util'
17
+
18
+ import { useCommerce } from '../../../../service/context'
19
+ import { processSquareCardPayment } from '../../../../util'
20
+ import type { PaymentMethodComponentProps } from '../../../../types'
21
+ import { sendFBEvent, sendGAEvent } from '../../../../util/analytics'
22
+
23
+ import ContactInfo from '../contact-form'
24
+ import PaymentMethods from '../card-icon-row'
25
+
26
+ const PayWithCard: React.FC<PaymentMethodComponentProps> = observer(({
27
+ onDone,
28
+ transactionStatus,
29
+ setTransactionStatus,
30
+ storePaymentInfo,
31
+ contactForm,
32
+ }) => {
33
+ const cmmc = useCommerce()
34
+
35
+ const cardTokenizeResponseReceived = async (
36
+ token: any,
37
+ verifiedBuyer: any
38
+ ) => {
39
+ contactForm.handleSubmit(async () => {
40
+ setTransactionStatus('paid')
41
+ const res = await processSquareCardPayment(token.token, cmmc.promoAppliedCartTotal, verifiedBuyer.token)
42
+ if (res) {
43
+ await storePaymentInfo({paymentMethod: token.details.method ?? null, processed: res})
44
+ setTransactionStatus('confirmed')
45
+ sendGAEvent('purchase', {
46
+ transaction_id: res.payment?.id,
47
+ value: res.payment?.amountMoney?.amount,
48
+ currency: res.payment?.amountMoney?.currency,
49
+ items: cmmc.cartItems.map((item) => ({
50
+ item_id: item.sku,
51
+ item_name: item.title,
52
+ item_category: item.familyId,
53
+ price: item.price,
54
+ quantity: item.quantity
55
+ })),
56
+ })
57
+ sendFBEvent('Purchase', {
58
+ content_ids: cmmc.cartItems.map((item) => item.sku),
59
+ contents: cmmc.cartItems.map(item => ({
60
+ id: item.sku,
61
+ quantity: item.quantity
62
+ })),
63
+ num_items: cmmc.cartItems.length,
64
+ value: cmmc.promoAppliedCartTotal,
65
+ currency: 'USD',
66
+ })
67
+ } else {
68
+ setTransactionStatus('error')
69
+ }
70
+ })()
71
+ }
72
+
73
+ const createVerificationDetails = (): { amount: string; billingContact: { givenName: string; email: string }; currencyCode: string; intent: 'CHARGE' | 'CHARGE_AND_STORE' } => {
74
+ const {name, email} = contactForm.getValues()
75
+ return {
76
+ amount: cmmc.promoAppliedCartTotal.toFixed(2),
77
+ billingContact: {
78
+ givenName: name,
79
+ email,
80
+ },
81
+ currencyCode: 'USD',
82
+ intent: 'CHARGE' as 'CHARGE',
83
+ }
84
+ }
85
+
86
+ const createPaymentRequest = () => ({
87
+ countryCode: "US",
88
+ currencyCode: "USD",
89
+ lineItems: cmmc.cartItems.map(item => ({
90
+ amount: item.price.toFixed(2),
91
+ label: item.title,
92
+ id: item.sku,
93
+ })),
94
+ requestBillingContact: false,
95
+ requestShippingContact: false,
96
+ total: {
97
+ amount: cmmc.promoAppliedCartTotal.toFixed(2),
98
+ label: "Total",
99
+ },
100
+ })
101
+
102
+ /**
103
+ * Reload payment form after checkout value changes (promo code applied, etc.)
104
+ * Reloading is required so that Apple Pay and Google Pay buttons are updated for new cart total.
105
+ */
106
+ const [loadingPaymentForm, setLoadingPaymentForm] = useState<boolean>(false)
107
+ useEffect(() => {
108
+ setLoadingPaymentForm(true)
109
+ const timeout = setTimeout(() => setLoadingPaymentForm(false), 1000)
110
+ return () => clearTimeout(timeout)
111
+ }, [cmmc.promoAppliedCartTotal])
112
+
113
+ if (loadingPaymentForm) {
114
+ return (
115
+ <div className='flex flex-col gap-2'>
116
+ <Skeleton className='w-full h-10' />
117
+ <Skeleton className='w-full h-10' />
118
+ </div>
119
+ )
120
+ }
121
+
122
+ return (
123
+ <PaymentForm
124
+ /**
125
+ * Identifies the calling form with a verified application ID generated from
126
+ * the Square Application Dashboard.
127
+ */
128
+ applicationId={process.env.NEXT_PUBLIC_SQUARE_APPLICATION_ID ?? ''}
129
+ /**
130
+ * Invoked when payment form receives the result of a tokenize generation
131
+ * request. The result will be a valid credit card or wallet token, or an error.
132
+ */
133
+ cardTokenizeResponseReceived={cardTokenizeResponseReceived}
134
+ /**
135
+ * This function enable the Strong Customer Authentication (SCA) flow
136
+ *
137
+ * We strongly recommend use this function to verify the buyer and reduce
138
+ * the chance of fraudulent transactions.
139
+ */
140
+ createVerificationDetails={createVerificationDetails}
141
+ /**
142
+ * This function is required for digital wallets (Apple Pay, Google Pay)
143
+ */
144
+ createPaymentRequest={createPaymentRequest}
145
+ /**
146
+ * Identifies the location of the merchant that is taking the payment.
147
+ * Obtained from the Square Application Dashboard - Locations tab.
148
+ */
149
+ locationId={process.env.NEXT_PUBLIC_SQUARE_LOCATION_ID ?? ''}
150
+ >
151
+ <ApplyTypography className='flex flex-col mt-6 gap-1'>
152
+ {transactionStatus === 'paid' ? (
153
+ <h6 className='mx-auto'>Processing your payment...</h6>
154
+ ) : transactionStatus === 'confirmed' ? (
155
+ <div className='flex flex-col gap-4'>
156
+ <h5 className='mx-auto'>Payment confirmed!</h5>
157
+ <p className='mx-auto'>Thank you for your purchase.</p>
158
+ <Button onClick={onDone}>Continue</Button>
159
+ </div>
160
+ ) : (
161
+ <div className='flex flex-col gap-1'>
162
+ <GooglePay/>
163
+ <ApplePay/>
164
+
165
+ <div className='flex gap-2 whitespace-nowrap items-center my-1 sm:my-3 text-xs text-muted'>
166
+ <Separator className='grow w-auto'/><div className='shrink-0 mx-1'>or</div><Separator className='grow w-auto'/>
167
+ </div>
168
+
169
+ <PaymentMethods />
170
+
171
+ <ContactInfo form={contactForm}/>
172
+ {/* Imitates libreapps/ui Button and Input styles, I was unable to render the
173
+ libreapps/ui button outright and keeping the submit form functionality*/}
174
+ <CreditCard
175
+ style={{
176
+ '.input-container': {
177
+ borderColor: '#666666',
178
+ borderRadius: '8px',
179
+ },
180
+ '.input-container.is-focus': {
181
+ borderColor: '#ffffff',
182
+ },
183
+ '.input-container.is-error': {
184
+ borderColor: '#ff1600',
185
+ },
186
+ '.message-text': {
187
+ color: '#999999',
188
+ },
189
+ '.message-icon': {
190
+ color: '#999999',
191
+ },
192
+ '.message-text.is-error': {
193
+ color: '#ff1600',
194
+ },
195
+ '.message-icon.is-error': {
196
+ color: '#ff1600',
197
+ },
198
+ input: {
199
+ backgroundColor: 'transparent',
200
+ color: '#FFFFFF',
201
+ fontSize: '15px',
202
+ fontFamily: 'helvetica neue, sans-serif',
203
+ },
204
+ 'input::placeholder': {
205
+ color: '#999999',
206
+ },
207
+ 'input.is-error': {
208
+ color: '#ff1600',
209
+ },
210
+ }}
211
+ render={(Button: any) => (
212
+ <Button className={cn(
213
+ 'items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-2',
214
+ 'focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background',
215
+ '!bg-primary !text-primary-fg hover:!bg-primary-hover font-nav whitespace-nowrap not-typography h-10 py-2 px-4',
216
+ '!text-sm rounded-md lg:min-w-[220px] sm:min-w-[220px] flex'
217
+ )}>
218
+ Pay
219
+ </Button>
220
+ )}
221
+ />
222
+ {transactionStatus === 'error' && (
223
+ <p className='mx-auto text-destructive'>There was an error processing your payment.</p>
224
+ )}
225
+ </div>
226
+ )}
227
+ </ApplyTypography>
228
+ </PaymentForm>
229
+ )
230
+ })
231
+
232
+ export default PayWithCard