@0xsequence/marketplace-sdk 0.8.11 → 0.9.0

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 (530) hide show
  1. package/CHANGELOG.md +236 -2
  2. package/dist/CalendarIcon-DbQ7Vxcw.js +141 -0
  3. package/dist/CalendarIcon-DbQ7Vxcw.js.map +1 -0
  4. package/dist/CollectibleCard-C8Ae64Ab.d.ts +71 -0
  5. package/dist/_internal-BgWcRIak.js +22 -0
  6. package/dist/_internal-BgWcRIak.js.map +1 -0
  7. package/dist/abi-BKyRjVcZ.js +0 -0
  8. package/dist/{alien_swap-2B65TDGT.js → alien_swap-B_76IMma.js} +5 -5
  9. package/dist/alien_swap-B_76IMma.js.map +1 -0
  10. package/dist/api-DTIan01C.js +241 -0
  11. package/dist/api-DTIan01C.js.map +1 -0
  12. package/dist/{aqua-xyz-WMYQLAIS.js → aqua-xyz-CMN_TFY5.js} +5 -5
  13. package/dist/aqua-xyz-CMN_TFY5.js.map +1 -0
  14. package/dist/{aura-V22RV5OG.js → aura-Cye_TuHj.js} +5 -5
  15. package/dist/aura-Cye_TuHj.js.map +1 -0
  16. package/dist/{blur-GE5QOMCM.js → blur-DWDMyMpK.js} +5 -5
  17. package/dist/blur-DWDMyMpK.js.map +1 -0
  18. package/dist/builder-api-BFuZNOaN.js +28 -0
  19. package/dist/builder-api-BFuZNOaN.js.map +1 -0
  20. package/dist/builder-api-C_zj5mr3.d.ts +12 -0
  21. package/dist/builder.gen-B9wR2nvF.js +303 -0
  22. package/dist/builder.gen-B9wR2nvF.js.map +1 -0
  23. package/dist/{coinbase-NLHJMGAP.js → coinbase-ByA_XRB0.js} +5 -5
  24. package/dist/coinbase-ByA_XRB0.js.map +1 -0
  25. package/dist/{element-2LGTYYSP.js → element-b77CyXIZ.js} +5 -5
  26. package/dist/element-b77CyXIZ.js.map +1 -0
  27. package/dist/{foundation-BPN66ZTN.js → foundation-DbOrKP9Y.js} +5 -5
  28. package/dist/foundation-DbOrKP9Y.js.map +1 -0
  29. package/dist/index-21LE7OhL.d.ts +102 -0
  30. package/dist/index-BL9RUSEK.d.ts +1803 -0
  31. package/dist/index-BQsgAvtX.d.ts +2938 -0
  32. package/dist/index-BUVWziLP.d.ts +60 -0
  33. package/dist/index-ByznONYE.d.ts +187 -0
  34. package/dist/index-C39K_8SG.d.ts +1 -0
  35. package/dist/index-CLy8y5hm.d.ts +1057 -0
  36. package/dist/index-COt10OgI.d.ts +24 -0
  37. package/dist/index-D5v5iluA.d.ts +809 -0
  38. package/dist/index-DPNWNa7t.d.ts +414 -0
  39. package/dist/index-DXMfTZ1F.d.ts +7 -0
  40. package/dist/index-DaE5ZNHb.d.ts +24 -0
  41. package/dist/index-DsfCs3-x.d.ts +122 -0
  42. package/dist/index-DvpBZgor.d.ts +1 -0
  43. package/dist/index-dUb6wb4Y.d.ts +22 -0
  44. package/dist/index.css +397 -371
  45. package/dist/index.d.ts +10 -29
  46. package/dist/index.js +13 -104
  47. package/dist/{looks-rare-MZRSOPT4.js → looks-rare-C1VqNcSM.js} +5 -5
  48. package/dist/looks-rare-C1VqNcSM.js.map +1 -0
  49. package/dist/{magic-eden-PUBL6KWW.js → magic-eden-ea_AGCZr.js} +5 -5
  50. package/dist/magic-eden-ea_AGCZr.js.map +1 -0
  51. package/dist/{manifold-GA445YJ6.js → manifold-8y8J2sjT.js} +5 -5
  52. package/dist/manifold-8y8J2sjT.js.map +1 -0
  53. package/dist/marketplace-logos-CSeGcPW4.js +50 -0
  54. package/dist/marketplace-logos-CSeGcPW4.js.map +1 -0
  55. package/dist/marketplace-nwnZv9Cb.js +1913 -0
  56. package/dist/marketplace-nwnZv9Cb.js.map +1 -0
  57. package/dist/marketplace.gen-BSDIX7NZ.js +1077 -0
  58. package/dist/marketplace.gen-BSDIX7NZ.js.map +1 -0
  59. package/dist/marketplaceConfig-C6X1SUik.js +71 -0
  60. package/dist/marketplaceConfig-C6X1SUik.js.map +1 -0
  61. package/dist/{mintify-UMC5PTKC.js → mintify-LA68TzWg.js} +5 -5
  62. package/dist/mintify-LA68TzWg.js.map +1 -0
  63. package/dist/new-marketplace-types-Bfis0U4J.d.ts +1546 -0
  64. package/dist/{nftx-AX3CY3IE.js → nftx-D3Tc8nzd.js} +5 -5
  65. package/dist/nftx-D3Tc8nzd.js.map +1 -0
  66. package/dist/{okx-GNVLAE2R.js → okx-hbqg6oIJ.js} +5 -5
  67. package/dist/okx-hbqg6oIJ.js.map +1 -0
  68. package/dist/{open-sea-KI43GVEB.js → open-sea-BccuK8-t.js} +5 -5
  69. package/dist/open-sea-BccuK8-t.js.map +1 -0
  70. package/dist/options-B4QN7Xou.js +0 -0
  71. package/dist/primary-sale-C55ALnfQ.js +1264 -0
  72. package/dist/primary-sale-C55ALnfQ.js.map +1 -0
  73. package/dist/queries-CUU65uYZ.js +599 -0
  74. package/dist/queries-CUU65uYZ.js.map +1 -0
  75. package/dist/{rarible-2J3MMZJ7.js → rarible-BgTwwj9g.js} +5 -5
  76. package/dist/rarible-BgTwwj9g.js.map +1 -0
  77. package/dist/react/_internal/api/index.d.ts +4 -86
  78. package/dist/react/_internal/api/index.js +7 -150
  79. package/dist/react/_internal/databeat/index.d.ts +45 -41
  80. package/dist/react/_internal/databeat/index.js +23 -27
  81. package/dist/react/_internal/index.d.ts +7 -76
  82. package/dist/react/_internal/index.js +9 -176
  83. package/dist/react/_internal/wagmi/index.d.ts +4 -17
  84. package/dist/react/_internal/wagmi/index.js +5 -14
  85. package/dist/react/hooks/index.d.ts +18 -3652
  86. package/dist/react/hooks/index.js +23 -153
  87. package/dist/react/hooks/options/index.d.ts +4 -8
  88. package/dist/react/hooks/options/index.js +11 -21
  89. package/dist/react/index.d.ts +18 -36
  90. package/dist/react/index.js +23 -193
  91. package/dist/react/queries/index.d.ts +8 -26
  92. package/dist/react/queries/index.js +18 -51
  93. package/dist/react/ssr/index.d.ts +19 -13
  94. package/dist/react/ssr/index.js +29 -28
  95. package/dist/react/ssr/index.js.map +1 -1
  96. package/dist/react/ui/components/marketplace-collectible-card/index.d.ts +9 -0
  97. package/dist/react/ui/components/marketplace-collectible-card/index.js +23 -0
  98. package/dist/react/ui/components/marketplace-collectible-card/utils/index.d.ts +8 -0
  99. package/dist/react/ui/components/marketplace-collectible-card/utils/index.js +10 -0
  100. package/dist/react/ui/components/marketplace-logos/index.d.ts +26 -24
  101. package/dist/react/ui/components/marketplace-logos/index.js +3 -45
  102. package/dist/react/ui/icons/index.d.ts +1 -2
  103. package/dist/react/ui/icons/index.js +10 -14
  104. package/dist/react/ui/index.d.ts +9 -116
  105. package/dist/react/ui/index.js +23 -41
  106. package/dist/react/ui/modals/_internal/components/actionModal/index.d.ts +59 -33
  107. package/dist/react/ui/modals/_internal/components/actionModal/index.js +23 -31
  108. package/dist/react-BbHBl6gg.css +80 -0
  109. package/dist/react-BbHBl6gg.css.map +1 -0
  110. package/dist/react-DAIicQPT.js +8938 -0
  111. package/dist/react-DAIicQPT.js.map +1 -0
  112. package/dist/{sequence-TGLUFEPQ.js → sequence-Do3kzb4J.js} +5 -5
  113. package/dist/sequence-Do3kzb4J.js.map +1 -0
  114. package/dist/src-Dz2CfBL0.js +8 -0
  115. package/dist/src-Dz2CfBL0.js.map +1 -0
  116. package/dist/{sudo-swap-M2O6E3TE.js → sudo-swap-B6vPKxBz.js} +5 -5
  117. package/dist/sudo-swap-B6vPKxBz.js.map +1 -0
  118. package/dist/{super-rare-UU2U4LIN.js → super-rare-eCm1SE6O.js} +5 -5
  119. package/dist/super-rare-eCm1SE6O.js.map +1 -0
  120. package/dist/token-Da4TdyUk.js +2091 -0
  121. package/dist/token-Da4TdyUk.js.map +1 -0
  122. package/dist/transaction-CcVViHEL.js +97 -0
  123. package/dist/transaction-CcVViHEL.js.map +1 -0
  124. package/dist/types/index.d.ts +3 -13
  125. package/dist/types/index.js +5 -44
  126. package/dist/types-DwWE6xOF.js +13 -0
  127. package/dist/types-DwWE6xOF.js.map +1 -0
  128. package/dist/utils/abi/index.d.ts +5 -3
  129. package/dist/utils/abi/index.js +6 -26
  130. package/dist/utils/abi/marketplace/index.d.ts +2 -805
  131. package/dist/utils/abi/marketplace/index.js +3 -11
  132. package/dist/utils/abi/primary-sale/index.d.ts +2 -1054
  133. package/dist/utils/abi/primary-sale/index.js +3 -9
  134. package/dist/utils/abi/token/index.d.ts +2 -1125
  135. package/dist/utils/abi/token/index.js +3 -11
  136. package/dist/utils/index.d.ts +8 -91
  137. package/dist/utils/index.js +11 -57
  138. package/dist/utils-BPYfgDSL.js +44 -0
  139. package/dist/utils-BPYfgDSL.js.map +1 -0
  140. package/dist/utils-CW2NA5KG.js +216 -0
  141. package/dist/utils-CW2NA5KG.js.map +1 -0
  142. package/dist/wagmi-CDzEQbfk.js +166 -0
  143. package/dist/wagmi-CDzEQbfk.js.map +1 -0
  144. package/dist/{x2y2-3W5BBMZC.js → x2y2-DD17tT91.js} +5 -5
  145. package/dist/x2y2-DD17tT91.js.map +1 -0
  146. package/dist/{zora-6EY6FUH6.js → zora-BpSG9UzS.js} +5 -5
  147. package/dist/zora-BpSG9UzS.js.map +1 -0
  148. package/eslint/use-client.js +0 -6
  149. package/package.json +36 -35
  150. package/src/index.ts +1 -2
  151. package/src/react/_internal/api/__mocks__/builder.msw.ts +5 -3
  152. package/src/react/_internal/api/__mocks__/indexer.msw.ts +9 -8
  153. package/src/react/_internal/api/__mocks__/marketplace.msw.ts +4 -6
  154. package/src/react/_internal/api/__mocks__/metadata.msw.ts +1 -1
  155. package/src/react/_internal/api/builder.gen.ts +6 -7
  156. package/src/react/_internal/api/get-query-client.ts +2 -2
  157. package/src/react/_internal/api/index.ts +2 -2
  158. package/src/react/_internal/api/marketplace.gen.ts +505 -26
  159. package/src/react/_internal/api/query-keys.ts +13 -6
  160. package/src/react/_internal/api/services.ts +42 -52
  161. package/src/react/_internal/index.ts +1 -1
  162. package/src/react/_internal/types.ts +10 -23
  163. package/src/react/_internal/utils.ts +1 -2
  164. package/src/react/_internal/wagmi/__tests__/create-config.test.ts +5 -5
  165. package/src/react/_internal/wagmi/create-config.ts +23 -9
  166. package/src/react/_internal/wagmi/get-connectors.ts +10 -5
  167. package/src/react/_internal/wallet/__tests__/wallet.test.ts +1 -1
  168. package/src/react/_internal/wallet/wallet.ts +18 -18
  169. package/src/react/hooks/__tests__/__snapshots__/useListCollections.test.tsx.snap +181 -2
  170. package/src/react/hooks/__tests__/__snapshots__/useMarketplaceConfig.test.tsx.snap +54 -6
  171. package/src/react/hooks/__tests__/useAutoSelectFeeOption.test.tsx +8 -5
  172. package/src/react/hooks/__tests__/useBalanceOfCollectible.test.tsx +1 -1
  173. package/src/react/hooks/__tests__/useCancelOrder.test.tsx +4 -4
  174. package/src/react/hooks/__tests__/useCancelTransactionSteps.test.tsx +1 -1
  175. package/src/react/hooks/__tests__/useCheckoutOptionsSalesContract.test.tsx +225 -0
  176. package/src/react/hooks/__tests__/useCollectible.test.tsx +14 -16
  177. package/src/react/hooks/__tests__/useCollection.test.tsx +4 -4
  178. package/src/react/hooks/__tests__/useCollectionBalanceDetails.test.tsx +1 -27
  179. package/src/react/hooks/__tests__/useCollectionDetails.test.tsx +1 -1
  180. package/src/react/hooks/__tests__/useCollectionDetailsPolling.test.tsx +4 -4
  181. package/src/react/hooks/__tests__/useComparePrices.test.tsx +7 -6
  182. package/src/react/hooks/__tests__/useConvertPriceToUSD.test.tsx +1 -1
  183. package/src/react/hooks/__tests__/useCountListingsForCollectible.test.tsx +2 -2
  184. package/src/react/hooks/__tests__/useCountOfCollectables.test.tsx +5 -5
  185. package/src/react/hooks/__tests__/useCountOffersForCollectible.test.tsx +2 -2
  186. package/src/react/hooks/__tests__/useCurrency.test.tsx +5 -3
  187. package/src/react/hooks/__tests__/useFilters.test.tsx +1 -1
  188. package/src/react/hooks/__tests__/useFloorOrder.test.tsx +4 -4
  189. package/src/react/hooks/__tests__/useGenerateCancelTransaction.test.tsx +5 -6
  190. package/src/react/hooks/__tests__/useGenerateListingTransaction.test.tsx +1 -1
  191. package/src/react/hooks/__tests__/useGenerateOfferTransaction.test.tsx +1 -1
  192. package/src/react/hooks/__tests__/useGenerateSellTransaction.test.tsx +1 -1
  193. package/src/react/hooks/__tests__/useGetTokenSuppliesMap.test.tsx +104 -0
  194. package/src/react/hooks/__tests__/useHighestOffer.test.tsx +4 -20
  195. package/src/react/hooks/__tests__/useInventory.test.tsx +1 -37
  196. package/src/react/hooks/__tests__/useListCollectibleActivities.test.tsx +11 -13
  197. package/src/react/hooks/__tests__/useListCollectibles.test.tsx +5 -5
  198. package/src/react/hooks/__tests__/useListCollectiblesPaginated.test.tsx +10 -15
  199. package/src/react/hooks/__tests__/useListCollectionActivities.test.tsx +13 -15
  200. package/src/react/hooks/__tests__/useListCollections.test.tsx +4 -4
  201. package/src/react/hooks/__tests__/useListListingsForCollectible.test.tsx +3 -2
  202. package/src/react/hooks/__tests__/useListMarketCardData.test.tsx +301 -0
  203. package/src/react/hooks/__tests__/useListOffersForCollectible.test.tsx +1 -1
  204. package/src/react/hooks/__tests__/useListTokenMetadata.test.tsx +111 -0
  205. package/src/react/hooks/__tests__/useLowestListing.test.tsx +1 -1
  206. package/src/react/hooks/__tests__/useMarketCurrencies.test.tsx +1 -1
  207. package/src/react/hooks/__tests__/useRoyalty.test.tsx +0 -23
  208. package/src/react/hooks/index.ts +27 -17
  209. package/src/react/hooks/options/index.ts +0 -1
  210. package/src/react/hooks/useAutoSelectFeeOption.tsx +1 -1
  211. package/src/react/hooks/useBalanceOfCollectible.tsx +14 -10
  212. package/src/react/hooks/useCancelTransactionSteps.tsx +7 -3
  213. package/src/react/hooks/useCheckoutOptionsSalesContract.tsx +67 -0
  214. package/src/react/hooks/useCollectible.tsx +64 -49
  215. package/src/react/hooks/useCollection.tsx +60 -11
  216. package/src/react/hooks/useCollectionBalanceDetails.tsx +20 -27
  217. package/src/react/hooks/useCollectionDetails.ts +69 -0
  218. package/src/react/hooks/useCollectionDetailsPolling.tsx +10 -2
  219. package/src/react/hooks/useComparePrices.tsx +18 -21
  220. package/src/react/hooks/useConvertPriceToUSD.tsx +20 -37
  221. package/src/react/hooks/useCountListingsForCollectible.tsx +64 -52
  222. package/src/react/hooks/useCountOfCollectables.tsx +61 -67
  223. package/src/react/hooks/useCountOfPrimarySaleItems.tsx +13 -0
  224. package/src/react/hooks/useCountOffersForCollectible.tsx +64 -52
  225. package/src/react/hooks/useCurrency.tsx +56 -64
  226. package/src/react/hooks/useERC721SaleMintedTokens.tsx +67 -0
  227. package/src/react/hooks/useFilterState.tsx +1 -2
  228. package/src/react/hooks/useFloorOrder.tsx +65 -37
  229. package/src/react/hooks/useGenerateCancelTransaction.tsx +17 -15
  230. package/src/react/hooks/useGenerateListingTransaction.tsx +16 -6
  231. package/src/react/hooks/useGenerateOfferTransaction.tsx +16 -7
  232. package/src/react/hooks/useGenerateSellTransaction.tsx +19 -15
  233. package/src/react/hooks/useGetReceiptFromHash.tsx +32 -3
  234. package/src/react/hooks/useGetTokenRanges.tsx +31 -0
  235. package/src/react/hooks/useGetTokenSuppliesMap.tsx +73 -0
  236. package/src/react/hooks/useHighestOffer.tsx +68 -4
  237. package/src/react/hooks/useInventory.tsx +8 -6
  238. package/src/react/hooks/useList1155ShopCardData.tsx +103 -0
  239. package/src/react/hooks/useList721ShopCardData.tsx +160 -0
  240. package/src/react/hooks/useListBalances.tsx +7 -10
  241. package/src/react/hooks/useListCollectibleActivities.tsx +89 -49
  242. package/src/react/hooks/useListCollectibles.tsx +78 -26
  243. package/src/react/hooks/useListCollectiblesPaginated.tsx +96 -63
  244. package/src/react/hooks/useListCollectionActivities.tsx +84 -49
  245. package/src/react/hooks/useListCollections.tsx +72 -18
  246. package/src/react/hooks/useListListingsForCollectible.tsx +90 -49
  247. package/src/react/hooks/useListMarketCardData.tsx +157 -0
  248. package/src/react/hooks/useListOffersForCollectible.tsx +11 -15
  249. package/src/react/hooks/useListPrimarySaleItems.ts +102 -0
  250. package/src/react/hooks/useListShopCardData.tsx +70 -0
  251. package/src/react/hooks/useListTokenMetadata.tsx +73 -0
  252. package/src/react/hooks/useLowestListing.tsx +68 -4
  253. package/src/react/hooks/useMarketCurrencies.tsx +62 -5
  254. package/src/react/hooks/useRoyalty.tsx +57 -13
  255. package/src/react/hooks/useShopCollectibleSaleData.tsx +349 -0
  256. package/src/react/hooks/useTokenSaleDetailsBatch.tsx +134 -0
  257. package/src/react/hooks/useTransferTokens.tsx +1 -1
  258. package/src/react/hooks/util/optimisticCancelUpdates.ts +5 -7
  259. package/src/react/index.ts +5 -3
  260. package/src/react/queries/balanceOfCollectible.ts +1 -1
  261. package/src/react/queries/collectible.ts +66 -0
  262. package/src/react/queries/collection.ts +55 -0
  263. package/src/react/queries/collectionDetails.ts +64 -0
  264. package/src/react/queries/countListingsForCollectible.ts +73 -0
  265. package/src/react/queries/countOfCollectables.ts +83 -0
  266. package/src/react/queries/countOfPrimarySaleItems.ts +48 -0
  267. package/src/react/queries/countOffersForCollectible.ts +73 -0
  268. package/src/react/queries/currency.ts +83 -0
  269. package/src/react/queries/floorOrder.ts +63 -0
  270. package/src/react/queries/getTokenSuppliesMap.ts +77 -0
  271. package/src/react/queries/highestOffer.ts +48 -40
  272. package/src/react/queries/index.ts +7 -4
  273. package/src/react/queries/inventory.ts +38 -4
  274. package/src/react/queries/listBalances.ts +14 -30
  275. package/src/react/queries/listCollectibleActivities.ts +97 -0
  276. package/src/react/queries/listCollectibles.ts +117 -47
  277. package/src/react/queries/listCollectiblesPaginated.ts +87 -0
  278. package/src/react/queries/listCollectionActivities.ts +95 -0
  279. package/src/react/queries/listCollections.ts +55 -10
  280. package/src/react/queries/listListingsForCollectible.ts +82 -0
  281. package/src/react/queries/listTokenMetadata.ts +47 -18
  282. package/src/react/queries/lowestListing.ts +48 -31
  283. package/src/react/queries/marketCurrencies.ts +52 -35
  284. package/src/react/queries/marketplaceConfig.ts +56 -81
  285. package/src/react/ssr/__tests__/__snapshots__/create-ssr-client.test.ts.snap +54 -6
  286. package/src/react/ssr/__tests__/create-ssr-client.test.ts +0 -3
  287. package/src/react/ssr/create-ssr-client.ts +6 -11
  288. package/src/react/types/query.ts +34 -0
  289. package/src/react/ui/components/ModelViewer.tsx +1 -1
  290. package/src/react/ui/components/_internals/action-button/ActionButton.tsx +47 -13
  291. package/src/react/ui/components/_internals/action-button/__tests__/ActionButtonBody.test.tsx +1 -1
  292. package/src/react/ui/components/_internals/action-button/__tests__/NonOwnerActions.test.tsx +28 -15
  293. package/src/react/ui/components/_internals/action-button/__tests__/OwnerActions.test.tsx +1 -1
  294. package/src/react/ui/components/_internals/action-button/__tests__/useActionButtonLogic.test.tsx +15 -9
  295. package/src/react/ui/components/_internals/action-button/components/ActionButtonBody.tsx +1 -1
  296. package/src/react/ui/components/_internals/action-button/components/NonOwnerActions.tsx +78 -15
  297. package/src/react/ui/components/_internals/action-button/components/OwnerActions.tsx +1 -1
  298. package/src/react/ui/components/_internals/action-button/hooks/useActionButtonLogic.ts +13 -16
  299. package/src/react/ui/components/_internals/action-button/store.ts +46 -18
  300. package/src/react/ui/components/marketplace-collectible-card/CollectibleCard.tsx +17 -0
  301. package/src/react/ui/components/marketplace-collectible-card/CollectibleCardSkeleton.tsx +24 -0
  302. package/src/react/ui/components/marketplace-collectible-card/Footer.tsx +231 -0
  303. package/src/react/ui/components/marketplace-collectible-card/components/ActionButtonWrapper.tsx +76 -0
  304. package/src/react/ui/components/marketplace-collectible-card/components/BaseCard.tsx +58 -0
  305. package/src/react/ui/components/marketplace-collectible-card/index.ts +3 -0
  306. package/src/react/ui/components/marketplace-collectible-card/types.ts +98 -0
  307. package/src/react/ui/components/marketplace-collectible-card/utils/formatPrice.ts +45 -0
  308. package/src/react/ui/components/marketplace-collectible-card/utils/index.ts +2 -0
  309. package/src/react/ui/components/marketplace-collectible-card/utils/supplyStatus.ts +39 -0
  310. package/src/react/ui/components/marketplace-collectible-card/variants/MarketCard.tsx +125 -0
  311. package/src/react/ui/components/marketplace-collectible-card/variants/ShopCard.tsx +102 -0
  312. package/src/react/ui/components/marketplace-logos/marketplace-logos.tsx +1 -1
  313. package/src/react/ui/components/{collectible-card/media → media}/Media.tsx +47 -26
  314. package/src/react/ui/components/{collectible-card/media → media}/types.ts +3 -1
  315. package/src/react/ui/index.ts +8 -7
  316. package/src/react/ui/modals/BuyModal/__tests__/BuyModalRouter.test.tsx +554 -0
  317. package/src/react/ui/modals/BuyModal/__tests__/ERC1155ShopModal.test.tsx +392 -0
  318. package/src/react/ui/modals/BuyModal/__tests__/ERC721ShopModal.test.tsx +272 -0
  319. package/src/react/ui/modals/BuyModal/__tests__/Modal.test.tsx.bak +112 -0
  320. package/src/react/ui/modals/BuyModal/__tests__/Modal1155.test.tsx +117 -13
  321. package/src/react/ui/modals/BuyModal/__tests__/store.test.ts +10 -7
  322. package/src/react/ui/modals/BuyModal/components/BuyModalRouter.tsx +157 -0
  323. package/src/react/ui/modals/BuyModal/components/ERC1155BuyModal.tsx +136 -0
  324. package/src/react/ui/modals/BuyModal/components/ERC1155QuantityModal.tsx +183 -0
  325. package/src/react/ui/modals/BuyModal/components/ERC1155ShopModal.tsx +121 -0
  326. package/src/react/ui/modals/BuyModal/components/ERC721BuyModal.tsx +85 -0
  327. package/src/react/ui/modals/BuyModal/components/ERC721ShopModal.tsx +86 -0
  328. package/src/react/ui/modals/BuyModal/components/Modal.tsx +14 -0
  329. package/src/react/ui/modals/BuyModal/components/types.ts +8 -0
  330. package/src/react/ui/modals/BuyModal/hooks/__tests__/useCheckoutOptions.test.tsx +5 -5
  331. package/src/react/ui/modals/BuyModal/hooks/__tests__/useERC1155Checkout.test.tsx +379 -0
  332. package/src/react/ui/modals/BuyModal/hooks/__tests__/useERC721SalePaymentParams.test.tsx +253 -0
  333. package/src/react/ui/modals/BuyModal/hooks/__tests__/{useFees.test.tsx → useMarketPlatformFee.test.tsx} +10 -11
  334. package/src/react/ui/modals/BuyModal/hooks/useCheckoutOptions.ts +63 -45
  335. package/src/react/ui/modals/BuyModal/hooks/useERC1155Checkout.ts +73 -0
  336. package/src/react/ui/modals/BuyModal/hooks/useERC721SalePaymentParams.ts +196 -0
  337. package/src/react/ui/modals/BuyModal/hooks/useLoadData.ts +74 -18
  338. package/src/react/ui/modals/BuyModal/hooks/useMarketPlatformFee.ts +53 -0
  339. package/src/react/ui/modals/BuyModal/hooks/usePaymentModalParams.ts +30 -15
  340. package/src/react/ui/modals/BuyModal/store.ts +147 -13
  341. package/src/react/ui/modals/CreateListingModal/Modal.tsx +1 -1
  342. package/src/react/ui/modals/CreateListingModal/__tests__/Modal.test.tsx +2 -2
  343. package/src/react/ui/modals/CreateListingModal/hooks/useCreateListing.tsx +0 -1
  344. package/src/react/ui/modals/CreateListingModal/hooks/useGetTokenApproval.ts +4 -3
  345. package/src/react/ui/modals/CreateListingModal/hooks/useTransactionSteps.tsx +12 -9
  346. package/src/react/ui/modals/CreateListingModal/index.tsx +1 -1
  347. package/src/react/ui/modals/MakeOfferModal/Modal.tsx +2 -2
  348. package/src/react/ui/modals/MakeOfferModal/__tests__/Modal.test.tsx +1 -1
  349. package/src/react/ui/modals/MakeOfferModal/hooks/useGetTokenApproval.tsx +3 -2
  350. package/src/react/ui/modals/MakeOfferModal/hooks/useMakeOffer.tsx +0 -1
  351. package/src/react/ui/modals/MakeOfferModal/hooks/useTransactionSteps.tsx +12 -10
  352. package/src/react/ui/modals/MakeOfferModal/index.tsx +1 -1
  353. package/src/react/ui/modals/SellModal/Modal.tsx +3 -3
  354. package/src/react/ui/modals/SellModal/__tests__/Modal.test.tsx +6 -4
  355. package/src/react/ui/modals/SellModal/hooks/useGetTokenApproval.tsx +5 -4
  356. package/src/react/ui/modals/SellModal/hooks/useSell.tsx +0 -1
  357. package/src/react/ui/modals/SellModal/hooks/useTransactionSteps.tsx +11 -8
  358. package/src/react/ui/modals/SuccessfulPurchaseModal/__tests__/Modal.test.tsx +12 -8
  359. package/src/react/ui/modals/SuccessfulPurchaseModal/index.tsx +34 -28
  360. package/src/react/ui/modals/SuccessfulPurchaseModal/store.ts +71 -0
  361. package/src/react/ui/modals/TransferModal/_store.ts +1 -7
  362. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TokenQuantityInput.tsx +2 -3
  363. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/index.tsx +2 -2
  364. package/src/react/ui/modals/_internal/components/actionModal/ActionModal.test.tsx +1 -2
  365. package/src/react/ui/modals/_internal/components/actionModal/ActionModal.tsx +107 -112
  366. package/src/react/ui/modals/_internal/components/actionModal/store.ts +45 -12
  367. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/__tests__/index.test.tsx +1 -1
  368. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/index.tsx +0 -1
  369. package/src/react/ui/modals/_internal/components/floorPriceText/index.tsx +4 -4
  370. package/src/react/ui/modals/_internal/components/quantityInput/QuantityInputBase.tsx +166 -0
  371. package/src/react/ui/modals/_internal/components/quantityInput/index.tsx +12 -141
  372. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/__tests__/SelectWaasFeeOptions.test.tsx +1 -1
  373. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/_components/BalanceIndicator.tsx +1 -2
  374. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/useWaasFeeOptionManager.tsx +0 -1
  375. package/src/react/ui/modals/_internal/components/switchChainModal/__tests__/SwitchChainModal.test.tsx +12 -8
  376. package/src/react/ui/modals/_internal/components/switchChainModal/index.tsx +35 -33
  377. package/src/react/ui/modals/_internal/components/switchChainModal/store.ts +61 -32
  378. package/src/react/ui/modals/_internal/components/transactionPreview/index.tsx +1 -1
  379. package/src/react/ui/modals/_internal/components/transactionStatusModal/__tests__/TransactionStatusModal.test.tsx +1 -1
  380. package/src/react/ui/modals/_internal/components/transactionStatusModal/hooks/useTransactionStatus.ts +0 -1
  381. package/src/react/ui/modals/_internal/components/transactionStatusModal/store.ts +1 -1
  382. package/src/react/ui/modals/_internal/components/waasFeeOptionsSelect/WaasFeeOptionsSelect.tsx +1 -1
  383. package/src/react/ui/modals/modal-provider.tsx +3 -4
  384. package/src/types/api-types.ts +36 -36
  385. package/src/types/buyModalErrors.ts +438 -0
  386. package/src/types/index.ts +5 -2
  387. package/src/types/new-marketplace-types.ts +6 -21
  388. package/src/types/sdk-config.ts +19 -24
  389. package/src/types/types.ts +17 -0
  390. package/src/types/waas-types.ts +1 -1
  391. package/src/utils/_internal/error/transaction.ts +36 -1
  392. package/src/utils/abi/index.ts +1 -1
  393. package/src/utils/abi/primary-sale/index.ts +1 -1
  394. package/src/utils/abi/token/index.ts +2 -1
  395. package/src/utils/decode/erc20.ts +1 -1
  396. package/src/utils/index.ts +3 -3
  397. package/test/const.ts +3 -1
  398. package/test/mocks/wallet.ts +1 -1
  399. package/test/test-utils.tsx +3 -4
  400. package/tsconfig.json +1 -1
  401. package/tsdown.config.ts +25 -0
  402. package/.changeset/fluffy-jokes-lay.md +0 -5
  403. package/.changeset/wise-bugs-boil.md +0 -8
  404. package/.ctirc +0 -32
  405. package/dist/alien_swap-2B65TDGT.js.map +0 -1
  406. package/dist/aqua-xyz-WMYQLAIS.js.map +0 -1
  407. package/dist/aura-V22RV5OG.js.map +0 -1
  408. package/dist/blur-GE5QOMCM.js.map +0 -1
  409. package/dist/chunk-2PSNAIAT.js +0 -1
  410. package/dist/chunk-2PSNAIAT.js.map +0 -1
  411. package/dist/chunk-5C6ZZ6WX.js +0 -130
  412. package/dist/chunk-5C6ZZ6WX.js.map +0 -1
  413. package/dist/chunk-5O44EPXZ.js +0 -207
  414. package/dist/chunk-5O44EPXZ.js.map +0 -1
  415. package/dist/chunk-6CTFVBKU.js +0 -1
  416. package/dist/chunk-6CTFVBKU.js.map +0 -1
  417. package/dist/chunk-6OPMUCGX.js +0 -42
  418. package/dist/chunk-6OPMUCGX.js.map +0 -1
  419. package/dist/chunk-FUM4OGOQ.js +0 -1027
  420. package/dist/chunk-FUM4OGOQ.js.map +0 -1
  421. package/dist/chunk-L6KWLCER.js +0 -32
  422. package/dist/chunk-L6KWLCER.js.map +0 -1
  423. package/dist/chunk-LAP2CKLN.js +0 -485
  424. package/dist/chunk-LAP2CKLN.js.map +0 -1
  425. package/dist/chunk-LECCEZAO.js +0 -11
  426. package/dist/chunk-LECCEZAO.js.map +0 -1
  427. package/dist/chunk-N7SQWS2R.js +0 -38
  428. package/dist/chunk-N7SQWS2R.js.map +0 -1
  429. package/dist/chunk-NX52D7NX.js +0 -135
  430. package/dist/chunk-NX52D7NX.js.map +0 -1
  431. package/dist/chunk-OAOONM4S.js +0 -1787
  432. package/dist/chunk-OAOONM4S.js.map +0 -1
  433. package/dist/chunk-Q3ECVC4F.js +0 -811
  434. package/dist/chunk-Q3ECVC4F.js.map +0 -1
  435. package/dist/chunk-QY52UADF.js +0 -107
  436. package/dist/chunk-QY52UADF.js.map +0 -1
  437. package/dist/chunk-TNAR3XEF.js +0 -8729
  438. package/dist/chunk-TNAR3XEF.js.map +0 -1
  439. package/dist/chunk-XABYNWXO.js +0 -549
  440. package/dist/chunk-XABYNWXO.js.map +0 -1
  441. package/dist/chunk-XX4EVWBF.js +0 -1292
  442. package/dist/chunk-XX4EVWBF.js.map +0 -1
  443. package/dist/chunk-YB5UUF2G.js +0 -11
  444. package/dist/chunk-YB5UUF2G.js.map +0 -1
  445. package/dist/chunk-YWGFI4PN.js +0 -217
  446. package/dist/chunk-YWGFI4PN.js.map +0 -1
  447. package/dist/coinbase-NLHJMGAP.js.map +0 -1
  448. package/dist/create-config-DLMvMTkZ.d.ts +0 -8
  449. package/dist/element-2LGTYYSP.js.map +0 -1
  450. package/dist/foundation-BPN66ZTN.js.map +0 -1
  451. package/dist/get-query-client-D46hbjk6.d.ts +0 -5
  452. package/dist/index.css.map +0 -1
  453. package/dist/index.js.map +0 -1
  454. package/dist/looks-rare-MZRSOPT4.js.map +0 -1
  455. package/dist/magic-eden-PUBL6KWW.js.map +0 -1
  456. package/dist/manifold-GA445YJ6.js.map +0 -1
  457. package/dist/marketCurrencies-enNVYwBk.d.ts +0 -277
  458. package/dist/marketplace.gen-D24veUQs.d.ts +0 -1073
  459. package/dist/marketplaceConfig-BwNAbLPw.d.ts +0 -21
  460. package/dist/mintify-UMC5PTKC.js.map +0 -1
  461. package/dist/new-marketplace-types-BCw19X9S.d.ts +0 -102
  462. package/dist/nftx-AX3CY3IE.js.map +0 -1
  463. package/dist/okx-GNVLAE2R.js.map +0 -1
  464. package/dist/open-sea-KI43GVEB.js.map +0 -1
  465. package/dist/rarible-2J3MMZJ7.js.map +0 -1
  466. package/dist/react/_internal/api/index.js.map +0 -1
  467. package/dist/react/_internal/databeat/index.css +0 -2764
  468. package/dist/react/_internal/databeat/index.css.map +0 -1
  469. package/dist/react/_internal/databeat/index.js.map +0 -1
  470. package/dist/react/_internal/index.js.map +0 -1
  471. package/dist/react/_internal/wagmi/index.js.map +0 -1
  472. package/dist/react/hooks/index.css +0 -2764
  473. package/dist/react/hooks/index.css.map +0 -1
  474. package/dist/react/hooks/index.js.map +0 -1
  475. package/dist/react/hooks/options/index.js.map +0 -1
  476. package/dist/react/index.css +0 -2764
  477. package/dist/react/index.css.map +0 -1
  478. package/dist/react/index.js.map +0 -1
  479. package/dist/react/queries/index.js.map +0 -1
  480. package/dist/react/ui/components/collectible-card/index.css +0 -2764
  481. package/dist/react/ui/components/collectible-card/index.css.map +0 -1
  482. package/dist/react/ui/components/collectible-card/index.d.ts +0 -71
  483. package/dist/react/ui/components/collectible-card/index.js +0 -27
  484. package/dist/react/ui/components/collectible-card/index.js.map +0 -1
  485. package/dist/react/ui/components/marketplace-logos/index.js.map +0 -1
  486. package/dist/react/ui/icons/index.js.map +0 -1
  487. package/dist/react/ui/index.css +0 -2764
  488. package/dist/react/ui/index.css.map +0 -1
  489. package/dist/react/ui/index.js.map +0 -1
  490. package/dist/react/ui/modals/_internal/components/actionModal/index.css +0 -2764
  491. package/dist/react/ui/modals/_internal/components/actionModal/index.css.map +0 -1
  492. package/dist/react/ui/modals/_internal/components/actionModal/index.js.map +0 -1
  493. package/dist/sdk-config-qorA0TgF.d.ts +0 -165
  494. package/dist/sequence-TGLUFEPQ.js.map +0 -1
  495. package/dist/services-WrshxCqc.d.ts +0 -23
  496. package/dist/sudo-swap-M2O6E3TE.js.map +0 -1
  497. package/dist/super-rare-UU2U4LIN.js.map +0 -1
  498. package/dist/types/index.js.map +0 -1
  499. package/dist/useCollection-YAdXfVO7.d.ts +0 -61
  500. package/dist/utils/abi/index.js.map +0 -1
  501. package/dist/utils/abi/marketplace/index.js.map +0 -1
  502. package/dist/utils/abi/primary-sale/index.js.map +0 -1
  503. package/dist/utils/abi/token/index.js.map +0 -1
  504. package/dist/utils/index.js.map +0 -1
  505. package/dist/x2y2-3W5BBMZC.js.map +0 -1
  506. package/dist/zora-6EY6FUH6.js.map +0 -1
  507. package/postcss.config.mjs +0 -5
  508. package/src/react/_internal/api/zod-schema.ts +0 -678
  509. package/src/react/hooks/__tests__/__snapshots__/useRoyaltyPercentage.test.tsx.snap +0 -8
  510. package/src/react/hooks/options/collectionOptions.ts +0 -41
  511. package/src/react/hooks/useCheckoutOptions.tsx +0 -65
  512. package/src/react/hooks/useCollectionDetails.tsx +0 -35
  513. package/src/react/hooks/useGetTokenSuppliesMap.ts +0 -28
  514. package/src/react/hooks/useListTokenMetadata.ts +0 -19
  515. package/src/react/queries/getTokenSupplies.ts +0 -38
  516. package/src/react/ui/components/collectible-card/CollectibleCard.tsx +0 -170
  517. package/src/react/ui/components/collectible-card/Footer.tsx +0 -157
  518. package/src/react/ui/components/collectible-card/__tests__/CollectibleCard.test.tsx +0 -94
  519. package/src/react/ui/components/collectible-card/__tests__/Footer.test.tsx +0 -136
  520. package/src/react/ui/components/collectible-card/__tests__/Media.test.tsx +0 -264
  521. package/src/react/ui/components/collectible-card/index.ts +0 -2
  522. package/src/react/ui/modals/BuyModal/ERC1155QuantityModal.tsx +0 -130
  523. package/src/react/ui/modals/BuyModal/Modal.tsx +0 -124
  524. package/src/react/ui/modals/BuyModal/__tests__/Modal.test.tsx +0 -104
  525. package/src/react/ui/modals/BuyModal/hooks/useFees.ts +0 -39
  526. package/src/react/ui/modals/SuccessfulPurchaseModal/_store.ts +0 -72
  527. package/tsconfig.tsbuildinfo +0 -1
  528. package/tsup.config.ts +0 -23
  529. /package/src/react/ui/components/{collectible-card/media → media}/MediaSkeleton.tsx +0 -0
  530. /package/src/react/ui/components/{collectible-card/media → media}/utils.ts +0 -0
@@ -1,136 +0,0 @@
1
- import { TEST_CURRENCY } from '@test/const';
2
- import { render, screen } from '@test/test-utils';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import { ContractType } from '../../../../_internal';
5
- import { mockOrder } from '../../../../_internal/api/__mocks__/marketplace.msw';
6
- import { Footer } from '../Footer';
7
-
8
- const defaultProps = {
9
- name: 'Test',
10
- type: ContractType.ERC721,
11
- decimals: 18,
12
- onOfferClick: vi.fn(),
13
- highestOffer: mockOrder,
14
- lowestOffer: mockOrder,
15
- lowestListingPriceAmount: '100',
16
- lowestListingCurrency: TEST_CURRENCY,
17
- balance: '100',
18
- };
19
-
20
- describe('Footer', () => {
21
- it('Renders with basic props (name, type) correctly', () => {
22
- render(<Footer {...defaultProps} />);
23
-
24
- expect(screen.getByText('Test')).toBeInTheDocument();
25
- expect(screen.getByText('0.0001 TEST')).toBeInTheDocument();
26
-
27
- const notificationBell = screen.getByRole('button', {
28
- name: 'Notification Bell',
29
- });
30
- expect(notificationBell).toBeInTheDocument();
31
- });
32
-
33
- it('Truncates long names appropriately based on presence of offers', () => {
34
- const longName =
35
- 'This is a very long collectible name that needs truncation';
36
-
37
- // Test truncation with offer present (truncates to 13 chars + "...")
38
- render(
39
- <Footer {...defaultProps} name={longName} highestOffer={mockOrder} />,
40
- );
41
- expect(screen.getByText('This is a ver...')).toBeInTheDocument();
42
-
43
- // Test truncation without offer present (truncates to 17 chars + "...")
44
- render(
45
- <Footer {...defaultProps} name={longName} highestOffer={undefined} />,
46
- );
47
- expect(screen.getByText('This is a very lo...')).toBeInTheDocument();
48
-
49
- // Test short name with offer (no truncation needed)
50
- render(
51
- <Footer {...defaultProps} name="Short Name" highestOffer={mockOrder} />,
52
- );
53
- expect(screen.getByText('Short Name')).toBeInTheDocument();
54
- });
55
-
56
- it('Formats prices correctly for different scenarios (normal, overflow, underflow)', () => {
57
- // Test normal price formatting
58
- render(
59
- <Footer
60
- {...defaultProps}
61
- lowestListingPriceAmount="1000000000000000000" // 1 TOKEN in wei
62
- />,
63
- );
64
- expect(screen.getByText('1 TEST')).toBeInTheDocument();
65
-
66
- // Test small number formatting (shows more decimals)
67
- render(
68
- <Footer
69
- {...defaultProps}
70
- lowestListingPriceAmount="5000000000000000" // 0.005 TOKEN in wei
71
- />,
72
- );
73
- expect(screen.getByText('0.005 TEST')).toBeInTheDocument();
74
-
75
- // Test underflow price (< 0.0001)
76
- render(
77
- <Footer
78
- {...defaultProps}
79
- lowestListingPriceAmount="10000000000000" // 0.00001 TOKEN in wei
80
- />,
81
- );
82
- // Should display minimum price with chevron icon
83
- expect(screen.getByText('0.0001 TEST')).toBeInTheDocument();
84
-
85
- // Test overflow price (> 100,000,000)
86
- render(
87
- <Footer
88
- {...defaultProps}
89
- lowestListingPriceAmount="100000000000000000000000000" // 100M+ TOKEN in wei
90
- />,
91
- );
92
- // Should display maximum price with chevron icon
93
- expect(screen.getByText('100,000,000 TEST')).toBeInTheDocument();
94
- });
95
-
96
- it("Displays 'Not listed yet' when no listing price is provided", () => {
97
- // Create props without listing price information
98
- const propsWithoutListing = {
99
- ...defaultProps,
100
- lowestListingPriceAmount: undefined,
101
- lowestListingCurrency: undefined,
102
- };
103
-
104
- render(<Footer {...propsWithoutListing} />);
105
-
106
- // Verify "Not listed yet" text is displayed
107
- expect(screen.getByText('Not listed yet')).toBeInTheDocument();
108
- });
109
-
110
- it('Shows proper token balance information for ERC721 vs ERC1155 tokens', () => {
111
- // Test ERC721 token display
112
- render(<Footer {...defaultProps} type={ContractType.ERC721} />);
113
- expect(screen.getByText('ERC-721')).toBeInTheDocument();
114
-
115
- // Test ERC1155 token display without balance
116
- render(
117
- <Footer
118
- {...defaultProps}
119
- type={ContractType.ERC1155}
120
- balance={undefined}
121
- />,
122
- );
123
- expect(screen.getByText('ERC-1155')).toBeInTheDocument();
124
-
125
- // Test ERC1155 token display with balance
126
- render(
127
- <Footer
128
- {...defaultProps}
129
- type={ContractType.ERC1155}
130
- balance="1000000000000000000"
131
- decimals={18}
132
- />,
133
- );
134
- expect(screen.getByText('Owned: 1')).toBeInTheDocument();
135
- });
136
- });
@@ -1,264 +0,0 @@
1
- import { render, screen, waitFor } from '@test/test-utils';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import * as fetchContentTypeModule from '../../../../../utils/fetchContentType';
4
- import type { TokenMetadata } from '../../../../_internal';
5
- import { Media } from '../media/Media';
6
- import * as contentTypeUtils from '../media/utils';
7
-
8
- describe('Media', () => {
9
- it('renders image content correctly with proper loading states and fallback', async () => {
10
- const originalImage = window.Image;
11
-
12
- // We need to use a proper constructor function to match the Image interface
13
- const MockImage = function (this: HTMLImageElement) {
14
- this.src = '';
15
- this.alt = '';
16
- this.className = '';
17
- this.onload = null;
18
- this.onerror = null;
19
- return this;
20
- } as unknown as typeof Image;
21
-
22
- window.Image = MockImage;
23
-
24
- const mockMetadata: Partial<TokenMetadata> = {
25
- tokenId: '1',
26
- name: 'Test Collectible',
27
- image: 'https://example.com/test-image.png',
28
- attributes: [],
29
- };
30
-
31
- // Initial render should show the loading skeleton
32
- const { rerender } = render(
33
- <Media name="Test Collectible" assets={[mockMetadata.image]} />,
34
- );
35
-
36
- // check if skeleton is rendered during loading
37
- const skeleton = screen.getByTestId('media');
38
- expect(skeleton).toBeInTheDocument();
39
-
40
- // trigger the image load event to simulate successful loading
41
- const imgElement = document.querySelector('img');
42
- expect(imgElement).not.toBeNull();
43
-
44
- if (imgElement) {
45
- expect(imgElement.getAttribute('src')).toBe(
46
- 'https://example.com/test-image.png',
47
- );
48
- expect(imgElement.getAttribute('alt')).toBe('Test Collectible');
49
-
50
- // initial state should be invisible due to loading
51
- expect(imgElement.className).toContain('invisible');
52
-
53
- // successful image load
54
- imgElement.dispatchEvent(new Event('load'));
55
-
56
- // after loading, the image should be visible
57
- expect(imgElement.className).toContain('visible');
58
- }
59
-
60
- // failing image that should use fallback
61
- const mockMetadataWithBadImage: Partial<TokenMetadata> = {
62
- tokenId: '1',
63
- name: 'Test Collectible',
64
- image: 'https://example.com/bad-image.png',
65
- attributes: [],
66
- };
67
-
68
- rerender(
69
- <Media
70
- name="Test Collectible"
71
- assets={[mockMetadataWithBadImage.image]}
72
- />,
73
- );
74
-
75
- const updatedImgElement = document.querySelector('img');
76
- if (updatedImgElement) {
77
- // simulate image load error
78
- updatedImgElement.dispatchEvent(new Event('error'));
79
-
80
- // after error, the src should be changed to the placeholder
81
- expect(updatedImgElement.className).toContain('visible');
82
- }
83
-
84
- // restore the original Image implementation
85
- window.Image = originalImage;
86
- });
87
-
88
- it('handles video content with appropriate controls and loading states', async () => {
89
- const getContentTypeSpy = vi.spyOn(contentTypeUtils, 'getContentType');
90
- getContentTypeSpy.mockResolvedValue('video');
91
-
92
- const fetchContentTypeSpy = vi.spyOn(
93
- fetchContentTypeModule,
94
- 'fetchContentType',
95
- );
96
- fetchContentTypeSpy.mockResolvedValue('video');
97
-
98
- // Create a mock for the HTMLVideoElement addEventListener
99
- const originalAddEventListener =
100
- HTMLVideoElement.prototype.addEventListener;
101
- HTMLVideoElement.prototype.addEventListener = vi.fn(
102
- (event: string, handler: EventListenerOrEventListenerObject) => {
103
- // Immediately call the loadedmetadata handler to simulate video loaded
104
- if (event === 'loadedmetadata' && typeof handler === 'function') {
105
- handler(new Event('loadedmetadata'));
106
- }
107
- },
108
- );
109
-
110
- // Mock browser detection for Safari
111
- const originalUserAgent = navigator.userAgent;
112
- Object.defineProperty(navigator, 'userAgent', {
113
- value:
114
- 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15',
115
- configurable: true,
116
- });
117
-
118
- // Mock video metadata
119
- const mockVideoMetadata: Partial<TokenMetadata> = {
120
- tokenId: '1',
121
- name: 'Video Collectible',
122
- video: 'https://example.com/video.mp4',
123
- attributes: [],
124
- };
125
-
126
- render(
127
- <Media name="Video Collectible" assets={[mockVideoMetadata.video]} />,
128
- );
129
-
130
- await waitFor(() => {
131
- expect(screen.getByTestId('collectible-asset-video')).toBeInTheDocument();
132
- });
133
-
134
- const videoElement = screen.getByTestId(
135
- 'collectible-asset-video',
136
- ) as HTMLVideoElement;
137
-
138
- expect(videoElement).not.toBeNull();
139
-
140
- // Video source should be set correctly
141
- const sourceElement = videoElement.querySelector('source');
142
- expect(sourceElement).not.toBeNull();
143
- expect(sourceElement?.getAttribute('src')).toBe(
144
- 'https://example.com/video.mp4',
145
- );
146
-
147
- // Video should have correct attributes for NFT display
148
- expect(videoElement.autoplay).toBe(true);
149
- expect(videoElement.loop).toBe(true);
150
- expect(videoElement.controls).toBe(true);
151
- expect(videoElement.playsInline).toBe(true);
152
- expect(videoElement.muted).toBe(true);
153
-
154
- // In Safari, pointer-events-none should be applied
155
- expect(videoElement.className).toContain('pointer-events-none');
156
-
157
- // After metadata loaded, video should be visible
158
- expect(videoElement.className).toContain('visible');
159
-
160
- // Clean up mocks
161
- getContentTypeSpy.mockRestore();
162
- fetchContentTypeSpy.mockRestore();
163
- HTMLVideoElement.prototype.addEventListener = originalAddEventListener;
164
- Object.defineProperty(navigator, 'userAgent', {
165
- value: originalUserAgent,
166
- configurable: true,
167
- });
168
- });
169
-
170
- it('handles HTML content in iframes with proper sandboxing', async () => {
171
- const getContentTypeSpy = vi.spyOn(contentTypeUtils, 'getContentType');
172
- getContentTypeSpy.mockResolvedValue('html');
173
-
174
- const fetchContentTypeSpy = vi.spyOn(
175
- fetchContentTypeModule,
176
- 'fetchContentType',
177
- );
178
- fetchContentTypeSpy.mockResolvedValue('html');
179
-
180
- // Mock HTML content metadata
181
- const mockHtmlMetadata: Partial<TokenMetadata> = {
182
- tokenId: '1',
183
- name: 'HTML Collectible',
184
- animation_url: 'https://example.com/interactive.html',
185
- attributes: [],
186
- };
187
-
188
- render(
189
- <Media
190
- name="HTML Collectible"
191
- assets={[mockHtmlMetadata.animation_url]}
192
- />,
193
- );
194
-
195
- await waitFor(() => {
196
- expect(document.querySelector('iframe')).toBeInTheDocument();
197
- });
198
-
199
- // Check that iframe element is present with correct attributes
200
- const iframeElement = document.querySelector('iframe') as HTMLIFrameElement;
201
- expect(iframeElement).toBeInTheDocument();
202
-
203
- // iframe source should be set correctly
204
- expect(iframeElement.getAttribute('src')).toBe(
205
- 'https://example.com/interactive.html',
206
- );
207
-
208
- // iframe should have appropriate attributes for security
209
- expect(iframeElement.getAttribute('sandbox')).toBe('allow-scripts');
210
-
211
- // iframe should have title for accessibility
212
- expect(iframeElement.getAttribute('title')).toBe('HTML Collectible');
213
-
214
- // iframe should have proper styling
215
- expect(iframeElement.className).toContain('aspect-square');
216
- expect(iframeElement.className).toContain('w-full');
217
-
218
- // Verify border styling
219
- expect(iframeElement.style.border).toBe('0px');
220
-
221
- getContentTypeSpy.mockRestore();
222
- fetchContentTypeSpy.mockRestore();
223
- });
224
-
225
- it('shows loading state when isLoading prop is true', async () => {
226
- const mockMetadata: Partial<TokenMetadata> = {
227
- tokenId: '1',
228
- name: 'Test Collectible',
229
- image: 'https://example.com/test-image.png',
230
- attributes: [],
231
- };
232
-
233
- // Render with isLoading=true
234
- const { rerender } = render(
235
- <Media
236
- name="Test Collectible"
237
- assets={[mockMetadata.image]}
238
- isLoading={true}
239
- />,
240
- );
241
-
242
- // Check if skeleton is rendered during loading
243
- expect(screen.getByTestId('media')).toBeInTheDocument();
244
-
245
- // Image should be invisible while loading
246
- const imgElement = document.querySelector('img');
247
- expect(imgElement?.className).toContain('invisible');
248
-
249
- // Re-render with isLoading=false
250
- rerender(
251
- <Media
252
- name="Test Collectible"
253
- assets={[mockMetadata.image]}
254
- isLoading={false}
255
- />,
256
- );
257
-
258
- // After loading completes, trigger load event
259
- imgElement?.dispatchEvent(new Event('load'));
260
-
261
- // Image should become visible
262
- expect(imgElement?.className).toContain('visible');
263
- });
264
- });
@@ -1,2 +0,0 @@
1
- export * from './CollectibleCard';
2
- export * from './media/Media';
@@ -1,130 +0,0 @@
1
- 'use client';
2
-
3
- import { use$, useObservable } from '@legendapp/state/react';
4
-
5
- import { Text, TokenImage } from '@0xsequence/design-system';
6
- import { DEFAULT_MARKETPLACE_FEE_PERCENTAGE } from '../../../../consts';
7
- import { compareAddress } from '../../../../utils/address';
8
- import { formatPriceWithFee } from '../../../../utils/price';
9
- import type { Order } from '../../../_internal';
10
- import { useCurrency, useMarketplaceConfig } from '../../../hooks';
11
- import { ActionModal } from '../_internal/components/actionModal';
12
- import QuantityInput from '../_internal/components/quantityInput';
13
- import { buyModalStore, useBuyModalProps, useIsOpen } from './store';
14
-
15
- export const ERC1155QuantityModal = ({ order }: { order: Order }) => {
16
- const { chainId } = useBuyModalProps();
17
- const isOpen = useIsOpen();
18
-
19
- const localQuantity$ = useObservable('1');
20
- const localQuantity = use$(localQuantity$);
21
- const invalidQuantity$ = useObservable(false);
22
- const invalidQuantity = use$(invalidQuantity$);
23
-
24
- return (
25
- <ActionModal
26
- isOpen={isOpen}
27
- chainId={chainId}
28
- onClose={() => buyModalStore.send({ type: 'close' })}
29
- title="Select Quantity"
30
- disableAnimation={true}
31
- ctas={[
32
- {
33
- label: 'Buy now',
34
- onClick: () => {
35
- buyModalStore.send({
36
- type: 'setQuantity',
37
- quantity: Number(localQuantity),
38
- });
39
- },
40
- disabled: invalidQuantity,
41
- },
42
- ]}
43
- >
44
- <div className="flex w-full flex-col gap-4">
45
- <QuantityInput
46
- $quantity={localQuantity$}
47
- $invalidQuantity={invalidQuantity$}
48
- decimals={order.quantityDecimals}
49
- maxQuantity={order.quantityRemaining}
50
- />
51
-
52
- <TotalPrice order={order} quantityStr={localQuantity} />
53
- </div>
54
- </ActionModal>
55
- );
56
- };
57
-
58
- const TotalPrice = ({
59
- order,
60
- quantityStr,
61
- }: {
62
- order: Order;
63
- quantityStr: string;
64
- }) => {
65
- const { data: marketplaceConfig } = useMarketplaceConfig();
66
- const { data: currency, isLoading: isCurrencyLoading } = useCurrency({
67
- chainId: order.chainId,
68
- currencyAddress: order.priceCurrencyAddress,
69
- });
70
-
71
- let error: null | string = null;
72
- let formattedPrice = '0';
73
-
74
- if (currency) {
75
- try {
76
- const marketplaceFeePercentage =
77
- marketplaceConfig?.market.collections.find((collection) =>
78
- compareAddress(
79
- collection.itemsAddress,
80
- order.collectionContractAddress,
81
- ),
82
- )?.feePercentage || DEFAULT_MARKETPLACE_FEE_PERCENTAGE;
83
- const quantity = BigInt(quantityStr);
84
- const totalPriceRaw = BigInt(order.priceAmount) * quantity;
85
-
86
- formattedPrice = formatPriceWithFee(
87
- totalPriceRaw,
88
- currency.decimals,
89
- marketplaceFeePercentage,
90
- );
91
- } catch (e) {
92
- console.error('Error formatting price', e);
93
- error = 'Unable to calculate total price';
94
- }
95
- }
96
-
97
- return error ? (
98
- <Text className="font-body font-medium text-xs" color="text50">
99
- {error}
100
- </Text>
101
- ) : (
102
- <div className="flex justify-between">
103
- <Text className="font-body font-medium text-xs" color="text50">
104
- Total Price
105
- </Text>
106
-
107
- <div className="flex items-center gap-0.5">
108
- {isCurrencyLoading || !currency ? (
109
- <div className="flex items-center gap-2">
110
- <Text className="font-body text-text-50 text-xs">Loading...</Text>
111
- </div>
112
- ) : (
113
- <>
114
- {currency.imageUrl && (
115
- <TokenImage src={currency.imageUrl} size="xs" />
116
- )}
117
-
118
- <Text className="font-body font-bold text-text-100 text-xs">
119
- {formattedPrice}
120
- </Text>
121
-
122
- <Text className="font-body font-bold text-text-80 text-xs">
123
- {currency?.symbol}
124
- </Text>
125
- </>
126
- )}
127
- </div>
128
- </div>
129
- );
130
- };
@@ -1,124 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- type SelectPaymentSettings,
5
- useSelectPaymentModal,
6
- } from '@0xsequence/checkout';
7
- import { useEffect, useRef } from 'react';
8
- import { ContractType } from '../../../_internal';
9
- import { ErrorModal } from '../_internal/components/actionModal/ErrorModal';
10
- import { LoadingModal } from '../_internal/components/actionModal/LoadingModal';
11
- import { ERC1155QuantityModal } from './ERC1155QuantityModal';
12
- import { useLoadData } from './hooks/useLoadData';
13
- import { usePaymentModalParams } from './hooks/usePaymentModalParams';
14
- import {
15
- buyModalStore,
16
- useBuyModalProps,
17
- useIsOpen,
18
- useOnError,
19
- useQuantity,
20
- } from './store';
21
-
22
- export const BuyModal = () => {
23
- const isOpen = useIsOpen();
24
-
25
- if (!isOpen) {
26
- return null;
27
- }
28
-
29
- return <BuyModalContent />;
30
- };
31
-
32
- const BuyModalContent = () => {
33
- const { chainId } = useBuyModalProps();
34
-
35
- const onError = useOnError();
36
-
37
- const quantity = useQuantity();
38
-
39
- const {
40
- collection,
41
- collectable,
42
- wallet,
43
- isLoading,
44
- isError,
45
- order,
46
- checkoutOptions,
47
- } = useLoadData();
48
-
49
- const {
50
- data: paymentModalParams,
51
- isLoading: isPaymentModalParamsLoading,
52
- isError: isPaymentModalParamsError,
53
- } = usePaymentModalParams({
54
- wallet,
55
- quantity,
56
- marketplace: order?.marketplace,
57
- collectable: collectable,
58
- checkoutOptions: checkoutOptions,
59
- priceCurrencyAddress: order?.priceCurrencyAddress,
60
- });
61
-
62
- // biome-ignore lint/correctness/useExhaustiveDependencies: we want to set this on collection change
63
- useEffect(() => {
64
- if (collection?.type === ContractType.ERC721 && !quantity) {
65
- buyModalStore.send({ type: 'setQuantity', quantity: 1 });
66
- }
67
- }, [collection]);
68
-
69
- if (isError || isPaymentModalParamsError) {
70
- onError(new Error('Error loading data'));
71
- return (
72
- <ErrorModal
73
- isOpen={true}
74
- chainId={chainId}
75
- onClose={() => buyModalStore.send({ type: 'close' })}
76
- title="Error"
77
- />
78
- );
79
- }
80
-
81
- if (
82
- isLoading ||
83
- isPaymentModalParamsLoading ||
84
- !collection ||
85
- !collectable ||
86
- !order
87
- ) {
88
- return (
89
- <LoadingModal
90
- isOpen={true}
91
- chainId={chainId}
92
- onClose={() => buyModalStore.send({ type: 'close' })}
93
- title="Loading Sequence Pay"
94
- />
95
- );
96
- }
97
-
98
- if (collection.type === ContractType.ERC1155 && !quantity) {
99
- return <ERC1155QuantityModal order={order} />;
100
- }
101
-
102
- if (paymentModalParams) {
103
- return <PaymentModalOpener paymentModalParams={paymentModalParams} />;
104
- }
105
- };
106
-
107
- const PaymentModalOpener = ({
108
- paymentModalParams,
109
- }: {
110
- paymentModalParams: SelectPaymentSettings;
111
- }) => {
112
- const { openSelectPaymentModal } = useSelectPaymentModal();
113
- const hasOpenedRef = useRef(false);
114
-
115
- // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>
116
- useEffect(() => {
117
- if (!hasOpenedRef.current) {
118
- hasOpenedRef.current = true;
119
- openSelectPaymentModal(paymentModalParams);
120
- }
121
- }, []);
122
-
123
- return null;
124
- };