Commit 55c46fa4 authored by Max Alekseenko's avatar Max Alekseenko

improve action button, add real data

parent 2cc75359
import type { AddressMetadataTag } from 'types/api/addressMetadata'; import type { AddressMetadataTag } from 'types/api/addressMetadata';
import type { AddressMetadataTagFormatted } from 'types/client/addressMetadata'; import type { AddressMetadataTagFormatted } from 'types/client/addressMetadata';
type MetaParsed = NonNullable<AddressMetadataTagFormatted['meta']>;
export default function parseMetaPayload(meta: AddressMetadataTag['meta']): AddressMetadataTagFormatted['meta'] { export default function parseMetaPayload(meta: AddressMetadataTag['meta']): AddressMetadataTagFormatted['meta'] {
try { try {
const parsedMeta = JSON.parse(meta || ''); const parsedMeta = JSON.parse(meta || '');
...@@ -11,16 +13,23 @@ export default function parseMetaPayload(meta: AddressMetadataTag['meta']): Addr ...@@ -11,16 +13,23 @@ export default function parseMetaPayload(meta: AddressMetadataTag['meta']): Addr
const result: AddressMetadataTagFormatted['meta'] = {}; const result: AddressMetadataTagFormatted['meta'] = {};
if ('textColor' in parsedMeta && typeof parsedMeta.textColor === 'string') { const stringFields: Array<keyof MetaParsed> = [
result.textColor = parsedMeta.textColor; 'textColor',
} 'bgColor',
'actionURL',
if ('bgColor' in parsedMeta && typeof parsedMeta.bgColor === 'string') { 'appID',
result.bgColor = parsedMeta.bgColor; 'logoURL',
} 'text',
'tooltipIcon',
'tooltipTitle',
'tooltipDescription',
'tooltipUrl',
];
if ('actionURL' in parsedMeta && typeof parsedMeta.actionURL === 'string') { for (const stringField of stringFields) {
result.actionURL = parsedMeta.actionURL; if (stringField in parsedMeta && typeof parsedMeta[stringField as keyof typeof parsedMeta] === 'string') {
result[stringField] = parsedMeta[stringField as keyof typeof parsedMeta];
}
} }
return result; return result;
......
...@@ -16,5 +16,12 @@ export interface AddressMetadataTagFormatted { ...@@ -16,5 +16,12 @@ export interface AddressMetadataTagFormatted {
textColor?: string; textColor?: string;
bgColor?: string; bgColor?: string;
actionURL?: string; actionURL?: string;
appID?: string;
logoURL?: string;
text?: string;
tooltipIcon?: string;
tooltipTitle?: string;
tooltipDescription?: string;
tooltipUrl?: string;
} | null; } | null;
} }
import { Button, Image, Text, useColorModeValue } from '@chakra-ui/react'; import { Button, Image, Text, useColorModeValue, chakra } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { AddressMetadataTagFormatted } from 'types/client/addressMetadata';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import LinkExternal from './LinkExternal'; import config from 'configs/app';
import LinkExternal from '../LinkExternal';
type Props = { type Props = {
data?: { data?: AddressMetadataTagFormatted['meta'];
appId?: string; className?: string;
actionUrl: string; txHash?: string;
textColor: string;
bgColor: string;
text: string;
logoUrl: string;
};
} }
const mockData = { const ActionButton = ({ data, className, txHash }: Props) => {
appId: 'uniswap',
actionUrl: 'https://app.uniswap.org/swap?inputCurrency=ETH&outputCurrency=0x6B175474E89094C44Da98b954EedeAC495271d0F',
textColor: '#E2E8F0',
bgColor: '#9747FF',
text: 'Mint NFT',
logoUrl: 'https://i.ibb.co/PGZ0y9r/tg-image-883021928.jpg',
};
const ActionButton = ({ data = mockData }: Props) => {
const { appId, actionUrl, textColor, bgColor, text, logoUrl } = data;
const defaultTextColor = useColorModeValue('blue.600', 'blue.300'); const defaultTextColor = useColorModeValue('blue.600', 'blue.300');
const defaultBg = useColorModeValue('gray.100', 'gray.700'); const defaultBg = useColorModeValue('gray.100', 'gray.700');
if (!data) {
return null;
}
const { appID, textColor, bgColor, text, logoURL } = data;
const actionURL = data.actionURL?.replace('{chainId}', config.chain.id || '').replace('{txHash}', txHash || '');
const content = ( const content = (
<> <>
<Image <Image
src={ logoUrl } src={ logoURL }
alt={ `${ text } button` } alt={ `${ text } button` }
boxSize={ 5 } boxSize={ 5 }
borderRadius="sm" borderRadius="sm"
...@@ -46,10 +42,11 @@ const ActionButton = ({ data = mockData }: Props) => { ...@@ -46,10 +42,11 @@ const ActionButton = ({ data = mockData }: Props) => {
</> </>
); );
return appId ? ( return appID ? (
<Button <Button
className={ className }
as="a" as="a"
href={ route({ pathname: '/apps/[id]', query: { id: appId, action: 'connect', url: actionUrl } }) } href={ route({ pathname: '/apps/[id]', query: { id: appID, action: 'connect', ...(actionURL ? { url: actionURL } : {}) } }) }
display="flex" display="flex"
size="sm" size="sm"
px={ 2 } px={ 2 }
...@@ -62,7 +59,8 @@ const ActionButton = ({ data = mockData }: Props) => { ...@@ -62,7 +59,8 @@ const ActionButton = ({ data = mockData }: Props) => {
</Button> </Button>
) : ( ) : (
<LinkExternal <LinkExternal
href={ actionUrl } className={ className }
href={ actionURL }
variant="subtle" variant="subtle"
display="flex" display="flex"
px={ 2 } px={ 2 }
...@@ -76,4 +74,4 @@ const ActionButton = ({ data = mockData }: Props) => { ...@@ -76,4 +74,4 @@ const ActionButton = ({ data = mockData }: Props) => {
); );
}; };
export default ActionButton; export default chakra(ActionButton);
import useAddressMetadataInfoQuery from 'lib/address/useAddressMetadataInfoQuery';
export default function useActionData(address: string | undefined = '') {
const { data } = useAddressMetadataInfoQuery([ address ]);
const metadata = data?.addresses[address?.toLowerCase()];
const tag = metadata?.tags?.find(({ tagType }) => tagType === 'protocol');
if (tag?.meta?.actionURL || tag?.meta?.appID) {
return tag.meta;
}
return null;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment