/* eslint-disable @typescript-eslint/no-explicit-any */ import { Bank } from '@blockworks-foundation/mango-v4' import { INITIAL_ANIMATION_SETTINGS } from '@components/settings/AnimationSettings' import ContentBox from '@components/shared/ContentBox' import { FadeInFadeOut } from '@components/shared/Transitions' import useLocalStorageState from 'hooks/useLocalStorageState' import useThemeWrapper from 'hooks/useThemeWrapper' import { useMemo, useState } from 'react' import { Area, AreaChart, Label, ReferenceDot, ResponsiveContainer, Tooltip, XAxis, YAxis, } from 'recharts' import { COLORS } from 'styles/colors' import { ANIMATION_SETTINGS_KEY } from 'utils/constants' import FlipNumbers from 'react-flip-numbers' import { floorToDecimal, formatNumericValue } from 'utils/numbers' import FormatNumericValue from '@components/shared/FormatNumericValue' import { useTranslation } from 'react-i18next' import { NoSymbolIcon } from '@heroicons/react/20/solid' type RateCurveData = { util: number rate: number } const RateCurveChart = ({ bank }: { bank: Bank | undefined }) => { const { t } = useTranslation(['common', 'token']) const { theme } = useThemeWrapper() const [animationSettings] = useLocalStorageState( ANIMATION_SETTINGS_KEY, INITIAL_ANIMATION_SETTINGS, ) const [mouseData, setMouseData] = useState(null) const handleMouseMove = (coords: any) => { if (coords.activePayload) { setMouseData(coords.activePayload[0].payload) } } const handleMouseLeave = () => { setMouseData(null) } const [currentRate, currentUtil] = useMemo(() => { if (!bank) return [0, 0] const currentRate = bank.getDepositRateUi() const currentUtil = (bank.uiBorrows() / bank.uiDeposits()) * 100 || 0 return [currentRate, currentUtil] }, [bank]) const rateCurveChartData = useMemo(() => { if (!bank) return [] const defaults = [ { util: 0, rate: 0 }, { util: bank.util0.toNumber() * 100, rate: bank.rate0.toNumber() * 100, }, { util: bank.util1.toNumber() * 100, rate: bank.rate1.toNumber() * 100, }, { util: 100, rate: bank.maxRate.toNumber() * 100 }, ] if (currentRate && currentUtil) { defaults.push({ util: currentUtil, rate: currentRate }) } return defaults.sort((a, b) => a.util - b.util) }, [bank, currentRate, currentUtil]) return ( {rateCurveChartData.length && bank ? ( <>

{t('token:rate-curve')}

{mouseData ? (
{animationSettings['number-scroll'] ? ( ) : ( % )}

{t('utilization')}:{' '} {floorToDecimal(mouseData.util, 2).toString()}%

) : (
{animationSettings['number-scroll'] ? ( ) : ( % )}

{t('utilization')}:{' '} {floorToDecimal(currentUtil, 2).toString()}%

)}
`${floorToDecimal(d, 2).toString()}%`} type="number" /> `${floorToDecimal(v, 2).toString()}%`} tickLine={false} /> } />
) : (

{t('chart-unavailable')}

)}
) } export default RateCurveChart