e5f41731ae
* bootstrap next app + add overview page * fix AssetList type * fix up nav stuff * Refactor Nav component and add network components pages * Refactor WorldMap component and update TelegramIcon, GitHubIcon, NymVpnIcon, DiscordIcon, and TwitterIcon components * add service providers page * mixnodes page * delegations page + use material react table for all tables * nodes map page * Refactor StyledLink component and remove unnecessary console.log statements * Refactor ESLint configuration, remove unused dependencies, and update component imports * update deps * Refactor imports and update dependencies * fix dark mode * build single mixnode page * build single gateway page * Refactor handleOnDelegate function to use useCallback in mixnodes page.tsx * Add defaults for constants --------- Co-authored-by: Mark Sinclair <mmsinclair@users.noreply.github.com>
58 lines
2.0 KiB
TypeScript
58 lines
2.0 KiB
TypeScript
/* eslint-disable camelcase */
|
|
import { MixNodeResponse, MixNodeResponseItem, MixnodeStatus } from '../../typeDefs/explorer-api';
|
|
import { toPercentInteger, toPercentIntegerString } from '@/app/utils';
|
|
import { unymToNym } from '@/app/utils/currency';
|
|
|
|
export type MixnodeRowType = {
|
|
mix_id: number;
|
|
id: string;
|
|
status: MixnodeStatus;
|
|
owner: string;
|
|
location: string;
|
|
identity_key: string;
|
|
bond: number;
|
|
self_percentage: string;
|
|
pledge_amount: number;
|
|
host: string;
|
|
layer: string;
|
|
profit_percentage: number;
|
|
avg_uptime: string;
|
|
stake_saturation: React.ReactNode;
|
|
operating_cost: number;
|
|
node_performance: number;
|
|
blacklisted: boolean;
|
|
};
|
|
|
|
export function mixnodeToGridRow(arrayOfMixnodes?: MixNodeResponse): MixnodeRowType[] {
|
|
return (arrayOfMixnodes || []).map(mixNodeResponseItemToMixnodeRowType);
|
|
}
|
|
|
|
export function mixNodeResponseItemToMixnodeRowType(item: MixNodeResponseItem): MixnodeRowType {
|
|
const pledge = Number(item.pledge_amount.amount) || 0;
|
|
const delegations = Number(item.total_delegation.amount) || 0;
|
|
const totalBond = pledge + delegations;
|
|
const selfPercentage = ((pledge * 100) / totalBond).toFixed(2);
|
|
const profitPercentage = toPercentInteger(item.profit_margin_percent) || 0;
|
|
const uncappedSaturation = typeof item.uncapped_saturation === 'number' ? item.uncapped_saturation * 100 : 0;
|
|
|
|
return {
|
|
mix_id: item.mix_id,
|
|
id: item.owner,
|
|
status: item.status,
|
|
owner: item.owner,
|
|
identity_key: item.mix_node.identity_key || '',
|
|
bond: totalBond || 0,
|
|
location: item?.location?.country_name || '',
|
|
self_percentage: selfPercentage,
|
|
pledge_amount: pledge,
|
|
host: item?.mix_node?.host || '',
|
|
layer: item?.layer || '',
|
|
profit_percentage: profitPercentage,
|
|
avg_uptime: `${toPercentIntegerString(item.node_performance.last_24h)}%`,
|
|
stake_saturation: Number(uncappedSaturation.toFixed(2)),
|
|
operating_cost: Number(unymToNym(item.operating_cost?.amount, 6)) || 0,
|
|
node_performance: toPercentInteger(item.node_performance.most_recent),
|
|
blacklisted: item.blacklisted,
|
|
};
|
|
}
|