diff --git a/src/CommonTypes/commonTypes.state.ts b/src/CommonTypes/commonTypes.state.ts index 5a3dced..868b3dd 100644 --- a/src/CommonTypes/commonTypes.state.ts +++ b/src/CommonTypes/commonTypes.state.ts @@ -17,6 +17,7 @@ import { } from "rxjs" import { selectedChains$ } from "../ChainPicker" import { metadatas } from "../api/metadatas" +import { persistSubscription } from "../lib/persistSubscription" export type MetadataEntry = (V15 | V14)["lookup"] extends Array ? R : never @@ -117,6 +118,8 @@ export const commonTypeNames$ = state( return result }, {}), + // Because the list is virtualized, we would lose the state when components unsubscribe + persistSubscription(), ), {}, ) diff --git a/src/api/metadatas.ts b/src/api/metadatas.ts index 057da58..840f091 100644 --- a/src/api/metadatas.ts +++ b/src/api/metadatas.ts @@ -7,19 +7,18 @@ import { get, set } from "idb-keyval" import { getSmProvider } from "polkadot-api/sm-provider" import { mapObject } from "polkadot-api/utils" import { - ReplaySubject, catchError, filter, finalize, map, of, - share, startWith, switchMap, take, tap, } from "rxjs" import { selectedChains$ } from "../ChainPicker" +import { persistSubscription } from "../lib/persistSubscription" import { chains } from "./smoldot" export const [changeUseCache$, setUseCache] = createSignal() @@ -58,12 +57,7 @@ export const metadatas = mapObject(chains, (chain$, key) => { if (!result) return throughSmoldot$ return of(result) }), - share({ - connector: () => new ReplaySubject(1), - resetOnComplete: false, - resetOnRefCountZero: false, - resetOnError: true, - }), + persistSubscription(), ) }) diff --git a/src/api/smoldot.ts b/src/api/smoldot.ts index dc98279..1204618 100644 --- a/src/api/smoldot.ts +++ b/src/api/smoldot.ts @@ -1,15 +1,8 @@ import { startFromWorker } from "polkadot-api/smoldot/from-worker" import SmWorker from "polkadot-api/smoldot/worker?worker" -import { - MonoTypeOperatorFunction, - Observable, - ReplaySubject, - combineLatest, - defer, - share, - switchMap, -} from "rxjs" +import { Observable, combineLatest, defer, switchMap } from "rxjs" import { Chain } from "smoldot" +import { persistSubscription } from "../lib/persistSubscription" export const smoldot = startFromWorker(new SmWorker()) @@ -48,7 +41,7 @@ export const chains: Record> = Object.fromEntries( chainSpec, }), ), - ).pipe(persist()) + ).pipe(persistSubscription()) const parachainChains = Object.entries(parachains).map( ([parachainKey, parachain]) => [ @@ -60,7 +53,7 @@ export const chains: Record> = Object.fromEntries( potentialRelayChains: [chainRelayChain], }), ), - persist(), + persistSubscription(), ), ] as const, ) @@ -68,12 +61,3 @@ export const chains: Record> = Object.fromEntries( return [[key, chainRelayChain], ...parachainChains] }), ) - -function persist(): MonoTypeOperatorFunction { - return share({ - connector: () => new ReplaySubject(1), - resetOnComplete: false, - resetOnRefCountZero: false, - resetOnError: true, - }) -} diff --git a/src/lib/persistSubscription.ts b/src/lib/persistSubscription.ts new file mode 100644 index 0000000..6d38a98 --- /dev/null +++ b/src/lib/persistSubscription.ts @@ -0,0 +1,10 @@ +import { MonoTypeOperatorFunction, share, ReplaySubject } from "rxjs" + +export function persistSubscription(): MonoTypeOperatorFunction { + return share({ + connector: () => new ReplaySubject(1), + resetOnComplete: false, + resetOnRefCountZero: false, + resetOnError: true, + }) +}