diff --git a/components/account/AccountHeroStats.tsx b/components/account/AccountHeroStats.tsx
new file mode 100644
index 00000000..9e17eb75
--- /dev/null
+++ b/components/account/AccountHeroStats.tsx
@@ -0,0 +1,501 @@
+import mangoStore from '@store/mangoStore'
+import useMangoAccount from 'hooks/useMangoAccount'
+import useMangoGroup from 'hooks/useMangoGroup'
+import { useTranslation } from 'next-i18next'
+import { useEffect, useMemo } from 'react'
+import { ChartToShow } from './AccountPage'
+import { useQuery } from '@tanstack/react-query'
+import { fetchFundingTotals, fetchVolumeTotals } from 'utils/account'
+import Tooltip from '@components/shared/Tooltip'
+import {
+ HealthType,
+ toUiDecimalsForQuote,
+} from '@blockworks-foundation/mango-v4'
+import HealthBar from './HealthBar'
+import FormatNumericValue from '@components/shared/FormatNumericValue'
+import { IconButton } from '@components/shared/Button'
+import { CalendarIcon, ChartBarIcon } from '@heroicons/react/20/solid'
+import Change from '@components/shared/Change'
+import SheenLoader from '@components/shared/SheenLoader'
+import { FormattedHourlyAccountVolumeData, PerformanceDataItem } from 'types'
+
+const AccountHeroStats = ({
+ accountPnl,
+ accountValue,
+ hourlyVolumeData,
+ loadingHourlyVolume,
+ rollingDailyData,
+ setShowPnlHistory,
+ setChartToShow,
+}: {
+ accountPnl: number
+ accountValue: number
+ hourlyVolumeData: FormattedHourlyAccountVolumeData[] | undefined
+ loadingHourlyVolume: boolean
+ rollingDailyData: PerformanceDataItem[]
+ setShowPnlHistory: (show: boolean) => void
+ setChartToShow: (view: ChartToShow) => void
+}) => {
+ const { t } = useTranslation(['common', 'account'])
+ const { group } = useMangoGroup()
+ const { mangoAccount, mangoAccountAddress } = useMangoAccount()
+
+ const totalInterestData = mangoStore(
+ (s) => s.mangoAccount.interestTotals.data
+ )
+
+ useEffect(() => {
+ if (mangoAccountAddress) {
+ const actions = mangoStore.getState().actions
+ actions.fetchAccountInterestTotals(mangoAccountAddress)
+ }
+ }, [mangoAccountAddress])
+
+ const {
+ data: fundingData,
+ isLoading: loadingFunding,
+ isFetching: fetchingFunding,
+ } = useQuery(
+ ['funding', mangoAccountAddress],
+ () => fetchFundingTotals(mangoAccountAddress),
+ {
+ cacheTime: 1000 * 60 * 10,
+ staleTime: 1000 * 60,
+ retry: 3,
+ refetchOnWindowFocus: false,
+ enabled: !!mangoAccountAddress,
+ }
+ )
+
+ const {
+ data: volumeTotalData,
+ isLoading: loadingVolumeTotalData,
+ isFetching: fetchingVolumeTotalData,
+ } = useQuery(
+ ['total-volume', mangoAccountAddress],
+ () => fetchVolumeTotals(mangoAccountAddress),
+ {
+ cacheTime: 1000 * 60 * 10,
+ staleTime: 1000 * 60,
+ retry: 3,
+ refetchOnWindowFocus: false,
+ enabled: !!mangoAccountAddress,
+ }
+ )
+
+ const maintHealth = useMemo(() => {
+ return group && mangoAccount
+ ? mangoAccount.getHealthRatioUi(group, HealthType.maint)
+ : 0
+ }, [mangoAccount, group])
+
+ const leverage = useMemo(() => {
+ if (!group || !mangoAccount) return 0
+ const assetsValue = toUiDecimalsForQuote(
+ mangoAccount.getAssetsValue(group).toNumber()
+ )
+
+ if (isNaN(assetsValue / accountValue)) {
+ return 0
+ } else {
+ return Math.abs(1 - assetsValue / accountValue)
+ }
+ }, [mangoAccount, group, accountValue])
+
+ const rollingDailyPnlChange = useMemo(() => {
+ if (!accountPnl || !rollingDailyData.length) return 0
+ return accountPnl - rollingDailyData[0].pnl
+ }, [accountPnl, rollingDailyData])
+
+ const interestTotalValue = useMemo(() => {
+ if (totalInterestData.length) {
+ return totalInterestData.reduce(
+ (a, c) => a + (c.borrow_interest_usd * -1 + c.deposit_interest_usd),
+ 0
+ )
+ }
+ return 0.0
+ }, [totalInterestData])
+
+ const fundingTotalValue = useMemo(() => {
+ if (fundingData?.length && mangoAccountAddress) {
+ return fundingData.reduce(
+ (a, c) => a + c.long_funding + c.short_funding,
+ 0
+ )
+ }
+ return 0.0
+ }, [fundingData, mangoAccountAddress])
+
+ const oneDayInterestChange = useMemo(() => {
+ if (rollingDailyData.length) {
+ const first = rollingDailyData[0]
+ const latest = rollingDailyData[rollingDailyData.length - 1]
+
+ const startDayInterest =
+ first.borrow_interest_cumulative_usd +
+ first.deposit_interest_cumulative_usd
+
+ const endDayInterest =
+ latest.borrow_interest_cumulative_usd +
+ latest.deposit_interest_cumulative_usd
+
+ return endDayInterest - startDayInterest
+ }
+ return 0.0
+ }, [rollingDailyData])
+
+ const dailyVolume = useMemo(() => {
+ if (!hourlyVolumeData || !hourlyVolumeData.length) return 0
+ // Calculate the current time in milliseconds
+ const currentTime = new Date().getTime()
+
+ // Calculate the start time for the last 24 hours in milliseconds
+ const last24HoursStartTime = currentTime - 24 * 60 * 60 * 1000
+
+ // Filter the formatted data based on the timestamp
+ const last24HoursData = hourlyVolumeData.filter((entry) => {
+ const timestampMs = new Date(entry.time).getTime()
+ return timestampMs >= last24HoursStartTime && timestampMs <= currentTime
+ })
+
+ const volume = last24HoursData.reduce((a, c) => a + c.total_volume_usd, 0)
+ return volume
+ }, [hourlyVolumeData])
+
+ const handleChartToShow = (
+ viewName:
+ | 'pnl'
+ | 'cumulative-interest-value'
+ | 'hourly-funding'
+ | 'hourly-volume'
+ ) => {
+ setChartToShow(viewName)
+ }
+
+ const loadingTotalVolume = fetchingVolumeTotalData || loadingVolumeTotalData
+
+ return (
+ <>
+
+
+
+
+
+ Health describes how close your account is to liquidation.
+ The lower your account health is the more likely you are to
+ get liquidated when prices fluctuate.
+
+ {maintHealth < 100 && mangoAccountAddress ? (
+ <>
+
+ Your account health is {maintHealth}%
+
+
+
+ Scenario:
+ {' '}
+ If the prices of all your liabilities increase by{' '}
+ {maintHealth}%, even for just a moment, some of your
+ liabilities will be liquidated.
+
+
+
+ Scenario:
+ {' '}
+ If the value of your total collateral decreases by{' '}
+ {(
+ (1 - 1 / ((maintHealth || 0) / 100 + 1)) *
+ 100
+ ).toFixed(2)}
+ % , some of your liabilities will be liquidated.
+
+
+ These are examples. A combination of events can also
+ lead to liquidation.
+
+ >
+ ) : null}
+
+ }
+ >
+
+ {t('health')}
+
+
+
+
+
+ {t('leverage')}:
+
+
+ x
+
+
+
+
+
+
+
+
+ {t('free-collateral')}
+
+
+
+
+
+
+
+ {t('total')}:
+
+
+
+
+
+
+
+
+
+
+
+
+ {t('pnl')}
+
+
+ {mangoAccountAddress ? (
+
+
+ handleChartToShow('pnl')}
+ >
+
+
+
+
+ setShowPnlHistory(true)}
+ >
+
+
+
+
+ ) : null}
+
+
+
+
+
+
+
{t('rolling-change')}
+
+
+
+
+
+
+
+ {t('account:lifetime-volume')}
+
+ {mangoAccountAddress ? (
+
+ handleChartToShow('hourly-volume')}
+ >
+
+
+
+ ) : null}
+
+ {loadingTotalVolume && mangoAccountAddress ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+ {t('account:daily-volume')}:
+ {loadingHourlyVolume && mangoAccountAddress ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+ {t('total-interest-earned')}
+
+
+ {mangoAccountAddress ? (
+
+
+ handleChartToShow('cumulative-interest-value')
+ }
+ >
+
+
+
+ ) : null}
+
+
+
+
+
+
+
{t('rolling-change')}
+
+
+
+
+
+
+
+ {t('account:total-funding-earned')}
+
+
+ {mangoAccountAddress ? (
+
+ handleChartToShow('hourly-funding')}
+ >
+
+
+
+ ) : null}
+
+ {(loadingFunding || fetchingFunding) && mangoAccountAddress ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+ >
+ )
+}
+
+export default AccountHeroStats
diff --git a/components/account/AccountPage.tsx b/components/account/AccountPage.tsx
index 77c582f6..ff9f3298 100644
--- a/components/account/AccountPage.tsx
+++ b/components/account/AccountPage.tsx
@@ -1,54 +1,25 @@
-import {
- HealthType,
- toUiDecimalsForQuote,
-} from '@blockworks-foundation/mango-v4'
+import { toUiDecimalsForQuote } from '@blockworks-foundation/mango-v4'
import { useTranslation } from 'next-i18next'
-import { useEffect, useMemo, useState } from 'react'
+import { useMemo, useState } from 'react'
import AccountActions from './AccountActions'
-import mangoStore from '@store/mangoStore'
-import { formatCurrencyValue } from '../../utils/numbers'
-import FlipNumbers from 'react-flip-numbers'
-import SimpleAreaChart from '@components/shared/SimpleAreaChart'
-import { COLORS } from '../../styles/colors'
-import { useTheme } from 'next-themes'
-import { IconButton } from '../shared/Button'
-import {
- ArrowsPointingOutIcon,
- CalendarIcon,
- ChartBarIcon,
-} from '@heroicons/react/20/solid'
-import { Transition } from '@headlessui/react'
import AccountTabs from './AccountTabs'
-import SheenLoader from '../shared/SheenLoader'
import AccountChart from './AccountChart'
import useMangoAccount from '../../hooks/useMangoAccount'
-import Change from '../shared/Change'
-import Tooltip from '@components/shared/Tooltip'
-import {
- ANIMATION_SETTINGS_KEY,
- // IS_ONBOARDED_KEY
-} from 'utils/constants'
import useLocalStorageState from 'hooks/useLocalStorageState'
// import AccountOnboardingTour from '@components/tours/AccountOnboardingTour'
import dayjs from 'dayjs'
-import { INITIAL_ANIMATION_SETTINGS } from '@components/settings/AnimationSettings'
import { useViewport } from 'hooks/useViewport'
import { breakpoints } from 'utils/theme'
import useMangoGroup from 'hooks/useMangoGroup'
import PnlHistoryModal from '@components/modals/PnlHistoryModal'
-import FormatNumericValue from '@components/shared/FormatNumericValue'
-import HealthBar from './HealthBar'
import AssetsLiabilities from './AssetsLiabilities'
import { PerformanceDataItem } from 'types'
import { useQuery } from '@tanstack/react-query'
import FundingChart from './FundingChart'
import VolumeChart from './VolumeChart'
-import {
- fetchAccountPerformance,
- fetchFundingTotals,
- fetchHourlyVolume,
- fetchVolumeTotals,
-} from 'utils/account'
+import { fetchAccountPerformance, fetchHourlyVolume } from 'utils/account'
+import AccountHeroStats from './AccountHeroStats'
+import AccountValue from './AccountValue'
const TABS = ['account-value', 'account:assets-liabilities']
@@ -64,34 +35,17 @@ const AccountPage = () => {
const { t } = useTranslation(['common', 'account'])
const { group } = useMangoGroup()
const { mangoAccount, mangoAccountAddress } = useMangoAccount()
-
- const totalInterestData = mangoStore(
- (s) => s.mangoAccount.interestTotals.data
- )
const [chartToShow, setChartToShow] = useState('')
- const [showExpandChart, setShowExpandChart] = useState(false)
const [showPnlHistory, setShowPnlHistory] = useState(false)
- const { theme } = useTheme()
const { width } = useViewport()
const isMobile = width ? width < breakpoints.md : false
// const tourSettings = mangoStore((s) => s.settings.tours)
// const [isOnBoarded] = useLocalStorageState(IS_ONBOARDED_KEY)
- const [animationSettings] = useLocalStorageState(
- ANIMATION_SETTINGS_KEY,
- INITIAL_ANIMATION_SETTINGS
- )
const [activeTab, setActiveTab] = useLocalStorageState(
'accountHeroKey-0.1',
'account-value'
)
- useEffect(() => {
- if (mangoAccountAddress) {
- const actions = mangoStore.getState().actions
- actions.fetchAccountInterestTotals(mangoAccountAddress)
- }
- }, [mangoAccountAddress])
-
const {
data: performanceData,
isLoading: loadingPerformanceData,
@@ -108,38 +62,6 @@ const AccountPage = () => {
}
)
- const {
- data: fundingData,
- isLoading: loadingFunding,
- isFetching: fetchingFunding,
- } = useQuery(
- ['funding', mangoAccountAddress],
- () => fetchFundingTotals(mangoAccountAddress),
- {
- cacheTime: 1000 * 60 * 10,
- staleTime: 1000 * 60,
- retry: 3,
- refetchOnWindowFocus: false,
- enabled: !!mangoAccountAddress,
- }
- )
-
- const {
- data: volumeTotalData,
- isLoading: loadingVolumeTotalData,
- isFetching: fetchingVolumeTotalData,
- } = useQuery(
- ['total-volume', mangoAccountAddress],
- () => fetchVolumeTotals(mangoAccountAddress),
- {
- cacheTime: 1000 * 60 * 10,
- staleTime: 1000 * 60,
- retry: 3,
- refetchOnWindowFocus: false,
- enabled: !!mangoAccountAddress,
- }
- )
-
const {
data: hourlyVolumeData,
isLoading: loadingHourlyVolumeData,
@@ -156,25 +78,7 @@ const AccountPage = () => {
}
)
- const dailyVolume = useMemo(() => {
- if (!hourlyVolumeData || !hourlyVolumeData.length) return 0
- // Calculate the current time in milliseconds
- const currentTime = new Date().getTime()
-
- // Calculate the start time for the last 24 hours in milliseconds
- const last24HoursStartTime = currentTime - 24 * 60 * 60 * 1000
-
- // Filter the formatted data based on the timestamp
- const last24HoursData = hourlyVolumeData.filter((entry) => {
- const timestampMs = new Date(entry.time).getTime()
- return timestampMs >= last24HoursStartTime && timestampMs <= currentTime
- })
-
- const volume = last24HoursData.reduce((a, c) => a + c.total_volume_usd, 0)
- return volume
- }, [hourlyVolumeData])
-
- const oneDayPerformanceData: PerformanceDataItem[] | [] = useMemo(() => {
+ const rollingDailyData: PerformanceDataItem[] | [] = useMemo(() => {
if (!performanceData || !performanceData.length) return []
const nowDate = new Date()
return performanceData.filter((d) => {
@@ -183,20 +87,6 @@ const AccountPage = () => {
})
}, [performanceData])
- const onHoverMenu = (open: boolean, action: string) => {
- if (
- (!open && action === 'onMouseEnter') ||
- (open && action === 'onMouseLeave')
- ) {
- setShowExpandChart(!open)
- }
- }
-
- const handleShowAccountValueChart = () => {
- setChartToShow('account-value')
- setShowExpandChart(false)
- }
-
const handleHideChart = () => {
setChartToShow('')
}
@@ -213,89 +103,17 @@ const AccountPage = () => {
]
}, [group, mangoAccount])
- const leverage = useMemo(() => {
- if (!group || !mangoAccount) return 0
- const assetsValue = toUiDecimalsForQuote(
- mangoAccount.getAssetsValue(group).toNumber()
- )
+ const pnlChangeToday = useMemo(() => {
+ if (!accountPnl || !rollingDailyData.length) return 0
+ const startHour = rollingDailyData.find((item) => {
+ const itemHour = new Date(item.time).getHours()
+ return itemHour === 0
+ })
+ const startDayPnl = startHour?.pnl
+ const pnlChangeToday = startDayPnl ? accountPnl - startDayPnl : 0
- if (isNaN(assetsValue / accountValue)) {
- return 0
- } else {
- return Math.abs(1 - assetsValue / accountValue)
- }
- }, [mangoAccount, group, accountValue])
-
- const [accountValueChange, rollingDailyPnlChange, pnlChangeToday] =
- useMemo(() => {
- if (!accountValue || !accountPnl || !oneDayPerformanceData.length)
- return [0, 0, 0]
- const accountValueChange =
- accountValue - oneDayPerformanceData[0].account_equity
- const startHour = oneDayPerformanceData.find((item) => {
- const itemHour = new Date(item.time).getHours()
- return itemHour === 0
- })
- const startDayPnl = startHour?.pnl
- const rollingDailyPnlChange = accountPnl - oneDayPerformanceData[0].pnl
- const pnlChangeToday = startDayPnl ? accountPnl - startDayPnl : 0
-
- return [accountValueChange, rollingDailyPnlChange, pnlChangeToday]
- }, [accountPnl, accountValue, oneDayPerformanceData])
-
- const interestTotalValue = useMemo(() => {
- if (totalInterestData.length) {
- return totalInterestData.reduce(
- (a, c) => a + (c.borrow_interest_usd * -1 + c.deposit_interest_usd),
- 0
- )
- }
- return 0.0
- }, [totalInterestData])
-
- const fundingTotalValue = useMemo(() => {
- if (fundingData?.length && mangoAccountAddress) {
- return fundingData.reduce(
- (a, c) => a + c.long_funding + c.short_funding,
- 0
- )
- }
- return 0.0
- }, [fundingData, mangoAccountAddress])
-
- const oneDayInterestChange = useMemo(() => {
- if (oneDayPerformanceData.length) {
- const first = oneDayPerformanceData[0]
- const latest = oneDayPerformanceData[oneDayPerformanceData.length - 1]
-
- const startDayInterest =
- first.borrow_interest_cumulative_usd +
- first.deposit_interest_cumulative_usd
-
- const endDayInterest =
- latest.borrow_interest_cumulative_usd +
- latest.deposit_interest_cumulative_usd
-
- return endDayInterest - startDayInterest
- }
- return 0.0
- }, [oneDayPerformanceData])
-
- const maintHealth = useMemo(() => {
- return group && mangoAccount
- ? mangoAccount.getHealthRatioUi(group, HealthType.maint)
- : 0
- }, [mangoAccount, group])
-
- const handleChartToShow = (
- chartName:
- | 'pnl'
- | 'cumulative-interest-value'
- | 'hourly-funding'
- | 'hourly-volume'
- ) => {
- setChartToShow(chartName)
- }
+ return pnlChangeToday
+ }, [accountPnl, rollingDailyData])
const latestAccountData = useMemo(() => {
if (!accountValue || !performanceData || !performanceData.length) return []
@@ -315,7 +133,6 @@ const AccountPage = () => {
]
}, [accountPnl, accountValue, performanceData])
- const loadingTotalVolume = fetchingVolumeTotalData || loadingVolumeTotalData
const loadingHourlyVolume =
fetchingHourlyVolumeData || loadingHourlyVolumeData
@@ -342,93 +159,13 @@ const AccountPage = () => {
{activeTab === 'account-value' ? (
-
-
-
- {animationSettings['number-scroll'] ? (
- group && mangoAccount ? (
-
- ) : (
-
- )
- ) : (
-
- )}
-
-
-
-
- {t('rolling-change')}
-
-
-
- {!performanceLoading ? (
- oneDayPerformanceData.length ? (
-
- onHoverMenu(showExpandChart, 'onMouseEnter')
- }
- onMouseLeave={() =>
- onHoverMenu(showExpandChart, 'onMouseLeave')
- }
- >
-
= 0
- ? COLORS.UP[theme]
- : COLORS.DOWN[theme]
- }
- data={oneDayPerformanceData.concat(latestAccountData)}
- name="accountValue"
- xKey="time"
- yKey="account_equity"
- />
-
- handleShowAccountValueChart()}
- >
-
-
-
-
- ) : null
- ) : mangoAccountAddress ? (
-
-
-
- ) : null}
-
+
) : null}
{activeTab === 'account:assets-liabilities' ? (
@@ -439,323 +176,15 @@ const AccountPage = () => {
-
-
-
-
-
- Health describes how close your account is to liquidation.
- The lower your account health is the more likely you are to
- get liquidated when prices fluctuate.
-
- {maintHealth < 100 && mangoAccountAddress ? (
- <>
-
- Your account health is {maintHealth}%
-
-
-
- Scenario:
- {' '}
- If the prices of all your liabilities increase by{' '}
- {maintHealth}%, even for just a moment, some of your
- liabilities will be liquidated.
-
-
-
- Scenario:
- {' '}
- If the value of your total collateral decreases by{' '}
- {(
- (1 - 1 / ((maintHealth || 0) / 100 + 1)) *
- 100
- ).toFixed(2)}
- % , some of your liabilities will be liquidated.
-
-
- These are examples. A combination of events can also
- lead to liquidation.
-
- >
- ) : null}
-
- }
- >
-
- {t('health')}
-
-
-
-
-
- {t('leverage')}:
-
-
- x
-
-
-
-
-
-
-
-
- {t('free-collateral')}
-
-
-
-
-
-
-
- {t('total')}:
-
-
-
-
-
-
-
-
-
-
-
-
- {t('pnl')}
-
-
- {mangoAccountAddress ? (
-
-
- handleChartToShow('pnl')}
- >
-
-
-
-
- setShowPnlHistory(true)}
- >
-
-
-
-
- ) : null}
-
-
-
-
-
-
-
{t('rolling-change')}
-
-
-
-
-
-
-
- {t('account:lifetime-volume')}
-
- {mangoAccountAddress ? (
-
- handleChartToShow('hourly-volume')}
- >
-
-
-
- ) : null}
-
- {loadingTotalVolume && mangoAccountAddress ? (
-
-
-
- ) : (
-
-
-
- )}
-
- {t('account:daily-volume')}:
- {loadingHourlyVolume && mangoAccountAddress ? (
-
-
-
- ) : (
-
-
-
- )}
-
-
-
-
-
-
-
-
- {t('total-interest-earned')}
-
-
- {mangoAccountAddress ? (
-
-
- handleChartToShow('cumulative-interest-value')
- }
- >
-
-
-
- ) : null}
-
-
-
-
-
-
-
{t('rolling-change')}
-
-
-
-
-
-
-
- {t('account:total-funding-earned')}
-
-
- {mangoAccountAddress ? (
-
- handleChartToShow('hourly-funding')}
- >
-
-
-
- ) : null}
-
- {(loadingFunding || fetchingFunding) && mangoAccountAddress ? (
-
-
-
- ) : (
-
-
-
- )}
-
-
+
{/* {!tourSettings?.account_tour_seen && isOnBoarded && connected ? (
diff --git a/components/account/AccountValue.tsx b/components/account/AccountValue.tsx
new file mode 100644
index 00000000..e9a9c868
--- /dev/null
+++ b/components/account/AccountValue.tsx
@@ -0,0 +1,148 @@
+import { formatCurrencyValue } from '../../utils/numbers'
+import FlipNumbers from 'react-flip-numbers'
+import SimpleAreaChart from '@components/shared/SimpleAreaChart'
+import { COLORS } from '../../styles/colors'
+import { IconButton } from '../shared/Button'
+import { ArrowsPointingOutIcon } from '@heroicons/react/20/solid'
+import { Transition } from '@headlessui/react'
+import SheenLoader from '../shared/SheenLoader'
+import Change from '../shared/Change'
+import FormatNumericValue from '@components/shared/FormatNumericValue'
+import { useTheme } from 'next-themes'
+import useLocalStorageState from 'hooks/useLocalStorageState'
+import { ANIMATION_SETTINGS_KEY } from 'utils/constants'
+import { INITIAL_ANIMATION_SETTINGS } from '@components/settings/AnimationSettings'
+import useMangoGroup from 'hooks/useMangoGroup'
+import useMangoAccount from 'hooks/useMangoAccount'
+import { PerformanceDataItem } from 'types'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'next-i18next'
+import { useViewport } from 'hooks/useViewport'
+import { breakpoints } from 'utils/theme'
+import { ChartToShow } from './AccountPage'
+
+const AccountValue = ({
+ accountValue,
+ latestAccountData,
+ loading,
+ rollingDailyData,
+ setChartToShow,
+}: {
+ accountValue: number
+ latestAccountData: PerformanceDataItem[]
+ loading: boolean
+ rollingDailyData: PerformanceDataItem[]
+ setChartToShow: (chart: ChartToShow) => void
+}) => {
+ const { t } = useTranslation('common')
+ const { theme } = useTheme()
+ const { group } = useMangoGroup()
+ const { mangoAccount, mangoAccountAddress } = useMangoAccount()
+ const [showExpandChart, setShowExpandChart] = useState(false)
+ const [animationSettings] = useLocalStorageState(
+ ANIMATION_SETTINGS_KEY,
+ INITIAL_ANIMATION_SETTINGS
+ )
+ const { width } = useViewport()
+ const isMobile = width ? width < breakpoints.md : false
+
+ const accountValueChange = useMemo(() => {
+ if (!accountValue || !rollingDailyData.length) return 0
+ const accountValueChange = accountValue - rollingDailyData[0].account_equity
+ return accountValueChange
+ }, [accountValue, rollingDailyData])
+
+ const onHoverMenu = (open: boolean, action: string) => {
+ if (
+ (!open && action === 'onMouseEnter') ||
+ (open && action === 'onMouseLeave')
+ ) {
+ setShowExpandChart(!open)
+ }
+ }
+
+ const handleShowAccountValueChart = () => {
+ setChartToShow('account-value')
+ setShowExpandChart(false)
+ }
+
+ return (
+
+
+
+ {animationSettings['number-scroll'] ? (
+ group && mangoAccount ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+
+
{t('rolling-change')}
+
+
+ {!loading ? (
+ rollingDailyData.length ? (
+
onHoverMenu(showExpandChart, 'onMouseEnter')}
+ onMouseLeave={() => onHoverMenu(showExpandChart, 'onMouseLeave')}
+ >
+
= 0 ? COLORS.UP[theme] : COLORS.DOWN[theme]
+ }
+ data={rollingDailyData.concat(latestAccountData)}
+ name="accountValue"
+ xKey="time"
+ yKey="account_equity"
+ />
+
+ handleShowAccountValueChart()}
+ >
+
+
+
+
+ ) : null
+ ) : mangoAccountAddress ? (
+
+
+
+ ) : null}
+
+ )
+}
+
+export default AccountValue