// Copyright (c) 2020-2021 Drew Lemmy // This file is part of KristWeb 2 under GPL-3.0. // Full details: https://github.com/tmpim/KristWeb2/blob/master/LICENSE.txt import { notification } from "antd"; import { TFunction } from "react-i18next"; import { Wallet, WalletAddressMap } from "@wallets"; import { KristName } from "@api/types"; import { lookupNames } from "@api/lookup"; import { groupBy } from "lodash-es"; import Debug from "debug"; const debug = Debug("kristweb:name-picker"); export interface NameOptionGroup { key: string; label: string; wallet: Wallet; names: NameOption[]; } export interface NameOption { key: string; value: string; name: string; owner: string; } export function getNameOptions( nameSuffix: string, wallet: Wallet, names: KristName[] ): NameOptionGroup { // Group by owning wallet return { key: wallet.address, label: wallet.label || wallet.address, wallet, // Each individual name names: names.map(name => ({ key: name.name, value: name.name, name: name.name + "." + nameSuffix, owner: name.owner })) }; } export async function fetchNames( t: TFunction, nameSuffix: string, wallets: WalletAddressMap ): Promise<NameOptionGroup[] | null> { debug("performing name fetch"); try { // Get the full list of names for the given wallets. const addresses = Object.keys(wallets); const { names, total } = await lookupNames(addresses, { orderBy: "name", order: "ASC", limit: 1000 // TODO: support more than 1000 }); // Since more than 1000 isn't supported yet, show a warning if (total > 1000) notification.warning({ message: t("namePicker.warningTotalLimit") }); // Group the names into OptGroups per wallet. const options = Object.entries(groupBy(names, n => n.owner)) .map(([address, group]) => getNameOptions(nameSuffix, wallets[address], group)); debug("got names:", names, options); return options; } catch (err) { notification.error({ message: t("error"), description: t("namePicker.errorLookup") }); return null; } } export const buildLUT = (names: string[]): Record<string, boolean> => names.reduce((out, name) => { out[name] = true; return out; }, {} as Record<string, boolean>);