// Copyright 2017-2021 @polkadot/api-derive authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { Option, Vec } from '@polkadot/types'; import type { AccountId, Balance, Hash, PropIndex } from '@polkadot/types/interfaces'; import type { ITuple } from '@polkadot/types/types'; import type { Observable } from '@polkadot/x-rxjs'; import type { DeriveProposal, DeriveProposalImage } from '../types'; import { isFunction } from '@polkadot/util'; import { combineLatest, of } from '@polkadot/x-rxjs'; import { map, switchMap } from '@polkadot/x-rxjs/operators'; import { memo } from '../util'; type DepositorsNew = Option, Balance]>>; type DepositorsOld = Option]>>; type Depositors = DepositorsNew | DepositorsOld; type Proposals = Vec>; type Result = [Proposals, (DeriveProposalImage | undefined)[], Depositors[]]; // eslint-disable-next-line @typescript-eslint/no-unused-vars function isNewDepositors (depositors: ITuple<[Vec, Balance]> | ITuple<[Balance, Vec]>): depositors is ITuple<[Vec, Balance]> { // Detect balance... // eslint-disable-next-line @typescript-eslint/unbound-method return isFunction((depositors[1] as Balance).mul); } function parse ([proposals, images, optDepositors]: Result): DeriveProposal[] { return proposals .filter(([, , proposer], index): boolean => !!(optDepositors[index]?.isSome) && !proposer.isEmpty ) .map(([index, imageHash, proposer], proposalIndex): DeriveProposal => { const depositors = optDepositors[proposalIndex].unwrap(); return { ...( isNewDepositors(depositors) ? { balance: depositors[1], seconds: depositors[0] } : { balance: depositors[0], seconds: depositors[1] } ), image: images[proposalIndex], imageHash, index, proposer }; }); } export function proposals (instanceId: string, api: ApiInterfaceRx): () => Observable { return memo(instanceId, (): Observable => isFunction(api.query.democracy?.publicProps) && isFunction(api.query.democracy?.preimages) ? api.query.democracy.publicProps().pipe( switchMap((proposals) => combineLatest([ of(proposals), api.derive.democracy.preimages( proposals.map(([, hash]): Hash => hash)), api.query.democracy.depositOf.multi( proposals.map(([index]): PropIndex => index)) ]) ), map(parse) ) : of([]) ); }