@0xsequence/marketplace-sdk 0.8.12 → 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 (327) hide show
  1. package/CHANGELOG.md +91 -23
  2. package/dist/{CartIcon-Bll1rbxv.js → CalendarIcon-DbQ7Vxcw.js} +38 -38
  3. package/dist/CalendarIcon-DbQ7Vxcw.js.map +1 -0
  4. package/dist/{types-BIJOaL4j.d.ts → CollectibleCard-C8Ae64Ab.d.ts} +7 -4
  5. package/dist/{_internal-69NEWNUE.js → _internal-BgWcRIak.js} +2 -14
  6. package/dist/_internal-BgWcRIak.js.map +1 -0
  7. package/dist/{api-1KFxYh7o.js → api-DTIan01C.js} +73 -64
  8. package/dist/api-DTIan01C.js.map +1 -0
  9. package/dist/{builder-api-BQvzykoU.js → builder-api-BFuZNOaN.js} +2 -2
  10. package/dist/{builder-api-BQvzykoU.js.map → builder-api-BFuZNOaN.js.map} +1 -1
  11. package/dist/{builder-api-DoK3907S.d.ts → builder-api-C_zj5mr3.d.ts} +2 -2
  12. package/dist/{builder.gen-CxP9NT1p.js → builder.gen-B9wR2nvF.js} +1 -1
  13. package/dist/builder.gen-B9wR2nvF.js.map +1 -0
  14. package/dist/{index-Cl7PQOGu.d.ts → index-21LE7OhL.d.ts} +24 -24
  15. package/dist/{index-1bezgsFq.d.ts → index-BL9RUSEK.d.ts} +929 -255
  16. package/dist/index-BQsgAvtX.d.ts +2938 -0
  17. package/dist/{index-DafWjEb4.d.ts → index-BUVWziLP.d.ts} +9 -14
  18. package/dist/{index-BIMIpDiI.d.ts → index-ByznONYE.d.ts} +98 -99
  19. package/dist/{index-BjIwVzc4.d.ts → index-CLy8y5hm.d.ts} +238 -238
  20. package/dist/{index-CN8puQQJ.d.ts → index-COt10OgI.d.ts} +4 -4
  21. package/dist/index-DPNWNa7t.d.ts +414 -0
  22. package/dist/{index-BEYefG1G.d.ts → index-DaE5ZNHb.d.ts} +2 -2
  23. package/dist/{index-BfH21xmk.d.ts → index-DsfCs3-x.d.ts} +46 -41
  24. package/dist/{index-4-kfOFdx.d.ts → index-dUb6wb4Y.d.ts} +5 -5
  25. package/dist/index.css +14 -1
  26. package/dist/index.d.ts +7 -7
  27. package/dist/index.js +7 -7
  28. package/dist/marketplace-logos-CSeGcPW4.js.map +1 -1
  29. package/dist/{marketplace.gen-Dqk8vRmD.js → marketplace.gen-BSDIX7NZ.js} +12 -3
  30. package/dist/marketplace.gen-BSDIX7NZ.js.map +1 -0
  31. package/dist/{marketplaceConfig-D2MYFqll.js → marketplaceConfig-C6X1SUik.js} +2 -2
  32. package/dist/marketplaceConfig-C6X1SUik.js.map +1 -0
  33. package/dist/{sdk-config-DJzxVPld.d.ts → new-marketplace-types-Bfis0U4J.d.ts} +65 -54
  34. package/dist/options-B4QN7Xou.js +0 -0
  35. package/dist/{primary-sale-Cw95phYC.js → primary-sale-C55ALnfQ.js} +279 -279
  36. package/dist/primary-sale-C55ALnfQ.js.map +1 -0
  37. package/dist/{queries-DPvwtnO7.js → queries-CUU65uYZ.js} +247 -134
  38. package/dist/queries-CUU65uYZ.js.map +1 -0
  39. package/dist/react/_internal/api/index.d.ts +4 -4
  40. package/dist/react/_internal/api/index.js +5 -5
  41. package/dist/react/_internal/databeat/index.d.ts +3 -3
  42. package/dist/react/_internal/databeat/index.js +15 -15
  43. package/dist/react/_internal/index.d.ts +7 -7
  44. package/dist/react/_internal/index.js +7 -7
  45. package/dist/react/_internal/wagmi/index.d.ts +3 -3
  46. package/dist/react/_internal/wagmi/index.js +2 -2
  47. package/dist/react/hooks/index.d.ts +15 -14
  48. package/dist/react/hooks/index.js +16 -16
  49. package/dist/react/hooks/options/index.d.ts +4 -5
  50. package/dist/react/hooks/options/index.js +9 -9
  51. package/dist/react/index.d.ts +15 -37
  52. package/dist/react/index.js +16 -16
  53. package/dist/react/queries/index.d.ts +8 -8
  54. package/dist/react/queries/index.js +12 -12
  55. package/dist/react/ssr/index.d.ts +6 -6
  56. package/dist/react/ssr/index.js +7 -7
  57. package/dist/react/ssr/index.js.map +1 -1
  58. package/dist/react/ui/components/marketplace-collectible-card/index.d.ts +8 -9
  59. package/dist/react/ui/components/marketplace-collectible-card/index.js +15 -15
  60. package/dist/react/ui/components/marketplace-collectible-card/utils/index.d.ts +7 -7
  61. package/dist/react/ui/components/marketplace-collectible-card/utils/index.js +7 -7
  62. package/dist/react/ui/components/marketplace-logos/index.d.ts +21 -21
  63. package/dist/react/ui/icons/index.js +6 -6
  64. package/dist/react/ui/index.d.ts +8 -9
  65. package/dist/react/ui/index.js +15 -15
  66. package/dist/react/ui/modals/_internal/components/actionModal/index.d.ts +5 -5
  67. package/dist/react/ui/modals/_internal/components/actionModal/index.js +15 -15
  68. package/dist/{react-BG7o4PId.js → react-DAIicQPT.js} +7422 -6835
  69. package/dist/react-DAIicQPT.js.map +1 -0
  70. package/dist/{token-CO5llIla.js → token-Da4TdyUk.js} +1540 -761
  71. package/dist/token-Da4TdyUk.js.map +1 -0
  72. package/dist/types/index.d.ts +2 -2
  73. package/dist/types/index.js +2 -2
  74. package/dist/types-DwWE6xOF.js.map +1 -1
  75. package/dist/utils/abi/index.d.ts +3 -3
  76. package/dist/utils/abi/index.js +3 -3
  77. package/dist/utils/abi/primary-sale/index.d.ts +1 -1
  78. package/dist/utils/abi/primary-sale/index.js +1 -1
  79. package/dist/utils/abi/token/index.d.ts +2 -2
  80. package/dist/utils/abi/token/index.js +2 -2
  81. package/dist/utils/index.d.ts +6 -6
  82. package/dist/utils/index.js +6 -6
  83. package/dist/{utils-Cat9_pef.js → utils-BPYfgDSL.js} +2 -2
  84. package/dist/{utils-Cat9_pef.js.map → utils-BPYfgDSL.js.map} +1 -1
  85. package/dist/{utils-BFdxaToy.js → utils-CW2NA5KG.js} +87 -87
  86. package/dist/utils-CW2NA5KG.js.map +1 -0
  87. package/dist/{wagmi-DRctYEk6.js → wagmi-CDzEQbfk.js} +19 -12
  88. package/dist/wagmi-CDzEQbfk.js.map +1 -0
  89. package/eslint/use-client.js +0 -6
  90. package/package.json +30 -31
  91. package/src/index.ts +1 -1
  92. package/src/react/_internal/api/__mocks__/builder.msw.ts +5 -3
  93. package/src/react/_internal/api/__mocks__/indexer.msw.ts +8 -8
  94. package/src/react/_internal/api/__mocks__/marketplace.msw.ts +4 -6
  95. package/src/react/_internal/api/__mocks__/metadata.msw.ts +1 -1
  96. package/src/react/_internal/api/builder.gen.ts +6 -6
  97. package/src/react/_internal/api/get-query-client.ts +2 -2
  98. package/src/react/_internal/api/index.ts +2 -2
  99. package/src/react/_internal/api/marketplace.gen.ts +42 -4
  100. package/src/react/_internal/api/query-keys.ts +13 -6
  101. package/src/react/_internal/api/services.ts +28 -31
  102. package/src/react/_internal/index.ts +1 -1
  103. package/src/react/_internal/types.ts +10 -23
  104. package/src/react/_internal/utils.ts +1 -2
  105. package/src/react/_internal/wagmi/create-config.ts +20 -11
  106. package/src/react/_internal/wagmi/get-connectors.ts +9 -7
  107. package/src/react/_internal/wallet/__tests__/wallet.test.ts +1 -1
  108. package/src/react/_internal/wallet/wallet.ts +18 -18
  109. package/src/react/hooks/__tests__/__snapshots__/useListCollections.test.tsx.snap +20 -0
  110. package/src/react/hooks/__tests__/__snapshots__/useMarketplaceConfig.test.tsx.snap +12 -2
  111. package/src/react/hooks/__tests__/useAutoSelectFeeOption.test.tsx +1 -1
  112. package/src/react/hooks/__tests__/useBalanceOfCollectible.test.tsx +1 -1
  113. package/src/react/hooks/__tests__/useCancelOrder.test.tsx +4 -4
  114. package/src/react/hooks/__tests__/useCancelTransactionSteps.test.tsx +1 -1
  115. package/src/react/hooks/__tests__/useCollectible.test.tsx +14 -16
  116. package/src/react/hooks/__tests__/useCollection.test.tsx +4 -4
  117. package/src/react/hooks/__tests__/useCollectionBalanceDetails.test.tsx +1 -27
  118. package/src/react/hooks/__tests__/useCollectionDetails.test.tsx +1 -1
  119. package/src/react/hooks/__tests__/useCollectionDetailsPolling.test.tsx +1 -1
  120. package/src/react/hooks/__tests__/useComparePrices.test.tsx +7 -6
  121. package/src/react/hooks/__tests__/useConvertPriceToUSD.test.tsx +1 -1
  122. package/src/react/hooks/__tests__/useCountListingsForCollectible.test.tsx +2 -2
  123. package/src/react/hooks/__tests__/useCountOfCollectables.test.tsx +5 -5
  124. package/src/react/hooks/__tests__/useCountOffersForCollectible.test.tsx +2 -2
  125. package/src/react/hooks/__tests__/useCurrency.test.tsx +5 -3
  126. package/src/react/hooks/__tests__/useFilters.test.tsx +1 -1
  127. package/src/react/hooks/__tests__/useFloorOrder.test.tsx +4 -4
  128. package/src/react/hooks/__tests__/useGenerateCancelTransaction.test.tsx +3 -3
  129. package/src/react/hooks/__tests__/useGenerateListingTransaction.test.tsx +1 -1
  130. package/src/react/hooks/__tests__/useGenerateOfferTransaction.test.tsx +1 -1
  131. package/src/react/hooks/__tests__/useGenerateSellTransaction.test.tsx +1 -1
  132. package/src/react/hooks/__tests__/useGetTokenSuppliesMap.test.tsx +104 -0
  133. package/src/react/hooks/__tests__/useHighestOffer.test.tsx +4 -4
  134. package/src/react/hooks/__tests__/useInventory.test.tsx +1 -1
  135. package/src/react/hooks/__tests__/useListCollectibleActivities.test.tsx +11 -13
  136. package/src/react/hooks/__tests__/useListCollectibles.test.tsx +5 -5
  137. package/src/react/hooks/__tests__/useListCollectiblesPaginated.test.tsx +10 -15
  138. package/src/react/hooks/__tests__/useListCollectionActivities.test.tsx +13 -15
  139. package/src/react/hooks/__tests__/useListCollections.test.tsx +3 -3
  140. package/src/react/hooks/__tests__/useListListingsForCollectible.test.tsx +3 -2
  141. package/src/react/hooks/__tests__/useListMarketCardData.test.tsx +301 -0
  142. package/src/react/hooks/__tests__/useListOffersForCollectible.test.tsx +1 -1
  143. package/src/react/hooks/__tests__/useListTokenMetadata.test.tsx +111 -0
  144. package/src/react/hooks/__tests__/useLowestListing.test.tsx +1 -1
  145. package/src/react/hooks/__tests__/useMarketCurrencies.test.tsx +1 -1
  146. package/src/react/hooks/__tests__/useRoyalty.test.tsx +0 -23
  147. package/src/react/hooks/index.ts +27 -24
  148. package/src/react/hooks/options/index.ts +0 -1
  149. package/src/react/hooks/useAutoSelectFeeOption.tsx +1 -1
  150. package/src/react/hooks/useBalanceOfCollectible.tsx +1 -1
  151. package/src/react/hooks/useCancelTransactionSteps.tsx +2 -2
  152. package/src/react/hooks/useCheckoutOptionsSalesContract.tsx +1 -1
  153. package/src/react/hooks/useCollectible.tsx +64 -49
  154. package/src/react/hooks/useCollection.tsx +60 -11
  155. package/src/react/hooks/useCollectionBalanceDetails.tsx +20 -27
  156. package/src/react/hooks/useCollectionDetails.ts +69 -0
  157. package/src/react/hooks/useCollectionDetailsPolling.tsx +10 -2
  158. package/src/react/hooks/useComparePrices.tsx +18 -21
  159. package/src/react/hooks/useConvertPriceToUSD.tsx +20 -37
  160. package/src/react/hooks/useCountListingsForCollectible.tsx +64 -53
  161. package/src/react/hooks/useCountOfCollectables.tsx +60 -69
  162. package/src/react/hooks/useCountOfPrimarySaleItems.tsx +13 -0
  163. package/src/react/hooks/useCountOffersForCollectible.tsx +64 -53
  164. package/src/react/hooks/useCurrency.tsx +56 -64
  165. package/src/react/hooks/useFilterState.tsx +1 -2
  166. package/src/react/hooks/useFloorOrder.tsx +65 -40
  167. package/src/react/hooks/useGenerateCancelTransaction.tsx +5 -10
  168. package/src/react/hooks/useGenerateListingTransaction.tsx +1 -1
  169. package/src/react/hooks/useGenerateOfferTransaction.tsx +1 -1
  170. package/src/react/hooks/useGenerateSellTransaction.tsx +5 -10
  171. package/src/react/hooks/useGetReceiptFromHash.tsx +32 -3
  172. package/src/react/hooks/{useGetTokenSuppliesMap.ts → useGetTokenRanges.tsx} +15 -17
  173. package/src/react/hooks/useGetTokenSuppliesMap.tsx +73 -0
  174. package/src/react/hooks/useHighestOffer.tsx +68 -4
  175. package/src/react/hooks/useInventory.tsx +1 -1
  176. package/src/react/hooks/useList1155ShopCardData.tsx +55 -82
  177. package/src/react/hooks/useList721ShopCardData.tsx +93 -63
  178. package/src/react/hooks/useListBalances.tsx +1 -1
  179. package/src/react/hooks/useListCollectibleActivities.tsx +89 -50
  180. package/src/react/hooks/useListCollectibles.tsx +81 -16
  181. package/src/react/hooks/useListCollectiblesPaginated.tsx +96 -66
  182. package/src/react/hooks/useListCollectionActivities.tsx +84 -50
  183. package/src/react/hooks/useListCollections.tsx +72 -18
  184. package/src/react/hooks/useListListingsForCollectible.tsx +90 -50
  185. package/src/react/hooks/useListMarketCardData.tsx +1 -1
  186. package/src/react/hooks/useListOffersForCollectible.tsx +9 -14
  187. package/src/react/hooks/useListPrimarySaleItems.ts +72 -12
  188. package/src/react/hooks/useListShopCardData.tsx +70 -0
  189. package/src/react/hooks/useListTokenMetadata.tsx +73 -0
  190. package/src/react/hooks/useLowestListing.tsx +68 -4
  191. package/src/react/hooks/useMarketCurrencies.tsx +62 -5
  192. package/src/react/hooks/useRoyalty.tsx +57 -13
  193. package/src/react/hooks/useShopCollectibleSaleData.tsx +349 -0
  194. package/src/react/hooks/useTransferTokens.tsx +1 -1
  195. package/src/react/hooks/util/optimisticCancelUpdates.ts +5 -7
  196. package/src/react/index.ts +5 -3
  197. package/src/react/queries/balanceOfCollectible.ts +1 -1
  198. package/src/react/queries/collectible.ts +66 -0
  199. package/src/react/queries/collection.ts +55 -0
  200. package/src/react/queries/collectionDetails.ts +64 -0
  201. package/src/react/queries/countListingsForCollectible.ts +73 -0
  202. package/src/react/queries/countOfCollectables.ts +83 -0
  203. package/src/react/queries/countOfPrimarySaleItems.ts +48 -0
  204. package/src/react/queries/countOffersForCollectible.ts +73 -0
  205. package/src/react/queries/currency.ts +83 -0
  206. package/src/react/queries/floorOrder.ts +63 -0
  207. package/src/react/queries/getTokenSuppliesMap.ts +77 -0
  208. package/src/react/queries/highestOffer.ts +46 -40
  209. package/src/react/queries/index.ts +7 -4
  210. package/src/react/queries/inventory.ts +4 -4
  211. package/src/react/queries/listBalances.ts +1 -1
  212. package/src/react/queries/listCollectibleActivities.ts +97 -0
  213. package/src/react/queries/listCollectibles.ts +67 -50
  214. package/src/react/queries/listCollectiblesPaginated.ts +87 -0
  215. package/src/react/queries/listCollectionActivities.ts +95 -0
  216. package/src/react/queries/listCollections.ts +47 -8
  217. package/src/react/queries/listListingsForCollectible.ts +82 -0
  218. package/src/react/queries/listTokenMetadata.ts +47 -23
  219. package/src/react/queries/lowestListing.ts +46 -31
  220. package/src/react/queries/marketCurrencies.ts +42 -29
  221. package/src/react/queries/marketplaceConfig.ts +3 -3
  222. package/src/react/ssr/__tests__/__snapshots__/create-ssr-client.test.ts.snap +12 -2
  223. package/src/react/ssr/create-ssr-client.ts +1 -1
  224. package/src/react/types/query.ts +34 -0
  225. package/src/react/ui/components/ModelViewer.tsx +1 -1
  226. package/src/react/ui/components/_internals/action-button/__tests__/useActionButtonLogic.test.tsx +14 -8
  227. package/src/react/ui/components/_internals/action-button/hooks/useActionButtonLogic.ts +12 -15
  228. package/src/react/ui/components/_internals/action-button/store.ts +46 -18
  229. package/src/react/ui/components/marketplace-collectible-card/CollectibleCard.tsx +1 -1
  230. package/src/react/ui/components/marketplace-collectible-card/Footer.tsx +1 -1
  231. package/src/react/ui/components/marketplace-collectible-card/components/BaseCard.tsx +3 -0
  232. package/src/react/ui/components/marketplace-collectible-card/index.ts +1 -1
  233. package/src/react/ui/components/marketplace-collectible-card/types.ts +7 -4
  234. package/src/react/ui/components/marketplace-collectible-card/variants/MarketCard.tsx +3 -2
  235. package/src/react/ui/components/marketplace-collectible-card/variants/ShopCard.tsx +2 -5
  236. package/src/react/ui/components/marketplace-logos/marketplace-logos.tsx +1 -1
  237. package/src/react/ui/components/media/Media.tsx +5 -1
  238. package/src/react/ui/index.ts +8 -10
  239. package/src/react/ui/modals/BuyModal/__tests__/ERC1155ShopModal.test.tsx +94 -87
  240. package/src/react/ui/modals/BuyModal/__tests__/Modal1155.test.tsx +4 -4
  241. package/src/react/ui/modals/BuyModal/__tests__/store.test.ts +1 -1
  242. package/src/react/ui/modals/BuyModal/components/ERC1155QuantityModal.tsx +3 -4
  243. package/src/react/ui/modals/BuyModal/components/ERC1155ShopModal.tsx +1 -1
  244. package/src/react/ui/modals/BuyModal/hooks/__tests__/useCheckoutOptions.test.tsx +1 -1
  245. package/src/react/ui/modals/BuyModal/hooks/useCheckoutOptions.ts +1 -1
  246. package/src/react/ui/modals/BuyModal/hooks/useERC721SalePaymentParams.ts +1 -1
  247. package/src/react/ui/modals/BuyModal/hooks/usePaymentModalParams.ts +3 -3
  248. package/src/react/ui/modals/CreateListingModal/Modal.tsx +1 -1
  249. package/src/react/ui/modals/CreateListingModal/__tests__/Modal.test.tsx +2 -2
  250. package/src/react/ui/modals/CreateListingModal/hooks/useCreateListing.tsx +0 -1
  251. package/src/react/ui/modals/CreateListingModal/hooks/useGetTokenApproval.ts +2 -2
  252. package/src/react/ui/modals/CreateListingModal/hooks/useTransactionSteps.tsx +7 -6
  253. package/src/react/ui/modals/CreateListingModal/index.tsx +1 -1
  254. package/src/react/ui/modals/MakeOfferModal/Modal.tsx +2 -2
  255. package/src/react/ui/modals/MakeOfferModal/__tests__/Modal.test.tsx +1 -1
  256. package/src/react/ui/modals/MakeOfferModal/hooks/useGetTokenApproval.tsx +1 -1
  257. package/src/react/ui/modals/MakeOfferModal/hooks/useMakeOffer.tsx +0 -1
  258. package/src/react/ui/modals/MakeOfferModal/hooks/useTransactionSteps.tsx +7 -7
  259. package/src/react/ui/modals/MakeOfferModal/index.tsx +1 -1
  260. package/src/react/ui/modals/SellModal/Modal.tsx +3 -3
  261. package/src/react/ui/modals/SellModal/__tests__/Modal.test.tsx +6 -4
  262. package/src/react/ui/modals/SellModal/hooks/useGetTokenApproval.tsx +1 -1
  263. package/src/react/ui/modals/SellModal/hooks/useSell.tsx +0 -1
  264. package/src/react/ui/modals/SellModal/hooks/useTransactionSteps.tsx +6 -6
  265. package/src/react/ui/modals/SuccessfulPurchaseModal/__tests__/Modal.test.tsx +1 -1
  266. package/src/react/ui/modals/TransferModal/_store.ts +1 -7
  267. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TokenQuantityInput.tsx +2 -3
  268. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/index.tsx +2 -2
  269. package/src/react/ui/modals/_internal/components/actionModal/ActionModal.test.tsx +1 -1
  270. package/src/react/ui/modals/_internal/components/actionModal/ActionModal.tsx +2 -4
  271. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/__tests__/index.test.tsx +1 -1
  272. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/index.tsx +0 -1
  273. package/src/react/ui/modals/_internal/components/floorPriceText/index.tsx +4 -4
  274. package/src/react/ui/modals/_internal/components/quantityInput/QuantityInputBase.tsx +166 -0
  275. package/src/react/ui/modals/_internal/components/quantityInput/index.tsx +12 -141
  276. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/__tests__/SelectWaasFeeOptions.test.tsx +1 -1
  277. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/_components/BalanceIndicator.tsx +1 -2
  278. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/useWaasFeeOptionManager.tsx +0 -1
  279. package/src/react/ui/modals/_internal/components/transactionPreview/index.tsx +1 -1
  280. package/src/react/ui/modals/_internal/components/transactionStatusModal/__tests__/TransactionStatusModal.test.tsx +1 -1
  281. package/src/react/ui/modals/_internal/components/transactionStatusModal/hooks/useTransactionStatus.ts +0 -1
  282. package/src/react/ui/modals/_internal/components/transactionStatusModal/store.ts +1 -1
  283. package/src/react/ui/modals/_internal/components/waasFeeOptionsSelect/WaasFeeOptionsSelect.tsx +1 -1
  284. package/src/react/ui/modals/modal-provider.tsx +2 -3
  285. package/src/types/api-types.ts +36 -36
  286. package/src/types/buyModalErrors.ts +1 -1
  287. package/src/types/index.ts +5 -5
  288. package/src/types/new-marketplace-types.ts +1 -1
  289. package/src/types/sdk-config.ts +2 -1
  290. package/src/types/types.ts +1 -0
  291. package/src/types/waas-types.ts +1 -1
  292. package/src/utils/abi/index.ts +1 -1
  293. package/src/utils/abi/primary-sale/index.ts +1 -1
  294. package/src/utils/abi/token/index.ts +2 -1
  295. package/src/utils/decode/erc20.ts +1 -1
  296. package/src/utils/index.ts +3 -3
  297. package/test/const.ts +3 -1
  298. package/test/mocks/wallet.ts +1 -1
  299. package/test/test-utils.tsx +3 -4
  300. package/.changeset/fluffy-jokes-lay.md +0 -5
  301. package/.changeset/wise-bugs-boil.md +0 -8
  302. package/dist/CartIcon-Bll1rbxv.js.map +0 -1
  303. package/dist/CollectibleCard-CLQTl0_6.d.ts +0 -8
  304. package/dist/_internal-69NEWNUE.js.map +0 -1
  305. package/dist/api-1KFxYh7o.js.map +0 -1
  306. package/dist/builder.gen-CxP9NT1p.js.map +0 -1
  307. package/dist/index-BHiSG-Yi.d.ts +0 -312
  308. package/dist/index-BQW0PUkQ.d.ts +0 -3973
  309. package/dist/marketplace.gen-Dqk8vRmD.js.map +0 -1
  310. package/dist/marketplaceConfig-D2MYFqll.js.map +0 -1
  311. package/dist/options-DCi6_23w.js +0 -34
  312. package/dist/options-DCi6_23w.js.map +0 -1
  313. package/dist/primary-sale-Cw95phYC.js.map +0 -1
  314. package/dist/queries-DPvwtnO7.js.map +0 -1
  315. package/dist/react-BG7o4PId.js.map +0 -1
  316. package/dist/token-CO5llIla.js.map +0 -1
  317. package/dist/useCollection-C-mclKU0.d.ts +0 -66
  318. package/dist/utils-BFdxaToy.js.map +0 -1
  319. package/dist/wagmi-DRctYEk6.js.map +0 -1
  320. package/src/react/_internal/api/zod-schema.ts +0 -678
  321. package/src/react/hooks/options/collectionOptions.ts +0 -41
  322. package/src/react/hooks/useCheckoutOptions.tsx +0 -66
  323. package/src/react/hooks/useCollectionDetails.tsx +0 -50
  324. package/src/react/hooks/useListTokenMetadata.ts +0 -19
  325. package/src/react/queries/getTokenSupplies.ts +0 -38
  326. package/tsconfig.tsbuildinfo +0 -1
  327. /package/dist/{index-ij9f8GAA.d.ts → index-DvpBZgor.d.ts} +0 -0
@@ -1,54 +1,69 @@
1
1
  import { queryOptions } from '@tanstack/react-query';
2
- import type { Address } from 'viem';
3
2
  import type { SdkConfig } from '../../types';
4
3
  import {
4
+ collectableKeys,
5
5
  type GetCollectibleLowestListingArgs,
6
6
  type GetCollectibleLowestListingReturn,
7
- collectableKeys,
8
7
  getMarketplaceClient,
8
+ type ValuesOptional,
9
9
  } from '../_internal';
10
+ import type { StandardQueryOptions } from '../types/query';
10
11
 
11
- export interface UseLowestListingArgs
12
+ export interface FetchLowestListingParams
12
13
  extends Omit<GetCollectibleLowestListingArgs, 'contractAddress' | 'chainId'> {
13
- collectionAddress: Address;
14
+ collectionAddress: string;
14
15
  chainId: number;
15
- query?: {
16
- enabled?: boolean;
17
- };
16
+ config: SdkConfig;
18
17
  }
19
18
 
19
+ /**
20
+ * Fetches the lowest listing for a collectible from the marketplace API
21
+ */
20
22
  export async function fetchLowestListing(
21
- args: UseLowestListingArgs,
22
- config: SdkConfig,
23
+ params: FetchLowestListingParams,
23
24
  ): Promise<GetCollectibleLowestListingReturn['order'] | null> {
25
+ const { collectionAddress, chainId, config, ...additionalApiParams } = params;
26
+
24
27
  const marketplaceClient = getMarketplaceClient(config);
25
28
 
26
- const { chainId, collectionAddress, tokenId } = args;
27
- const data = await marketplaceClient.getCollectibleLowestListing({
28
- chainId: String(chainId),
29
+ const apiArgs: GetCollectibleLowestListingArgs = {
29
30
  contractAddress: collectionAddress,
30
- tokenId,
31
- });
32
-
33
- // let order: Order | undefined;
34
- // if (data.order) {
35
- // order = {
36
- // ...data.order,
37
- // priceAmount: BigInt(data.order.priceAmount),
38
- // priceAmountNet: BigInt(data.order.priceAmountNet),
39
- // };
40
- // }
31
+ chainId: String(chainId),
32
+ ...additionalApiParams,
33
+ };
41
34
 
42
- return data.order || null;
35
+ const result = await marketplaceClient.getCollectibleLowestListing(apiArgs);
36
+ return result.order || null;
43
37
  }
44
38
 
45
- export function lowestListingOptions(
46
- args: UseLowestListingArgs,
47
- config: SdkConfig,
48
- ) {
39
+ export type LowestListingQueryOptions =
40
+ ValuesOptional<FetchLowestListingParams> & {
41
+ query?: StandardQueryOptions;
42
+ };
43
+
44
+ export function lowestListingQueryOptions(params: LowestListingQueryOptions) {
45
+ const enabled = Boolean(
46
+ params.collectionAddress &&
47
+ params.chainId &&
48
+ params.tokenId &&
49
+ params.config &&
50
+ (params.query?.enabled ?? true),
51
+ );
52
+
49
53
  return queryOptions({
50
- enabled: args.query?.enabled ?? true,
51
- queryKey: [...collectableKeys.lowestListings, args],
52
- queryFn: () => fetchLowestListing(args, config),
54
+ queryKey: [...collectableKeys.lowestListings, params],
55
+ queryFn: () =>
56
+ fetchLowestListing({
57
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
58
+ chainId: params.chainId!,
59
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
60
+ collectionAddress: params.collectionAddress!,
61
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
62
+ tokenId: params.tokenId!,
63
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
64
+ config: params.config!,
65
+ }),
66
+ ...params.query,
67
+ enabled,
53
68
  });
54
69
  }
@@ -6,30 +6,31 @@ import {
6
6
  currencyKeys,
7
7
  getMarketplaceClient,
8
8
  getQueryClient,
9
+ type ValuesOptional,
9
10
  } from '../_internal';
11
+ import type { StandardQueryOptions } from '../types/query';
10
12
  import { marketplaceConfigOptions } from './marketplaceConfig';
11
13
 
12
- type QueryArg = {
13
- enabled?: boolean;
14
- };
15
-
16
- export interface UseMarketCurrenciesArgs {
14
+ export interface FetchMarketCurrenciesParams {
17
15
  chainId: number;
18
16
  includeNativeCurrency?: boolean;
19
17
  collectionAddress?: Address;
20
- query?: QueryArg;
18
+ config: SdkConfig;
21
19
  }
22
20
 
23
- const fetchMarketCurrencies = async (
24
- args: UseMarketCurrenciesArgs,
25
- config: SdkConfig,
26
- ) => {
27
- const includeNativeCurrency = args.includeNativeCurrency ?? true;
21
+ /**
22
+ * Fetches supported currencies for a marketplace
23
+ */
24
+ export async function fetchMarketCurrencies(
25
+ params: FetchMarketCurrenciesParams,
26
+ ) {
27
+ const { chainId, includeNativeCurrency, collectionAddress, config } = params;
28
+ const includeNativeCurrencyOption = includeNativeCurrency ?? true;
28
29
  const marketplaceClient = getMarketplaceClient(config);
29
30
 
30
31
  let currencies = await marketplaceClient
31
32
  .listCurrencies({
32
- chainId: String(args.chainId),
33
+ chainId: String(chainId),
33
34
  })
34
35
  .then((resp) =>
35
36
  resp.currencies.map((currency) => ({
@@ -38,7 +39,7 @@ const fetchMarketCurrencies = async (
38
39
  })),
39
40
  );
40
41
 
41
- if (args.collectionAddress) {
42
+ if (collectionAddress) {
42
43
  const queryClient = getQueryClient();
43
44
  const marketplaceConfig = await queryClient.fetchQuery(
44
45
  marketplaceConfigOptions(config),
@@ -46,7 +47,7 @@ const fetchMarketCurrencies = async (
46
47
 
47
48
  const currenciesOptions = marketplaceConfig.market.collections.find(
48
49
  (collection) =>
49
- compareAddress(collection.itemsAddress, args.collectionAddress),
50
+ compareAddress(collection.itemsAddress, collectionAddress),
50
51
  )?.currencyOptions;
51
52
 
52
53
  // Filter currencies based on collection currency options
@@ -57,25 +58,37 @@ const fetchMarketCurrencies = async (
57
58
  }
58
59
  }
59
60
 
60
- if (!includeNativeCurrency) {
61
+ if (!includeNativeCurrencyOption) {
61
62
  currencies = currencies.filter((currency) => !currency.nativeCurrency);
62
63
  }
63
64
 
64
65
  return currencies;
65
- };
66
+ }
67
+
68
+ export type MarketCurrenciesQueryOptions =
69
+ ValuesOptional<FetchMarketCurrenciesParams> & {
70
+ query?: StandardQueryOptions;
71
+ };
72
+
73
+ export function marketCurrenciesQueryOptions(
74
+ params: MarketCurrenciesQueryOptions,
75
+ ) {
76
+ const enabled = Boolean(
77
+ params.chainId && params.config && (params.query?.enabled ?? true),
78
+ );
66
79
 
67
- export const currenciesOptions = (
68
- args: UseMarketCurrenciesArgs,
69
- config: SdkConfig,
70
- ) => {
71
80
  return queryOptions({
72
- ...args.query,
73
- queryKey: [
74
- ...currencyKeys.lists,
75
- args.chainId,
76
- args.includeNativeCurrency ?? true,
77
- args.collectionAddress,
78
- ],
79
- queryFn: () => fetchMarketCurrencies(args, config),
81
+ queryKey: [...currencyKeys.lists, params],
82
+ queryFn: () =>
83
+ fetchMarketCurrencies({
84
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
85
+ chainId: params.chainId!,
86
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
87
+ config: params.config!,
88
+ includeNativeCurrency: params.includeNativeCurrency,
89
+ collectionAddress: params.collectionAddress,
90
+ }),
91
+ ...params.query,
92
+ enabled,
80
93
  });
81
- };
94
+ }
@@ -15,7 +15,7 @@ export const fetchMarketplaceConfig = async ({
15
15
  prefetchedMarketplaceSettings,
16
16
  }: {
17
17
  config: SdkConfig;
18
- prefetchedMarketplaceSettings?: LookupMarketplaceReturn; //TODO: Is this the right approach?
18
+ prefetchedMarketplaceSettings?: LookupMarketplaceReturn;
19
19
  }): Promise<MarketplaceConfig> => {
20
20
  let builderMarketplaceConfig = prefetchedMarketplaceSettings;
21
21
 
@@ -72,14 +72,14 @@ export const fetchMarketplaceConfig = async ({
72
72
  market: {
73
73
  ...marketplaceConfig.market,
74
74
  ...overrides.market,
75
- //@ts-expect-error - TODO: Fix this partial type
75
+ //@ts-expect-error - TODO: Fix this partial type. We need to align new-marketplace-types with builder.gen.ts
76
76
  collections:
77
77
  overrides.market?.collections ?? marketplaceConfig.market.collections,
78
78
  },
79
79
  shop: {
80
80
  ...marketplaceConfig.shop,
81
81
  ...overrides.shop,
82
- //@ts-expect-error - TODO: Fix this partial type
82
+ //@ts-expect-error - TODO: Fix this partial type. We need to align new-marketplace-types with builder.gen.ts
83
83
  collections:
84
84
  overrides.shop?.collections ?? marketplaceConfig.shop.collections,
85
85
  },
@@ -72,7 +72,7 @@ exports[`createSSRClient > should fetch marketplace config successfully 1`] = `
72
72
  ],
73
73
  "enabled": true,
74
74
  "ogImage": "https://example.com/og-image.png",
75
- "title": "Mock Market Page",
75
+ "private": false,
76
76
  },
77
77
  "projectId": NaN,
78
78
  "settings": {
@@ -112,6 +112,11 @@ exports[`createSSRClient > should fetch marketplace config successfully 1`] = `
112
112
  "projectId": 1,
113
113
  "saleAddress": "0x0000000000000000000000000000000000000000",
114
114
  "saleBannerUrl": "https://example.com/shop-sale-banner.png",
115
+ "tokenIds": [
116
+ "1",
117
+ "2",
118
+ "3",
119
+ ],
115
120
  "updatedAt": "2025-03-16T13:04:16.098Z",
116
121
  },
117
122
  {
@@ -125,12 +130,17 @@ exports[`createSSRClient > should fetch marketplace config successfully 1`] = `
125
130
  "projectId": 1,
126
131
  "saleAddress": "0x1234567890123456789012345678901234567890",
127
132
  "saleBannerUrl": "https://example.com/polygon-shop-sale-banner.png",
133
+ "tokenIds": [
134
+ "4",
135
+ "5",
136
+ "6",
137
+ ],
128
138
  "updatedAt": "2025-03-16T13:04:16.098Z",
129
139
  },
130
140
  ],
131
141
  "enabled": true,
132
142
  "ogImage": "https://example.com/shop-og-image.png",
133
- "title": "Mock Shop Page",
143
+ "private": false,
134
144
  },
135
145
  }
136
146
  `;
@@ -1,4 +1,4 @@
1
- import { type State, cookieToInitialState } from 'wagmi';
1
+ import { cookieToInitialState, type State } from 'wagmi';
2
2
  import type { SdkConfig } from '../../types/sdk-config';
3
3
  import { getQueryClient } from '../_internal/api/get-query-client';
4
4
  import { createWagmiConfig } from '../_internal/wagmi/create-config';
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Standard query options that can be used across all marketplace SDK hooks
3
+ *
4
+ * Based on TanStack Query v5 UseQueryOptions, but simplified, the type from TanStack is hard to modify
5
+ */
6
+ export interface StandardQueryOptions<TError = Error> {
7
+ /** Whether the query should be enabled/disabled */
8
+ enabled?: boolean;
9
+ /** Time in milliseconds that data is considered fresh */
10
+ staleTime?: number;
11
+ gcTime?: number;
12
+ // biome-ignore lint/suspicious/noExplicitAny: TanStack Query requires any type for query parameter
13
+ refetchInterval?: number | false | ((query: any) => number | false);
14
+ refetchOnWindowFocus?: boolean;
15
+ refetchOnMount?: boolean;
16
+ refetchOnReconnect?: boolean;
17
+ retry?: boolean | number | ((failureCount: number, error: TError) => boolean);
18
+ retryDelay?: number | ((retryAttempt: number, error: TError) => number);
19
+ // select is not supported for now
20
+ // select?: <TSelected = TData>(data: TData) => TSelected;
21
+ suspense?: boolean;
22
+ /** Placeholder data is not supported for now */
23
+ // placeholderData?: TData | (() => TData);
24
+ }
25
+
26
+ /**
27
+ * Standard infinite query options that can be used across all marketplace SDK hooks
28
+ * that support infinite pagination
29
+ */
30
+ export interface StandardInfiniteQueryOptions<TError = Error>
31
+ extends StandardQueryOptions<TError> {
32
+ /** Maximum number of pages to fetch */
33
+ maxPages?: number;
34
+ }
@@ -1,5 +1,5 @@
1
1
  import { Skeleton } from '@0xsequence/design-system';
2
- import { Suspense, lazy } from 'react';
2
+ import { lazy, Suspense } from 'react';
3
3
 
4
4
  const ModelViewerComponent = lazy(() =>
5
5
  import('@google/model-viewer').then(() => ({
@@ -6,7 +6,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
6
  import { CollectibleCardAction } from '../../../../../../types';
7
7
  import * as walletModule from '../../../../../_internal/wallet/useWallet';
8
8
  import { useActionButtonLogic } from '../hooks/useActionButtonLogic';
9
- import { actionButtonStore, setPendingAction } from '../store';
9
+ import { actionButtonStore } from '../store';
10
10
 
11
11
  describe('useActionButtonLogic', () => {
12
12
  const onCannotPerformActionMock = vi.fn();
@@ -23,7 +23,7 @@ describe('useActionButtonLogic', () => {
23
23
  vi.clearAllMocks();
24
24
  vi.clearAllMocks();
25
25
  vi.restoreAllMocks();
26
- actionButtonStore.pendingAction.set(null);
26
+ actionButtonStore.send({ type: 'clearPendingAction' });
27
27
 
28
28
  vi.spyOn(walletModule, 'useWallet').mockReturnValue({
29
29
  wallet: createMockWallet(),
@@ -33,7 +33,12 @@ describe('useActionButtonLogic', () => {
33
33
  });
34
34
 
35
35
  it('restricts owners from performing buy/offer actions', async () => {
36
- setPendingAction(defaultProps.action, vi.fn(), '123');
36
+ actionButtonStore.send({
37
+ type: 'setPendingAction',
38
+ action: defaultProps.action,
39
+ onPendingActionExecuted: vi.fn(),
40
+ tokenId: '123',
41
+ });
37
42
 
38
43
  const { result } = renderHook(() =>
39
44
  useActionButtonLogic({
@@ -52,11 +57,12 @@ describe('useActionButtonLogic', () => {
52
57
  it('executes pending action when user becomes connected', async () => {
53
58
  const executePendingActionMock = vi.fn();
54
59
 
55
- setPendingAction(
56
- CollectibleCardAction.BUY,
57
- executePendingActionMock,
58
- defaultProps.tokenId,
59
- );
60
+ actionButtonStore.send({
61
+ type: 'setPendingAction',
62
+ action: CollectibleCardAction.BUY,
63
+ onPendingActionExecuted: executePendingActionMock,
64
+ tokenId: defaultProps.tokenId,
65
+ });
60
66
 
61
67
  renderHook(() =>
62
68
  useActionButtonLogic({
@@ -4,9 +4,9 @@ import { useEffect } from 'react';
4
4
  import { CollectibleCardAction } from '../../../../../../types';
5
5
  import { useWallet } from '../../../../../_internal/wallet/useWallet';
6
6
  import {
7
- actionButtonStore,
8
7
  clearPendingAction,
9
- executePendingActionIfExists,
8
+ executePendingAction,
9
+ usePendingAction,
10
10
  } from '../store';
11
11
 
12
12
  type UseActionButtonLogicProps = {
@@ -30,17 +30,17 @@ export const useActionButtonLogic = ({
30
30
  CollectibleCardAction.BUY,
31
31
  CollectibleCardAction.OFFER,
32
32
  ];
33
- const pendingActionType = actionButtonStore.pendingAction.type.get();
33
+ const pendingAction = usePendingAction();
34
+ const pendingActionType = pendingAction?.type;
34
35
 
35
36
  // Handle owner restrictions
36
- // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>
37
37
  useEffect(() => {
38
38
  if (
39
39
  owned &&
40
- actionButtonStore.pendingAction.get() &&
40
+ pendingAction &&
41
41
  address &&
42
42
  actionsThatOwnersCannotPerform.includes(action) &&
43
- actionButtonStore.pendingAction.get()?.collectibleId === tokenId
43
+ pendingAction?.collectibleId === tokenId
44
44
  ) {
45
45
  onCannotPerformAction?.(
46
46
  pendingActionType as
@@ -51,7 +51,7 @@ export const useActionButtonLogic = ({
51
51
  }
52
52
  }, [
53
53
  owned,
54
- actionButtonStore.pendingAction.get(),
54
+ pendingAction,
55
55
  address,
56
56
  action,
57
57
  tokenId,
@@ -64,16 +64,13 @@ export const useActionButtonLogic = ({
64
64
  if (
65
65
  address &&
66
66
  !owned &&
67
- actionButtonStore.pendingAction.get() &&
68
- actionButtonStore.pendingAction.get()?.collectibleId === tokenId
67
+ pendingAction &&
68
+ pendingAction?.collectibleId === tokenId
69
69
  ) {
70
- // TODO: Remove this timeout once pointer-events: none issue is fixed on Radix UI side
71
- setTimeout(() => {
72
- executePendingActionIfExists();
73
- clearPendingAction();
74
- }, 1000);
70
+ executePendingAction(pendingAction);
71
+ clearPendingAction();
75
72
  }
76
- }, [address, owned, tokenId]);
73
+ }, [address, owned, tokenId, pendingAction]);
77
74
 
78
75
  const shouldShowAction = !address
79
76
  ? [CollectibleCardAction.BUY, CollectibleCardAction.OFFER].includes(action)
@@ -1,5 +1,6 @@
1
- import { observable } from '@legendapp/state';
2
- import type { CollectibleCardAction } from './types';
1
+ import { createStore } from '@xstate/store';
2
+ import { useSelector } from '@xstate/store/react';
3
+ import type { CollectibleCardAction } from '../../../../../types';
3
4
 
4
5
  type PendingAction = {
5
6
  type: CollectibleCardAction.BUY | CollectibleCardAction.OFFER;
@@ -8,32 +9,59 @@ type PendingAction = {
8
9
  timestamp: number;
9
10
  };
10
11
 
11
- export const actionButtonStore = observable({
12
- pendingAction: null as PendingAction | null,
12
+ export const actionButtonStore = createStore({
13
+ context: {
14
+ pendingAction: null as PendingAction | null,
15
+ },
16
+ on: {
17
+ setPendingAction: (
18
+ context,
19
+ event: {
20
+ action: CollectibleCardAction.BUY | CollectibleCardAction.OFFER;
21
+ onPendingActionExecuted: () => void;
22
+ tokenId: string;
23
+ },
24
+ ) => ({
25
+ ...context,
26
+ pendingAction: {
27
+ type: event.action,
28
+ callback: event.onPendingActionExecuted,
29
+ timestamp: Date.now(),
30
+ collectibleId: event.tokenId,
31
+ },
32
+ }),
33
+ clearPendingAction: (context) => ({
34
+ ...context,
35
+ pendingAction: null,
36
+ }),
37
+ },
13
38
  });
14
39
 
15
40
  export const setPendingAction = (
16
- type: CollectibleCardAction.BUY | CollectibleCardAction.OFFER,
17
- callback: () => void,
18
- collectibleId: string,
41
+ action: CollectibleCardAction.BUY | CollectibleCardAction.OFFER,
42
+ onPendingActionExecuted: () => void,
43
+ tokenId: string,
19
44
  ) => {
20
- actionButtonStore.pendingAction.set({
21
- type,
22
- callback,
23
- timestamp: Date.now(),
24
- collectibleId,
45
+ actionButtonStore.send({
46
+ type: 'setPendingAction',
47
+ action,
48
+ onPendingActionExecuted,
49
+ tokenId,
25
50
  });
26
51
  };
27
52
 
53
+ // Selector hooks
54
+ export const usePendingAction = () =>
55
+ useSelector(actionButtonStore, (state) => state.context.pendingAction);
56
+
28
57
  export const clearPendingAction = () => {
29
- actionButtonStore.pendingAction.set(null);
58
+ actionButtonStore.send({ type: 'clearPendingAction' });
30
59
  };
31
60
 
32
- export const executePendingActionIfExists = () => {
33
- const timestamp = actionButtonStore.pendingAction.get()?.timestamp;
34
- const callback = actionButtonStore.pendingAction.get()?.callback as
35
- | (() => void)
36
- | undefined;
61
+ export const executePendingAction = (pendingAction: PendingAction | null) => {
62
+ if (!pendingAction) return;
63
+
64
+ const { timestamp, callback } = pendingAction;
37
65
 
38
66
  if (timestamp && callback) {
39
67
  // Only execute if the pending action is less than 5 minutes old
@@ -9,7 +9,7 @@ export function CollectibleCard(props: CollectibleCardProps) {
9
9
  switch (props.marketplaceType) {
10
10
  case 'shop':
11
11
  return <ShopCard {...props} />;
12
- // biome-ignore lint/complexity/noUselessSwitchCase: <explanation>
12
+ // biome-ignore lint/complexity/noUselessSwitchCase: explicit case makes code clearer and future-proof
13
13
  case 'market':
14
14
  default:
15
15
  return <MarketCard {...props} />;
@@ -3,10 +3,10 @@
3
3
  import {
4
4
  ChevronLeftIcon,
5
5
  ChevronRightIcon,
6
+ cn,
6
7
  IconButton,
7
8
  Image,
8
9
  Text,
9
- cn,
10
10
  } from '@0xsequence/design-system';
11
11
  import { formatUnits } from 'viem';
12
12
  import type { MarketplaceType } from '../../../../types';
@@ -33,11 +33,14 @@ export function BaseCard({
33
33
  }
34
34
 
35
35
  return (
36
+ // biome-ignore lint/a11y/noStaticElementInteractions: div used as interactive card with proper role and keyboard support
36
37
  <div
37
38
  data-testid="collectible-card"
38
39
  className="w-card-width min-w-card-min-width overflow-hidden rounded-xl border border-border-base bg-background-primary focus-visible:border-border-focus focus-visible:shadow-focus-ring focus-visible:outline-focus active:border-border-focus active:shadow-active-ring"
39
40
  onClick={onClick}
40
41
  onKeyDown={onKeyDown}
42
+ role={onClick ? 'button' : undefined}
43
+ tabIndex={onClick ? 0 : undefined}
41
44
  >
42
45
  <div className="group relative z-10 flex h-full w-full cursor-pointer flex-col items-start overflow-hidden rounded-xl border-none bg-none p-0 focus:outline-none [&:focus]:rounded-[10px] [&:focus]:outline-[3px] [&:focus]:outline-black [&:focus]:outline-offset-[-3px]">
43
46
  <article className="w-full rounded-xl">
@@ -1,3 +1,3 @@
1
+ export * from './CollectibleCard';
1
2
  export * from './types';
2
3
  export * from './utils';
3
- export * from './CollectibleCard';
@@ -1,9 +1,12 @@
1
1
  import type { Address, Hex } from 'viem';
2
2
  import type { CollectibleCardAction, MarketplaceType } from '../../../../types';
3
- import type { ContractType, TokenMetadata } from '../../../_internal';
4
- import type { CollectibleOrder } from '../../../_internal';
5
- import type { Order } from '../../../_internal';
6
- import type { OrderbookKind } from '../../../_internal';
3
+ import type {
4
+ CollectibleOrder,
5
+ ContractType,
6
+ Order,
7
+ OrderbookKind,
8
+ TokenMetadata,
9
+ } from '../../../_internal';
7
10
 
8
11
  // Base properties shared by all collectible card types
9
12
  type MarketplaceCardBaseProps = {
@@ -1,10 +1,11 @@
1
1
  'use client';
2
2
 
3
+ import type { Address } from 'viem';
3
4
  import { CollectibleCardAction } from '../../../../../types';
4
5
  import { useCurrency } from '../../../../hooks';
5
- import { Footer } from '../Footer';
6
6
  import { ActionButtonWrapper } from '../components/ActionButtonWrapper';
7
7
  import { BaseCard } from '../components/BaseCard';
8
+ import { Footer } from '../Footer';
8
9
  import type { MarketCollectibleCardProps } from '../types';
9
10
 
10
11
  export function MarketCard({
@@ -31,7 +32,7 @@ export function MarketCard({
31
32
  isLoading: lowestListingCurrencyLoading,
32
33
  } = useCurrency({
33
34
  chainId,
34
- currencyAddress: collectible?.listing?.priceCurrencyAddress,
35
+ currencyAddress: collectible?.listing?.priceCurrencyAddress as Address,
35
36
  query: {
36
37
  enabled: !!collectible?.listing?.priceCurrencyAddress,
37
38
  },
@@ -3,9 +3,9 @@
3
3
  import { CollectibleCardAction } from '../../../../../types';
4
4
  import { ContractType } from '../../../../_internal';
5
5
  import { useCurrency } from '../../../../hooks';
6
- import { Footer } from '../Footer';
7
6
  import { ActionButtonWrapper } from '../components/ActionButtonWrapper';
8
7
  import { BaseCard } from '../components/BaseCard';
8
+ import { Footer } from '../Footer';
9
9
  import type { ShopCollectibleCardProps } from '../types';
10
10
 
11
11
  export function ShopCard({
@@ -51,10 +51,7 @@ export function ShopCard({
51
51
 
52
52
  const action = CollectibleCardAction.BUY;
53
53
 
54
- const mediaClassName =
55
- collectionType === ContractType.ERC721 && !quantityRemaining
56
- ? 'opacity-50'
57
- : 'opacity-100';
54
+ const mediaClassName = !quantityRemaining ? 'opacity-50' : 'opacity-100';
58
55
 
59
56
  return (
60
57
  <BaseCard
@@ -1,5 +1,5 @@
1
1
  import { Image } from '@0xsequence/design-system';
2
- import { type ComponentProps, Suspense, lazy } from 'react';
2
+ import { type ComponentProps, lazy, Suspense } from 'react';
3
3
 
4
4
  /* @__PURE__ */
5
5
  const createMarketplaceLogo = (
@@ -34,6 +34,7 @@ export function Media({
34
34
  const [assetLoadFailed, setAssetLoadFailed] = useState(false);
35
35
  const [assetLoading, setAssetLoading] = useState(true);
36
36
  const [currentAssetIndex, setCurrentAssetIndex] = useState(0);
37
+ const [isSafari, setIsSafari] = useState(false);
37
38
  const [contentType, setContentType] = useState<ContentTypeState>({
38
39
  type: null,
39
40
  loading: true,
@@ -41,7 +42,10 @@ export function Media({
41
42
  });
42
43
 
43
44
  const videoRef = useRef<HTMLVideoElement>(null);
44
- const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
45
+
46
+ useEffect(() => {
47
+ setIsSafari(/^((?!chrome|android).)*safari/i.test(navigator.userAgent));
48
+ }, []);
45
49
 
46
50
  const validAssets = assets.filter((asset): asset is string => !!asset);
47
51
  const assetUrl = validAssets[currentAssetIndex];