Skip to content

Commit 48d0ed2

Browse files
authored
Public tags: attributions (#3169)
Resolves #3163
1 parent 9be8e2b commit 48d0ed2

File tree

7 files changed

+48
-12
lines changed

7 files changed

+48
-12
lines changed

lib/address/parseMetaPayload.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export default function parseMetaPayload(meta: AddressMetadataTag['meta']): Addr
2222
'tooltipTitle',
2323
'tooltipDescription',
2424
'tooltipUrl',
25+
'tooltipAttribution',
26+
'tooltipAttributionIcon',
2527
'appID',
2628
'appMarketplaceURL',
2729
'appLogoURL',

mocks/metadata/address.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ export const tagWithTooltip: AddressMetadataTagApi = {
6262
tooltipIcon: 'https://localhost:3100/icon.svg',
6363
tooltipTitle: 'Blockscout team member',
6464
tooltipUrl: 'https://blockscout.com',
65+
tooltipAttribution: 'https://duck.org',
66+
tooltipAttributionIcon: 'https://localhost:3100/icon_sm.svg',
6567
},
6668
};
6769

types/api/addressMetadata.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ export interface AddressMetadataTagApi extends Omit<AddressMetadataTag, 'meta'>
2727
tooltipTitle?: string;
2828
tooltipDescription?: string;
2929
tooltipUrl?: string;
30+
tooltipAttribution?: string;
31+
tooltipAttributionIcon?: string;
3032
appID?: string;
3133
appMarketplaceURL?: string;
3234
appLogoURL?: string;

ui/shared/EntityTags/EntityTag.pw.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ test('tag with link and long name +@dark-mode', async({ render }) => {
4444

4545
test('tag with tooltip +@dark-mode', async({ render, page, mockAssetResponse }) => {
4646
await mockAssetResponse(addressMetadataMock.tagWithTooltip.meta?.tooltipIcon as string, './playwright/mocks/image_s.jpg');
47+
await mockAssetResponse(addressMetadataMock.tagWithTooltip.meta?.tooltipAttributionIcon as string, './playwright/mocks/image_md.jpg');
4748
const component = await render(<EntityTag data={ addressMetadataMock.tagWithTooltip }/>);
4849
await component.getByText('BlockscoutHeroes').hover();
4950
await page.getByText('Blockscout team member').waitFor({ state: 'visible' });

ui/shared/EntityTags/EntityTagTooltip.tsx

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { chakra, Flex } from '@chakra-ui/react';
1+
import { Box, chakra, Flex, Separator } from '@chakra-ui/react';
22
import React from 'react';
33

44
import type { EntityTag } from './types';
@@ -15,8 +15,23 @@ interface Props {
1515
}
1616

1717
const EntityTagTooltip = ({ data, children }: Props) => {
18+
const hasPopover = Boolean(
19+
data.meta?.tooltipIcon ||
20+
data.meta?.tooltipTitle ||
21+
data.meta?.tooltipDescription ||
22+
data.meta?.tooltipUrl ||
23+
data.meta?.tooltipAttribution,
24+
);
25+
1826
const link = makePrettyLink(data.meta?.tooltipUrl);
19-
const hasPopover = Boolean(data.meta?.tooltipIcon || data.meta?.tooltipTitle || data.meta?.tooltipDescription || data.meta?.tooltipUrl);
27+
28+
const attribution = React.useMemo(() => {
29+
if (!data.meta?.tooltipAttribution) {
30+
return;
31+
}
32+
const link = makePrettyLink(data.meta?.tooltipAttribution);
33+
return link ?? data.meta.tooltipAttribution;
34+
}, [ data.meta?.tooltipAttribution ]);
2035

2136
const handleLinkClick = React.useCallback(() => {
2237
if (!data.meta?.tooltipUrl) {
@@ -36,16 +51,30 @@ const EntityTagTooltip = ({ data, children }: Props) => {
3651
}
3752

3853
const content = (
39-
<Flex textStyle="sm" flexDir="column" rowGap={ 2 } textAlign="left" className="dark">
40-
{ (data.meta?.tooltipIcon || data.meta?.tooltipTitle) && (
41-
<Flex columnGap={ 3 } alignItems="center">
42-
{ data.meta?.tooltipIcon && <Image src={ data.meta.tooltipIcon } boxSize="30px" alt={ `${ data.name } tag logo` }/> }
43-
{ data.meta?.tooltipTitle && <chakra.span fontWeight="600">{ data.meta.tooltipTitle }</chakra.span> }
44-
</Flex>
45-
) }
46-
{ data.meta?.tooltipDescription && <chakra.span>{ data.meta.tooltipDescription }</chakra.span> }
47-
{ link && <Link external href={ link.href } onClick={ handleLinkClick }>{ link.domain }</Link> }
48-
</Flex>
54+
<Box className="dark">
55+
<Flex textStyle="sm" flexDir="column" rowGap={ 2 } textAlign="left" _empty={{ display: 'none' }}>
56+
{ (data.meta?.tooltipIcon || data.meta?.tooltipTitle) && (
57+
<Flex columnGap={ 3 } alignItems="center">
58+
{ data.meta?.tooltipIcon && <Image src={ data.meta.tooltipIcon } boxSize="30px" alt={ `${ data.name } tag logo` }/> }
59+
{ data.meta?.tooltipTitle && <chakra.span fontWeight="600">{ data.meta.tooltipTitle }</chakra.span> }
60+
</Flex>
61+
) }
62+
{ data.meta?.tooltipDescription && <chakra.span>{ data.meta.tooltipDescription }</chakra.span> }
63+
{ link && <Link external href={ link.href } onClick={ handleLinkClick }>{ link.domain }</Link> }
64+
</Flex>
65+
{ attribution ? (
66+
<>
67+
{ (data.meta?.tooltipIcon || data.meta?.tooltipTitle || data.meta?.tooltipDescription || link) && <Separator mt={ 2 } mb={ 1 }/> }
68+
<Flex alignItems="center" color="text.secondary" textStyle="xs">
69+
<chakra.span mr={ 2 }>Source:</chakra.span>
70+
{ data.meta?.tooltipAttributionIcon && <Image src={ data.meta.tooltipAttributionIcon } boxSize={ 4 } mr={ 1 } zIndex={ 1 }/> }
71+
{ typeof attribution === 'string' ?
72+
<chakra.span fontWeight="500">{ attribution }</chakra.span> :
73+
<Link external href={ attribution.href }>{ attribution.domain }</Link> }
74+
</Flex>
75+
</>
76+
) : null }
77+
</Box>
4978
);
5079

5180
return (
2.17 KB
Loading
2.18 KB
Loading

0 commit comments

Comments
 (0)