Skip to content

Commit 7c023cd

Browse files
feat: introduce fancy QR codes with logos in them (#10393)
Co-authored-by: Apotheosis <[email protected]>
1 parent 06561c9 commit 7c023cd

File tree

5 files changed

+67
-37
lines changed

5 files changed

+67
-37
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@
171171
"p-queue": "^8.0.1",
172172
"p-ratelimit": "^1.0.1",
173173
"pretty-ms": "7.0.1",
174-
"qr-image": "^3.2.0",
175174
"qs": "^6.10.5",
176175
"re-reselect": "^4.0.0",
177176
"react": "^19.0.0",
@@ -188,6 +187,7 @@
188187
"react-multi-ref": "^1.0.1",
189188
"react-number-format": "^4.9.3",
190189
"react-polyglot": "^0.7.2",
190+
"react-qrcode-logo": "^4.0.0",
191191
"react-redux": "^9.2.0",
192192
"react-router": "^6.30.0",
193193
"react-router-breadcrumbs-hoc": "^4.1.0",
@@ -233,7 +233,6 @@
233233
"@types/node": "^22.13.14",
234234
"@types/node-polyglot": "^2.4.2",
235235
"@types/pify": "^5.0.4",
236-
"@types/qr-image": "^3.2.5",
237236
"@types/qs": "^6.9.18",
238237
"@types/react": "^19.0.0",
239238
"@types/react-dom": "^19.0.0",
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { Box, Center, Spinner } from '@chakra-ui/react'
2+
import type { Asset } from '@shapeshiftoss/types'
3+
import { QRCode } from 'react-qrcode-logo'
4+
5+
import { AssetIcon } from '../AssetIcon'
6+
7+
type LogoQRCodeProps = {
8+
text?: string
9+
asset: Asset
10+
loading?: boolean
11+
size?: number
12+
}
13+
14+
// Create a transparent 1x1 pixel image as a placeholder
15+
const transparentPixel =
16+
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='
17+
18+
export const LogoQRCode = ({ text = '', asset, loading, size = 180 }: LogoQRCodeProps) => {
19+
if (loading)
20+
return (
21+
<Center>
22+
<Spinner />
23+
</Center>
24+
)
25+
26+
return (
27+
<Center position='relative'>
28+
<QRCode
29+
value={text}
30+
size={size}
31+
logoHeight={40}
32+
logoWidth={40}
33+
logoPaddingStyle='circle'
34+
logoPadding={2}
35+
logoImage={transparentPixel}
36+
removeQrCodeBehindLogo
37+
ecLevel='H'
38+
/>
39+
<Box position='absolute'>
40+
<AssetIcon asset={asset} size='md' showNetworkIcon={false} />
41+
</Box>
42+
</Center>
43+
)
44+
}

src/components/Modals/Receive/ReceiveInfo.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { useNavigate } from 'react-router-dom'
2727
import type { Address } from 'viem'
2828

2929
import { AccountDropdown } from '@/components/AccountDropdown/AccountDropdown'
30+
import { LogoQRCode } from '@/components/LogoQRCode/LogoQRCode'
3031
import { MiddleEllipsis } from '@/components/MiddleEllipsis/MiddleEllipsis'
3132
import { DialogBackButton } from '@/components/Modal/components/DialogBackButton'
3233
import { DialogBody } from '@/components/Modal/components/DialogBody'
@@ -35,7 +36,6 @@ import { DialogFooter } from '@/components/Modal/components/DialogFooter'
3536
import { DialogHeader, DialogHeaderRight } from '@/components/Modal/components/DialogHeader'
3637
import { DialogTitle } from '@/components/Modal/components/DialogTitle'
3738
import { getReceiveAddress } from '@/components/MultiHopTrade/hooks/useReceiveAddress'
38-
import { QRCode } from '@/components/QRCode/QRCode'
3939
import { Text } from '@/components/Text'
4040
import type { TextPropTypes } from '@/components/Text/Text'
4141
import { getChainAdapterManager } from '@/context/PluginProvider/chainAdapterSingleton'
@@ -218,7 +218,7 @@ export const ReceiveInfo = ({ asset, accountId, onBack }: ReceivePropsType) => {
218218
<CardBody display='inline-block' textAlign='center' p={6}>
219219
<LightMode>
220220
<Skeleton isLoaded={!!receiveAddress && !isAddressLoading} mb={2}>
221-
<QRCode text={receiveAddress} data-test='receive-qr-code' />
221+
<LogoQRCode text={receiveAddress} asset={asset} data-test='receive-qr-code' />
222222
</Skeleton>
223223
<Skeleton isLoaded={!!receiveAddress && !isAddressLoading}>
224224
<Flex

src/components/QRCode/QRCode.tsx

Lines changed: 0 additions & 15 deletions
This file was deleted.

yarn.lock

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10614,7 +10614,6 @@ __metadata:
1061410614
"@types/node": ^22.13.14
1061510615
"@types/node-polyglot": ^2.4.2
1061610616
"@types/pify": ^5.0.4
10617-
"@types/qr-image": ^3.2.5
1061810617
"@types/qs": ^6.9.18
1061910618
"@types/react": ^19.0.0
1062010619
"@types/react-dom": ^19.0.0
@@ -10713,7 +10712,6 @@ __metadata:
1071310712
pify: ^5.0.0
1071410713
prettier: ^3.0.3
1071510714
pretty-ms: 7.0.1
10716-
qr-image: ^3.2.0
1071710715
qs: ^6.10.5
1071810716
re-reselect: ^4.0.0
1071910717
react: ^19.0.0
@@ -10730,6 +10728,7 @@ __metadata:
1073010728
react-multi-ref: ^1.0.1
1073110729
react-number-format: ^4.9.3
1073210730
react-polyglot: ^0.7.2
10731+
react-qrcode-logo: ^4.0.0
1073310732
react-redux: ^9.2.0
1073410733
react-router: ^6.30.0
1073510734
react-router-breadcrumbs-hoc: ^4.1.0
@@ -12152,15 +12151,6 @@ __metadata:
1215212151
languageName: node
1215312152
linkType: hard
1215412153

12155-
"@types/qr-image@npm:^3.2.5":
12156-
version: 3.2.5
12157-
resolution: "@types/qr-image@npm:3.2.5"
12158-
dependencies:
12159-
"@types/node": "*"
12160-
checksum: 5b197ea858499ad95cd99fb457981dfe7b750f1301246f3f9944515c2d42f662746290525b564dbd79ecc2176632b2dd399d499a9a2552f4b7125395ae286a26
12161-
languageName: node
12162-
linkType: hard
12163-
1216412154
"@types/qs@npm:^6.9.18":
1216512155
version: 6.9.18
1216612156
resolution: "@types/qs@npm:6.9.18"
@@ -27004,20 +26994,20 @@ pvutils@latest:
2700426994
languageName: node
2700526995
linkType: hard
2700626996

27007-
"qr-image@npm:^3.2.0":
27008-
version: 3.2.0
27009-
resolution: "qr-image@npm:3.2.0"
27010-
checksum: 9d22d9425234b8dfbcf954cff334d1594aa7391f999b15cf3e07d554c99341e7c2303646ddf58237fc498455c11d505b8803a995ff22d8385ddd05f58b3259b5
27011-
languageName: node
27012-
linkType: hard
27013-
2701426997
"qrcode-generator@npm:^1.4.3":
2701526998
version: 1.4.4
2701626999
resolution: "qrcode-generator@npm:1.4.4"
2701727000
checksum: 860cfdd2a7a608d34e92cab99774cc08182e1911432f30ed36d16f8a5cdabd7fdf40239caed91fa2691cfe66c8d95c1340a2fc9cc439eed07a9f2eb328c6f527
2701827001
languageName: node
2701927002
linkType: hard
2702027003

27004+
"qrcode-generator@npm:^2.0.4":
27005+
version: 2.0.4
27006+
resolution: "qrcode-generator@npm:2.0.4"
27007+
checksum: d0a212e5126f0fe8f7238cc944f74eed57a8deadf7ec75cf5b052e254ae1fb4487732b0f2e856f3dfbb47e7482b31a9e5cbf3658bbf7fb85624f0dae6a6143e9
27008+
languageName: node
27009+
linkType: hard
27010+
2702127011
"qrcode-terminal-nooctal@npm:^0.12.1":
2702227012
version: 0.12.1
2702327013
resolution: "qrcode-terminal-nooctal@npm:0.12.1"
@@ -27456,6 +27446,18 @@ pvutils@latest:
2745627446
languageName: node
2745727447
linkType: hard
2745827448

27449+
"react-qrcode-logo@npm:^4.0.0":
27450+
version: 4.0.0
27451+
resolution: "react-qrcode-logo@npm:4.0.0"
27452+
dependencies:
27453+
qrcode-generator: ^2.0.4
27454+
peerDependencies:
27455+
react: ">=18.0.0"
27456+
react-dom: ">=18.0.0"
27457+
checksum: 752a37626f65ea385f64ba22ce4b510813b15f21b20e0a71396f49786cf10e97616ac63b25431c8df5f265b1ead08aa110ded4dea81a89e614fe0bad20ebc759
27458+
languageName: node
27459+
linkType: hard
27460+
2745927461
"react-redux@npm:^9.2.0":
2746027462
version: 9.2.0
2746127463
resolution: "react-redux@npm:9.2.0"

0 commit comments

Comments
 (0)