@0xsequence/marketplace-sdk 0.9.0 → 0.10.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 (326) hide show
  1. package/.storybook/main.ts +63 -0
  2. package/.storybook/preview.ts +24 -0
  3. package/.storybook/vitest.setup.ts +6 -0
  4. package/CHANGELOG.md +77 -8
  5. package/dist/{CalendarIcon-DbQ7Vxcw.js → CalendarIcon-CqsuAuCm.js} +4 -51
  6. package/dist/CalendarIcon-CqsuAuCm.js.map +1 -0
  7. package/dist/{CollectibleCard-C8Ae64Ab.d.ts → CollectibleCard-Dd-CG6dE.d.ts} +8 -7
  8. package/dist/InfoIcon-v0w_Lu7t.js +53 -0
  9. package/dist/InfoIcon-v0w_Lu7t.js.map +1 -0
  10. package/dist/{_internal-BgWcRIak.js → _internal-C75gOSNo.js} +2 -10
  11. package/dist/_internal-C75gOSNo.js.map +1 -0
  12. package/dist/actionModal-CMUeVsFX.js +116 -0
  13. package/dist/actionModal-CMUeVsFX.js.map +1 -0
  14. package/dist/{alien_swap-B_76IMma.js → alien_swap-CYv6YlOF.js} +1 -1
  15. package/dist/{alien_swap-B_76IMma.js.map → alien_swap-CYv6YlOF.js.map} +1 -1
  16. package/dist/{api-DTIan01C.js → api-BiMGqWdz.js} +17 -34
  17. package/dist/api-BiMGqWdz.js.map +1 -0
  18. package/dist/{aqua-xyz-CMN_TFY5.js → aqua-xyz-Bzn5baeH.js} +1 -1
  19. package/dist/{aqua-xyz-CMN_TFY5.js.map → aqua-xyz-Bzn5baeH.js.map} +1 -1
  20. package/dist/{aura-Cye_TuHj.js → aura-DzIWh8WT.js} +1 -1
  21. package/dist/{aura-Cye_TuHj.js.map → aura-DzIWh8WT.js.map} +1 -1
  22. package/dist/base-DqaJPvfN.js +22 -0
  23. package/dist/base-DqaJPvfN.js.map +1 -0
  24. package/dist/{blur-DWDMyMpK.js → blur-DSH-Cbpj.js} +1 -1
  25. package/dist/{blur-DWDMyMpK.js.map → blur-DSH-Cbpj.js.map} +1 -1
  26. package/dist/{coinbase-ByA_XRB0.js → coinbase-Df8URNxq.js} +1 -1
  27. package/dist/{coinbase-ByA_XRB0.js.map → coinbase-Df8URNxq.js.map} +1 -1
  28. package/dist/{new-marketplace-types-Bfis0U4J.d.ts → create-config-DKJ-F0jc.d.ts} +402 -41
  29. package/dist/{wagmi-CDzEQbfk.js → create-config-fQ-jbJD1.js} +20 -10
  30. package/dist/create-config-fQ-jbJD1.js.map +1 -0
  31. package/dist/{element-b77CyXIZ.js → element-Cx6uJu5N.js} +1 -1
  32. package/dist/{element-b77CyXIZ.js.map → element-Cx6uJu5N.js.map} +1 -1
  33. package/dist/{foundation-DbOrKP9Y.js → foundation-D6U4aRLN.js} +1 -1
  34. package/dist/{foundation-DbOrKP9Y.js.map → foundation-D6U4aRLN.js.map} +1 -1
  35. package/dist/get-provider-CYYHfrlg.js +10 -0
  36. package/dist/get-provider-CYYHfrlg.js.map +1 -0
  37. package/dist/get-query-client-D19vvfJo.js +23 -0
  38. package/dist/get-query-client-D19vvfJo.js.map +1 -0
  39. package/dist/hooks-4pxIbLbM.js +4044 -0
  40. package/dist/hooks-4pxIbLbM.js.map +1 -0
  41. package/dist/{index-BL9RUSEK.d.ts → index-136YrWDH.d.ts} +1 -1
  42. package/dist/{index-D5v5iluA.d.ts → index-BAhaEfqY.d.ts} +1 -1
  43. package/dist/index-BKBin-rq.d.ts +979 -0
  44. package/dist/{index-BQsgAvtX.d.ts → index-BUWB_RXp.d.ts} +776 -570
  45. package/dist/{index-21LE7OhL.d.ts → index-BhVFc2rX.d.ts} +6 -3
  46. package/dist/{index-DXMfTZ1F.d.ts → index-C5aqo8xu.d.ts} +1 -1
  47. package/dist/{index-ByznONYE.d.ts → index-CKrYP7ot.d.ts} +20 -48
  48. package/dist/{index-DaE5ZNHb.d.ts → index-CUwMH7Ht.d.ts} +5 -5
  49. package/dist/{index-CLy8y5hm.d.ts → index-Cu70Lw-w.d.ts} +1 -1
  50. package/dist/index.css +414 -1
  51. package/dist/index.d.ts +8 -10
  52. package/dist/index.js +13 -9
  53. package/dist/{looks-rare-C1VqNcSM.js → looks-rare-ChBRBY-p.js} +1 -1
  54. package/dist/{looks-rare-C1VqNcSM.js.map → looks-rare-ChBRBY-p.js.map} +1 -1
  55. package/dist/{magic-eden-ea_AGCZr.js → magic-eden-D5U7N1xL.js} +1 -1
  56. package/dist/{magic-eden-ea_AGCZr.js.map → magic-eden-D5U7N1xL.js.map} +1 -1
  57. package/dist/{manifold-8y8J2sjT.js → manifold-CtLF52zU.js} +1 -1
  58. package/dist/{manifold-8y8J2sjT.js.map → manifold-CtLF52zU.js.map} +1 -1
  59. package/dist/{marketplace-nwnZv9Cb.js → marketplace-DmFiyBoS.js} +1 -1
  60. package/dist/{marketplace-nwnZv9Cb.js.map → marketplace-DmFiyBoS.js.map} +1 -1
  61. package/dist/{marketplace-logos-CSeGcPW4.js → marketplace-logos-Cd6W-qOq.js} +21 -21
  62. package/dist/{marketplace-logos-CSeGcPW4.js.map → marketplace-logos-Cd6W-qOq.js.map} +1 -1
  63. package/dist/{marketplace.gen-BSDIX7NZ.js → marketplace.gen-HpnpL5xU.js} +3 -3
  64. package/dist/marketplace.gen-HpnpL5xU.js.map +1 -0
  65. package/dist/{marketplaceConfig-C6X1SUik.js → marketplaceConfig-GQTTmihy.js} +3 -3
  66. package/dist/marketplaceConfig-GQTTmihy.js.map +1 -0
  67. package/dist/{mintify-LA68TzWg.js → mintify-Bi3Bce68.js} +1 -1
  68. package/dist/{mintify-LA68TzWg.js.map → mintify-Bi3Bce68.js.map} +1 -1
  69. package/dist/network-CGD0oKtS.js +15 -0
  70. package/dist/network-CGD0oKtS.js.map +1 -0
  71. package/dist/{nftx-D3Tc8nzd.js → nftx-BDQZjtkX.js} +1 -1
  72. package/dist/{nftx-D3Tc8nzd.js.map → nftx-BDQZjtkX.js.map} +1 -1
  73. package/dist/{okx-hbqg6oIJ.js → okx-D4meadLe.js} +1 -1
  74. package/dist/{okx-hbqg6oIJ.js.map → okx-D4meadLe.js.map} +1 -1
  75. package/dist/{open-sea-BccuK8-t.js → open-sea-DN0hgfVw.js} +1 -1
  76. package/dist/{open-sea-BccuK8-t.js.map → open-sea-DN0hgfVw.js.map} +1 -1
  77. package/dist/{primary-sale-C55ALnfQ.js → primary-sale-CmWxSfFQ.js} +1 -1
  78. package/dist/{primary-sale-C55ALnfQ.js.map → primary-sale-CmWxSfFQ.js.map} +1 -1
  79. package/dist/provider-DPGUA10G.js +125 -0
  80. package/dist/provider-DPGUA10G.js.map +1 -0
  81. package/dist/{queries-CUU65uYZ.js → queries-Ce_2othB.js} +165 -7
  82. package/dist/queries-Ce_2othB.js.map +1 -0
  83. package/dist/{rarible-BgTwwj9g.js → rarible-B0xlD88A.js} +1 -1
  84. package/dist/{rarible-BgTwwj9g.js.map → rarible-B0xlD88A.js.map} +1 -1
  85. package/dist/react/_internal/api/index.d.ts +2 -4
  86. package/dist/react/_internal/api/index.js +7 -4
  87. package/dist/react/_internal/databeat/index.d.ts +2 -73
  88. package/dist/react/_internal/databeat/index.js +4 -21
  89. package/dist/react/_internal/index.d.ts +2 -7
  90. package/dist/react/_internal/index.js +11 -6
  91. package/dist/react/_internal/wagmi/index.d.ts +2 -4
  92. package/dist/react/_internal/wagmi/index.js +5 -3
  93. package/dist/react/hooks/index.d.ts +12 -17
  94. package/dist/react/hooks/index.js +23 -19
  95. package/dist/react/hooks/options/index.d.ts +2 -3
  96. package/dist/react/hooks/options/index.js +12 -7
  97. package/dist/react/index.d.ts +12 -17
  98. package/dist/react/index.js +28 -19
  99. package/dist/react/queries/index.d.ts +9 -8
  100. package/dist/react/queries/index.js +20 -15
  101. package/dist/react/ssr/index.d.ts +7 -9
  102. package/dist/react/ssr/index.js +11 -6
  103. package/dist/react/ssr/index.js.map +1 -1
  104. package/dist/react/ui/components/marketplace-collectible-card/index.d.ts +3 -8
  105. package/dist/react/ui/components/marketplace-collectible-card/index.js +27 -18
  106. package/dist/react/ui/components/marketplace-collectible-card/utils/index.d.ts +2 -7
  107. package/dist/react/ui/components/marketplace-collectible-card/utils/index.js +11 -6
  108. package/dist/react/ui/components/marketplace-logos/index.d.ts +21 -21
  109. package/dist/react/ui/components/marketplace-logos/index.js +1 -1
  110. package/dist/react/ui/icons/index.js +13 -9
  111. package/dist/react/ui/index.d.ts +3 -8
  112. package/dist/react/ui/index.js +27 -18
  113. package/dist/react/ui/modals/_internal/components/actionModal/index.d.ts +2 -2
  114. package/dist/react/ui/modals/_internal/components/actionModal/index.js +23 -18
  115. package/dist/{react-DAIicQPT.js → react-DP0M2Wfm.js} +799 -4306
  116. package/dist/react-DP0M2Wfm.js.map +1 -0
  117. package/dist/{react-BbHBl6gg.css → react-DeDyTgo7.css} +1 -1
  118. package/dist/{react-BbHBl6gg.css.map → react-DeDyTgo7.css.map} +1 -1
  119. package/dist/{sequence-Do3kzb4J.js → sequence-BIrOVRXO.js} +1 -1
  120. package/dist/{sequence-Do3kzb4J.js.map → sequence-BIrOVRXO.js.map} +1 -1
  121. package/dist/{sudo-swap-B6vPKxBz.js → sudo-swap-BPMon-M5.js} +1 -1
  122. package/dist/{sudo-swap-B6vPKxBz.js.map → sudo-swap-BPMon-M5.js.map} +1 -1
  123. package/dist/{super-rare-eCm1SE6O.js → super-rare-kPN6Ua8i.js} +1 -1
  124. package/dist/{super-rare-eCm1SE6O.js.map → super-rare-kPN6Ua8i.js.map} +1 -1
  125. package/dist/{token-Da4TdyUk.js → token-CHSBPYVG.js} +1 -1
  126. package/dist/{token-Da4TdyUk.js.map → token-CHSBPYVG.js.map} +1 -1
  127. package/dist/{transaction-CcVViHEL.js → transaction-CnctdNzS.js} +3 -21
  128. package/dist/transaction-CnctdNzS.js.map +1 -0
  129. package/dist/types/index.d.ts +2 -3
  130. package/dist/types/index.js +2 -2
  131. package/dist/{types-DwWE6xOF.js → types-Yw2ywj6j.js} +1 -1
  132. package/dist/{types-DwWE6xOF.js.map → types-Yw2ywj6j.js.map} +1 -1
  133. package/dist/utils/abi/index.d.ts +4 -4
  134. package/dist/utils/abi/index.js +4 -4
  135. package/dist/utils/abi/marketplace/index.d.ts +1 -1
  136. package/dist/utils/abi/marketplace/index.js +1 -1
  137. package/dist/utils/abi/primary-sale/index.d.ts +1 -1
  138. package/dist/utils/abi/primary-sale/index.js +1 -1
  139. package/dist/utils/abi/token/index.d.ts +1 -1
  140. package/dist/utils/abi/token/index.js +1 -1
  141. package/dist/utils/index.d.ts +7 -8
  142. package/dist/utils/index.js +12 -9
  143. package/dist/{utils-CW2NA5KG.js → utils-9RXDgcBl.js} +4 -11
  144. package/dist/utils-9RXDgcBl.js.map +1 -0
  145. package/dist/{utils-BPYfgDSL.js → utils-DjVJ9tov.js} +5 -6
  146. package/dist/utils-DjVJ9tov.js.map +1 -0
  147. package/dist/wagmi-Do_KW5ke.js +0 -0
  148. package/dist/{x2y2-DD17tT91.js → x2y2-BLz-_Q2O.js} +1 -1
  149. package/dist/{x2y2-DD17tT91.js.map → x2y2-BLz-_Q2O.js.map} +1 -1
  150. package/dist/{zora-BpSG9UzS.js → zora-UGhKs-aL.js} +1 -1
  151. package/dist/{zora-BpSG9UzS.js.map → zora-UGhKs-aL.js.map} +1 -1
  152. package/eslint.config.mjs +4 -0
  153. package/package.json +27 -14
  154. package/postcss.config.mjs +6 -0
  155. package/src/index.css +5 -4
  156. package/src/index.ts +1 -0
  157. package/src/react/__tests__/provider.test.tsx +4 -3
  158. package/src/react/_internal/api/__mocks__/indexer.msw.ts +16 -0
  159. package/src/react/_internal/api/__mocks__/laos.msw.ts +387 -0
  160. package/src/react/_internal/api/__mocks__/marketplace.msw.ts +2 -0
  161. package/src/react/_internal/api/__tests__/laos-api.test.ts +756 -0
  162. package/src/react/_internal/api/laos-api.ts +3 -0
  163. package/src/react/_internal/api/marketplace.gen.ts +5 -3
  164. package/src/react/_internal/api/query-keys.ts +12 -4
  165. package/src/react/_internal/api/services.ts +2 -14
  166. package/src/react/_internal/databeat/index.ts +15 -14
  167. package/src/react/_internal/databeat/types.ts +22 -0
  168. package/src/react/_internal/databeat/utils.ts +26 -0
  169. package/src/react/_internal/utils.ts +4 -4
  170. package/src/react/_internal/wagmi/create-config.ts +28 -13
  171. package/src/react/_internal/wallet/wallet.ts +4 -4
  172. package/src/react/hooks/__tests__/useBalanceOfCollectible.laos.test.tsx +367 -0
  173. package/src/react/hooks/__tests__/useCheckoutOptions.test.tsx +158 -0
  174. package/src/react/hooks/__tests__/useCheckoutOptionsSalesContract.test.tsx +42 -65
  175. package/src/react/hooks/__tests__/useCollectionBalanceDetails.test.tsx +17 -0
  176. package/src/react/hooks/__tests__/useCollectionDetailsPolling.test.tsx +11 -3
  177. package/src/react/hooks/__tests__/useConvertPriceToUSD.test.tsx +3 -3
  178. package/src/react/hooks/__tests__/useCurrencyBalance.test.tsx +7 -3
  179. package/src/react/hooks/__tests__/useFilters.test.tsx +2 -2
  180. package/src/react/hooks/__tests__/useGetTokenRanges.test.tsx +111 -0
  181. package/src/react/hooks/__tests__/useListTokenMetadata.test.tsx +83 -57
  182. package/src/react/hooks/__tests__/useTransferTokens.test.tsx +469 -0
  183. package/src/react/hooks/index.ts +3 -1
  184. package/src/react/hooks/useCheckoutOptions.tsx +96 -0
  185. package/src/react/hooks/useCheckoutOptionsSalesContract.tsx +98 -57
  186. package/src/react/hooks/useCollectionBalanceDetails.tsx +95 -68
  187. package/src/react/hooks/useCollectionDetailsPolling.tsx +3 -7
  188. package/src/react/hooks/useComparePrices.tsx +90 -82
  189. package/src/react/hooks/useConvertPriceToUSD.tsx +85 -71
  190. package/src/react/hooks/useCurrencyBalance.tsx +132 -46
  191. package/src/react/hooks/useERC721SaleMintedTokens.tsx +8 -5
  192. package/src/react/hooks/useFilters.tsx +154 -111
  193. package/src/react/hooks/useGetCountOfPrimarySaleItems.tsx +48 -0
  194. package/src/react/hooks/useGetTokenRanges.tsx +83 -22
  195. package/src/react/hooks/useList1155ShopCardData.tsx +2 -0
  196. package/src/react/hooks/useList721ShopCardData.tsx +12 -7
  197. package/src/react/hooks/useListCollections.tsx +25 -25
  198. package/src/react/hooks/useListMarketCardData.tsx +2 -1
  199. package/src/react/hooks/useListPrimarySaleItems.tsx +66 -0
  200. package/src/react/hooks/useListTokenMetadata.ts +71 -0
  201. package/src/react/hooks/useOpenConnectModal.tsx +9 -0
  202. package/src/react/hooks/useTokenSaleDetailsBatch.tsx +3 -7
  203. package/src/react/hooks/useTokenSupplies.ts +81 -0
  204. package/src/react/hooks/useTransferTokens.tsx +2 -2
  205. package/src/react/provider.tsx +73 -9
  206. package/src/react/queries/__tests__/balanceOfCollectible.laos.test.ts +123 -0
  207. package/src/react/queries/__tests__/inventory.laos.test.ts +496 -0
  208. package/src/react/queries/balanceOfCollectible.ts +7 -4
  209. package/src/react/queries/checkoutOptions.ts +85 -0
  210. package/src/react/queries/checkoutOptionsSalesContract.ts +89 -0
  211. package/src/react/queries/collectionBalanceDetails.ts +92 -0
  212. package/src/react/queries/comparePrices.ts +108 -0
  213. package/src/react/queries/convertPriceToUSD.ts +92 -0
  214. package/src/react/queries/filters.ts +138 -0
  215. package/src/react/queries/getTokenRanges.ts +62 -0
  216. package/src/react/queries/index.ts +3 -0
  217. package/src/react/queries/inventory.ts +6 -0
  218. package/src/react/queries/listBalances.ts +4 -3
  219. package/src/react/queries/listCollections.ts +7 -3
  220. package/src/react/queries/listTokenMetadata.ts +2 -2
  221. package/src/react/queries/marketplaceConfig.ts +1 -1
  222. package/src/react/queries/primarySaleItems.ts +85 -0
  223. package/src/react/queries/primarySaleItemsCount.ts +64 -0
  224. package/src/react/queries/tokenSupplies.ts +93 -0
  225. package/src/react/ui/components/_internals/action-button/ActionButton.tsx +66 -66
  226. package/src/react/ui/components/_internals/action-button/__tests__/ActionButtonBody.test.tsx +22 -4
  227. package/src/react/ui/components/_internals/action-button/components/ActionButtonBody.tsx +5 -4
  228. package/src/react/ui/components/_internals/action-button/components/NonOwnerActions.tsx +3 -0
  229. package/src/react/ui/components/_internals/action-button/components/OwnerActions.tsx +4 -4
  230. package/src/react/ui/components/_internals/action-button/hooks/useActionButtonLogic.ts +13 -8
  231. package/src/react/ui/components/_internals/action-button/store.ts +44 -34
  232. package/src/react/ui/components/_internals/custom-select/CustomSelect.stories.tsx +582 -0
  233. package/src/react/ui/components/_internals/pill/Pill.stories.tsx +83 -0
  234. package/src/react/ui/components/marketplace-collectible-card/Footer.tsx +11 -4
  235. package/src/react/ui/components/marketplace-collectible-card/components/ActionButtonWrapper.tsx +7 -4
  236. package/src/react/ui/components/marketplace-collectible-card/types.ts +4 -3
  237. package/src/react/ui/components/marketplace-collectible-card/utils/supplyStatus.ts +4 -7
  238. package/src/react/ui/components/marketplace-collectible-card/variants/ShopCard.tsx +5 -1
  239. package/src/react/ui/components/marketplace-logos/marketplace-logos.stories.tsx +199 -0
  240. package/src/react/ui/components/media/Media.stories.tsx +642 -0
  241. package/src/react/ui/components/media/Media.tsx +24 -19
  242. package/src/react/ui/components/media/types.ts +6 -0
  243. package/src/react/ui/modals/BuyModal/__tests__/BuyModalRouter.test.tsx +15 -0
  244. package/src/react/ui/modals/BuyModal/__tests__/ERC1155ShopModal.test.tsx +6 -0
  245. package/src/react/ui/modals/BuyModal/__tests__/Modal1155.test.tsx +7 -1
  246. package/src/react/ui/modals/BuyModal/__tests__/store.test.ts +9 -1
  247. package/src/react/ui/modals/BuyModal/components/ERC1155QuantityModal.tsx +15 -8
  248. package/src/react/ui/modals/BuyModal/components/ERC1155ShopModal.tsx +3 -0
  249. package/src/react/ui/modals/BuyModal/hooks/__tests__/useERC1155Checkout.test.tsx +30 -27
  250. package/src/react/ui/modals/BuyModal/hooks/useCheckoutOptions.ts +2 -2
  251. package/src/react/ui/modals/BuyModal/hooks/useERC1155Checkout.ts +11 -2
  252. package/src/react/ui/modals/BuyModal/hooks/useERC721SalePaymentParams.ts +1 -1
  253. package/src/react/ui/modals/BuyModal/hooks/usePaymentModalParams.ts +7 -0
  254. package/src/react/ui/modals/BuyModal/index.tsx +9 -1
  255. package/src/react/ui/modals/BuyModal/store.ts +26 -0
  256. package/src/react/ui/modals/CreateListingModal/Modal.tsx +28 -11
  257. package/src/react/ui/modals/CreateListingModal/store.ts +3 -3
  258. package/src/react/ui/modals/MakeOfferModal/Modal.tsx +30 -13
  259. package/src/react/ui/modals/MakeOfferModal/store.ts +3 -3
  260. package/src/react/ui/modals/SellModal/Modal.tsx +11 -8
  261. package/src/react/ui/modals/SellModal/store.ts +3 -3
  262. package/src/react/ui/modals/TransferModal/__tests__/__snapshots__/store.test.ts.snap +17 -0
  263. package/src/react/ui/modals/TransferModal/__tests__/store.test.ts +366 -0
  264. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/__tests__/useHandleTransfer.test.tsx +402 -0
  265. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TokenQuantityInput.tsx +51 -48
  266. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TransferButton.tsx +39 -47
  267. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/WalletAddressInput.tsx +9 -8
  268. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/index.tsx +31 -35
  269. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/useHandleTransfer.tsx +19 -10
  270. package/src/react/ui/modals/TransferModal/index.tsx +28 -31
  271. package/src/react/ui/modals/TransferModal/messages.ts +1 -1
  272. package/src/react/ui/modals/TransferModal/store.ts +122 -0
  273. package/src/react/ui/modals/_internal/components/calendar/index.tsx +0 -1
  274. package/src/react/ui/modals/_internal/components/currencyImage/index.tsx +10 -14
  275. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/__tests__/index.test.tsx +5 -2
  276. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/index.tsx +23 -17
  277. package/src/react/ui/modals/_internal/components/expirationDateSelect/index.tsx +10 -10
  278. package/src/react/ui/modals/_internal/components/floorPriceText/__tests__/FloorPriceText.test.tsx +6 -6
  279. package/src/react/ui/modals/_internal/components/priceInput/__tests__/PriceInput.test.tsx +13 -5
  280. package/src/react/ui/modals/_internal/components/priceInput/index.tsx +41 -26
  281. package/src/react/ui/modals/_internal/components/quantityInput/__tests__/index.test.tsx +68 -59
  282. package/src/react/ui/modals/_internal/components/quantityInput/index.tsx +155 -20
  283. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/__tests__/SelectWaasFeeOptions.test.tsx +339 -40
  284. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/index.tsx +95 -101
  285. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/store.ts +72 -14
  286. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/useWaasFeeOptionManager.tsx +29 -13
  287. package/src/react/ui/modals/_internal/components/tokenPreview/index.tsx +2 -2
  288. package/src/react/ui/modals/_internal/components/transactionDetails/index.tsx +2 -2
  289. package/src/react/ui/modals/_internal/components/transactionPreview/index.tsx +88 -89
  290. package/src/react/ui/modals/_internal/components/transactionStatusModal/__tests__/TransactionStatusModal.test.tsx +36 -10
  291. package/src/react/ui/modals/_internal/components/transactionStatusModal/index.tsx +32 -20
  292. package/src/react/ui/modals/_internal/components/transactionStatusModal/store.ts +91 -62
  293. package/src/react/ui/modals/_internal/components/waasFeeOptionsSelect/WaasFeeOptionsSelect.tsx +43 -44
  294. package/src/react/ui/modals/_internal/types.ts +2 -2
  295. package/src/types/sdk-config.ts +6 -1
  296. package/src/utils/network.ts +15 -0
  297. package/test/test-utils.tsx +2 -0
  298. package/vitest.shims.d.ts +2 -0
  299. package/vitest.storybook.config.js +33 -0
  300. package/dist/CalendarIcon-DbQ7Vxcw.js.map +0 -1
  301. package/dist/_internal-BgWcRIak.js.map +0 -1
  302. package/dist/api-DTIan01C.js.map +0 -1
  303. package/dist/builder-api-C_zj5mr3.d.ts +0 -12
  304. package/dist/index-BUVWziLP.d.ts +0 -60
  305. package/dist/index-COt10OgI.d.ts +0 -24
  306. package/dist/index-DPNWNa7t.d.ts +0 -414
  307. package/dist/index-DsfCs3-x.d.ts +0 -122
  308. package/dist/index-dUb6wb4Y.d.ts +0 -22
  309. package/dist/marketplace.gen-BSDIX7NZ.js.map +0 -1
  310. package/dist/marketplaceConfig-C6X1SUik.js.map +0 -1
  311. package/dist/queries-CUU65uYZ.js.map +0 -1
  312. package/dist/react-DAIicQPT.js.map +0 -1
  313. package/dist/transaction-CcVViHEL.js.map +0 -1
  314. package/dist/utils-BPYfgDSL.js.map +0 -1
  315. package/dist/utils-CW2NA5KG.js.map +0 -1
  316. package/dist/wagmi-CDzEQbfk.js.map +0 -1
  317. package/src/react/hooks/__tests__/useGetTokenSuppliesMap.test.tsx +0 -104
  318. package/src/react/hooks/useGetTokenSuppliesMap.tsx +0 -73
  319. package/src/react/hooks/useListPrimarySaleItems.ts +0 -102
  320. package/src/react/queries/getTokenSuppliesMap.ts +0 -77
  321. package/src/react/ui/modals/TransferModal/_store.ts +0 -66
  322. package/src/react/ui/modals/_internal/components/quantityInput/QuantityInputBase.tsx +0 -166
  323. package/src/react/ui/modals/_internal/stores/accountModal.ts +0 -3
  324. /package/dist/{abi-BKyRjVcZ.js → abi-BMvgNbKQ.js} +0 -0
  325. /package/dist/{index-C39K_8SG.d.ts → index-CD2bj_xW.d.ts} +0 -0
  326. /package/dist/{options-B4QN7Xou.js → options-BBBR8u_4.js} +0 -0
@@ -1,13 +1,13 @@
1
1
  import type { GetTokenBalancesReturn, Page } from '@0xsequence/indexer';
2
2
  import { infiniteQueryOptions } from '@tanstack/react-query';
3
- import type { Hex } from 'viem';
3
+ import type { Address, Hex } from 'viem';
4
4
  import type { SdkConfig } from '../../types';
5
5
  import { balanceQueries, getIndexerClient, LaosAPI } from '../_internal';
6
6
 
7
7
  export type UseListBalancesArgs = {
8
8
  chainId: number;
9
- accountAddress?: Hex;
10
- contractAddress?: Hex;
9
+ accountAddress?: Address;
10
+ contractAddress?: Address;
11
11
  tokenId?: string;
12
12
  includeMetadata?: boolean;
13
13
  metadataOptions?: {
@@ -34,6 +34,7 @@ export async function fetchBalances(
34
34
  return laosClient.getTokenBalances({
35
35
  chainId: args.chainId.toString(),
36
36
  accountAddress: args.accountAddress,
37
+ contractAddress: args.contractAddress as Address,
37
38
  includeMetadata: args.includeMetadata,
38
39
  page: {
39
40
  sort: [
@@ -28,7 +28,7 @@ export interface FetchListCollectionsParams {
28
28
  }
29
29
 
30
30
  /**
31
- * Fetches list of collections from the metadata API with marketplace filtering
31
+ * Fetches collections from the metadata API with marketplace config filtering
32
32
  */
33
33
  export async function fetchListCollections(params: FetchListCollectionsParams) {
34
34
  const { marketplaceType, marketplaceConfig, config } = params;
@@ -150,14 +150,18 @@ export const listCollectionsOptions = ({
150
150
  config: SdkConfig;
151
151
  }) => {
152
152
  return queryOptions({
153
- queryKey: [...collectionKeys.list, marketplaceType],
153
+ queryKey: [
154
+ ...collectionKeys.list,
155
+ { marketplaceType, marketplaceConfig, config },
156
+ ],
154
157
  queryFn: marketplaceConfig
155
158
  ? () =>
156
159
  fetchListCollections({
157
- marketplaceType,
158
160
  marketplaceConfig,
159
161
  config,
162
+ marketplaceType,
160
163
  })
161
164
  : skipToken,
165
+ enabled: Boolean(marketplaceConfig),
162
166
  });
163
167
  };
@@ -2,7 +2,7 @@ import { queryOptions } from '@tanstack/react-query';
2
2
  import type { SdkConfig } from '../../types';
3
3
  import {
4
4
  getMetadataClient,
5
- metadataKeys,
5
+ tokenKeys,
6
6
  type ValuesOptional,
7
7
  } from '../_internal';
8
8
  import type { StandardQueryOptions } from '../types/query';
@@ -49,7 +49,7 @@ export function listTokenMetadataQueryOptions(
49
49
  );
50
50
 
51
51
  return queryOptions({
52
- queryKey: [...metadataKeys.tokenMetadata, params],
52
+ queryKey: [...tokenKeys.metadata, params],
53
53
  queryFn: () =>
54
54
  fetchListTokenMetadata({
55
55
  // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
@@ -38,7 +38,7 @@ export const fetchMarketplaceConfig = async ({
38
38
  } satisfies MarketCollection;
39
39
  });
40
40
 
41
- const shopCollections = builderMarketplaceConfig.shopCollections.map(
41
+ const shopCollections = (builderMarketplaceConfig.shopCollections ?? []).map(
42
42
  (collection) => {
43
43
  return {
44
44
  ...collection,
@@ -0,0 +1,85 @@
1
+ import { infiniteQueryOptions } from '@tanstack/react-query';
2
+ import type { Address } from 'viem';
3
+ import type { SdkConfig } from '../../types';
4
+ import {
5
+ getMarketplaceClient,
6
+ type ListPrimarySaleItemsArgs,
7
+ type ListPrimarySaleItemsReturn,
8
+ type Page,
9
+ type PrimarySaleItemsFilter,
10
+ type ValuesOptional,
11
+ } from '../_internal';
12
+ import type { StandardQueryOptions } from '../types/query';
13
+
14
+ export interface FetchPrimarySaleItemsParams {
15
+ chainId: number;
16
+ primarySaleContractAddress: Address;
17
+ filter?: PrimarySaleItemsFilter;
18
+ page?: Page;
19
+ config: SdkConfig;
20
+ }
21
+
22
+ /**
23
+ * Fetches primary sale items from the marketplace API
24
+ */
25
+ export async function fetchPrimarySaleItems(
26
+ params: FetchPrimarySaleItemsParams,
27
+ ): Promise<ListPrimarySaleItemsReturn> {
28
+ const { chainId, primarySaleContractAddress, filter, page, config } = params;
29
+
30
+ const marketplaceClient = getMarketplaceClient(config);
31
+
32
+ return marketplaceClient.listPrimarySaleItems({
33
+ chainId: String(chainId),
34
+ primarySaleContractAddress,
35
+ filter,
36
+ page,
37
+ });
38
+ }
39
+
40
+ export type ListPrimarySaleItemsQueryOptions =
41
+ ValuesOptional<FetchPrimarySaleItemsParams> & {
42
+ query?: StandardQueryOptions;
43
+ };
44
+
45
+ export const listPrimarySaleItemsQueryOptions = (
46
+ params: ListPrimarySaleItemsQueryOptions,
47
+ ) => {
48
+ const enabled = Boolean(
49
+ params.primarySaleContractAddress &&
50
+ params.chainId &&
51
+ params.config &&
52
+ (params.query?.enabled ?? true),
53
+ );
54
+
55
+ type PageParam = { page: number; pageSize: number };
56
+ const initialPage: PageParam = { page: 1, pageSize: 30 };
57
+
58
+ return infiniteQueryOptions({
59
+ queryKey: ['listPrimarySaleItems', params],
60
+ queryFn: async ({ pageParam }) => {
61
+ return fetchPrimarySaleItems({
62
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
63
+ chainId: params.chainId!,
64
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
65
+ primarySaleContractAddress: params.primarySaleContractAddress!,
66
+ filter: params.filter,
67
+ page: pageParam,
68
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
69
+ config: params.config!,
70
+ });
71
+ },
72
+ initialPageParam: initialPage,
73
+ getNextPageParam: (lastPage) =>
74
+ lastPage.page?.more
75
+ ? {
76
+ page: (lastPage.page?.page || 1) + 1,
77
+ pageSize: lastPage.page?.pageSize || 30,
78
+ }
79
+ : undefined,
80
+ ...params.query,
81
+ enabled,
82
+ });
83
+ };
84
+
85
+ export type { ListPrimarySaleItemsArgs, ListPrimarySaleItemsReturn };
@@ -0,0 +1,64 @@
1
+ import { queryOptions } from '@tanstack/react-query';
2
+ import type { Address } from 'viem';
3
+ import type { SdkConfig } from '../../types';
4
+ import {
5
+ type GetCountOfPrimarySaleItemsReturn,
6
+ getMarketplaceClient,
7
+ type PrimarySaleItemsFilter,
8
+ } from '../_internal';
9
+ import type { StandardQueryOptions } from '../types/query';
10
+
11
+ export interface FetchPrimarySaleItemsCountParams {
12
+ chainId: number;
13
+ primarySaleContractAddress: Address;
14
+ filter?: PrimarySaleItemsFilter;
15
+ config: SdkConfig;
16
+ }
17
+
18
+ /**
19
+ * Fetches the count of primary sale items from the marketplace API
20
+ */
21
+ export async function fetchPrimarySaleItemsCount(
22
+ params: FetchPrimarySaleItemsCountParams,
23
+ ): Promise<GetCountOfPrimarySaleItemsReturn> {
24
+ const { chainId, primarySaleContractAddress, filter, config } = params;
25
+
26
+ const marketplaceClient = getMarketplaceClient(config);
27
+ return marketplaceClient.getCountOfPrimarySaleItems({
28
+ chainId: String(chainId),
29
+ primarySaleContractAddress,
30
+ filter,
31
+ });
32
+ }
33
+
34
+ export type PrimarySaleItemsCountQueryOptions =
35
+ Partial<FetchPrimarySaleItemsCountParams> & {
36
+ query?: StandardQueryOptions;
37
+ };
38
+
39
+ export const primarySaleItemsCountQueryOptions = (
40
+ args: PrimarySaleItemsCountQueryOptions,
41
+ ) => {
42
+ const enabled = Boolean(
43
+ args.primarySaleContractAddress &&
44
+ args.chainId &&
45
+ args.config &&
46
+ (args.query?.enabled ?? true),
47
+ );
48
+
49
+ return queryOptions({
50
+ queryKey: ['primarySaleItemsCount', args],
51
+ queryFn: () =>
52
+ fetchPrimarySaleItemsCount({
53
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
54
+ chainId: args.chainId!,
55
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
56
+ primarySaleContractAddress: args.primarySaleContractAddress!,
57
+ filter: args.filter,
58
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
59
+ config: args.config!,
60
+ }),
61
+ ...args.query,
62
+ enabled,
63
+ });
64
+ };
@@ -0,0 +1,93 @@
1
+ import type { GetTokenSuppliesArgs } from '@0xsequence/indexer';
2
+ import { queryOptions } from '@tanstack/react-query';
3
+ import type { SdkConfig } from '../../types';
4
+ import {
5
+ getIndexerClient,
6
+ LaosAPI,
7
+ tokenKeys,
8
+ type ValuesOptional,
9
+ } from '../_internal';
10
+ import type { StandardQueryOptions } from '../types/query';
11
+
12
+ export interface FetchTokenSuppliesParams
13
+ extends Omit<GetTokenSuppliesArgs, 'contractAddress'> {
14
+ chainId: number;
15
+ collectionAddress: string;
16
+ config: SdkConfig;
17
+ isLaos721?: boolean;
18
+ }
19
+
20
+ /**
21
+ * Fetches token supplies with support for both indexer and LAOS APIs
22
+ * Uses the more efficient single-contract APIs from both services
23
+ */
24
+ export async function fetchTokenSupplies(params: FetchTokenSuppliesParams) {
25
+ const { chainId, collectionAddress, config, isLaos721, ...rest } = params;
26
+
27
+ if (isLaos721) {
28
+ const laosApi = new LaosAPI();
29
+
30
+ // Convert indexer Page format to LAOS PaginationOptions format
31
+ const laosPage = rest.page
32
+ ? {
33
+ sort:
34
+ rest.page.sort?.map((sortBy) => ({
35
+ column: sortBy.column,
36
+ order: sortBy.order,
37
+ })) || [],
38
+ }
39
+ : undefined;
40
+
41
+ const result = await laosApi.getTokenSupplies({
42
+ chainId: chainId.toString(),
43
+ contractAddress: collectionAddress,
44
+ includeMetadata: rest.includeMetadata,
45
+ page: laosPage,
46
+ });
47
+
48
+ return result;
49
+ }
50
+
51
+ const indexerClient = getIndexerClient(chainId, config);
52
+
53
+ const apiArgs: GetTokenSuppliesArgs = {
54
+ contractAddress: collectionAddress,
55
+ ...rest,
56
+ };
57
+
58
+ const result = await indexerClient.getTokenSupplies(apiArgs);
59
+ return result;
60
+ }
61
+
62
+ export type TokenSuppliesQueryOptions =
63
+ ValuesOptional<FetchTokenSuppliesParams> & {
64
+ query?: StandardQueryOptions;
65
+ };
66
+
67
+ export function tokenSuppliesQueryOptions(params: TokenSuppliesQueryOptions) {
68
+ const enabled = Boolean(
69
+ params.chainId &&
70
+ params.collectionAddress &&
71
+ params.config &&
72
+ (params.query?.enabled ?? true),
73
+ );
74
+
75
+ return queryOptions({
76
+ queryKey: [...tokenKeys.supplies, params],
77
+ queryFn: () =>
78
+ fetchTokenSupplies({
79
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
80
+ chainId: params.chainId!,
81
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
82
+ collectionAddress: params.collectionAddress!,
83
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
84
+ config: params.config!,
85
+ isLaos721: params.isLaos721,
86
+ includeMetadata: params.includeMetadata,
87
+ metadataOptions: params.metadataOptions,
88
+ page: params.page,
89
+ }),
90
+ ...params.query,
91
+ enabled,
92
+ });
93
+ }
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { observer } from '@legendapp/state/react';
4
- import type { Address, Hex } from 'viem';
3
+ import type { Address } from 'viem';
5
4
  import type {
6
5
  CollectibleCardAction,
7
6
  MarketplaceType,
@@ -13,7 +12,7 @@ import { useActionButtonLogic } from './hooks/useActionButtonLogic';
13
12
 
14
13
  type ActionButtonProps = {
15
14
  chainId: number;
16
- collectionAddress: Hex;
15
+ collectionAddress: Address;
17
16
  tokenId: string;
18
17
  orderbookKind?: OrderbookKind;
19
18
  isTransfer?: boolean;
@@ -33,75 +32,76 @@ type ActionButtonProps = {
33
32
  };
34
33
  quantityDecimals?: number;
35
34
  quantityRemaining?: number;
35
+ unlimitedSupply?: boolean;
36
36
  };
37
37
 
38
- export const ActionButton = observer(
39
- ({
40
- collectionAddress,
41
- chainId,
38
+ export function ActionButton({
39
+ collectionAddress,
40
+ chainId,
41
+ tokenId,
42
+ orderbookKind,
43
+ action,
44
+ owned,
45
+ highestOffer,
46
+ lowestListing,
47
+ onCannotPerformAction,
48
+ marketplaceType,
49
+ salesContractAddress,
50
+ prioritizeOwnerActions,
51
+ salePrice,
52
+ quantityDecimals,
53
+ quantityRemaining,
54
+ unlimitedSupply,
55
+ }: ActionButtonProps) {
56
+ const { shouldShowAction, isOwnerAction } = useActionButtonLogic({
42
57
  tokenId,
43
- orderbookKind,
44
- action,
45
58
  owned,
46
- highestOffer,
47
- lowestListing,
59
+ action,
48
60
  onCannotPerformAction,
49
- marketplaceType,
50
- salesContractAddress,
51
- prioritizeOwnerActions,
52
- salePrice,
53
- quantityDecimals,
54
- quantityRemaining,
55
- }: ActionButtonProps) => {
56
- const { shouldShowAction, isOwnerAction } = useActionButtonLogic({
57
- tokenId,
58
- owned,
59
- action,
60
- onCannotPerformAction,
61
- });
61
+ });
62
62
 
63
- if (!shouldShowAction) {
64
- return null;
65
- }
63
+ if (!shouldShowAction) {
64
+ return null;
65
+ }
66
66
 
67
- if (isOwnerAction || prioritizeOwnerActions) {
68
- return (
69
- <OwnerActions
70
- action={action}
71
- tokenId={tokenId}
72
- collectionAddress={collectionAddress}
73
- chainId={chainId}
74
- orderbookKind={orderbookKind}
75
- highestOffer={highestOffer}
76
- />
77
- );
78
- }
67
+ if (isOwnerAction || prioritizeOwnerActions) {
68
+ return (
69
+ <OwnerActions
70
+ action={action}
71
+ tokenId={tokenId}
72
+ collectionAddress={collectionAddress}
73
+ chainId={chainId}
74
+ orderbookKind={orderbookKind}
75
+ highestOffer={highestOffer}
76
+ />
77
+ );
78
+ }
79
79
 
80
- const nonOwnerProps =
81
- marketplaceType === 'shop' && salesContractAddress && salePrice
82
- ? {
83
- marketplaceType: 'shop' as const,
84
- salesContractAddress,
85
- salePrice,
86
- action,
87
- tokenId,
88
- collectionAddress,
89
- chainId,
90
- quantityDecimals,
91
- quantityRemaining,
92
- }
93
- : {
94
- marketplaceType: 'market' as const,
95
- orderbookKind,
96
- lowestListing,
97
- action,
98
- tokenId,
99
- collectionAddress,
100
- chainId,
101
- quantityDecimals,
102
- quantityRemaining,
103
- };
80
+ const nonOwnerProps =
81
+ marketplaceType === 'shop' && salesContractAddress && salePrice
82
+ ? {
83
+ marketplaceType: 'shop' as const,
84
+ salesContractAddress,
85
+ salePrice,
86
+ action,
87
+ tokenId,
88
+ collectionAddress,
89
+ chainId,
90
+ quantityDecimals,
91
+ quantityRemaining,
92
+ unlimitedSupply,
93
+ }
94
+ : {
95
+ marketplaceType: 'market' as const,
96
+ orderbookKind,
97
+ lowestListing,
98
+ action,
99
+ tokenId,
100
+ collectionAddress,
101
+ chainId,
102
+ quantityDecimals,
103
+ quantityRemaining,
104
+ };
104
105
 
105
- return <NonOwnerActions {...nonOwnerProps} />;
106
- },
107
- );
106
+ return <NonOwnerActions {...nonOwnerProps} />;
107
+ }
@@ -5,15 +5,24 @@ import { createMockWallet } from '@test/mocks/wallet';
5
5
  import { beforeEach, describe, expect, it, vi } from 'vitest';
6
6
  import { CollectibleCardAction } from '../../../../../../types';
7
7
  import * as walletModule from '../../../../../_internal/wallet/useWallet';
8
+ import * as hooksModule from '../../../../../hooks';
8
9
  import { ActionButtonBody } from '../components/ActionButtonBody';
9
- import { setPendingAction } from '../store';
10
+ import { useActionButtonStore } from '../store';
10
11
 
11
12
  vi.mock('../store', () => ({
12
- setPendingAction: vi.fn(),
13
+ useActionButtonStore: vi.fn(() => ({
14
+ setPendingAction: vi.fn(),
15
+ })),
16
+ }));
17
+
18
+ vi.mock('../../../../../hooks', () => ({
19
+ useOpenConnectModal: vi.fn(),
13
20
  }));
14
21
 
15
22
  describe('ActionButtonBody', () => {
16
23
  const mockOnClick = vi.fn();
24
+ const mockOpenConnectModal = vi.fn();
25
+ const mockSetPendingAction = vi.fn();
17
26
  const defaultProps = {
18
27
  label: 'Buy now' as const,
19
28
  tokenId: '123',
@@ -29,6 +38,14 @@ describe('ActionButtonBody', () => {
29
38
  isLoading: false,
30
39
  isError: false,
31
40
  });
41
+
42
+ vi.spyOn(hooksModule, 'useOpenConnectModal').mockReturnValue({
43
+ openConnectModal: mockOpenConnectModal,
44
+ });
45
+
46
+ (useActionButtonStore as ReturnType<typeof vi.fn>).mockReturnValue({
47
+ setPendingAction: mockSetPendingAction,
48
+ });
32
49
  });
33
50
 
34
51
  it('executes onClick directly when user is connected', () => {
@@ -38,7 +55,7 @@ describe('ActionButtonBody', () => {
38
55
  fireEvent.click(button);
39
56
 
40
57
  expect(mockOnClick).toHaveBeenCalledTimes(1);
41
- expect(setPendingAction).not.toHaveBeenCalled();
58
+ expect(mockSetPendingAction).not.toHaveBeenCalled();
42
59
  });
43
60
 
44
61
  it('sets pending action and opens connect modal when user is not connected', () => {
@@ -57,10 +74,11 @@ describe('ActionButtonBody', () => {
57
74
  fireEvent.click(button);
58
75
 
59
76
  expect(mockOnClick).not.toHaveBeenCalled();
60
- expect(setPendingAction).toHaveBeenCalledWith(
77
+ expect(mockSetPendingAction).toHaveBeenCalledWith(
61
78
  defaultProps.action,
62
79
  defaultProps.onClick,
63
80
  defaultProps.tokenId,
64
81
  );
82
+ expect(mockOpenConnectModal).toHaveBeenCalledTimes(1);
65
83
  });
66
84
  });
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
 
3
- import { useOpenConnectModal } from '@0xsequence/connect';
4
3
  import { Button, type IconProps } from '@0xsequence/design-system';
5
4
  import type { ComponentType } from 'react';
6
5
  import type { CollectibleCardAction } from '../../../../../../types';
7
6
  import { useWallet } from '../../../../../_internal/wallet/useWallet';
8
- import { setPendingAction } from '../store';
7
+ import { useOpenConnectModal } from '../../../../../hooks';
8
+ import { useActionButtonStore } from '../store';
9
9
 
10
10
  type ActionButtonBodyProps = {
11
11
  label: 'Buy now' | 'Sell' | 'Make an offer' | 'Create listing' | 'Transfer';
@@ -24,7 +24,8 @@ export function ActionButtonBody({
24
24
  }: ActionButtonBodyProps) {
25
25
  const { wallet } = useWallet();
26
26
  const address = wallet?.address;
27
- const { setOpenConnectModal } = useOpenConnectModal();
27
+ const { openConnectModal } = useOpenConnectModal();
28
+ const { setPendingAction } = useActionButtonStore();
28
29
 
29
30
  const handleClick = (e: React.MouseEvent) => {
30
31
  e.preventDefault();
@@ -32,7 +33,7 @@ export function ActionButtonBody({
32
33
 
33
34
  if (!address && action) {
34
35
  setPendingAction(action, onClick, tokenId);
35
- setOpenConnectModal(true);
36
+ openConnectModal();
36
37
  } else {
37
38
  onClick();
38
39
  }
@@ -15,6 +15,7 @@ type NonOwnerActionsBaseProps = {
15
15
  chainId: number;
16
16
  quantityDecimals?: number;
17
17
  quantityRemaining?: number;
18
+ unlimitedSupply?: boolean;
18
19
  };
19
20
 
20
21
  type ShopNonOwnerActionsProps = NonOwnerActionsBaseProps & {
@@ -48,6 +49,7 @@ export function NonOwnerActions(props: NonOwnerActionsProps) {
48
49
  chainId,
49
50
  quantityDecimals,
50
51
  quantityRemaining,
52
+ unlimitedSupply,
51
53
  marketplaceType,
52
54
  } = props;
53
55
 
@@ -80,6 +82,7 @@ export function NonOwnerActions(props: NonOwnerActionsProps) {
80
82
  },
81
83
  quantityDecimals: quantityDecimals ?? 0,
82
84
  quantityRemaining: quantityRemaining ?? 0,
85
+ unlimitedSupply,
83
86
  })
84
87
  }
85
88
  icon={SvgCartIcon}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import type { Hex } from 'viem';
3
+ import type { Address } from 'viem';
4
4
  import { CollectibleCardAction } from '../../../../../../types';
5
5
  import type { Order, OrderbookKind } from '../../../../../_internal';
6
6
  import { useCreateListingModal } from '../../../../modals/CreateListingModal';
@@ -11,7 +11,7 @@ import { ActionButtonBody } from './ActionButtonBody';
11
11
  type OwnerActionsProps = {
12
12
  action: CollectibleCardAction;
13
13
  tokenId: string;
14
- collectionAddress: Hex;
14
+ collectionAddress: Address;
15
15
  chainId: number;
16
16
  orderbookKind?: OrderbookKind;
17
17
  highestOffer?: Order;
@@ -36,7 +36,7 @@ export function OwnerActions({
36
36
  tokenId={tokenId}
37
37
  onClick={() =>
38
38
  showCreateListingModal({
39
- collectionAddress: collectionAddress as Hex,
39
+ collectionAddress: collectionAddress as Address,
40
40
  chainId,
41
41
  collectibleId: tokenId,
42
42
  orderbookKind,
@@ -70,7 +70,7 @@ export function OwnerActions({
70
70
  tokenId={tokenId}
71
71
  onClick={() =>
72
72
  showTransferModal({
73
- collectionAddress: collectionAddress as Hex,
73
+ collectionAddress: collectionAddress as Address,
74
74
  chainId,
75
75
  collectibleId: tokenId,
76
76
  })
@@ -3,11 +3,7 @@
3
3
  import { useEffect } from 'react';
4
4
  import { CollectibleCardAction } from '../../../../../../types';
5
5
  import { useWallet } from '../../../../../_internal/wallet/useWallet';
6
- import {
7
- clearPendingAction,
8
- executePendingAction,
9
- usePendingAction,
10
- } from '../store';
6
+ import { useActionButtonStore } from '../store';
11
7
 
12
8
  type UseActionButtonLogicProps = {
13
9
  tokenId: string;
@@ -30,7 +26,8 @@ export const useActionButtonLogic = ({
30
26
  CollectibleCardAction.BUY,
31
27
  CollectibleCardAction.OFFER,
32
28
  ];
33
- const pendingAction = usePendingAction();
29
+ const { pendingAction, clearPendingAction, executePendingAction } =
30
+ useActionButtonStore();
34
31
  const pendingActionType = pendingAction?.type;
35
32
 
36
33
  // Handle owner restrictions
@@ -57,6 +54,7 @@ export const useActionButtonLogic = ({
57
54
  tokenId,
58
55
  onCannotPerformAction,
59
56
  pendingActionType,
57
+ clearPendingAction,
60
58
  ]);
61
59
 
62
60
  // Execute pending action when user becomes connected
@@ -67,10 +65,17 @@ export const useActionButtonLogic = ({
67
65
  pendingAction &&
68
66
  pendingAction?.collectibleId === tokenId
69
67
  ) {
70
- executePendingAction(pendingAction);
68
+ executePendingAction();
71
69
  clearPendingAction();
72
70
  }
73
- }, [address, owned, tokenId, pendingAction]);
71
+ }, [
72
+ address,
73
+ owned,
74
+ tokenId,
75
+ pendingAction,
76
+ executePendingAction,
77
+ clearPendingAction,
78
+ ]);
74
79
 
75
80
  const shouldShowAction = !address
76
81
  ? [CollectibleCardAction.BUY, CollectibleCardAction.OFFER].includes(action)