import { useLocalStorageValue } from "@react-hookz/web"; import clsx from "clsx"; import Image, { type StaticImageData } from "next/image"; import { type ComponentProps, type ReactNode, type FormEvent, useState, useMemo, useEffect, useCallback, } from "react"; import { Tabs, TabList, TabPanel, Tab, Form } from "react-aria-components"; import type { States, StateType as ApiStateType } from "../../hooks/use-api"; import { AccountSummary } from "../AccountSummary"; import { Button, LinkButton } from "../Button"; import { Checkbox } from "../Checkbox"; import { Governance } from "../Governance"; import { Link } from "../Link"; import { ModalDialog } from "../ModalDialog"; import governanceImage from "../NoWalletHome/governance.png"; import ois from "../NoWalletHome/ois.png"; import { OracleIntegrityStaking } from "../OracleIntegrityStaking"; type Props = { api: States[ApiStateType.Loaded] | States[ApiStateType.LoadedNoStakeAccount]; currentEpoch: bigint; total: bigint; lastSlash: | { amount: bigint; date: Date; } | undefined; walletAmount: bigint; availableRewards: bigint; expiringRewards: Date | undefined; unlockSchedule: { amount: bigint; date: Date; }[]; governance: { warmup: bigint; staked: bigint; cooldown: bigint; cooldown2: bigint; }; yieldRate: bigint; integrityStakingPublishers: ComponentProps< typeof OracleIntegrityStaking >["publishers"]; enableGovernance: boolean; enableOis: boolean; }; export const Dashboard = ({ api, currentEpoch, total, lastSlash, walletAmount, availableRewards, expiringRewards, governance, integrityStakingPublishers, unlockSchedule, yieldRate, enableGovernance, enableOis, }: Props) => { const [tab, setTab] = useState(TabIds.Empty); const availableToStakeGovernance = useMemo( () => total - governance.warmup - governance.staked - governance.cooldown - governance.cooldown2, [ total, governance.warmup, governance.staked, governance.cooldown, governance.cooldown2, ], ); const integrityStakingWarmup = useIntegrityStakingSum( integrityStakingPublishers, "warmup", ); const integrityStakingStaked = useIntegrityStakingSum( integrityStakingPublishers, "staked", ); const integrityStakingCooldown = useIntegrityStakingSum( integrityStakingPublishers, "cooldown", ); const integrityStakingCooldown2 = useIntegrityStakingSum( integrityStakingPublishers, "cooldown2", ); const locked = useMemo( () => unlockSchedule.reduce((sum, { amount }) => sum + amount, 0n), [unlockSchedule], ); const availableToStakeIntegrity = useMemo( () => total - locked - integrityStakingWarmup - integrityStakingStaked - integrityStakingCooldown - integrityStakingCooldown2, [ total, locked, integrityStakingWarmup, integrityStakingStaked, integrityStakingCooldown, integrityStakingCooldown2, ], ); const availableToWithdraw = useMemo( () => bigIntMin(availableToStakeGovernance, availableToStakeIntegrity), [availableToStakeGovernance, availableToStakeIntegrity], ); useEffect(() => { window.scrollTo({ top: 0, behavior: "smooth" }); }, [tab]); return ( <>
{enableOis ? (

Choose Your Journey

Secure the Oracle
to Earn Rewards
Gain Voting Power
for Governance
) : ( )}
); }; const useIntegrityStakingSum = ( publishers: Props["integrityStakingPublishers"], field: "warmup" | "staked" | "cooldown" | "cooldown2", ): bigint => useMemo( () => publishers .map((publisher) => publisher.positions?.[field] ?? 0n) .reduce((acc, cur) => acc + cur, 0n), [publishers, field], ); // eslint-disable-next-line unicorn/no-array-reduce const bigIntMin = (...args: bigint[]) => args.reduce((m, e) => (e < m ? e : m)); type TabId = Exclude["selectedKey"], undefined>; type JourneyProps = ComponentProps & { children: ReactNode | ReactNode[]; longText: ReactNode; shortText: ReactNode; image: StaticImageData; }; const Journey = ({ className, children, image, longText, shortText, ...props }: JourneyProps) => (
{longText} {shortText}
{children}
); export enum TabIds { Empty = "empty", Governance = "governance", IntegrityStaking = "ois", } const Disclosure = () => { const hasAcknowledgedLegal = useLocalStorageValue("has-acknowledged-legal"); const [understood, setUnderstood] = useState(false); const [agreed, setAgreed] = useState(false); const acknowledge = useCallback( (e: FormEvent) => { e.preventDefault(); if (understood && agreed) { hasAcknowledgedLegal.set("true"); } }, [hasAcknowledgedLegal, understood, agreed], ); return (

EXCEPT EXPLICTLY PROVIDED IN THESE TERMS, CERTAIN TOOLS AND/OR SERVICES ARE NOT DEVELOPED FOR, AND ARE NOT AVAILABLE TO PERSONS OR ENTITIES WHO RESIDE IN, ARE LOCATED IN, ARE INCORPORATED IN, OR HAVE A REGISTERED OFFICE OR PRINCIPAL PLACE OF BUSINESS IN THE UNITED KINGDOM (COLLECTIVELY, “ BLOCKED PERSONS”). MOREOVER, THE SERVICES ARE NOT OFFERED TO PERSONS OR ENTITIES WHO RESIDE IN, ARE CITIZENS OF, ARE LOCATED IN, ARE INCORPORATED IN, OR HAVE A REGISTERED OFFICE OR PRINCIPAL PLACE OF BUSINESS IN ANY RESTRICTED JURISDICTION OR COUNTRY SUBJECT TO ANY SANCTIONS OR RESTRICTIONS PURSUANT TO ANY APPLICABLE LAW, INCLUDING CUBA, DEMOCRATIC PEOPLE’S REPUBLIC OF KOREA (NORTH KOREA), IRAN, MYANMAR (BURMA), SYRIA, , THE CRIMEA AND SEVASTOPOL REGIONS, THE DONETSK AND LUHANSK REGIONS, OR ANY OTHER COUNTRY OR REGION TO WHICH THE UNITED STATES, THE UNITED KINGDOM, THE EUROPEAN UNION, SWITZERLAND OR ANY OTHER JURISDICTIONS EMBARGOES GOODS OR IMPOSES SIMILAR SANCTIONS, INCLUDING THOSE LISTED ON OUR SERVICES (COLLECTIVELY, THE “RESTRICTED JURISDICTIONS” AND EACH A “RESTRICTED JURISDICTION”) OR ANY PERSON OWNED, CONTROLLED, LOCATED IN OR ORGANIZED UNDER THE LAWS OF ANY JURISDICTION UNDER EMBARGO OR CONNECTED OR AFFILIATED WITH ANY SUCH PERSON (COLLECTIVELY, “RESTRICTED PERSONS”). THE SERVICES WERE NOT SPECIFICALLY DEVELOPED FOR, AND IS NOT AIMED AT OR BEING ACTIVELY MARKETED TO, PERSONS OR ENTITIES WHO RESIDE IN, ARE LOCATED IN, ARE INCORPORATED IN, OR HAVE A REGISTERED OFFICE OR PRINCIPAL PLACE OF BUSINESS IN THE EUROPEAN UNION. THERE ARE NO EXCEPTIONS. IF YOU ARE A BLOCKED PERSON OR A RESTRICTED PERSON, THEN DO NOT USE OR ATTEMPT TO ACCESS AND/OR USE THE SERVICES. USE OF ANY TECHNOLOGY OR MECHANISM, SUCH AS A VIRTUAL PRIVATE NETWORK (“ VPN”) TO CIRCUMVENT THE RESTRICTIONS SET FORTH HEREIN IS PROHIBITED.

I understand By checking the box and access the Services, you acknowledge and agree to the terms and conditions of our{" "} Terms of Use {" "} ,{" "} Privacy Policy , and{" "} Terms of Service .
Exit
); };