From 3208fe117e5e4bf7db154b575237630857ebcd38 Mon Sep 17 00:00:00 2001 From: Jaco Date: Thu, 3 Jun 2021 14:21:21 +0300 Subject: [PATCH] Carry teleport info per chain (#5430) * Carry teleport info per chain * Always has teleports --- .../src/endpoints/testingRelayWestend.ts | 5 +- packages/apps-config/src/endpoints/types.ts | 4 +- packages/apps-config/src/endpoints/util.ts | 11 +--- packages/react-hooks/src/useTeleport.ts | 54 +++++++++++++------ 4 files changed, 44 insertions(+), 30 deletions(-) diff --git a/packages/apps-config/src/endpoints/testingRelayWestend.ts b/packages/apps-config/src/endpoints/testingRelayWestend.ts index 0667b6941f..4714f636dd 100644 --- a/packages/apps-config/src/endpoints/testingRelayWestend.ts +++ b/packages/apps-config/src/endpoints/testingRelayWestend.ts @@ -27,18 +27,19 @@ export function createWestend (t: TFunction): EndpointOption { 'Patract Elara': 'wss://westend.elara.patract.io', OnFinality: 'wss://westend.api.onfinality.io/public-ws' }, + teleport: [1000], // statemint only linked: [ // (1) system parachains (none available yet) // ... // (2) common good, leave as second group { info: 'westmint', - allowTeleport: true, paraId: 1000, text: t('rpc.westend.shell', 'Westmint', { ns: 'apps-config' }), providers: { Parity: 'wss://westmint-rpc.polkadot.io' - } + }, + teleport: [-1] // relay only }, // (3) parachains with id, see Rococo (info here maps to the actual "named icon") // diff --git a/packages/apps-config/src/endpoints/types.ts b/packages/apps-config/src/endpoints/types.ts index 6bf648b90d..58dc749bd6 100644 --- a/packages/apps-config/src/endpoints/types.ts +++ b/packages/apps-config/src/endpoints/types.ts @@ -4,7 +4,6 @@ import type { Option } from '../settings/types'; export interface EndpointOption { - allowTeleport?: boolean; dnslink?: string; genesisHash?: string; isChild?: boolean; @@ -14,11 +13,11 @@ export interface EndpointOption { info?: string; paraId?: number; providers: Record; + teleport?: number[]; text: React.ReactNode; } export interface LinkOption extends Option { - allowTeleport?: boolean; dnslink?: string; genesisHash?: string; genesisHashRelay?: string; @@ -28,5 +27,6 @@ export interface LinkOption extends Option { isSpaced?: boolean; linked?: LinkOption[]; paraId?: number; + teleport?: number[]; textBy: string; } diff --git a/packages/apps-config/src/endpoints/util.ts b/packages/apps-config/src/endpoints/util.ts index 18d172a857..ca0f2b361d 100644 --- a/packages/apps-config/src/endpoints/util.ts +++ b/packages/apps-config/src/endpoints/util.ts @@ -21,14 +21,14 @@ export function expandLinked (input: LinkOption[]): LinkOption[] { }, []); } -export function expandEndpoint (t: TFunction, { allowTeleport, dnslink, genesisHash, info, isChild, isDisabled, linked, paraId, providers, text }: EndpointOption): LinkOption[] { +export function expandEndpoint (t: TFunction, { dnslink, genesisHash, info, isChild, isDisabled, linked, paraId, providers, teleport, text }: EndpointOption): LinkOption[] { const base = { - allowTeleport, genesisHash, info, isChild, isDisabled, paraId, + teleport, text }; @@ -47,13 +47,6 @@ export function expandEndpoint (t: TFunction, { allowTeleport, dnslink, genesisH linked.forEach((o) => options.push(...expandEndpoint(t, o))); last.isRelay = true; last.linked = options; - - // if one of the children allows teleport, add it to the root as well - const allowTeleport = options.some(({ allowTeleport }) => allowTeleport); - - result.forEach((r): void => { - r.allowTeleport = allowTeleport; - }); } return expandLinked(result); diff --git a/packages/react-hooks/src/useTeleport.ts b/packages/react-hooks/src/useTeleport.ts index 18869489e6..adc036065f 100644 --- a/packages/react-hooks/src/useTeleport.ts +++ b/packages/react-hooks/src/useTeleport.ts @@ -7,6 +7,7 @@ import type { ParaId } from '@polkadot/types/interfaces'; import { useEffect, useState } from 'react'; import { createWsEndpoints } from '@polkadot/apps-config'; +import { isNumber } from '@polkadot/util'; import { useApi } from './useApi'; import { useCall } from './useCall'; @@ -18,9 +19,22 @@ interface Teleport { paraId?: ParaId; } -const endpoints = createWsEndpoints((k: string, v: string | undefined) => v || k).filter(({ allowTeleport }) => allowTeleport); +interface ExtLinkOption extends LinkOption { + teleport: number[]; +} -function extractRelayDestinations (relayGenesis: string, filter: (l: LinkOption) => boolean): LinkOption[] { +const DEFAULT_STATE: Teleport = { + allowTeleport: false, + destinations: [], + isParachain: false +}; + +const endpoints = createWsEndpoints((k: string, v: string | undefined) => v || k).filter((v): v is ExtLinkOption => + !!v.teleport && + !!v.teleport.length +); + +function extractRelayDestinations (relayGenesis: string, filter: (l: ExtLinkOption) => boolean): ExtLinkOption[] { return endpoints .filter((l) => ( @@ -28,7 +42,7 @@ function extractRelayDestinations (relayGenesis: string, filter: (l: LinkOption) l.genesisHash === relayGenesis ) && filter(l) ) - .reduce((result: LinkOption[], curr): LinkOption[] => { + .reduce((result: ExtLinkOption[], curr): ExtLinkOption[] => { if (!result.some(({ genesisHash, paraId }) => paraId === curr.paraId || genesisHash === curr.genesisHash)) { result.push(curr); } @@ -47,24 +61,29 @@ function extractRelayDestinations (relayGenesis: string, filter: (l: LinkOption) export function useTeleport (): Teleport { const { api, apiUrl, isApiReady } = useApi(); const chainParaId = useCall(isApiReady && api.query.parachainInfo?.parachainId); - const [state, setState] = useState(() => ({ - allowTeleport: false, - destinations: [], - isParachain: false - })); + const [state, setState] = useState(() => ({ ...DEFAULT_STATE })); useEffect((): void => { if (isApiReady) { const relayGenesis = api.genesisHash.toHex(); - const destinations = extractRelayDestinations(relayGenesis, ({ genesisHash }) => relayGenesis !== genesisHash); + const endpoint = endpoints.find(({ value }) => + value === apiUrl + ); - setState((prev) => ({ - ...prev, - allowTeleport: destinations.length !== 0, - destinations - })); + if (endpoint) { + const destinations = extractRelayDestinations(relayGenesis, ({ paraId }) => + isNumber(paraId) && + endpoint.teleport.includes(paraId) + ); + + setState((prev) => ({ + ...prev, + allowTeleport: destinations.length !== 0, + destinations + })); + } } - }, [api, isApiReady]); + }, [api, apiUrl, isApiReady]); useEffect((): void => { if (chainParaId) { @@ -78,8 +97,9 @@ export function useTeleport (): Teleport { // FIXME Cannot quite get this working... allowTeleport: false, // !!endpoint, destinations: endpoint && endpoint.genesisHashRelay - // FIXME we probably just want to check for !chainParaId.eq(paraId) || !!genesisHash (would affect Teleport modal) - ? extractRelayDestinations(endpoint.genesisHashRelay, ({ genesisHash }) => !!genesisHash) + ? extractRelayDestinations(endpoint.genesisHashRelay, ({ paraId }) => + endpoint.teleport.includes(isNumber(paraId) ? paraId : -1) + ) : [], isParachain: true, paraId: chainParaId