@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
77 lines (63 loc) • 2.28 kB
text/typescript
import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets";
import { useMemo } from "react";
import {
getCurrentSolanaPreloadData,
getSolanaPreloadData,
} from "@ledgerhq/coin-solana/preload-data";
import { SolanaPreloadDataV1, SolanaStake, SolanaStakeWithMeta } from "@ledgerhq/coin-solana/types";
import type { ValidatorsAppValidator } from "@ledgerhq/coin-solana/network/validator-app/index";
import { useObservable } from "../../observable";
export function useSolanaPreloadData(
currency: CryptoCurrency,
): SolanaPreloadDataV1 | undefined | null {
return useObservable(getSolanaPreloadData(currency), getCurrentSolanaPreloadData(currency));
}
export function useValidators(currency: CryptoCurrency, search?: string): ValidatorsAppValidator[] {
const data = useSolanaPreloadData(currency);
return useMemo(() => {
const validators = data?.validators ?? [];
if (validators.length === 0 || !search || search === "") {
return validators;
}
const lowercaseSearch = search.toLowerCase();
const filtered = validators.filter(
validator =>
validator.name?.toLowerCase().includes(lowercaseSearch) ||
validator.voteAccount.toLowerCase().includes(lowercaseSearch),
);
const flags = [];
const output: ValidatorsAppValidator[] = [];
for (let i = 0; i < filtered.length; i++) {
if (flags[filtered[i].voteAccount]) continue;
flags[filtered[i].voteAccount] = true;
output.push(filtered[i]);
}
return output;
}, [data, search]);
}
export function useSolanaStakesWithMeta(
currency: CryptoCurrency,
stakes: SolanaStake[],
): SolanaStakeWithMeta[] {
const data = useSolanaPreloadData(currency);
if (data === null || data === undefined) {
return [];
}
const { validators } = data;
const validatorByVoteAccAddr = new Map(validators.map(v => [v.voteAccount, v]));
return stakes.map(stake => {
const voteAccAddr = stake.delegation?.voteAccAddr;
const validator =
voteAccAddr === undefined ? undefined : validatorByVoteAccAddr.get(voteAccAddr);
return {
stake,
meta: {
validator: {
img: validator?.avatarUrl,
name: validator?.name,
url: validator?.wwwUrl,
},
},
};
});
}