From 501ac5f7154136bbd25d02ed2bf2e3366a27afbf Mon Sep 17 00:00:00 2001 From: fbwoolf Date: Wed, 3 May 2023 12:35:51 -0500 Subject: [PATCH] refactor: stamps query and ui, closes #3648 --- public/assets/images/bitcoin-stamp.png | Bin 0 -> 3213 bytes public/assets/images/generic-error-icon.png | Bin 34840 -> 0 bytes .../receive/receive-collectible-item.tsx | 38 ++++++++ .../receive/receive-collectible.tsx | 88 ++++++++---------- .../_collectible-types/collectible-image.tsx | 8 +- .../_collectible-types/collectible-text.tsx | 7 +- .../components/add-collectible.tsx | 2 +- .../components/bitcoin/inscription-text.tsx | 2 + .../components/bitcoin/inscription.tsx | 2 + .../collectibles/components/bitcoin/stamp.tsx | 10 +- .../components/stacks/stacks-bns-name.tsx | 2 + .../stacks/stacks-non-fungible-tokens.tsx | 2 +- .../use-taproot-address-utxos.query.ts | 4 +- .../bitcoin/stamps/stamp-collection.query.ts | 42 --------- .../bitcoin/stamps/stamps-by-address.query.ts | 18 ++-- .../query/bitcoin/stamps/use-is-stamped-tx.ts | 12 +-- 16 files changed, 119 insertions(+), 118 deletions(-) create mode 100644 public/assets/images/bitcoin-stamp.png delete mode 100644 public/assets/images/generic-error-icon.png create mode 100644 src/app/components/receive/receive-collectible-item.tsx delete mode 100644 src/app/query/bitcoin/stamps/stamp-collection.query.ts diff --git a/public/assets/images/bitcoin-stamp.png b/public/assets/images/bitcoin-stamp.png new file mode 100644 index 0000000000000000000000000000000000000000..cc129286799d5a73b3b9571fd4d4e2fc7da3d65f GIT binary patch literal 3213 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 b(QIS2)+BjS3KafIsWy}?F;ZIrA* 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 U<8N!w>;M1&07*qoM6N<$g51?uPyhe` diff --git a/src/app/components/receive/receive-collectible-item.tsx b/src/app/components/receive/receive-collectible-item.tsx new file mode 100644 index 00000000..45d4b382 --- /dev/null +++ b/src/app/components/receive/receive-collectible-item.tsx @@ -0,0 +1,38 @@ +import { FiCopy } from 'react-icons/fi'; + +import { Box, Button, Flex, Stack } from '@stacks/ui'; +import { truncateMiddle } from '@stacks/ui-utils'; + +import { Flag } from '../layout/flag'; +import { Caption } from '../typography'; + +interface ReceiveCollectibleItemProps { + address: string; + icon: JSX.Element; + onCopyAddress(): void; + title: string; +} +export function ReceiveCollectibleItem({ + address, + icon, + onCopyAddress, + title, +}: ReceiveCollectibleItemProps) { + return ( + + + + {title} + {truncateMiddle(address, 6)} + + + + + + + + + ); +} diff --git a/src/app/components/receive/receive-collectible.tsx b/src/app/components/receive/receive-collectible.tsx index 9cac95ad..a9aeb291 100644 --- a/src/app/components/receive/receive-collectible.tsx +++ b/src/app/components/receive/receive-collectible.tsx @@ -1,9 +1,8 @@ import toast from 'react-hot-toast'; -import { FiCopy } from 'react-icons/fi'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Box, Button, Flex, Stack, useClipboard } from '@stacks/ui'; -import { truncateMiddle } from '@stacks/ui-utils'; +import BitcoinStampImg from '@assets/images/bitcoin-stamp.png'; +import { Box, Stack, useClipboard } from '@stacks/ui'; import get from 'lodash.get'; import { RouteUrls } from '@shared/route-urls'; @@ -11,77 +10,68 @@ import { RouteUrls } from '@shared/route-urls'; import { useAnalytics } from '@app/common/hooks/analytics/use-analytics'; import { StxAvatar } from '@app/components/crypto-assets/stacks/components/stx-avatar'; import { OrdinalIcon } from '@app/components/icons/ordinal-icon'; -import { Flag } from '@app/components/layout/flag'; -import { Caption } from '@app/components/typography'; import { useZeroIndexTaprootAddress } from '@app/query/bitcoin/ordinals/use-zero-index-taproot-address'; +import { useCurrentBtcNativeSegwitAccountAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; import { useCurrentAccountStxAddressState } from '@app/store/accounts/blockchain/stacks/stacks-account.hooks'; +import { ReceiveCollectibleItem } from './receive-collectible-item'; + export function ReceiveCollectible() { const analytics = useAnalytics(); const location = useLocation(); const navigate = useNavigate(); const accountIndex = get(location.state, 'accountIndex', undefined); - const btcAddress = useZeroIndexTaprootAddress(accountIndex); + const btcAddressNativeSegwit = useCurrentBtcNativeSegwitAccountAddressIndexZero(); + const btcAddressTaproot = useZeroIndexTaprootAddress(accountIndex); // TODO: Reuse later for privacy mode // const { isLoading, isError, data: btcAddress } = useNextFreshTaprootAddressQuery(accountIndex); const stxAddress = useCurrentAccountStxAddressState(); + const { onCopy: onCopyBitcoin } = useClipboard(btcAddressNativeSegwit); const { onCopy: onCopyStacks } = useClipboard(stxAddress); - function copyToClipboard(copyHandler: () => void) { + function copyBitcoinAddressToClipboard(copyHandler: () => void) { + void analytics.track('select_stamp_to_add_new_collectible'); + toast.success('Copied to clipboard!'); + copyHandler(); + } + + function copyStacksAddressToClipboard(copyHandler: () => void) { void analytics.track('select_nft_to_add_new_collectible'); toast.success('Copied to clipboard!'); copyHandler(); } - if (!btcAddress) return null; + if (!btcAddressTaproot) return null; return ( - } spacing="base"> - + } + onCopyAddress={() => { + void analytics.track('select_inscription_to_add_new_collectible'); + navigate(RouteUrls.ReceiveCollectibleOrdinal, { state: { btcAddressTaproot } }); + }} + title="Ordinal inscription" + /> + - Ordinal inscription - {truncateMiddle(btcAddress, 6)} + - - - - - - - - } spacing="base"> - - - Stacks NFT - {truncateMiddle(stxAddress, 6)} - - - - - - - - + } + onCopyAddress={() => copyBitcoinAddressToClipboard(onCopyBitcoin)} + title="Bitcoin Stamp" + /> + } + onCopyAddress={() => copyStacksAddressToClipboard(onCopyStacks)} + title="Stacks NFT" + /> ); } diff --git a/src/app/features/collectibles/components/_collectible-types/collectible-image.tsx b/src/app/features/collectibles/components/_collectible-types/collectible-image.tsx index 8db6296d..25310617 100644 --- a/src/app/features/collectibles/components/_collectible-types/collectible-image.tsx +++ b/src/app/features/collectibles/components/_collectible-types/collectible-image.tsx @@ -3,30 +3,30 @@ import { useState } from 'react'; import { Spinner } from '@stacks/ui'; import { figmaTheme } from '@app/common/utils/figma-theme'; -import { OrdinalMinimalIcon } from '@app/components/icons/ordinal-minimal-icon'; import { CollectibleItemLayout, CollectibleItemLayoutProps } from '../collectible-item.layout'; import { ImageUnavailable } from '../image-unavailable'; interface CollectibleImageProps extends Omit { alt?: string; + icon: JSX.Element; src: string; } export function CollectibleImage(props: CollectibleImageProps) { - const { alt, src, ...rest } = props; + const { alt, icon, src, ...rest } = props; const [isError, setIsError] = useState(false); const [isLoading, setIsLoading] = useState(true); const [width, setWidth] = useState(0); if (isError) return ( - } {...rest}> + ); return ( - } {...rest}> + {isLoading && } {alt} { + icon: JSX.Element; content: string; } export function CollectibleText(props: CollectibleTextProps) { - const { content, ...rest } = props; + const { content, icon, ...rest } = props; return ( - } {...rest}> + {content} ); diff --git a/src/app/features/collectibles/components/add-collectible.tsx b/src/app/features/collectibles/components/add-collectible.tsx index 26d52130..e1bda496 100644 --- a/src/app/features/collectibles/components/add-collectible.tsx +++ b/src/app/features/collectibles/components/add-collectible.tsx @@ -33,7 +33,7 @@ export function AddCollectible() { void analytics.track('select_add_new_collectible'); navigate(RouteUrls.ReceiveCollectible); }} - subtitle="Ordinal or Stacks NFT" + subtitle="Collectible" title="Add new" > diff --git a/src/app/features/collectibles/components/bitcoin/inscription-text.tsx b/src/app/features/collectibles/components/bitcoin/inscription-text.tsx index 25714992..2b90171c 100644 --- a/src/app/features/collectibles/components/bitcoin/inscription-text.tsx +++ b/src/app/features/collectibles/components/bitcoin/inscription-text.tsx @@ -1,6 +1,7 @@ import { Spinner } from '@stacks/ui'; import { figmaTheme } from '@app/common/utils/figma-theme'; +import { OrdinalMinimalIcon } from '@app/components/icons/ordinal-minimal-icon'; import { useTextInscriptionContentQuery } from '@app/query/bitcoin/ordinals/use-text-ordinal-content.query'; import { CollectibleText } from '../_collectible-types/collectible-text'; @@ -24,6 +25,7 @@ export function InscriptionText({ return ( } key={inscriptionNumber} onClickCallToAction={onClickCallToAction} onClickSend={onClickSend} diff --git a/src/app/features/collectibles/components/bitcoin/inscription.tsx b/src/app/features/collectibles/components/bitcoin/inscription.tsx index 5eb76604..3f2a43cf 100644 --- a/src/app/features/collectibles/components/bitcoin/inscription.tsx +++ b/src/app/features/collectibles/components/bitcoin/inscription.tsx @@ -4,6 +4,7 @@ import { RouteUrls } from '@shared/route-urls'; import { openInNewTab } from '@app/common/utils/open-in-new-tab'; import { OrdinalIconFull } from '@app/components/icons/ordinal-icon-full'; +import { OrdinalMinimalIcon } from '@app/components/icons/ordinal-minimal-icon'; import { useInscription } from '@app/query/bitcoin/ordinals/inscription.hooks'; import { TaprootUtxo } from '@app/query/bitcoin/ordinals/use-taproot-address-utxos.query'; @@ -32,6 +33,7 @@ export function Inscription({ path, utxo }: InscriptionProps) { case 'image': { return ( } key={inscription.title} onClickCallToAction={() => openInNewTab(inscription.infoUrl)} onClickSend={() => openSendInscriptionModal()} diff --git a/src/app/features/collectibles/components/bitcoin/stamp.tsx b/src/app/features/collectibles/components/bitcoin/stamp.tsx index 4891e77c..cb768a2a 100644 --- a/src/app/features/collectibles/components/bitcoin/stamp.tsx +++ b/src/app/features/collectibles/components/bitcoin/stamp.tsx @@ -1,5 +1,8 @@ +import BitcoinStampImg from '@assets/images/bitcoin-stamp.png'; +import { Box } from '@stacks/ui'; + import { openInNewTab } from '@app/common/utils/open-in-new-tab'; -import { Stamp as BitcoinStamp } from '@app/query/bitcoin/stamps/stamp-collection.query'; +import { Stamp as BitcoinStamp } from '@app/query/bitcoin/stamps/stamps-by-address.query'; import { CollectibleImage } from '../_collectible-types/collectible-image'; @@ -10,6 +13,11 @@ export function Stamp(props: { bitcoinStamp: BitcoinStamp }) { return ( + + + } key={bitcoinStamp.stamp} onClickCallToAction={() => openInNewTab(`${stampChainAssetUrl}${bitcoinStamp.stamp}`)} src={bitcoinStamp.stamp_url} diff --git a/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx b/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx index 112d4a68..fdf0d779 100644 --- a/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx +++ b/src/app/features/collectibles/components/stacks/stacks-bns-name.tsx @@ -1,6 +1,7 @@ import StacksNftBns from '@assets/images/stacks-nft-bns.png'; import { figmaTheme } from '@app/common/utils/figma-theme'; +import { StxAvatar } from '@app/components/crypto-assets/stacks/components/stx-avatar'; import { CollectibleItemLayout } from '../collectible-item.layout'; @@ -16,6 +17,7 @@ export function StacksBnsName(props: { bnsName: string }) { return ( } subtitle="Bitcoin Naming System" title={bnsName} > diff --git a/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx b/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx index a4a2ea9a..77e3f08e 100644 --- a/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx +++ b/src/app/features/collectibles/components/stacks/stacks-non-fungible-tokens.tsx @@ -25,7 +25,7 @@ export function StacksNonFungibleTokens({ metadata }: StacksNonFungibleTokensPro } + icon={} src={metadata.cached_image ?? ''} subtitle="Stacks NFT" title={metadata.name ?? ''} diff --git a/src/app/query/bitcoin/ordinals/use-taproot-address-utxos.query.ts b/src/app/query/bitcoin/ordinals/use-taproot-address-utxos.query.ts index b8b8f156..f48cbace 100644 --- a/src/app/query/bitcoin/ordinals/use-taproot-address-utxos.query.ts +++ b/src/app/query/bitcoin/ordinals/use-taproot-address-utxos.query.ts @@ -7,7 +7,6 @@ import { useBitcoinClient } from '@app/store/common/api-clients.hooks'; import { useCurrentNetwork } from '@app/store/networks/networks.selectors'; import { UtxoResponseItem } from '../bitcoin-client'; -import { useIsStampedTx } from '../stamps/use-is-stamped-tx'; import { getTaprootAddress, hasInscriptions } from './utils'; const stopSearchAfterNumberAddressesWithoutOrdinals = 20; @@ -24,7 +23,6 @@ export interface TaprootUtxo extends UtxoResponseItem { export function useTaprootAccountUtxosQuery() { const network = useCurrentNetwork(); const keychain = useCurrentTaprootAccountKeychain(); - const isStamped = useIsStampedTx(); const client = useBitcoinClient(); const currentAccountIndex = useCurrentAccountIndex(); @@ -62,6 +60,6 @@ export function useTaprootAccountUtxosQuery() { currentNumberOfAddressesWithoutOrdinals = 0; addressIndexCounter.increment(); } - return foundUnspentTransactions.filter(tx => !isStamped(tx.txid)); + return foundUnspentTransactions; }); } diff --git a/src/app/query/bitcoin/stamps/stamp-collection.query.ts b/src/app/query/bitcoin/stamps/stamp-collection.query.ts deleted file mode 100644 index c2106a52..00000000 --- a/src/app/query/bitcoin/stamps/stamp-collection.query.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import { AppUseQueryConfig } from '@app/query/query-config'; -import { QueryPrefixes } from '@app/query/query-prefixes'; - -export interface Stamp { - asset: string; - block_index: number; - message_index: number; - stamp: number; - stamp_mimetype: string; - stamp_url: string; - timestamp: number; - tx_hash: string; - tx_index: number; -} - -async function fetchStampCollection() { - return ( - fetch('https://stampchain.io/stamp.json') - .then(res => res.json()) - // Currently we only filter UTXOs for stamps. As we collect, and cache, - // all stamps, we cache only the ID to lower the amount of storage used - .then((allStamps: Stamp[]) => allStamps.map(s => ({ tx_hash: s.tx_hash }))) - ); -} - -type FetchStampCollectionResp = Awaited>; - -export function useStampCollectionQuery( - options?: AppUseQueryConfig -) { - return useQuery({ - queryKey: [QueryPrefixes.StampCollection], - queryFn: () => fetchStampCollection(), - refetchOnMount: false, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - staleTime: 1000 * 60 * 60 * 5, - ...options, - }); -} diff --git a/src/app/query/bitcoin/stamps/stamps-by-address.query.ts b/src/app/query/bitcoin/stamps/stamps-by-address.query.ts index 638bd07d..e786ac88 100644 --- a/src/app/query/bitcoin/stamps/stamps-by-address.query.ts +++ b/src/app/query/bitcoin/stamps/stamps-by-address.query.ts @@ -3,12 +3,17 @@ import { useQuery } from '@tanstack/react-query'; import { AppUseQueryConfig } from '@app/query/query-config'; import { QueryPrefixes } from '@app/query/query-prefixes'; -import { Stamp } from './stamp-collection.query'; - -const stampsByAddressQueryOptions = { - cacheTime: Infinity, - staleTime: 15 * 60 * 1000, -} as const; +export interface Stamp { + asset: string; + block_index: number; + message_index: number; + stamp: number; + stamp_mimetype: string; + stamp_url: string; + timestamp: number; + tx_hash: string; + tx_index: number; +} async function fetchStampsByAddress(address: string): Promise { return fetch(`https://stampchain.io/api/stamps?wallet_address=${address}`).then(res => @@ -25,7 +30,6 @@ export function useStampsByAddressQuery fetchStampsByAddress(address), - ...stampsByAddressQueryOptions, ...options, }); } diff --git a/src/app/query/bitcoin/stamps/use-is-stamped-tx.ts b/src/app/query/bitcoin/stamps/use-is-stamped-tx.ts index 5457e888..76a2b089 100644 --- a/src/app/query/bitcoin/stamps/use-is-stamped-tx.ts +++ b/src/app/query/bitcoin/stamps/use-is-stamped-tx.ts @@ -1,12 +1,12 @@ import { useCallback } from 'react'; -import { useStampCollectionQuery } from './stamp-collection.query'; +import { useCurrentBtcNativeSegwitAccountAddressIndexZero } from '@app/store/accounts/blockchain/bitcoin/native-segwit-account.hooks'; + +import { useStampsByAddressQuery } from './stamps-by-address.query'; export function useIsStampedTx() { - const { data: stampCollection = [] } = useStampCollectionQuery(); + const currentAccountBtcAddress = useCurrentBtcNativeSegwitAccountAddressIndexZero(); + const { data: stamps = [] } = useStampsByAddressQuery(currentAccountBtcAddress); - return useCallback( - (txid: string) => stampCollection.some(stamp => stamp.tx_hash === txid), - [stampCollection] - ); + return useCallback((txid: string) => stamps.some(stamp => stamp.tx_hash === txid), [stamps]); }