@0xsequence/marketplace-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README.md +8 -0
  2. package/dist/chunk-3TYUQEFM.js +115 -0
  3. package/dist/chunk-3TYUQEFM.js.map +1 -0
  4. package/dist/chunk-4ESPWOBV.js +13 -0
  5. package/dist/chunk-4ESPWOBV.js.map +1 -0
  6. package/dist/chunk-4PFMUVE4.js +78 -0
  7. package/dist/chunk-4PFMUVE4.js.map +1 -0
  8. package/dist/chunk-5WRI5ZAA.js +31 -0
  9. package/dist/chunk-5WRI5ZAA.js.map +1 -0
  10. package/dist/chunk-6S4FYXP6.js +43 -0
  11. package/dist/chunk-6S4FYXP6.js.map +1 -0
  12. package/dist/chunk-7OO74L2K.js +41 -0
  13. package/dist/chunk-7OO74L2K.js.map +1 -0
  14. package/dist/chunk-BBB3XUB4.js +213 -0
  15. package/dist/chunk-BBB3XUB4.js.map +1 -0
  16. package/dist/chunk-BCNFYVAL.js +1 -0
  17. package/dist/chunk-BCNFYVAL.js.map +1 -0
  18. package/dist/chunk-D7QQP6MS.js +2 -0
  19. package/dist/chunk-D7QQP6MS.js.map +1 -0
  20. package/dist/chunk-DBFOPEV6.js +23 -0
  21. package/dist/chunk-DBFOPEV6.js.map +1 -0
  22. package/dist/chunk-EDTC7UES.js +176 -0
  23. package/dist/chunk-EDTC7UES.js.map +1 -0
  24. package/dist/chunk-G3D572BT.js +249 -0
  25. package/dist/chunk-G3D572BT.js.map +1 -0
  26. package/dist/chunk-HGBEC3WX.js +1285 -0
  27. package/dist/chunk-HGBEC3WX.js.map +1 -0
  28. package/dist/chunk-MJ4YU7RW.js +2 -0
  29. package/dist/chunk-MJ4YU7RW.js.map +1 -0
  30. package/dist/chunk-NJ2GXOPW.js +2 -0
  31. package/dist/chunk-NJ2GXOPW.js.map +1 -0
  32. package/dist/chunk-O5JXKTWP.js +1029 -0
  33. package/dist/chunk-O5JXKTWP.js.map +1 -0
  34. package/dist/chunk-O642NH7U.js +15 -0
  35. package/dist/chunk-O642NH7U.js.map +1 -0
  36. package/dist/chunk-QOJXWHRZ.js +71 -0
  37. package/dist/chunk-QOJXWHRZ.js.map +1 -0
  38. package/dist/chunk-QVFMD6S2.js +21 -0
  39. package/dist/chunk-QVFMD6S2.js.map +1 -0
  40. package/dist/chunk-RNUHUVLC.js +214 -0
  41. package/dist/chunk-RNUHUVLC.js.map +1 -0
  42. package/dist/chunk-SM7V6ZWI.js +2740 -0
  43. package/dist/chunk-SM7V6ZWI.js.map +1 -0
  44. package/dist/chunk-STO74F2I.js +14 -0
  45. package/dist/chunk-STO74F2I.js.map +1 -0
  46. package/dist/chunk-TZGLKJRF.js +198 -0
  47. package/dist/chunk-TZGLKJRF.js.map +1 -0
  48. package/dist/chunk-UYRQ5MJQ.js +1027 -0
  49. package/dist/chunk-UYRQ5MJQ.js.map +1 -0
  50. package/dist/chunk-VPGWEMWL.js +162 -0
  51. package/dist/chunk-VPGWEMWL.js.map +1 -0
  52. package/dist/chunk-ZE2LNX65.js +394 -0
  53. package/dist/chunk-ZE2LNX65.js.map +1 -0
  54. package/dist/create-config-Dz0gCiQ0.d.ts +8 -0
  55. package/dist/get-query-client-D46hbjk6.d.ts +5 -0
  56. package/dist/index.css +232 -0
  57. package/dist/index.d.ts +16 -0
  58. package/dist/index.js +76 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/marketplace-config-DZbtyrma.d.ts +57 -0
  61. package/dist/marketplace.gen-Ceofb9Cs.d.ts +904 -0
  62. package/dist/react/_internal/api/index.d.ts +51 -0
  63. package/dist/react/_internal/api/index.js +134 -0
  64. package/dist/react/_internal/api/index.js.map +1 -0
  65. package/dist/react/_internal/index.d.ts +22 -0
  66. package/dist/react/_internal/index.js +150 -0
  67. package/dist/react/_internal/index.js.map +1 -0
  68. package/dist/react/_internal/wagmi/index.d.ts +12 -0
  69. package/dist/react/_internal/wagmi/index.js +12 -0
  70. package/dist/react/_internal/wagmi/index.js.map +1 -0
  71. package/dist/react/hooks/index.d.ts +381 -0
  72. package/dist/react/hooks/index.js +82 -0
  73. package/dist/react/hooks/index.js.map +1 -0
  74. package/dist/react/index.css +233 -0
  75. package/dist/react/index.css.map +1 -0
  76. package/dist/react/index.d.ts +27 -0
  77. package/dist/react/index.js +113 -0
  78. package/dist/react/index.js.map +1 -0
  79. package/dist/react/ssr/index.d.ts +94 -0
  80. package/dist/react/ssr/index.js +351 -0
  81. package/dist/react/ssr/index.js.map +1 -0
  82. package/dist/react/ui/icons/index.css +25 -0
  83. package/dist/react/ui/icons/index.css.map +1 -0
  84. package/dist/react/ui/icons/index.d.ts +2 -0
  85. package/dist/react/ui/icons/index.js +12 -0
  86. package/dist/react/ui/icons/index.js.map +1 -0
  87. package/dist/react/ui/index.css +233 -0
  88. package/dist/react/ui/index.css.map +1 -0
  89. package/dist/react/ui/index.d.ts +112 -0
  90. package/dist/react/ui/index.js +34 -0
  91. package/dist/react/ui/index.js.map +1 -0
  92. package/dist/react/ui/modals/_internal/components/actionModal/index.css +44 -0
  93. package/dist/react/ui/modals/_internal/components/actionModal/index.css.map +1 -0
  94. package/dist/react/ui/modals/_internal/components/actionModal/index.d.ts +31 -0
  95. package/dist/react/ui/modals/_internal/components/actionModal/index.js +39 -0
  96. package/dist/react/ui/modals/_internal/components/actionModal/index.js.map +1 -0
  97. package/dist/react/ui/styles/index.css +36 -0
  98. package/dist/react/ui/styles/index.css.map +1 -0
  99. package/dist/react/ui/styles/index.d.ts +5 -0
  100. package/dist/react/ui/styles/index.js +13 -0
  101. package/dist/react/ui/styles/index.js.map +1 -0
  102. package/dist/sdk-config-xWkdBdrL.d.ts +24 -0
  103. package/dist/services-BIwQ1C1c.d.ts +20 -0
  104. package/dist/styles/index.css +233 -0
  105. package/dist/styles/index.css.map +1 -0
  106. package/dist/styles/index.d.ts +58 -0
  107. package/dist/styles/index.js +5019 -0
  108. package/dist/styles/index.js.map +1 -0
  109. package/dist/styles.css-BVaTR5nO.d.ts +3 -0
  110. package/dist/types/index.d.ts +12 -0
  111. package/dist/types/index.js +39 -0
  112. package/dist/types/index.js.map +1 -0
  113. package/dist/types-BrAQ8-w4.d.ts +12 -0
  114. package/dist/utils/abi/abi/standard/index.d.ts +25 -0
  115. package/dist/utils/abi/abi/standard/index.js +8 -0
  116. package/dist/utils/abi/abi/standard/index.js.map +1 -0
  117. package/dist/utils/abi/abi/token/index.d.ts +1125 -0
  118. package/dist/utils/abi/abi/token/index.js +13 -0
  119. package/dist/utils/abi/abi/token/index.js.map +1 -0
  120. package/dist/utils/abi/clients/index.d.ts +27 -0
  121. package/dist/utils/abi/clients/index.js +13 -0
  122. package/dist/utils/abi/clients/index.js.map +1 -0
  123. package/dist/utils/index.d.ts +23 -0
  124. package/dist/utils/index.js +37 -0
  125. package/dist/utils/index.js.map +1 -0
  126. package/package.json +74 -0
  127. package/src/consts.ts +2 -0
  128. package/src/index.ts +3 -0
  129. package/src/react/_internal/api/get-query-client.ts +32 -0
  130. package/src/react/_internal/api/index.ts +5 -0
  131. package/src/react/_internal/api/marketplace-api.ts +31 -0
  132. package/src/react/_internal/api/marketplace.gen.ts +1911 -0
  133. package/src/react/_internal/api/query-keys.ts +61 -0
  134. package/src/react/_internal/api/services.ts +101 -0
  135. package/src/react/_internal/consts.ts +1 -0
  136. package/src/react/_internal/get-provider.ts +6 -0
  137. package/src/react/_internal/index.ts +5 -0
  138. package/src/react/_internal/types.ts +13 -0
  139. package/src/react/_internal/wagmi/create-config.ts +62 -0
  140. package/src/react/_internal/wagmi/embedded.ts +87 -0
  141. package/src/react/_internal/wagmi/index.ts +3 -0
  142. package/src/react/_internal/wagmi/universal.ts +82 -0
  143. package/src/react/hooks/index.ts +17 -0
  144. package/src/react/hooks/options/marketplaceConfigOptions.ts +62 -0
  145. package/src/react/hooks/useBalanceOfCollectible.tsx +51 -0
  146. package/src/react/hooks/useCollectible.tsx +47 -0
  147. package/src/react/hooks/useCollection.tsx +42 -0
  148. package/src/react/hooks/useCollectionCounts.tsx +61 -0
  149. package/src/react/hooks/useConfig.tsx +15 -0
  150. package/src/react/hooks/useCurrencies.tsx +76 -0
  151. package/src/react/hooks/useFilters.tsx +39 -0
  152. package/src/react/hooks/useFloorOrder.tsx +28 -0
  153. package/src/react/hooks/useGenerateListingTransaction.tsx +63 -0
  154. package/src/react/hooks/useGenerateOfferTransaction.tsx +60 -0
  155. package/src/react/hooks/useGenerateSellTransaction.tsx +43 -0
  156. package/src/react/hooks/useHighestOffer.tsx +46 -0
  157. package/src/react/hooks/useListBalances.tsx +56 -0
  158. package/src/react/hooks/useListCollectibles.tsx +54 -0
  159. package/src/react/hooks/useListOffersForCollectible.tsx +53 -0
  160. package/src/react/hooks/useLowestListing.tsx +47 -0
  161. package/src/react/hooks/useMarketplaceConfig.tsx +10 -0
  162. package/src/react/hooks/useRoyaltyPercentage.tsx +45 -0
  163. package/src/react/hooks/useTransferTokens.tsx +81 -0
  164. package/src/react/index.ts +5 -0
  165. package/src/react/provider.tsx +24 -0
  166. package/src/react/ssr/create-ssr-client.ts +31 -0
  167. package/src/react/ssr/index.ts +1 -0
  168. package/src/react/ui/icons/ArrowUp.tsx +29 -0
  169. package/src/react/ui/icons/CalendarIcon.tsx +29 -0
  170. package/src/react/ui/icons/InfoIcon.tsx +36 -0
  171. package/src/react/ui/icons/InventoryIcon.tsx +41 -0
  172. package/src/react/ui/icons/MinusIcon.tsx +31 -0
  173. package/src/react/ui/icons/PlusIcon.tsx +29 -0
  174. package/src/react/ui/icons/PositiveCircleIcon.tsx +35 -0
  175. package/src/react/ui/icons/index.ts +7 -0
  176. package/src/react/ui/icons/styles.css.ts +35 -0
  177. package/src/react/ui/index.ts +6 -0
  178. package/src/react/ui/modals/Account/index.tsx +29 -0
  179. package/src/react/ui/modals/CreateListingModal/_store.ts +326 -0
  180. package/src/react/ui/modals/CreateListingModal/_utils/getCreateListingTransactionTitleMessage.ts +30 -0
  181. package/src/react/ui/modals/CreateListingModal/index.tsx +146 -0
  182. package/src/react/ui/modals/MakeOfferModal/_store.ts +296 -0
  183. package/src/react/ui/modals/MakeOfferModal/_utils/getMakeOfferTransactionTitleMessage.ts +28 -0
  184. package/src/react/ui/modals/MakeOfferModal/index.tsx +157 -0
  185. package/src/react/ui/modals/SellModal/_store.ts +274 -0
  186. package/src/react/ui/modals/SellModal/_utils/getSellTransactionTitleMessage.ts +28 -0
  187. package/src/react/ui/modals/SellModal/index.tsx +126 -0
  188. package/src/react/ui/modals/SellModal/utils.ts +38 -0
  189. package/src/react/ui/modals/SuccessfulPurchaseModal/_store.ts +58 -0
  190. package/src/react/ui/modals/SuccessfulPurchaseModal/index.tsx +186 -0
  191. package/src/react/ui/modals/SuccessfulPurchaseModal/styles.css.ts +52 -0
  192. package/src/react/ui/modals/TransferModal/_store.ts +58 -0
  193. package/src/react/ui/modals/TransferModal/_utils/getTransferTransactionTitleMessage.ts +28 -0
  194. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/index.tsx +102 -0
  195. package/src/react/ui/modals/TransferModal/_views/followWalletInstructions/index.tsx +130 -0
  196. package/src/react/ui/modals/TransferModal/index.tsx +92 -0
  197. package/src/react/ui/modals/TransferModal/messages.ts +14 -0
  198. package/src/react/ui/modals/TransferModal/styles.css.ts +20 -0
  199. package/src/react/ui/modals/_internal/components/actionModal/ActionModal.tsx +94 -0
  200. package/src/react/ui/modals/_internal/components/actionModal/index.ts +3 -0
  201. package/src/react/ui/modals/_internal/components/actionModal/store.ts +19 -0
  202. package/src/react/ui/modals/_internal/components/actionModal/styles.css.ts +15 -0
  203. package/src/react/ui/modals/_internal/components/alertMessage/index.tsx +21 -0
  204. package/src/react/ui/modals/_internal/components/alertMessage/styles.css.ts +22 -0
  205. package/src/react/ui/modals/_internal/components/calendar/index.tsx +59 -0
  206. package/src/react/ui/modals/_internal/components/calendarPopover/index.tsx +41 -0
  207. package/src/react/ui/modals/_internal/components/calendarPopover/styles.css.ts +16 -0
  208. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/index.tsx +76 -0
  209. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/styles.css.ts +33 -0
  210. package/src/react/ui/modals/_internal/components/expirationDateSelect/index.tsx +127 -0
  211. package/src/react/ui/modals/_internal/components/expirationDateSelect/styles.css.ts +25 -0
  212. package/src/react/ui/modals/_internal/components/floorPriceText/index.tsx +54 -0
  213. package/src/react/ui/modals/_internal/components/priceInput/index.tsx +72 -0
  214. package/src/react/ui/modals/_internal/components/priceInput/styles.css.ts +23 -0
  215. package/src/react/ui/modals/_internal/components/priceInput/types.ts +4 -0
  216. package/src/react/ui/modals/_internal/components/quantityInput/index.tsx +168 -0
  217. package/src/react/ui/modals/_internal/components/quantityInput/styles.css.ts +30 -0
  218. package/src/react/ui/modals/_internal/components/switchChainModal/index.tsx +132 -0
  219. package/src/react/ui/modals/_internal/components/switchChainModal/store.ts +41 -0
  220. package/src/react/ui/modals/_internal/components/switchChainModal/styles.css.ts +37 -0
  221. package/src/react/ui/modals/_internal/components/timeAgo/index.tsx +32 -0
  222. package/src/react/ui/modals/_internal/components/tokenPreview/index.tsx +58 -0
  223. package/src/react/ui/modals/_internal/components/tokenPreview/styles.css.ts +11 -0
  224. package/src/react/ui/modals/_internal/components/transaction-footer/index.tsx +48 -0
  225. package/src/react/ui/modals/_internal/components/transactionDetails/index.tsx +80 -0
  226. package/src/react/ui/modals/_internal/components/transactionHeader/index.tsx +30 -0
  227. package/src/react/ui/modals/_internal/components/transactionPreview/consts.ts +27 -0
  228. package/src/react/ui/modals/_internal/components/transactionPreview/index.tsx +111 -0
  229. package/src/react/ui/modals/_internal/components/transactionPreview/useTransactionPreviewTitle.tsx +24 -0
  230. package/src/react/ui/modals/_internal/components/transactionStatusModal/index.tsx +123 -0
  231. package/src/react/ui/modals/_internal/components/transactionStatusModal/store.ts +87 -0
  232. package/src/react/ui/modals/_internal/components/transactionStatusModal/styles.css.ts +15 -0
  233. package/src/react/ui/modals/_internal/stores/accountModal.ts +3 -0
  234. package/src/react/ui/modals/modal-provider.tsx +27 -0
  235. package/src/react/ui/styles/index.ts +1 -0
  236. package/src/react/ui/styles/modal.css.ts +73 -0
  237. package/src/styles/index.ts +18 -0
  238. package/src/types/api-types.ts +48 -0
  239. package/src/types/index.ts +4 -0
  240. package/src/types/marketplace-config.ts +63 -0
  241. package/src/types/messages.ts +43 -0
  242. package/src/types/sdk-config.ts +23 -0
  243. package/src/types/types.ts +6 -0
  244. package/src/utils/abi/abi/standard/EIP2981.ts +15 -0
  245. package/src/utils/abi/abi/standard/index.ts +1 -0
  246. package/src/utils/abi/abi/token/ERC1155.ts +324 -0
  247. package/src/utils/abi/abi/token/ERC20.ts +185 -0
  248. package/src/utils/abi/abi/token/ERC721.ts +506 -0
  249. package/src/utils/abi/abi/token/index.ts +3 -0
  250. package/src/utils/abi/clients/ERC1155.ts +82 -0
  251. package/src/utils/abi/clients/ERC20.ts +101 -0
  252. package/src/utils/abi/clients/ERC721.ts +97 -0
  253. package/src/utils/abi/clients/index.ts +3 -0
  254. package/src/utils/address.ts +26 -0
  255. package/src/utils/get-public-rpc-client.ts +32 -0
  256. package/src/utils/index.ts +6 -0
  257. package/src/utils/network.ts +5 -0
  258. package/src/utils/price.ts +21 -0
@@ -0,0 +1,30 @@
1
+ import { globalStyle, style } from '@vanilla-extract/css';
2
+
3
+ export const quantityInputWrapper = style({
4
+ display: 'flex',
5
+ flexDirection: 'column',
6
+ width: '100%',
7
+ });
8
+
9
+ globalStyle(`${quantityInputWrapper} > label`, {
10
+ gap: 2,
11
+ });
12
+
13
+ globalStyle(`${quantityInputWrapper} > label > div > div`, {
14
+ height: 36,
15
+ fontSize: 12,
16
+ borderRadius: 4,
17
+ paddingLeft: 12,
18
+ paddingRight: 0,
19
+ });
20
+
21
+ globalStyle(
22
+ `${quantityInputWrapper} > label > div > div:has(:disabled) , ${quantityInputWrapper} > label > div > div:has(:disabled):hover`,
23
+ {
24
+ opacity: 1,
25
+ },
26
+ );
27
+
28
+ globalStyle(`${quantityInputWrapper} > label > div > div > input`, {
29
+ fontSize: 12,
30
+ });
@@ -0,0 +1,132 @@
1
+ import { Close, Content, Overlay, Portal, Root } from '@radix-ui/react-dialog';
2
+ import { switchChainModal$ } from './store';
3
+ import {
4
+ closeButton,
5
+ dialogOverlay,
6
+ switchChainCta,
7
+ switchChainModalContent,
8
+ } from './styles.css';
9
+ import {
10
+ Button,
11
+ CloseIcon,
12
+ IconButton,
13
+ Spinner,
14
+ Text,
15
+ } from '@0xsequence/design-system';
16
+ import AlertMessage from '../alertMessage';
17
+ import { observer } from '@legendapp/state/react';
18
+ import { useSwitchChain } from 'wagmi';
19
+ import { BaseError } from 'viem';
20
+ import { getPresentableChainName } from '../../../../../../utils/network';
21
+
22
+ import { UserRejectedRequestError } from 'viem';
23
+ import { SwitchChainNotSupportedError } from 'wagmi';
24
+ import type { SwitchChainMessageCallbacks } from '../../../../../../types/messages';
25
+
26
+ export type ShowSwitchChainModalArgs = {
27
+ chainIdToSwitchTo: number;
28
+ onSwitchChain: () => void;
29
+ messages?: SwitchChainMessageCallbacks;
30
+ };
31
+
32
+ export const useSwitchChainModal = () => {
33
+ return {
34
+ show: (args: ShowSwitchChainModalArgs) => switchChainModal$.open(args),
35
+ close: () => switchChainModal$.close(),
36
+ isSwitching$: switchChainModal$.state.isSwitching,
37
+ };
38
+ };
39
+
40
+ const SwitchChainModal = observer(() => {
41
+ const chainIdToSwitchTo = switchChainModal$.state.chainIdToSwitchTo.get();
42
+ const isSwitching$ = switchChainModal$.state.isSwitching;
43
+ const chainName = getPresentableChainName(chainIdToSwitchTo!);
44
+ const { switchChainAsync } = useSwitchChain();
45
+ const {
46
+ onSwitchingNotSupported,
47
+ onUserRejectedRequest,
48
+ onUnknownError,
49
+ onSuccess,
50
+ }: Partial<SwitchChainMessageCallbacks> =
51
+ switchChainModal$.state.messages.get() || {};
52
+
53
+ async function handleSwitchChain() {
54
+ isSwitching$.set(true);
55
+
56
+ try {
57
+ await switchChainAsync({ chainId: chainIdToSwitchTo! });
58
+
59
+ switchChainModal$.state.onSwitchChain();
60
+ onSuccess && onSuccess();
61
+
62
+ switchChainModal$.close();
63
+ } catch (error) {
64
+ if (error instanceof BaseError) {
65
+ const name = error.name as BaseError['name'];
66
+
67
+ switch (name) {
68
+ case SwitchChainNotSupportedError.name:
69
+ onSwitchingNotSupported && onSwitchingNotSupported();
70
+ break;
71
+ case UserRejectedRequestError.name:
72
+ onUserRejectedRequest && onUserRejectedRequest();
73
+ break;
74
+ default:
75
+ onUnknownError && onUnknownError(error);
76
+ break;
77
+ }
78
+ } else {
79
+ onUnknownError && onUnknownError(error);
80
+ }
81
+ } finally {
82
+ isSwitching$.set(false);
83
+ }
84
+ }
85
+
86
+ return (
87
+ <Root open={switchChainModal$.isOpen.get()}>
88
+ <Portal>
89
+ <Overlay className={dialogOverlay} />
90
+
91
+ <Content className={switchChainModalContent}>
92
+ <Text fontSize="large" fontWeight="bold" color="text100">
93
+ Wrong network
94
+ </Text>
95
+
96
+ <AlertMessage
97
+ type="warning"
98
+ message={`You need to switch to ${chainName} network before completing the transaction`}
99
+ />
100
+
101
+ <Button
102
+ name="switch-chain"
103
+ size="sm"
104
+ label={isSwitching$.get() ? <Spinner /> : 'Switch Network'}
105
+ variant="primary"
106
+ pending={isSwitching$.get()}
107
+ shape="square"
108
+ className={
109
+ isSwitching$.get()
110
+ ? switchChainCta.pending
111
+ : switchChainCta.default
112
+ }
113
+ justifySelf="flex-end"
114
+ onClick={handleSwitchChain}
115
+ />
116
+
117
+ <Close
118
+ onClick={() => {
119
+ switchChainModal$.delete();
120
+ }}
121
+ className={closeButton}
122
+ asChild
123
+ >
124
+ <IconButton size="xs" aria-label="Close modal" icon={CloseIcon} />
125
+ </Close>
126
+ </Content>
127
+ </Portal>
128
+ </Root>
129
+ );
130
+ });
131
+
132
+ export default SwitchChainModal;
@@ -0,0 +1,41 @@
1
+ import { observable } from '@legendapp/state';
2
+ import type { ShowSwitchChainModalArgs } from '.';
3
+ import type { SwitchChainMessageCallbacks } from '../../../../../../types/messages';
4
+
5
+ export interface SwitchChainModalState {
6
+ isOpen: boolean;
7
+ open: (args: ShowSwitchChainModalArgs) => void;
8
+ close: () => void;
9
+ state: {
10
+ chainIdToSwitchTo?: number;
11
+ onSwitchChain?: () => void;
12
+ isSwitching: boolean;
13
+ messages?: SwitchChainMessageCallbacks;
14
+ };
15
+ }
16
+
17
+ export const initialState: SwitchChainModalState = {
18
+ isOpen: false,
19
+ open: ({ chainIdToSwitchTo, onSwitchChain, messages }) => {
20
+ switchChainModal$.state.set({
21
+ ...switchChainModal$.state.get(),
22
+ chainIdToSwitchTo,
23
+ onSwitchChain,
24
+ messages,
25
+ });
26
+ switchChainModal$.isOpen.set(true);
27
+ },
28
+ close: () => {
29
+ switchChainModal$.isOpen.set(false);
30
+ switchChainModal$.state.set({
31
+ ...initialState.state,
32
+ });
33
+ },
34
+ state: {
35
+ chainIdToSwitchTo: undefined,
36
+ onSwitchChain: () => {},
37
+ isSwitching: false,
38
+ },
39
+ };
40
+
41
+ export const switchChainModal$ = observable(initialState);
@@ -0,0 +1,37 @@
1
+ import { dialogContent } from '../../../../styles/index';
2
+ import { atoms } from '@0xsequence/design-system';
3
+ import { style } from '@vanilla-extract/css';
4
+ import { styleVariants } from '@vanilla-extract/css';
5
+ import { globalStyle } from '@vanilla-extract/css';
6
+
7
+ export { closeButton, dialogOverlay } from '../../../../styles/modal.css';
8
+
9
+ export const switchChainModalContent = style([
10
+ dialogContent.wide,
11
+ atoms({
12
+ display: 'grid',
13
+ flexDirection: 'column',
14
+ gap: '6',
15
+ padding: '7',
16
+ }),
17
+ ]);
18
+
19
+ const switchChainCtaBase = style({
20
+ width: '147px',
21
+ });
22
+
23
+ export const switchChainCta = styleVariants({
24
+ default: [switchChainCtaBase],
25
+ pending: [
26
+ switchChainCtaBase,
27
+ {
28
+ display: 'flex',
29
+ alignItems: 'center',
30
+ justifyContent: 'center',
31
+ },
32
+ ],
33
+ });
34
+
35
+ globalStyle(`${switchChainCta.pending} > div`, {
36
+ justifyContent: 'center',
37
+ });
@@ -0,0 +1,32 @@
1
+ import { Box, Text } from '@0xsequence/design-system';
2
+ import { formatDistanceToNow } from 'date-fns';
3
+ import { useState, useEffect } from 'react';
4
+
5
+ type TimeAgoProps = {
6
+ date: Date;
7
+ };
8
+
9
+ export default function TimeAgo({ date }: TimeAgoProps) {
10
+ const [timeAgo, setTimeAgo] = useState<string>('');
11
+
12
+ useEffect(() => {
13
+ const interval = setInterval(() => {
14
+ setTimeAgo(formatDistanceToNow(date));
15
+ }, 1000);
16
+
17
+ return () => clearInterval(interval);
18
+ }, [date]);
19
+
20
+ return (
21
+ <Box
22
+ flexGrow="1"
23
+ display="flex"
24
+ alignItems="center"
25
+ justifyContent="flex-end"
26
+ >
27
+ <Text color="text50" fontSize="small">
28
+ {timeAgo}
29
+ </Text>
30
+ </Box>
31
+ );
32
+ }
@@ -0,0 +1,58 @@
1
+ import { Box, Image, Skeleton, Text } from '@0xsequence/design-system';
2
+ import { useCollectible } from '@react-hooks/useCollectible';
3
+ import { tokenPreview } from './styles.css';
4
+
5
+ type TokenPreviewProps = {
6
+ collectionName?: string;
7
+ collectionAddress: string;
8
+ collectibleId: string;
9
+ chainId: string;
10
+ };
11
+
12
+ export default function TokenPreview({
13
+ collectionName,
14
+ collectionAddress,
15
+ collectibleId,
16
+ chainId,
17
+ }: TokenPreviewProps) {
18
+ const { data: collectable, isLoading: collectibleLoading } = useCollectible({
19
+ chainId: chainId,
20
+ collectionAddress: collectionAddress,
21
+ collectibleId,
22
+ });
23
+
24
+ if (collectibleLoading) {
25
+ return (
26
+ <Box display="flex" alignItems="center" gap="3" width="full">
27
+ <Skeleton width={'9'} height={'9'} borderRadius={'xs'} />
28
+
29
+ <Box display="flex" flexGrow="1" gap="1" flexDirection="column">
30
+ <Skeleton width="1/3" height="3" />
31
+ <Skeleton width="1/2" height="3" />
32
+ </Box>
33
+ </Box>
34
+ );
35
+ }
36
+
37
+ return (
38
+ <Box className={tokenPreview}>
39
+ <Image
40
+ src={collectable?.image}
41
+ alt={collectable?.name}
42
+ width={'9'}
43
+ height={'9'}
44
+ borderRadius={'xs'}
45
+ />
46
+
47
+ <Box display={'flex'} flexDirection={'column'} marginLeft={'3'}>
48
+ <Text fontSize={'small'} color={'text80'} fontWeight={'medium'}>
49
+ {collectionName}
50
+ </Text>
51
+
52
+ <Text fontSize={'small'} fontWeight={'bold'} color={'text100'}>
53
+ {collectable?.name}
54
+ </Text>
55
+ </Box>
56
+ </Box>
57
+ );
58
+ }
@@ -0,0 +1,11 @@
1
+ import { atoms } from '@0xsequence/design-system';
2
+ import { style } from '@vanilla-extract/css';
3
+
4
+ export const tokenPreview = style([
5
+ atoms({
6
+ display: 'flex',
7
+ alignItems: 'center',
8
+ width: 'full',
9
+ marginX: '4',
10
+ }),
11
+ ]);
@@ -0,0 +1,48 @@
1
+ import { truncateMiddle } from '../../../../../../utils';
2
+ import SvgPositiveCircleIcon from '../../../../icons/PositiveCircleIcon';
3
+ import { Box, Spinner, Text } from '@0xsequence/design-system';
4
+ import type { Hex } from 'viem';
5
+
6
+ type TransactionFooterProps = {
7
+ transactionHash: Hex;
8
+ isConfirming: boolean;
9
+ isConfirmed: boolean;
10
+ isFailed: boolean;
11
+ };
12
+
13
+ export default function TransactionFooter({
14
+ transactionHash,
15
+ isConfirming,
16
+ isConfirmed,
17
+ isFailed,
18
+ }: TransactionFooterProps) {
19
+ const icon =
20
+ (isConfirming && <Spinner size="md" />) ||
21
+ (isConfirmed && <SvgPositiveCircleIcon size="md" />);
22
+
23
+ const title =
24
+ (isConfirming && 'Processing transaction') ||
25
+ (isConfirmed && 'Transaction complete') ||
26
+ (isFailed && 'Transaction failed');
27
+ return (
28
+ <Box display="flex" alignItems="center">
29
+ {icon}
30
+
31
+ <Text color="text50" fontSize="normal" fontWeight="medium" marginLeft="2">
32
+ {title}
33
+ </Text>
34
+
35
+ <Text
36
+ // TODO: Replace "polygonLight" with the actual color from design system
37
+ color="polygonLight"
38
+ flexGrow="1"
39
+ textAlign="right"
40
+ fontSize="normal"
41
+ fontWeight="medium"
42
+ marginLeft="2"
43
+ >
44
+ {truncateMiddle(transactionHash, 4, 4)}
45
+ </Text>
46
+ </Box>
47
+ );
48
+ }
@@ -0,0 +1,80 @@
1
+ import { Box, NetworkImage, Skeleton, Text } from '@0xsequence/design-system';
2
+ import { useMarketplaceConfig } from '@react-hooks/useMarketplaceConfig';
3
+ import { useRoyaltyPercentage } from '@react-hooks/useRoyaltyPercentage';
4
+ import type { Price } from '@types';
5
+ import { formatUnits } from 'viem';
6
+
7
+ type TransactionDetailsProps = {
8
+ collectibleId: string;
9
+ collectionAddress: string;
10
+ chainId: string;
11
+ price?: Price;
12
+ };
13
+
14
+ //TODO: Move this
15
+ const DEFAULT_MARKETPLACE_FEE_PERCENTAGE = 2.5;
16
+
17
+ export default function TransactionDetails({
18
+ collectibleId,
19
+ collectionAddress,
20
+ chainId,
21
+ price,
22
+ }: TransactionDetailsProps) {
23
+ const { data, isLoading: marketplaceConfigLoading } = useMarketplaceConfig();
24
+
25
+ const marketplaceFeePercentage =
26
+ data?.collections.find(
27
+ (collection) => collection.collectionAddress === collectionAddress,
28
+ )?.marketplaceFeePercentage || DEFAULT_MARKETPLACE_FEE_PERCENTAGE;
29
+ const { data: royaltyPercentage, isLoading: royaltyPercentageLoading } =
30
+ useRoyaltyPercentage({
31
+ chainId,
32
+ collectionAddress,
33
+ collectibleId,
34
+ });
35
+
36
+ const priceLoading =
37
+ !price || marketplaceConfigLoading || royaltyPercentageLoading;
38
+
39
+ let formattedAmount =
40
+ price && formatUnits(BigInt(price.amountRaw), price.currency.decimals);
41
+
42
+ if (royaltyPercentage !== undefined && formattedAmount) {
43
+ formattedAmount = (
44
+ Number.parseFloat(formattedAmount) -
45
+ (Number.parseFloat(formattedAmount) * Number(royaltyPercentage)) / 100
46
+ ).toString();
47
+ }
48
+
49
+ if (marketplaceFeePercentage !== undefined && formattedAmount) {
50
+ formattedAmount = (
51
+ Number.parseFloat(formattedAmount) -
52
+ (Number.parseFloat(formattedAmount) * marketplaceFeePercentage) / 100
53
+ ).toString();
54
+ }
55
+
56
+ return (
57
+ <Box
58
+ width="full"
59
+ display={'flex'}
60
+ justifyContent={'space-between'}
61
+ alignItems={'center'}
62
+ >
63
+ <Text fontSize={'small'} color={'text50'}>
64
+ Total earnings
65
+ </Text>
66
+
67
+ <Box display="flex" alignItems="center" gap="2">
68
+ <NetworkImage chainId={Number(chainId)} size="xs" />
69
+
70
+ {priceLoading ? (
71
+ <Skeleton width="16" height={'4'} />
72
+ ) : (
73
+ <Text fontSize={'small'} color={'text100'}>
74
+ {formattedAmount} {price.currency.symbol}
75
+ </Text>
76
+ )}
77
+ </Box>
78
+ </Box>
79
+ );
80
+ }
@@ -0,0 +1,30 @@
1
+ import { Box, NetworkImage, Skeleton, Text } from '@0xsequence/design-system';
2
+ import { formatDistanceToNow } from 'date-fns';
3
+
4
+ type TransactionHeaderProps = {
5
+ title: string;
6
+ chainId: number;
7
+ date?: Date;
8
+ };
9
+
10
+ export default function TransactionHeader({
11
+ title,
12
+ chainId,
13
+ date,
14
+ }: TransactionHeaderProps) {
15
+ return (
16
+ <Box display="flex" alignItems="center" width="full">
17
+ <Text fontSize="small" fontWeight="medium" color="text80" marginRight="1">
18
+ {title}
19
+ </Text>
20
+
21
+ <NetworkImage size="xs" chainId={chainId} />
22
+
23
+ {(date && (
24
+ <Text fontSize="small" color="text50" flexGrow="1" textAlign="right">
25
+ {formatDistanceToNow(date)} ago
26
+ </Text>
27
+ )) || <Skeleton width="8" height="4" />}
28
+ </Box>
29
+ );
30
+ }
@@ -0,0 +1,27 @@
1
+ export const TRANSACTION_TITLES = {
2
+ sell: {
3
+ confirming: 'Selling',
4
+ confirmed: 'Sold',
5
+ failed: 'Sale failed',
6
+ },
7
+ createListing: {
8
+ confirming: 'Creating listing',
9
+ confirmed: 'Listed',
10
+ failed: 'Listing failed',
11
+ },
12
+ createOffer: {
13
+ confirming: 'Creating offer',
14
+ confirmed: 'Offer created',
15
+ failed: 'Offer failed',
16
+ },
17
+ buy: {
18
+ confirming: 'Buying',
19
+ confirmed: 'Bought',
20
+ failed: 'Purchase failed',
21
+ },
22
+ transfer: {
23
+ confirming: 'Transferring',
24
+ confirmed: 'Transferred',
25
+ failed: 'Transfer failed',
26
+ },
27
+ } as const;
@@ -0,0 +1,111 @@
1
+ import { Box, Image, NetworkImage, Text } from '@0xsequence/design-system';
2
+ import type { TokenMetadata } from '@internal';
3
+ import { useCollection } from '@react-hooks/useCollection';
4
+ import TimeAgo from '../timeAgo';
5
+ import { transactionStatusModal$ } from '../transactionStatusModal/store';
6
+ import { observer } from '@legendapp/state/react';
7
+ import { useTransactionPreviewTitle } from './useTransactionPreviewTitle';
8
+ import type { Price } from '@types';
9
+ import { formatUnits } from 'viem';
10
+
11
+ type TransactionPreviewProps = {
12
+ price?: Price;
13
+ collectionAddress: string;
14
+ chainId: string;
15
+ collectible: TokenMetadata;
16
+ isConfirming: boolean;
17
+ isConfirmed: boolean;
18
+ isFailed: boolean;
19
+ };
20
+
21
+ const TransactionPreview = observer(
22
+ ({
23
+ price,
24
+ collectionAddress,
25
+ chainId,
26
+ collectible,
27
+ isConfirming,
28
+ isConfirmed,
29
+ isFailed,
30
+ }: TransactionPreviewProps) => {
31
+ const { type } = transactionStatusModal$.state.get();
32
+ const title = useTransactionPreviewTitle(
33
+ { isConfirmed, isConfirming, isFailed },
34
+ type,
35
+ );
36
+ const { data: collection } = useCollection({
37
+ collectionAddress,
38
+ chainId,
39
+ });
40
+
41
+ const collectibleImage = collectible.image;
42
+ const collectibleName = collectible.name;
43
+ const collectionName = collection?.name;
44
+ const priceFormatted = price
45
+ ? formatUnits(BigInt(price!.amountRaw), price!.currency.decimals)
46
+ : undefined;
47
+
48
+ return (
49
+ <Box padding="3" background="backgroundSecondary" borderRadius="md">
50
+ <Box display="flex" alignItems="center">
51
+ <Text
52
+ color="text50"
53
+ fontSize="small"
54
+ fontWeight="medium"
55
+ marginRight="1"
56
+ >
57
+ {title}
58
+ </Text>
59
+
60
+ <NetworkImage chainId={Number(chainId)} size="xs" />
61
+
62
+ {isConfirming && <TimeAgo date={new Date()} />}
63
+ </Box>
64
+
65
+ <Box display="flex" alignItems="center" marginTop="2">
66
+ <Image
67
+ src={collectibleImage}
68
+ alt={collectibleName}
69
+ width="9"
70
+ height="9"
71
+ borderRadius="xs"
72
+ marginRight="3"
73
+ />
74
+
75
+ <Box
76
+ display="flex"
77
+ flexDirection="column"
78
+ alignItems="flex-start"
79
+ gap="0.5"
80
+ >
81
+ <Text color="text80" fontSize="small" fontWeight="medium">
82
+ {collectibleName}
83
+ </Text>
84
+
85
+ <Text color="text100" fontSize="small">
86
+ {collectionName}
87
+ </Text>
88
+ </Box>
89
+
90
+ {price && (
91
+ <Box
92
+ flexGrow="1"
93
+ display="flex"
94
+ alignItems="center"
95
+ justifyContent="flex-end"
96
+ gap="1"
97
+ >
98
+ <NetworkImage chainId={Number(chainId)} size="xs" />
99
+
100
+ <Text color="text80" fontSize="small" fontWeight="medium">
101
+ {priceFormatted} {price!.currency.symbol}
102
+ </Text>
103
+ </Box>
104
+ )}
105
+ </Box>
106
+ </Box>
107
+ );
108
+ },
109
+ );
110
+
111
+ export default TransactionPreview;
@@ -0,0 +1,24 @@
1
+ import { useMemo } from 'react';
2
+ import type {
3
+ ConfirmationStatus,
4
+ StatusOrderType,
5
+ } from '../transactionStatusModal/store';
6
+ import { TRANSACTION_TITLES } from './consts';
7
+
8
+ export function useTransactionPreviewTitle(
9
+ status: ConfirmationStatus,
10
+ type?: StatusOrderType | undefined,
11
+ ): string {
12
+ return useMemo(() => {
13
+ if (!type) return '';
14
+
15
+ const { isConfirming, isConfirmed, isFailed } = status;
16
+ const titles = TRANSACTION_TITLES[type];
17
+
18
+ if (isConfirming) return titles.confirming;
19
+ if (isConfirmed) return titles.confirmed;
20
+ if (isFailed) return titles.failed;
21
+
22
+ return '';
23
+ }, [status, type]);
24
+ }