Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions packages/checkout/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
"motion": "^12.9.2",
"pako": "^2.1.0",
"qrcode.react": "^4.2.0",
"react-copy-to-clipboard": "^5.1.0",
"timeago-react": "^3.0.7"
},
"peerDependencies": {
Expand All @@ -58,7 +57,6 @@
"@0xsequence/connect": "workspace:*",
"@tanstack/react-query": "^5.74.11",
"@types/pako": "^2.0.3",
"@types/react-copy-to-clipboard": "^5.0.7",
"ethers": "^6.13.7",
"react": "^19.1.0",
"react-dom": "^19.1.0",
Expand Down
35 changes: 15 additions & 20 deletions packages/checkout/src/components/CopyButton.tsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,27 @@
import { Button, CheckmarkIcon, CopyIcon } from '@0xsequence/design-system'
import React, { useEffect, useState, type ComponentProps } from 'react'
import { CopyToClipboard } from 'react-copy-to-clipboard'
import { useClipboard } from '@0xsequence/hooks'
import React, { type ComponentProps } from 'react'

type ButtonProps = ComponentProps<typeof Button>

interface CopyButtonProps extends ButtonProps {
text: string
inline?: boolean
}

export const CopyButton = (props: CopyButtonProps) => {
const { text, size = 'xs', ...rest } = props
const [isCopied, setCopy] = useState(false)
const { text, size = 'xs', inline = false, ...rest } = props
const [isCopied, setCopied] = useClipboard({ timeout: 4000 })

useEffect(() => {
if (isCopied) {
setTimeout(() => {
setCopy(false)
}, 4000)
}
}, [isCopied])

const handleCopy = () => {
setCopy(true)
}

return (
<CopyToClipboard text={text} onCopy={handleCopy}>
<Button size={size} leftIcon={isCopied ? CheckmarkIcon : CopyIcon} label={isCopied ? 'Copied' : 'Copy'} {...rest} />
</CopyToClipboard>
return inline ? (
<Button size={size} variant="text" leftIcon={isCopied ? CheckmarkIcon : CopyIcon} onClick={() => setCopied(text)} />
) : (
<Button
size={size}
leftIcon={isCopied ? CheckmarkIcon : CopyIcon}
label={isCopied ? 'Copied' : 'Copy'}
onClick={() => setCopied(text)}
{...rest}
/>
)
}
32 changes: 9 additions & 23 deletions packages/checkout/src/views/PaymentSelection/TransferFunds.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Card, CheckmarkIcon, CopyIcon, IconButton, Text, truncateAddress } from '@0xsequence/design-system'
import { useClipboard } from '@0xsequence/hooks'
import { QRCodeCanvas } from 'qrcode.react'
import { useEffect, useState } from 'react'
import { CopyToClipboard } from 'react-copy-to-clipboard'
import { useAccount } from 'wagmi'

import { useSelectPaymentModal, useTransferFundsModal } from '../../hooks'
Expand All @@ -10,19 +9,7 @@ export const TransferFunds = () => {
const { openTransferFundsModal } = useTransferFundsModal()
const { openSelectPaymentModal, closeSelectPaymentModal, selectPaymentSettings } = useSelectPaymentModal()
const { address: userAddress } = useAccount()
const [isCopied, setCopy] = useState(false)

useEffect(() => {
if (isCopied) {
setTimeout(() => {
setCopy(false)
}, 4000)
}
}, [isCopied])

const handleCopy = () => {
setCopy(true)
}
const [isCopied, setCopied] = useClipboard({ timeout: 4000 })

const onClickQrCode = (e: React.MouseEvent<HTMLDivElement>) => {
e.preventDefault()
Expand Down Expand Up @@ -83,14 +70,13 @@ export const TransferFunds = () => {
e.preventDefault()
}}
>
<CopyToClipboard text={userAddress || ''} onCopy={handleCopy}>
<IconButton
className="text-muted"
variant="base"
size="md"
icon={isCopied ? () => <CheckmarkIcon size="lg" /> : () => <CopyIcon size="lg" />}
/>
</CopyToClipboard>
<IconButton
className="text-muted"
variant="base"
size="md"
icon={isCopied ? () => <CheckmarkIcon size="lg" /> : () => <CopyIcon size="lg" />}
onClick={() => setCopied(userAddress || '')}
/>
</div>
</Card>
</div>
Expand Down
37 changes: 0 additions & 37 deletions packages/checkout/src/views/TransferToWallet/CopyButton.tsx

This file was deleted.

2 changes: 1 addition & 1 deletion packages/checkout/src/views/TransferToWallet/QRCode.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Skeleton } from '@0xsequence/design-system'
import { QRCodeCanvas } from 'qrcode.react'

import { CopyButton } from './CopyButton'
import { CopyButton } from '../../components/CopyButton'

interface QRCodeProps {
value: string | undefined
Expand Down
3 changes: 3 additions & 0 deletions packages/hooks/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,8 @@
"viem": "^2.28.1",
"vite": "^6.3.4",
"vitest": "^2.1.9"
},
"dependencies": {
"copy-to-clipboard": "^3.3.3"
}
}
31 changes: 31 additions & 0 deletions packages/hooks/src/hooks/useClipboard.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import copy from 'copy-to-clipboard'
import { useEffect, useState } from 'react'

interface UseClipboardProps {
timeout?: number
}

export const useClipboard = (props?: UseClipboardProps) => {
const [isCopied, setIsCopied] = useState(false)
const timeout = props && props.timeout

useEffect(() => {
if (isCopied) {
const id = setTimeout(() => {
setIsCopied(false)
}, timeout)

return () => {
clearTimeout(id)
}
}
}, [isCopied, timeout])

return [
isCopied,
(text: string) => {
copy(text)
setIsCopied(true)
}
] as const
}
3 changes: 2 additions & 1 deletion packages/hooks/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ export { useGetSwapQuote } from './hooks/Combination/useGetSwapQuote'
export { useGetSwapRoutes } from './hooks/Combination/useGetSwapRoutes'

// Etc
export { useClearCachedBalances } from './hooks/useClearCachedBalances.js'
export { useClearCachedBalances } from './hooks/useClearCachedBalances'
export { useClipboard } from './hooks/useClipboard'
4 changes: 1 addition & 3 deletions packages/wallet-widget/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@
"fuse.js": "^6.6.2",
"micro-observables": "1.7.2",
"motion": "^12.9.2",
"qrcode.react": "^4.2.0",
"react-copy-to-clipboard": "^5.1.0"
"qrcode.react": "^4.2.0"
},
"peerDependencies": {
"@0xsequence/api": "2.3.11",
Expand All @@ -60,7 +59,6 @@
"@0xsequence/connect": "workspace:*",
"@0xsequence/hooks": "workspace:*",
"@tanstack/react-query": "^5.74.11",
"@types/react-copy-to-clipboard": "^5.0.7",
"ethers": "^6.13.7",
"react": "^19.1.0",
"react-dom": "^19.1.0",
Expand Down
35 changes: 11 additions & 24 deletions packages/wallet-widget/src/components/CopyButton.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Button, CheckmarkIcon, CopyIcon } from '@0xsequence/design-system'
import { useEffect, useState, type ComponentProps } from 'react'
import { CopyToClipboard } from 'react-copy-to-clipboard'
import { useClipboard } from '@0xsequence/hooks'
import type { ComponentProps } from 'react'

type ButtonProps = ComponentProps<typeof Button>

Expand All @@ -11,31 +11,18 @@ interface CopyButtonProps extends ButtonProps {

export const CopyButton = (props: CopyButtonProps) => {
const { buttonVariant = 'icon', text, size = 'xs', ...rest } = props
const [isCopied, setCopy] = useState(false)

useEffect(() => {
if (isCopied) {
setTimeout(() => {
setCopy(false)
}, 2000)
}
}, [isCopied])

const handleCopy = () => {
setCopy(true)
}
const [isCopied, setCopied] = useClipboard({ timeout: 4000 })

const label = isCopied ? 'Copied!' : 'Copy'

return (
<CopyToClipboard text={text} onCopy={handleCopy}>
<Button
size={size!}
leftIcon={isCopied ? CheckmarkIcon : CopyIcon}
label={buttonVariant === 'with-label' ? label : undefined}
variant={buttonVariant === 'icon' ? 'ghost' : 'glass'}
{...rest}
/>
</CopyToClipboard>
<Button
size={size!}
leftIcon={isCopied ? CheckmarkIcon : CopyIcon}
label={buttonVariant === 'with-label' ? label : undefined}
variant={buttonVariant === 'icon' ? 'ghost' : 'glass'}
onClick={() => setCopied(text)}
{...rest}
/>
)
}
21 changes: 3 additions & 18 deletions packages/wallet-widget/src/views/Receive.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { getNetwork } from '@0xsequence/connect'
import { Button, CopyIcon, Image, ShareIcon, Text } from '@0xsequence/design-system'
import { useClipboard } from '@0xsequence/hooks'
import { QRCodeCanvas } from 'qrcode.react'
import { useEffect, useState } from 'react'
import { CopyToClipboard } from 'react-copy-to-clipboard'
import { useAccount } from 'wagmi'

import { NetworkSelect } from '../components/Select/NetworkSelect'
Expand All @@ -12,23 +11,11 @@ const isVowel = (char: string) => ['a', 'e', 'i', 'o', 'u'].includes(char.toLowe

export const Receive = () => {
const { address, chain } = useAccount()
const [isCopied, setCopied] = useState<boolean>(false)
const [isCopied, setCopied] = useClipboard({ timeout: 4000 })

const networkInfo = getNetwork(chain?.id || 1)
const networkName = networkInfo.title || networkInfo.name

useEffect(() => {
if (isCopied) {
setTimeout(() => {
setCopied(false)
}, 4000)
}
}, [isCopied])

const onClickCopy = () => {
setCopied(true)
}

const onClickShare = () => {
if (typeof window !== 'undefined') {
window.open(`https://twitter.com/intent/tweet?text=Here%20is%20my%20address%20${address}`)
Expand Down Expand Up @@ -64,9 +51,7 @@ export const Receive = () => {
</div>
</div>
<div className="flex gap-3">
<CopyToClipboard text={address || ''}>
<Button onClick={onClickCopy} leftIcon={CopyIcon} label={isCopied ? 'Copied!' : 'Copy'} />
</CopyToClipboard>
<Button onClick={() => setCopied(address || '')} leftIcon={CopyIcon} label={isCopied ? 'Copied!' : 'Copy'} />
<Button onClick={onClickShare} leftIcon={ShareIcon} label="Share" />
</div>
<div className="flex justify-center items-center" style={{ maxWidth: '260px', textAlign: 'center' }}>
Expand Down
Loading