import { useEffect, useMemo, useState } from 'react' import dayjs from 'dayjs' import useMangoStore from '../../stores/useMangoStore' import { Table, Td, Th, TrBody, TrHead } from '../TableElements' import { useTranslation } from 'next-i18next' import isEmpty from 'lodash/isEmpty' import usePagination from '../../hooks/usePagination' import { numberCompactFormatter } from '../../utils/' import Pagination from '../Pagination' import Chart from '../Chart' const utc = require('dayjs/plugin/utc') dayjs.extend(utc) import { exportDataToCSV } from '../../utils/export' import { SaveIcon } from '@heroicons/react/solid' import Button from '../Button' export const handleDustTicks = (v) => v < 0.000001 ? v === 0 ? 0 : v.toExponential() : numberCompactFormatter.format(v) const AccountPerformance = () => { const { t } = useTranslation('common') const mangoAccount = useMangoStore((s) => s.selectedMangoAccount.current) const [hourlyPerformanceStats, setHourlyPerformanceStats] = useState([]) const [loading, setLoading] = useState(false) const [chartData, setChartData] = useState([]) const { paginatedData, setData, totalPages, nextPage, previousPage, page, firstPage, lastPage, } = usePagination(hourlyPerformanceStats) const mangoAccountPk = useMemo(() => { if (mangoAccount) { return mangoAccount.publicKey.toString() } }, [mangoAccount]) const exportPerformanceDataToCSV = () => { const dataToExport = hourlyPerformanceStats.map((row) => { const timestamp = new Date(row.time) return { timestamp: `${timestamp.toLocaleDateString()} ${timestamp.toLocaleTimeString()}`, account_equity: row.account_equity, pnl: row.pnl, } }) const title = `${ mangoAccount?.name || mangoAccount?.publicKey }-Performance-${new Date().toLocaleDateString()}` const headers = ['Timestamp', 'Account Equity', 'PNL'] exportDataToCSV(dataToExport, title, headers, t) } useEffect(() => { if (!isEmpty(hourlyPerformanceStats)) { setData(hourlyPerformanceStats) } }, [hourlyPerformanceStats]) useEffect(() => { const fetchHourlyPerformanceStats = async () => { setLoading(true) const response = await fetch( `https://mango-transaction-log.herokuapp.com/v3/stats/account-performance?mango-account=${mangoAccountPk}` ) const parsedResponse = await response.json() const entries: any = Object.entries(parsedResponse).sort((a, b) => b[0].localeCompare(a[0]) ) const stats = entries .map(([key, value]) => { return { ...value, time: key } }) .filter((x) => x) setLoading(false) setHourlyPerformanceStats(stats) } fetchHourlyPerformanceStats() }, [mangoAccountPk]) useEffect(() => { if (hourlyPerformanceStats) { setChartData(hourlyPerformanceStats.slice().reverse()) } }, [hourlyPerformanceStats]) const increaseYAxisWidth = !!chartData.find((data: any) => data.value < 0.001) return ( <>

{t('account-performance')}

{mangoAccount ? (
<> {!isEmpty(hourlyPerformanceStats) && !loading ? ( <> {chartData.length > 0 ? (
x && x.toFixed(6 + 1)} tickFormat={handleDustTicks} type="area" yAxisWidth={increaseYAxisWidth ? 70 : 50} showAll />
x && x.toFixed(6 + 1)} tickFormat={handleDustTicks} type="area" yAxisWidth={increaseYAxisWidth ? 70 : 50} showAll />
) : null}
{paginatedData.length ? ( {paginatedData.map((stat) => { // @ts-ignore const utc = dayjs.utc(stat.time).format() return ( ) })}
{t('time')} {t('account-equity')} {t('account-pnl')}
{dayjs(utc).format('DD/MM/YY, h:mma')} {stat.account_equity.toFixed(6 + 1)} {stat.pnl.toFixed(6 + 1)}
) : (
{t('no-performance-history')}
)}
) : loading ? (
) : null}
) : (
{t('connect-wallet')}
)} ) } export default AccountPerformance