"use client"; import { useQuery } from "@tanstack/react-query"; import { fetchEpochRewards, fetchNodeInfo } from "../../app/api"; import { Skeleton, Typography } from "@mui/material"; import { format } from "date-fns"; import ExplorerCard from "../cards/ExplorerCard"; import ExplorerListItem from "../list/ListItem"; interface INodeMetricsCardProps { id: number; // Node ID } export const NodeDataCard = ({ id }: INodeMetricsCardProps) => { const { data: epochRewardsData, isLoading: isEpochLoading, isError: isEpochError, } = useQuery({ queryKey: ["epochRewards"], queryFn: fetchEpochRewards, }); // Fetch node information const { data: nodeInfo, isLoading: isNodeLoading, isError: isNodeError, } = useQuery({ queryKey: ["nodeInfo", id], queryFn: () => fetchNodeInfo(id), }); if (isEpochLoading || isNodeLoading) { return ( ); } if (isEpochError || isNodeError || !nodeInfo || !epochRewardsData) { return ( Failed to load node data. ); } // Function to calculate active set probability const getActiveSetProbability = ( totalStake: number, stakeSaturationPoint: string, ): string => { const saturation = Number.parseFloat(stakeSaturationPoint); if (Number.isNaN(saturation) || saturation <= 0) { throw new Error("Invalid stake saturation point provided"); } const ratio = (totalStake / saturation) * 100; if (ratio > 70) { return "High"; } if (ratio >= 40 && ratio <= 70) { return "Medium"; } return "Low"; }; const activeSetProb = getActiveSetProbability( nodeInfo.total_stake, epochRewardsData.interval.stake_saturation_point, ); const softwareUpdateTime = format( new Date(nodeInfo.description.build_information.build_timestamp), "dd/MM/yyyy", ); return ( ); };