Skip to content

Commit 1cb1a2f

Browse files
fix: prevent SVG clip path ID collisions in multiple QR code instances
1 parent a8ffa82 commit 1cb1a2f

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

src/index.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo } from "react";
1+
import React, { useMemo, useId } from "react";
22
import Svg, {
33
Defs,
44
G,
@@ -23,24 +23,27 @@ const renderLogo = ({
2323
logoColor,
2424
logoMargin,
2525
logoBorderRadius,
26+
clipPathId
2627
}) => {
2728
const logoPosition = (size - logoSize - logoMargin * 2) / 2;
2829
const logoBackgroundSize = logoSize + logoMargin * 2;
2930
const logoBackgroundBorderRadius =
3031
logoBorderRadius + (logoMargin / logoSize) * logoBorderRadius;
31-
32+
const clipLogoBackgroundId = `clip-logo-background-${clipPathId}`;
33+
const clipLogoId = `clip-logo-${clipPathId}`;
34+
3235
return (
3336
<G x={logoPosition} y={logoPosition}>
3437
<Defs>
35-
<ClipPath id="clip-logo-background">
38+
<ClipPath id={clipLogoBackgroundId}>
3639
<Rect
3740
width={logoBackgroundSize}
3841
height={logoBackgroundSize}
3942
rx={logoBackgroundBorderRadius}
4043
ry={logoBackgroundBorderRadius}
4144
/>
4245
</ClipPath>
43-
<ClipPath id="clip-logo">
46+
<ClipPath id={clipLogoId}>
4447
<Rect
4548
width={logoSize}
4649
height={logoSize}
@@ -54,10 +57,10 @@ const renderLogo = ({
5457
width={logoBackgroundSize}
5558
height={logoBackgroundSize}
5659
fill={backgroundColor}
57-
clipPath="url(#clip-logo-background)"
60+
clipPath={`url(#${clipLogoBackgroundId})`}
5861
/>
5962
</G>
60-
<G x={logoMargin} y={logoMargin} clipPath="url(#clip-logo)">
63+
<G x={logoMargin} y={logoMargin} clipPath={`url(#${clipLogoId})`}>
6164
<Rect
6265
width={logoBackgroundSize - logoMargin}
6366
height={logoBackgroundSize - logoMargin}
@@ -71,7 +74,7 @@ const renderLogo = ({
7174
height={logoSize}
7275
preserveAspectRatio="xMidYMid slice"
7376
href={logo}
74-
clipPath="url(#clip-logo)"
77+
clipPath={`url(#${clipLogoId})`}
7578
/>
7679
)}
7780
</G>
@@ -100,6 +103,8 @@ const QRCode = ({
100103
onError,
101104
testID,
102105
}) => {
106+
const clipPathId = useId();
107+
103108
const result = useMemo(() => {
104109
try {
105110
return transformMatrixIntoPath(genMatrix(value, ecl), size);
@@ -173,6 +178,7 @@ const QRCode = ({
173178
logoColor,
174179
logoMargin,
175180
logoBorderRadius,
181+
clipPathId,
176182
})}
177183
</Svg>
178184
);

0 commit comments

Comments
 (0)