ghost-portal/packages/react-hooks/src/useCollectiveMembers.ts
2022-01-01 09:30:15 +02:00

39 lines
1.2 KiB
TypeScript

// Copyright 2017-2022 @polkadot/app-democracy authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { AccountId } from '@polkadot/types/interfaces';
import type { CollectiveType } from './types';
import { useMemo } from 'react';
import { createNamedHook } from './createNamedHook';
import { useAccounts } from './useAccounts';
import { useApi } from './useApi';
import { useCall } from './useCall';
interface Result {
isMember: boolean;
members: string[];
}
const transformMembers = {
transform: (accounts: AccountId[]) =>
accounts.map((accountId) => accountId.toString())
};
function useCollectiveMembersImpl (collective: CollectiveType): Result {
const { api } = useApi();
const { allAccounts, hasAccounts } = useAccounts();
const retrieved = useCall<string[]>(hasAccounts && api.derive[collective]?.members, undefined, transformMembers);
return useMemo(
() => ({
isMember: (retrieved || []).some((accountId) => allAccounts.includes(accountId)),
members: (retrieved || [])
}),
[allAccounts, retrieved]
);
}
export const useCollectiveMembers = createNamedHook('useCollectiveMembers', useCollectiveMembersImpl);