mirror of
https://github.com/pezkuwichain/pezkuwi-apps.git
synced 2026-08-04 23:45:48 +00:00
66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
// Copyright 2017-2026 @pezkuwi/app-addresses authors & contributors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
import type { KeyringAddress } from '@pezkuwi/ui-keyring/types';
|
|
import type { SortedAccount } from './types.js';
|
|
|
|
import React from 'react';
|
|
|
|
import { Menu } from '@pezkuwi/react-components';
|
|
import { keyring } from '@pezkuwi/ui-keyring';
|
|
|
|
export function createMenuGroup (items: (React.ReactNode | false | undefined | null)[]): React.ReactNode | null {
|
|
const filtered = items.filter((item): item is React.ReactNode => !!item);
|
|
|
|
return filtered.length
|
|
? <>{filtered}<Menu.Divider /></>
|
|
: null;
|
|
}
|
|
|
|
function expandList (mapped: SortedAccount[], entry: SortedAccount): SortedAccount[] {
|
|
mapped.push(entry);
|
|
|
|
entry.children.forEach((entry): void => {
|
|
expandList(mapped, entry);
|
|
});
|
|
|
|
return mapped;
|
|
}
|
|
|
|
export function sortAccounts (addresses: string[], favorites: string[]): SortedAccount[] {
|
|
const mapped = addresses
|
|
.map((address) => keyring.getAccount(address))
|
|
.filter((account): account is KeyringAddress => !!account)
|
|
.map((account): SortedAccount => ({
|
|
account,
|
|
children: [],
|
|
isFavorite: favorites.includes(account.address)
|
|
}))
|
|
.sort((a, b) => (a.account.meta.whenCreated || 0) - (b.account.meta.whenCreated || 0));
|
|
|
|
return mapped
|
|
.filter((entry): boolean => {
|
|
const parentAddress = entry.account.meta.parentAddress;
|
|
|
|
if (parentAddress) {
|
|
const parent = mapped.find(({ account: { address } }) => address === parentAddress);
|
|
|
|
if (parent) {
|
|
parent.children.push(entry);
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
})
|
|
.reduce(expandList, [])
|
|
.sort((a, b): number =>
|
|
a.isFavorite === b.isFavorite
|
|
? 0
|
|
: b.isFavorite
|
|
? 1
|
|
: -1
|
|
);
|
|
}
|