// Copyright 2017-2026 @pezkuwi/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { LinkOption } from '@pezkuwi/apps-config/endpoints/types'; import type { BN } from '@pezkuwi/util'; import { useMemo } from 'react'; import { createWsEndpoints } from '@pezkuwi/apps-config'; import { bnToBn } from '@pezkuwi/util'; import { createNamedHook } from './createNamedHook.js'; import { useApi } from './useApi.js'; const endpoints = createWsEndpoints((k, v) => v?.toString() || k); function extractRelayEndpoints (genesisHash: string): LinkOption[] { return endpoints.filter(({ genesisHashRelay }) => genesisHash === genesisHashRelay ); } function extractParaEndpoints (allEndpoints: LinkOption[], paraId: BN | number): LinkOption[] { const numId = bnToBn(paraId).toNumber(); return allEndpoints.filter(({ paraId }) => paraId === numId ); } function useRelayEndpointsImpl (): LinkOption[] { const { api } = useApi(); return useMemo( () => extractRelayEndpoints(api.genesisHash.toHex()), [api] ); } export const useRelayEndpoints = createNamedHook('useRelayEndpoints', useRelayEndpointsImpl); function useParaEndpointsImpl (paraId: BN | number): LinkOption[] { const endpoints = useRelayEndpoints(); return useMemo( () => extractParaEndpoints(endpoints, paraId), [endpoints, paraId] ); } export const useParaEndpoints = createNamedHook('useParaEndpoints', useParaEndpointsImpl); function useIsParasLinkedImpl (ids?: (BN | number)[] | null): Record { const endpoints = useRelayEndpoints(); return useMemo( () => ids ? ids.reduce((all: Record, id) => ({ ...all, [id.toString()]: extractParaEndpoints(endpoints, id).length !== 0 }), {}) : {}, [endpoints, ids] ); } export const useIsParasLinked = createNamedHook('useIsParasLinked', useIsParasLinkedImpl);