@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,82 +1,96 @@
1
- import { queryOptions, useQuery } from '@tanstack/react-query';
2
- import { type Address, formatUnits } from 'viem';
3
- import type { SdkConfig } from '../../types';
4
- import { type Currency, currencyKeys, getQueryClient } from '../_internal';
5
- import { marketCurrenciesQueryOptions } from '../queries/marketCurrencies';
6
- import { useConfig } from './useConfig';
7
-
8
- export interface UseConvertPriceToUSDArgs {
9
- chainId: number;
10
- currencyAddress: Address;
11
- amountRaw: string;
12
- query?: {
13
- enabled?: boolean;
14
- };
15
- }
16
-
17
- export type UseConvertPriceToUSDReturn = {
18
- usdAmount: number;
19
- usdAmountFormatted: string;
20
- };
1
+ 'use client';
21
2
 
22
- export const convertPriceToUSD = async (
23
- args: UseConvertPriceToUSDArgs,
24
- config: SdkConfig,
25
- ): Promise<UseConvertPriceToUSDReturn> => {
26
- const queryClient = getQueryClient();
27
- const currencies = (await queryClient.fetchQuery(
28
- marketCurrenciesQueryOptions({
29
- chainId: args.chainId,
30
- config,
31
- }),
32
- )) as Currency[];
33
- const currencyDetails = currencies.find(
34
- (c: Currency) =>
35
- c.contractAddress.toLowerCase() === args.currencyAddress.toLowerCase(),
36
- );
37
-
38
- if (!currencyDetails) {
39
- throw new Error('Currency not found');
40
- }
41
-
42
- const amountDecimal = Number(
43
- formatUnits(BigInt(args.amountRaw), currencyDetails.decimals),
44
- );
45
- const usdAmount = amountDecimal * currencyDetails.exchangeRate;
3
+ import { useQuery } from '@tanstack/react-query';
4
+ import type { Address } from 'viem';
5
+ import type { Optional } from '../_internal';
6
+ import {
7
+ type ConvertPriceToUSDQueryOptions,
8
+ type ConvertPriceToUSDReturn,
9
+ convertPriceToUSDQueryOptions,
10
+ type FetchConvertPriceToUSDParams,
11
+ } from '../queries/convertPriceToUSD';
12
+ import { useConfig } from './useConfig';
46
13
 
47
- return {
48
- usdAmount,
49
- usdAmountFormatted: usdAmount.toFixed(2),
50
- };
51
- };
52
-
53
- export const convertPriceToUSDOptions = (
54
- args: UseConvertPriceToUSDArgs,
55
- config: SdkConfig,
56
- ) => {
57
- return queryOptions({
58
- ...args.query,
59
- queryKey: [...currencyKeys.conversion, args],
60
- queryFn: () => convertPriceToUSD(args, config),
61
- });
62
- };
14
+ export type UseConvertPriceToUSDParams = Optional<
15
+ ConvertPriceToUSDQueryOptions,
16
+ 'config'
17
+ >;
63
18
 
64
19
  /**
65
20
  * Hook to convert a price amount from a specific currency to USD
66
- * @returns The price amount in USD and formatted USD amount
21
+ *
22
+ * Converts cryptocurrency amounts to their USD equivalent using current exchange rates.
23
+ * Fetches currency data and calculates the USD value based on the provided amount
24
+ * and currency address.
25
+ *
26
+ * @param params - Configuration parameters
27
+ * @param params.chainId - The chain ID (must be number, e.g., 1 for Ethereum, 137 for Polygon)
28
+ * @param params.currencyAddress - The currency contract address to convert from
29
+ * @param params.amountRaw - The raw amount in smallest units (e.g., wei for ETH)
30
+ * @param params.query - Optional React Query configuration
31
+ *
32
+ * @returns Query result containing USD amount and formatted USD amount
33
+ *
67
34
  * @example
68
- * ```ts
69
- * const { data } = useConvertPriceToUSD({
35
+ * Basic ETH to USD conversion:
36
+ * ```typescript
37
+ * const { data: conversion, isLoading } = useConvertPriceToUSD({
70
38
  * chainId: 1,
71
- * currencyAddress: "0x0000000000000000000000000000000000000000",
72
- * amountRaw: "1000000000000000000",
73
- * });
39
+ * currencyAddress: '0x0000000000000000000000000000000000000000', // ETH
40
+ * amountRaw: '1000000000000000000' // 1 ETH in wei
41
+ * })
42
+ *
43
+ * if (data) {
44
+ * console.log(`$${data.usdAmountFormatted}`); // e.g., "$2000.00"
45
+ * console.log(data.usdAmount); // e.g., 2000
46
+ * }
47
+ * ```
74
48
  *
75
- * console.log(data);
76
- * // { usdAmount: 1000, usdAmountFormatted: "1000.00" }
49
+ * @example
50
+ * ERC-20 token conversion with conditional enabling:
51
+ * ```typescript
52
+ * const { data: conversion } = useConvertPriceToUSD({
53
+ * chainId: 137,
54
+ * currencyAddress: '0x2791bca1f2de4661ed88a30c99a7a9449aa84174', // USDC on Polygon
55
+ * amountRaw: '1000000', // 1 USDC (6 decimals)
56
+ * query: {
57
+ * enabled: Boolean(userHasTokens),
58
+ * refetchInterval: 30000 // Update price every 30 seconds
59
+ * }
60
+ * })
77
61
  * ```
78
62
  */
79
- export const useConvertPriceToUSD = (args: UseConvertPriceToUSDArgs) => {
80
- const config = useConfig();
81
- return useQuery(convertPriceToUSDOptions(args, config));
63
+ export function useConvertPriceToUSD(params: UseConvertPriceToUSDParams) {
64
+ const defaultConfig = useConfig();
65
+
66
+ const { config = defaultConfig, ...rest } = params;
67
+
68
+ const queryOptions = convertPriceToUSDQueryOptions({
69
+ config,
70
+ ...rest,
71
+ });
72
+
73
+ return useQuery({
74
+ ...queryOptions,
75
+ });
76
+ }
77
+
78
+ export { convertPriceToUSDQueryOptions };
79
+
80
+ export type {
81
+ FetchConvertPriceToUSDParams,
82
+ ConvertPriceToUSDQueryOptions,
83
+ ConvertPriceToUSDReturn,
84
+ };
85
+
86
+ // Legacy exports for backward compatibility
87
+ export type UseConvertPriceToUSDArgs = {
88
+ chainId: number;
89
+ currencyAddress: Address;
90
+ amountRaw: string;
91
+ query?: {
92
+ enabled?: boolean;
93
+ };
82
94
  };
95
+
96
+ export type UseConvertPriceToUSDReturn = ConvertPriceToUSDReturn;
@@ -1,51 +1,137 @@
1
- import { skipToken, useQuery } from '@tanstack/react-query';
2
- import { type Address, erc20Abi, formatUnits, zeroAddress } from 'viem';
3
- import { usePublicClient } from 'wagmi';
4
- export function useCurrencyBalance({
5
- currencyAddress,
6
- chainId,
7
- userAddress,
8
- }: {
1
+ 'use client';
2
+
3
+ import type { Address } from 'viem';
4
+ import { erc20Abi, formatUnits, zeroAddress } from 'viem';
5
+ import { useBalance, useReadContracts } from 'wagmi';
6
+
7
+ export type UseCurrencyBalanceArgs = {
9
8
  currencyAddress: Address | undefined;
10
9
  chainId: number | undefined;
11
10
  userAddress: Address | undefined;
12
- }) {
13
- const publicClient = usePublicClient({ chainId });
14
-
15
- return useQuery({
16
- queryKey: ['balance', currencyAddress, chainId, userAddress],
17
- queryFn:
18
- !!userAddress && !!chainId && !!currencyAddress && !!publicClient
19
- ? async () => {
20
- if (currencyAddress === zeroAddress) {
21
- const balance = await publicClient.getBalance({
22
- address: userAddress,
23
- });
24
- return {
25
- value: balance,
26
- formatted: formatUnits(balance, 18),
27
- };
28
- }
29
-
30
- const [balance, decimals] = await Promise.all([
31
- publicClient.readContract({
32
- address: currencyAddress,
33
- abi: erc20Abi,
34
- functionName: 'balanceOf',
35
- args: [userAddress],
36
- }),
37
- publicClient.readContract({
38
- address: currencyAddress,
39
- abi: erc20Abi,
40
- functionName: 'decimals',
41
- }),
42
- ]);
43
-
44
- return {
45
- value: balance,
46
- formatted: formatUnits(balance, decimals),
47
- };
48
- }
49
- : skipToken,
11
+ query?: {
12
+ enabled?: boolean;
13
+ };
14
+ };
15
+
16
+ /**
17
+ * Hook to fetch cryptocurrency balance for a user
18
+ *
19
+ * Retrieves the balance of a specific currency (native token or ERC-20)
20
+ * for a given user address using wagmi. Handles both native tokens (ETH, MATIC, etc.)
21
+ * and ERC-20 tokens with automatic decimal formatting through direct blockchain calls.
22
+ *
23
+ * @param args - Configuration parameters
24
+ * @param args.currencyAddress - The currency contract address (use zero address for native tokens)
25
+ * @param args.chainId - The chain ID to query on
26
+ * @param args.userAddress - The user address to check balance for
27
+ * @param args.query - Optional wagmi query configuration
28
+ *
29
+ * @returns Wagmi query result containing raw and formatted balance values
30
+ *
31
+ * @example
32
+ * Native token balance (ETH):
33
+ * ```typescript
34
+ * const { data: ethBalance, isLoading } = useCurrencyBalance({
35
+ * currencyAddress: '0x0000000000000000000000000000000000000000', // Zero address for ETH
36
+ * chainId: 1,
37
+ * userAddress: '0x1234...'
38
+ * })
39
+ *
40
+ * if (data) {
41
+ * console.log(`ETH Balance: ${data.formatted} ETH`); // e.g., "1.5 ETH"
42
+ * console.log(`Raw balance: ${data.value.toString()}`); // e.g., "1500000000000000000"
43
+ * }
44
+ * ```
45
+ *
46
+ * @example
47
+ * ERC-20 token balance (USDC):
48
+ * ```typescript
49
+ * const { data: usdcBalance } = useCurrencyBalance({
50
+ * currencyAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC
51
+ * chainId: 1,
52
+ * userAddress: userAddress,
53
+ * query: {
54
+ * enabled: Boolean(userAddress), // Only fetch when user is connected
55
+ * refetchInterval: 30000 // Update every 30 seconds
56
+ * }
57
+ * })
58
+ *
59
+ * if (data) {
60
+ * console.log(`USDC Balance: $${data.formatted}`); // e.g., "$1000.50"
61
+ * }
62
+ * ```
63
+ */
64
+ export function useCurrencyBalance(args: UseCurrencyBalanceArgs) {
65
+ const { currencyAddress, chainId, userAddress, query } = args;
66
+
67
+ // Check if all required parameters are present
68
+ const hasAllParams = Boolean(currencyAddress && chainId && userAddress);
69
+ const isNativeToken = currencyAddress === zeroAddress;
70
+
71
+ // For native token (zero address), use useBalance
72
+ const nativeBalance = useBalance({
73
+ address: userAddress,
74
+ chainId,
75
+ query: {
76
+ ...query,
77
+ enabled: hasAllParams && isNativeToken && (query?.enabled ?? true),
78
+ },
50
79
  });
80
+
81
+ // For ERC-20 tokens, use useReadContracts to get both balance and decimals
82
+ const erc20Balance = useReadContracts({
83
+ contracts:
84
+ hasAllParams && !isNativeToken && currencyAddress && userAddress
85
+ ? [
86
+ {
87
+ address: currencyAddress,
88
+ abi: erc20Abi,
89
+ functionName: 'balanceOf',
90
+ args: [userAddress],
91
+ chainId,
92
+ },
93
+ {
94
+ address: currencyAddress,
95
+ abi: erc20Abi,
96
+ functionName: 'decimals',
97
+ chainId,
98
+ },
99
+ ]
100
+ : [],
101
+ query: {
102
+ ...query,
103
+ enabled: hasAllParams && !isNativeToken && (query?.enabled ?? true),
104
+ },
105
+ });
106
+
107
+ // Return native balance result if zero address
108
+ if (isNativeToken) {
109
+ return {
110
+ ...nativeBalance,
111
+ data: nativeBalance.data
112
+ ? {
113
+ value: nativeBalance.data.value,
114
+ formatted: nativeBalance.data.formatted,
115
+ }
116
+ : undefined,
117
+ };
118
+ }
119
+
120
+ // Return ERC-20 balance result with formatted data
121
+ const [balanceResult, decimalsResult] = erc20Balance.data || [];
122
+ const balance = balanceResult?.result;
123
+ const decimals = decimalsResult?.result;
124
+
125
+ const formattedData =
126
+ balance !== undefined && decimals !== undefined
127
+ ? {
128
+ value: balance,
129
+ formatted: formatUnits(balance, decimals),
130
+ }
131
+ : undefined;
132
+
133
+ return {
134
+ ...erc20Balance,
135
+ data: formattedData,
136
+ };
51
137
  }
@@ -1,7 +1,7 @@
1
1
  import type { Address } from 'viem';
2
2
  import { useReadContract } from 'wagmi';
3
3
  import { ERC721_SALE_ABI } from '../../../../sdk/src';
4
- import { useGetTokenSuppliesMap } from './useGetTokenSuppliesMap';
4
+ import { useTokenSupplies } from './useTokenSupplies';
5
5
 
6
6
  interface UseERC721SaleMintedTokensProps {
7
7
  chainId: number;
@@ -34,9 +34,8 @@ export function useERC721SaleMintedTokens({
34
34
 
35
35
  // Get token supplies for all potential tokens in the sale
36
36
  const { data: tokenSupplies, isLoading: tokenSuppliesLoading } =
37
- useGetTokenSuppliesMap({
37
+ useTokenSupplies({
38
38
  chainId,
39
- tokenIds,
40
39
  collectionAddress: contractAddress as Address,
41
40
  });
42
41
 
@@ -44,8 +43,12 @@ export function useERC721SaleMintedTokens({
44
43
 
45
44
  // Count how many tokens have been minted/owned
46
45
  const ownedCount = tokenIds.reduce((count, tokenId) => {
47
- const supplies = tokenSupplies?.supplies[contractAddress];
48
- const supply = supplies?.find((s) => s.tokenID === tokenId);
46
+ let supply: { tokenID: string; supply: string } | undefined;
47
+
48
+ if (tokenSupplies) {
49
+ supply = tokenSupplies.tokenIDs.find((s) => s.tokenID === tokenId);
50
+ }
51
+
49
52
  // If supply exists and is greater than 0, token exists and is owned
50
53
  const hasOwner = supply ? BigInt(supply.supply) > 0n : false;
51
54
  return count + (hasOwner ? 1 : 0);
@@ -1,126 +1,152 @@
1
+ 'use client';
2
+
1
3
  import type { PropertyFilter } from '@0xsequence/metadata';
2
- import { queryOptions, useQuery } from '@tanstack/react-query';
3
- import { FilterCondition, type SdkConfig } from '../../types';
4
- import { compareAddress } from '../../utils';
4
+ import { useQuery } from '@tanstack/react-query';
5
+ import type { Optional } from '../_internal';
5
6
  import {
6
- collectableKeys,
7
- getMetadataClient,
8
- getQueryClient,
9
- } from '../_internal';
10
- import { marketplaceConfigOptions } from '../queries/marketplaceConfig';
7
+ type FetchFiltersParams,
8
+ type FiltersQueryOptions,
9
+ filtersQueryOptions,
10
+ } from '../queries/filters';
11
11
  import { useConfig } from './useConfig';
12
12
 
13
- export type UseFiltersArgs = {
14
- chainId: number;
15
- collectionAddress: string;
16
- showAllFilters?: boolean;
17
- excludePropertyValues?: boolean;
18
- query?: {
19
- enabled?: boolean;
20
- };
21
- };
22
-
23
- export type UseFilterReturn = Awaited<ReturnType<typeof fetchFilters>>;
24
-
25
- export const fetchFilters = async (args: UseFiltersArgs, config: SdkConfig) => {
26
- const parsedArgs = args;
27
- const metadataClient = getMetadataClient(config);
28
-
29
- const filters = await metadataClient
30
- .getTokenMetadataPropertyFilters({
31
- chainID: parsedArgs.chainId.toString(),
32
- contractAddress: parsedArgs.collectionAddress,
33
- excludeProperties: [],
34
- excludePropertyValues: parsedArgs.excludePropertyValues,
35
- })
36
- .then((resp) => resp.filters);
37
-
38
- if (args.showAllFilters) return filters;
39
-
40
- const queryClient = getQueryClient();
41
- const marketplaceConfig = await queryClient.fetchQuery(
42
- marketplaceConfigOptions(config),
43
- );
44
- const collectionFilters = marketplaceConfig.market.collections.find((c) =>
45
- compareAddress(c.itemsAddress, parsedArgs.collectionAddress),
46
- )?.filterSettings;
47
-
48
- if (
49
- !collectionFilters?.exclusions ||
50
- collectionFilters.exclusions.length === 0 ||
51
- !collectionFilters.filterOrder ||
52
- collectionFilters.filterOrder.length === 0
53
- )
54
- return filters;
55
-
56
- const { filterOrder, exclusions } = collectionFilters;
57
-
58
- const sortedFilters = filters.toSorted((a, b) => {
59
- const aIndex =
60
- filterOrder.indexOf(a.name) > -1
61
- ? filterOrder.indexOf(a.name)
62
- : filterOrder.length;
63
- const bIndex =
64
- filterOrder.indexOf(b.name) > -1
65
- ? filterOrder.indexOf(b.name)
66
- : filterOrder.length;
67
- return aIndex - bIndex;
13
+ export type UseFiltersParams = Optional<FiltersQueryOptions, 'config'>;
14
+
15
+ /**
16
+ * Hook to fetch metadata filters for a collection
17
+ *
18
+ * Retrieves property filters for a collection from the metadata service,
19
+ * with support for marketplace-specific filter configuration including
20
+ * exclusion rules and custom ordering.
21
+ *
22
+ * @param params - Configuration parameters
23
+ * @param params.chainId - The chain ID (must be number, e.g., 1 for Ethereum, 137 for Polygon)
24
+ * @param params.collectionAddress - The collection contract address to fetch filters for
25
+ * @param params.showAllFilters - Whether to show all filters or apply marketplace filtering
26
+ * @param params.excludePropertyValues - Whether to exclude property values from the response
27
+ * @param params.query - Optional React Query configuration
28
+ *
29
+ * @returns Query result containing property filters for the collection
30
+ *
31
+ * @example
32
+ * Basic usage:
33
+ * ```typescript
34
+ * const { data: filters, isLoading } = useFilters({
35
+ * chainId: 137,
36
+ * collectionAddress: '0x1234...'
37
+ * })
38
+ *
39
+ * if (data) {
40
+ * console.log(`Found ${data.length} filters`);
41
+ * data.forEach(filter => {
42
+ * console.log(`${filter.name}: ${filter.values?.join(', ')}`);
43
+ * });
44
+ * }
45
+ * ```
46
+ *
47
+ * @example
48
+ * With marketplace filtering disabled:
49
+ * ```typescript
50
+ * const { data: allFilters } = useFilters({
51
+ * chainId: 1,
52
+ * collectionAddress: '0x5678...',
53
+ * showAllFilters: true, // Bypass marketplace filter rules
54
+ * query: {
55
+ * enabled: Boolean(selectedCollection),
56
+ * staleTime: 300000 // Cache for 5 minutes
57
+ * }
58
+ * })
59
+ * ```
60
+ *
61
+ * @example
62
+ * Exclude property values for faster loading:
63
+ * ```typescript
64
+ * const { data: filterNames } = useFilters({
65
+ * chainId: 137,
66
+ * collectionAddress: collectionAddress,
67
+ * excludePropertyValues: true, // Only get filter names, not values
68
+ * query: {
69
+ * enabled: Boolean(collectionAddress)
70
+ * }
71
+ * })
72
+ * ```
73
+ */
74
+ export function useFilters(params: UseFiltersParams) {
75
+ const defaultConfig = useConfig();
76
+
77
+ const { config = defaultConfig, ...rest } = params;
78
+
79
+ const queryOptions = filtersQueryOptions({
80
+ config,
81
+ ...rest,
68
82
  });
69
83
 
70
- const filteredResults = sortedFilters.reduce<PropertyFilter[]>(
71
- (acc, filter) => {
72
- const exclusionRule = exclusions.find((rule) => rule.key === filter.name);
73
-
74
- if (!exclusionRule) {
75
- acc.push(filter);
76
- return acc;
77
- }
78
-
79
- if (exclusionRule.condition === FilterCondition.ENTIRE_KEY) {
80
- return acc;
81
- }
82
-
83
- if (
84
- exclusionRule.condition === FilterCondition.SPECIFIC_VALUE &&
85
- exclusionRule.value
86
- ) {
87
- const filteredValues =
88
- filter.values?.filter((value) => value !== exclusionRule.value) || [];
89
- if (filteredValues.length > 0) {
90
- acc.push({ ...filter, values: filteredValues });
91
- }
92
- }
93
-
94
- return acc;
95
- },
96
- [],
97
- );
98
-
99
- return filteredResults;
100
- };
101
-
102
- export const filtersOptions = (args: UseFiltersArgs, config: SdkConfig) => {
103
- return queryOptions({
104
- ...args.query,
105
- queryKey: [...collectableKeys.filter, args, config],
106
- queryFn: () => fetchFilters(args, config),
84
+ return useQuery({
85
+ ...queryOptions,
107
86
  });
108
- };
109
-
110
- export const useFilters = (args: UseFiltersArgs) => {
111
- const config = useConfig();
112
- return useQuery(filtersOptions(args, config));
113
- };
114
-
115
- export const useFiltersProgressive = (args: UseFiltersArgs) => {
116
- const config = useConfig();
87
+ }
88
+
89
+ /**
90
+ * Hook to progressively load collection filters
91
+ *
92
+ * First loads filter names only for fast initial display, then loads full filter
93
+ * data with values. Uses placeholder data to provide immediate feedback while
94
+ * full data loads in the background.
95
+ *
96
+ * @param params - Configuration parameters (same as useFilters)
97
+ *
98
+ * @returns Query result with additional loading states
99
+ * @returns result.isLoadingNames - Whether filter names are still loading
100
+ * @returns result.isFetchingValues - Whether filter values are being fetched
101
+ *
102
+ * @example
103
+ * Progressive filter loading:
104
+ * ```typescript
105
+ * const {
106
+ * data: filters,
107
+ * isLoadingNames,
108
+ * isFetchingValues,
109
+ * isLoading
110
+ * } = useFiltersProgressive({
111
+ * chainId: 137,
112
+ * collectionAddress: '0x1234...'
113
+ * })
114
+ *
115
+ * if (isLoadingNames) {
116
+ * return <div>Loading filters...</div>;
117
+ * }
118
+ *
119
+ * return (
120
+ * <div>
121
+ * {filters?.map(filter => (
122
+ * <FilterComponent
123
+ * key={filter.name}
124
+ * filter={filter}
125
+ * isLoadingValues={isFetchingValues}
126
+ * />
127
+ * ))}
128
+ * </div>
129
+ * );
130
+ * ```
131
+ */
132
+ export function useFiltersProgressive(params: UseFiltersParams) {
133
+ const defaultConfig = useConfig();
134
+
135
+ const { config = defaultConfig, ...rest } = params;
117
136
 
118
137
  const namesQuery = useQuery(
119
- filtersOptions({ ...args, excludePropertyValues: true }, config),
138
+ filtersQueryOptions({
139
+ config,
140
+ ...rest,
141
+ excludePropertyValues: true,
142
+ }),
120
143
  );
121
144
 
122
145
  const fullQuery = useQuery({
123
- ...filtersOptions(args, config),
146
+ ...filtersQueryOptions({
147
+ config,
148
+ ...rest,
149
+ }),
124
150
  placeholderData: namesQuery.data,
125
151
  });
126
152
 
@@ -132,4 +158,21 @@ export const useFiltersProgressive = (args: UseFiltersArgs) => {
132
158
  isFetchingValues,
133
159
  isLoadingNames,
134
160
  };
161
+ }
162
+
163
+ export { filtersQueryOptions };
164
+
165
+ export type { FetchFiltersParams, FiltersQueryOptions };
166
+
167
+ // Legacy exports for backward compatibility
168
+ export type UseFiltersArgs = {
169
+ chainId: number;
170
+ collectionAddress: string;
171
+ showAllFilters?: boolean;
172
+ excludePropertyValues?: boolean;
173
+ query?: {
174
+ enabled?: boolean;
175
+ };
135
176
  };
177
+
178
+ export type UseFilterReturn = PropertyFilter[];