1
- import { useMemo } from 'react' ;
1
+ import React , { useMemo } from 'react' ;
2
+ import { cbwSvg } from '../../svg/cbwSvg' ;
3
+ import ReactDOMServer from 'react-dom/server' ;
2
4
3
5
type RenderLogoProps = {
4
6
size : number ;
5
- logo : React . ReactNode | undefined ;
7
+ logo : { uri : string } | React . ReactNode | undefined ;
6
8
logoSize : number ;
7
9
logoBackgroundColor : string ;
8
10
logoMargin : number ;
9
11
logoBorderRadius : number ;
10
12
} ;
11
13
14
+ const defaultSvgString = ReactDOMServer . renderToString ( cbwSvg ) ;
15
+ const defaultSvgDataUri = `data:image/svg+xml;charset=utf-8,${ encodeURIComponent (
16
+ defaultSvgString ,
17
+ ) } `;
18
+
12
19
export function useLogo ( {
13
20
size,
14
21
logo,
@@ -18,25 +25,18 @@ export function useLogo({
18
25
logoBorderRadius,
19
26
} : RenderLogoProps ) {
20
27
const svgLogo = useMemo ( ( ) => {
21
- if ( ! logo ) {
22
- return ;
28
+ let logoUri = defaultSvgDataUri ;
29
+ if ( React . isValidElement ( logo ) ) {
30
+ logoUri = `data:image/svg+xml;charset=utf-8,${ encodeURIComponent (
31
+ ReactDOMServer . renderToString ( logo ) ,
32
+ ) } `;
23
33
}
24
34
const logoPosition = ( size - logoSize - logoMargin * 2 ) / 2 ;
25
35
const logoBackgroundSize = logoSize + logoMargin * 2 ;
26
- const logoBackgroundBorderRadius =
27
- logoBorderRadius + ( logoMargin / logoSize ) * logoBorderRadius ;
28
36
29
37
return (
30
38
< g transform = { `translate(${ logoPosition } , ${ logoPosition } )` } >
31
39
< defs >
32
- < clipPath id = "clip-logo-background" >
33
- < rect
34
- width = { logoBackgroundSize }
35
- height = { logoBackgroundSize }
36
- rx = { logoBackgroundBorderRadius }
37
- ry = { logoBackgroundBorderRadius }
38
- />
39
- </ clipPath >
40
40
< clipPath id = "clip-logo" >
41
41
< rect
42
42
width = { logoSize }
@@ -50,18 +50,19 @@ export function useLogo({
50
50
< rect
51
51
width = { logoBackgroundSize }
52
52
height = { logoBackgroundSize }
53
+ rx = { logoBorderRadius }
54
+ ry = { logoBorderRadius }
53
55
fill = { logoBackgroundColor }
54
- clipPath = "url(#clip-logo-background)"
55
56
/>
56
57
</ g >
57
- < g x = { logoMargin } y = { logoMargin } >
58
- < g
58
+ < g transform = { `translate( ${ logoMargin } , $ {logoMargin } )` } >
59
+ < image
59
60
width = { logoSize }
60
61
height = { logoSize }
62
+ preserveAspectRatio = "xMidYMid slice"
63
+ href = { logoUri }
61
64
clipPath = "url(#clip-logo)"
62
- >
63
- { logo }
64
- </ g >
65
+ />
65
66
</ g >
66
67
</ g >
67
68
) ;
0 commit comments