From 83a1f9ea951936f0613bc9d9ab8efedc6ad40e77 Mon Sep 17 00:00:00 2001 From: isstuev Date: Fri, 17 May 2024 13:39:32 +0200 Subject: [PATCH] change portfolio url logics --- configs/app/features/multichainButton.ts | 4 ++- configs/envs/.env.eth | 4 ++- deploy/tools/envs-validator/schema.ts | 3 +- deploy/tools/envs-validator/test/.env.base | 2 +- docs/ENVS.md | 5 ++-- types/client/multichainProviderConfig.ts | 1 + ui/address/details/AddressNetWorth.pw.tsx | 4 +-- ui/address/details/AddressNetWorth.tsx | 27 +++++++++--------- ...multichain-button-internal-dark-mode-1.png | Bin 5902 -> 5788 bytes ...ault_with-multichain-button-external-1.png | Bin 5860 -> 5699 bytes ...multichain-button-internal-dark-mode-1.png | Bin 5716 -> 5553 bytes 11 files changed, 29 insertions(+), 21 deletions(-) diff --git a/configs/app/features/multichainButton.ts b/configs/app/features/multichainButton.ts index 3d52d466bc..d513595577 100644 --- a/configs/app/features/multichainButton.ts +++ b/configs/app/features/multichainButton.ts @@ -2,12 +2,13 @@ import type { Feature } from './types'; import type { MultichainProviderConfig } from 'types/client/multichainProviderConfig'; import { getEnvValue, parseEnvJson } from '../utils'; +import marketplace from './marketplace'; const value = parseEnvJson(getEnvValue('NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG')); const title = 'Multichain button'; -const config: Feature<{name: string; logoUrl?: string; url_template: string }> = (() => { +const config: Feature<{name: string; logoUrl?: string; url_template: string; dapp_id?: string }> = (() => { if (value) { return Object.freeze({ title, @@ -15,6 +16,7 @@ const config: Feature<{name: string; logoUrl?: string; url_template: string }> = name: value.name, logoUrl: value.logo, url_template: value.url_template, + dapp_id: marketplace.isEnabled ? value.dapp_id : undefined, }); } diff --git a/configs/envs/.env.eth b/configs/envs/.env.eth index b31e1d8745..2584d493e4 100644 --- a/configs/envs/.env.eth +++ b/configs/envs/.env.eth @@ -53,9 +53,11 @@ NEXT_PUBLIC_MARKETPLACE_CATEGORIES_URL=https://raw.githubusercontent.com/blocksc NEXT_PUBLIC_MARKETPLACE_SUBMIT_FORM=https://airtable.com/appiy5yijZpMMSKjT/shr6uMGPKjj1DK7NL NEXT_PUBLIC_MARKETPLACE_SUGGEST_IDEAS_FORM=https://airtable.com/appiy5yijZpMMSKjT/pag3t82DUCyhGRZZO/form NEXT_PUBLIC_VIEWS_CONTRACT_SOLIDITYSCAN_ENABLED=true -NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG={'name': 'zerion', 'url_template': '/apps/zerion/{address}/overview', 'logo': 'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/marketplace-logos/zerion.svg'} +NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG={'name': 'zerion', 'dapp_id': 'zerion', 'url_template': 'https://app.zerion.io/{address}/overview', 'logo': 'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/marketplace-logos/zerion.svg'} #meta NEXT_PUBLIC_OG_IMAGE_URL=https://github.com/blockscout/frontend-configs/blob/main/configs/og-images/eth.jpg?raw=true NEXT_PUBLIC_OG_ENHANCED_DATA_ENABLED=true NEXT_PUBLIC_SEO_ENHANCED_DATA_ENABLED=true +NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=xxx + diff --git a/deploy/tools/envs-validator/schema.ts b/deploy/tools/envs-validator/schema.ts index c88d230189..01944b0661 100644 --- a/deploy/tools/envs-validator/schema.ts +++ b/deploy/tools/envs-validator/schema.ts @@ -623,12 +623,13 @@ const schema = yup NEXT_PUBLIC_SWAP_BUTTON_URL: yup.string(), NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG: yup .mixed() - .test('shape', 'Invalid schema were provided for NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG, it should have name and url props', (data) => { + .test('shape', 'Invalid schema were provided for NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG, it should have name and url url_template', (data) => { const isUndefined = data === undefined; const valueSchema = yup.object().transform(replaceQuotes).json().shape({ name: yup.string().required(), url_template: yup.string().required(), logo: yup.string(), + dapp_id: yup.string(), }); return isUndefined || valueSchema.isValidSync(data); diff --git a/deploy/tools/envs-validator/test/.env.base b/deploy/tools/envs-validator/test/.env.base index c326068bb8..7b63a1aaac 100644 --- a/deploy/tools/envs-validator/test/.env.base +++ b/deploy/tools/envs-validator/test/.env.base @@ -74,5 +74,5 @@ NEXT_PUBLIC_WEB3_DISABLE_ADD_TOKEN_TO_WALLET=false NEXT_PUBLIC_WEB3_WALLETS=['coinbase','metamask','token_pocket'] NEXT_PUBLIC_SWAP_BUTTON_URL=uniswap NEXT_PUBLIC_VALIDATORS_CHAIN_TYPE=stability -NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG={'name': 'zerion', 'url_template': '/apps/zerion/{address}/overview', 'logo': 'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/marketplace-logos/zerion.svg'} +NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG={'name': 'zerion', 'url_template': 'https://app.zerion.io/{address}/overview', 'logo': 'https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/marketplace-logos/zerion.svg'} diff --git a/docs/ENVS.md b/docs/ENVS.md index 51ac980297..3a087fb348 100644 --- a/docs/ENVS.md +++ b/docs/ENVS.md @@ -686,7 +686,7 @@ If the feature is enabled, a Multichain balance button will be displayed on the | Variable | Type| Description | Compulsoriness | Default value | Example value | | --- | --- | --- | --- | --- | --- | -| NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG | `{ name: string; url_template: string; logo?: string }` | Multichain portfolio application config See [below](#multichain-button-configuration-properties) | - | - | `{ name: 'zerion', url_template: '/apps/zerion/{address}/overview', logo: 'https://example.com/icon.svg'` | +| NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG | `{ name: string; url_template: string; dapp_id?: string; logo?: string }` | Multichain portfolio application config See [below](#multichain-button-configuration-properties) | - | - | `{ name: 'zerion', url_template: 'https://app.zerion.io/{address}/overview', logo: 'https://example.com/icon.svg'` |   @@ -695,7 +695,8 @@ If the feature is enabled, a Multichain balance button will be displayed on the | Variable | Type| Description | Compulsoriness | Default value | Example value | | --- | --- | --- | --- | --- | --- | | name | `string` | Multichain portfolio application name | Required | - | `zerion` | -| url_template | `string` | Absolute (for external links) or relative (for internal links) path template to the portfolio. Should be a template with `{address}` variable | Required | - | `/apps/zerion/{address}/overview` | +| url_template | `string` | Url template to the portfolio. Should be a template with `{address}` variable | Required | - | `https://app.zerion.io/{address}/overview` | +| dapp_id | `string` | Set for open a Blockscout dapp page with the portfolio instead of opening external app page | - | - | `zerion` | | logo | `string` | Multichain portfolio application logo (.svg) url | - | - | `https://example.com/icon.svg` |   diff --git a/types/client/multichainProviderConfig.ts b/types/client/multichainProviderConfig.ts index fbec165ef3..fbdced386f 100644 --- a/types/client/multichainProviderConfig.ts +++ b/types/client/multichainProviderConfig.ts @@ -1,5 +1,6 @@ export type MultichainProviderConfig = { name: string; + dapp_id?: string; url_template: string; logo?: string; }; diff --git a/ui/address/details/AddressNetWorth.pw.tsx b/ui/address/details/AddressNetWorth.pw.tsx index f9102b7086..ea955c8091 100644 --- a/ui/address/details/AddressNetWorth.pw.tsx +++ b/ui/address/details/AddressNetWorth.pw.tsx @@ -29,7 +29,7 @@ test('base view', async({ mount }) => { test('with multichain button internal +@dark-mode', async({ mount, mockEnvs, mockAssetResponse }) => { await mockEnvs([ - [ 'NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG', `{"name": "zerion", "url_template": "/apps/zerion/{address}/overview", "logo": "${ ICON_URL }"}` ], + [ 'NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG', `{"name": "duck", "dapp_id": "duck", "url_template": "https://duck.url/{address}", "logo": "${ ICON_URL }"}` ], ]); await mockAssetResponse(ICON_URL, './playwright/mocks/image_svg.svg'); @@ -44,7 +44,7 @@ test('with multichain button internal +@dark-mode', async({ mount, mockEnvs, moc test('with multichain button external', async({ mount, mockEnvs, mockAssetResponse }) => { await mockEnvs([ - [ 'NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG', `{"name": "zerion", "url_template": "https://duck.url/{address}", "logo": "${ ICON_URL }"}` ], + [ 'NEXT_PUBLIC_MULTICHAIN_PROVIDER_CONFIG', `{"name": "duck", "url_template": "https://duck.url/{address}", "logo": "${ ICON_URL }"}` ], ]); await mockAssetResponse(ICON_URL, './playwright/mocks/image_svg.svg'); diff --git a/ui/address/details/AddressNetWorth.tsx b/ui/address/details/AddressNetWorth.tsx index c4c66046a5..10ef92febb 100644 --- a/ui/address/details/AddressNetWorth.tsx +++ b/ui/address/details/AddressNetWorth.tsx @@ -4,10 +4,11 @@ import React from 'react'; import type { Address } from 'types/api/address'; +import { route } from 'nextjs-routes'; + import config from 'configs/app'; import getCurrencyValue from 'lib/getCurrencyValue'; import * as mixpanel from 'lib/mixpanel/index'; -import * as regexp from 'lib/regexp'; import LinkExternal from 'ui/shared/links/LinkExternal'; import LinkInternal from 'ui/shared/links/LinkInternal'; import TextSeparator from 'ui/shared/TextSeparator'; @@ -65,31 +66,31 @@ const AddressNetWorth = ({ addressData, isLoading, addressHash }: Props) => { onClick: onMultichainClick, }; - const urlString = multichainFeature.url_template.replace(TEMPLATE_ADDRESS, addressHash); - const isExternal = regexp.URL_PREFIX.test(urlString); - const url = isExternal ? new URL(urlString) : new URL(urlString, config.app.baseUrl); + const portfolioUrlString = multichainFeature.url_template.replace(TEMPLATE_ADDRESS, addressHash); + const portfolioUrl = new URL(portfolioUrlString); + portfolioUrl.searchParams.append('utm_source', 'blockscout'); + portfolioUrl.searchParams.append('utm_medium', 'address'); - url.searchParams.append('utm_source', 'blockscout'); - url.searchParams.append('utm_medium', 'address'); + const dappId = multichainFeature.dapp_id; multichainItem = ( <> Multichain - { isExternal ? ( - { buttonContent } - + ) : ( - { buttonContent } - + ) } ); diff --git a/ui/address/details/__screenshots__/AddressNetWorth.pw.tsx_dark-color-mode_with-multichain-button-internal-dark-mode-1.png b/ui/address/details/__screenshots__/AddressNetWorth.pw.tsx_dark-color-mode_with-multichain-button-internal-dark-mode-1.png index 349ae0725d542e70d8190a82c5687d949bd1892d..bea144869e59c5aacac54a5ad47875adb414ce4d 100644 GIT binary patch literal 5788 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 literal 5902 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 diff --git a/ui/address/details/__screenshots__/AddressNetWorth.pw.tsx_default_with-multichain-button-external-1.png b/ui/address/details/__screenshots__/AddressNetWorth.pw.tsx_default_with-multichain-button-external-1.png index 11aaf192d7fed8be8147a9bcb3632289e6987108..70ecd1959529394eb581bb4f153369885a99c9a1 100644 GIT binary patch literal 5699 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 HY0{J&O!&lNZ(AT;nCW)kM7Jzhnk8C58-}1NO1i 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 literal 5716 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 S!FQlc41%b`)T&i&U;ZBnT0*}7