import { useMemo } from "react"; import type { PreciseClaimableAmounts } from "./calculateClaimableAmounts"; import { makeGetPreciseClaimableAmounts, useGetPreciseClaimableAmounts, } from "./calculateClaimableAmounts"; import type { RewardRates } from "./calculateRewardRates"; import { calculateRewardRates } from "./calculateRewardRates"; import type { GetAllClaimableAmounts } from "./types"; export interface UseAllRewardsArgs { getAllClaimableAmounts: GetAllClaimableAmounts; } export interface RewardsAndRates { amounts: () => PreciseClaimableAmounts | null; rates: RewardRates | null; } const ONE_DAY_MS = 86_400 * 1_000; const ONE_HOUR_MS = 3_600 * 1_000; export const makeRewardsAndRates = ({ getAllClaimableAmounts, }: UseAllRewardsArgs): RewardsAndRates => { const rates = calculateRewardRates(getAllClaimableAmounts) ?? calculateRewardRates(getAllClaimableAmounts, ONE_DAY_MS) ?? calculateRewardRates(getAllClaimableAmounts, ONE_HOUR_MS); const amounts = makeGetPreciseClaimableAmounts(rates); return { amounts, rates }; }; /** * Does some magical filtering to hide jumpyness. Prioritizing smoothness and * precision over accuracy * * @param getAmount Either getClaimableAmount or getTotalClaimableAmount * @returns */ export const useAllRewards = ({ getAllClaimableAmounts, }: UseAllRewardsArgs): RewardsAndRates => { const rates = useMemo(() => { return ( calculateRewardRates(getAllClaimableAmounts) ?? calculateRewardRates(getAllClaimableAmounts, ONE_DAY_MS) ?? calculateRewardRates(getAllClaimableAmounts, ONE_HOUR_MS) ); }, [getAllClaimableAmounts]); const amounts = useGetPreciseClaimableAmounts(rates); return { amounts, rates, }; };