@@ -25,14 +25,23 @@ import useLocalStorage from 'hooks/localStorage/useLocalStorage'
2525import { LocalStorageKeys } from 'constants/localStorageKeys'
2626import { getDefaultChainSettings } from 'constants/defaultSettings'
2727import useChainConfig from 'hooks/chain/useChainConfig'
28- import CustomTooltip from './ChartTooltip'
28+ import CustomTooltip from 'components/common/DynamicLineChart/ChartTooltip'
29+
30+ interface LineConfig {
31+ dataKey : string
32+ color : string
33+ name : string
34+ isPercentage ?: boolean
35+ isCurrency ?: boolean
36+ }
2937
3038interface Props {
3139 data : MergedChartData [ ]
3240 lines : LineConfig [ ]
3341 height ?: string
34- customYAxisDomain ?: ( values : number [ ] ) => [ number , number ]
42+ legend ?: boolean
3543 timeframe ?: string
44+ customYAxisDomain ?: ( values : number [ ] ) => [ number , number ]
3645}
3746
3847interface ChartDataPayloadProps {
@@ -82,14 +91,27 @@ const TooltipContent = ({
8291 { lineConfig ?. isPercentage ? (
8392 < FormattedNumber
8493 amount = { value }
85- options = { { minDecimals : 2 , maxDecimals : 2 , suffix : '%' } }
94+ options = { {
95+ maxDecimals : Number ( item . value ) > 100 ? 0 : 2 ,
96+ minDecimals : Number ( item . value ) > 100 ? 0 : 2 ,
97+ suffix : '%' ,
98+ } }
99+ className = 'text-xs'
100+ />
101+ ) : lineConfig ?. isCurrency ? (
102+ < DisplayCurrency
103+ coin = { BNCoin . fromDenomAndBigNumber (
104+ 'usd' ,
105+ BN ( item . value ) . shiftedBy ( - PRICE_ORACLE_DECIMALS ) ,
106+ ) }
107+ options = { { maxDecimals : 3 , minDecimals : 2 } }
86108 className = 'text-xs'
87109 />
88110 ) : (
89111 < DisplayCurrency
90- coin = { BNCoin . fromDenomAndBigNumber ( 'usd' , BN ( value ) . shiftedBy ( - PRICE_ORACLE_DECIMALS ) ) }
112+ coin = { BNCoin . fromDenomAndBigNumber ( 'usd' , BN ( item . value ) ) }
113+ options = { { maxDecimals : 3 , minDecimals : 2 } }
91114 className = 'text-xs'
92- showSignPrefix
93115 />
94116 ) }
95117 </ div >
@@ -98,18 +120,17 @@ const TooltipContent = ({
98120}
99121
100122export default function DynamicLineChartBody ( props : Props ) {
101- const { data, lines, height = 'h-65 ' , customYAxisDomain , timeframe = '' } = props
123+ const { data, lines, height = 'h-80 ' , timeframe = '' , legend = true , customYAxisDomain } = props
102124 const chainConfig = useChainConfig ( )
103125 const [ reduceMotion ] = useLocalStorage < boolean > (
104126 LocalStorageKeys . REDUCE_MOTION ,
105127 getDefaultChainSettings ( chainConfig ) . reduceMotion ,
106128 )
107- const reversedData = [ ...data ] . reverse ( )
108129
109130 // domain setting for large percentage values and custom domains
110131 const getYAxisDomain = ( ) => {
111132 const extractValues = ( ) =>
112- reversedData
133+ data
113134 . map ( ( item ) =>
114135 lines . map ( ( line ) => {
115136 const value = item [ line . dataKey ]
@@ -139,7 +160,7 @@ export default function DynamicLineChartBody(props: Props) {
139160 < div className = { classNames ( '-ml-4' , height ) } >
140161 < ResponsiveContainer width = '100%' height = '100%' >
141162 < AreaChart
142- data = { reversedData }
163+ data = { data }
143164 margin = { {
144165 top : 10 ,
145166 right : 10 ,
@@ -174,7 +195,6 @@ export default function DynamicLineChartBody(props: Props) {
174195 dot = { false }
175196 strokeWidth = { 2 }
176197 isAnimationActive = { ! reduceMotion }
177- strokeDasharray = { lineConfig . strokeDasharray }
178198 />
179199 ) ) }
180200
@@ -192,29 +212,37 @@ export default function DynamicLineChartBody(props: Props) {
192212 }
193213 return moment ( value ) . format ( 'DD MMM' )
194214 } }
195- interval = { reversedData . length > 10 ? Math . floor ( reversedData . length / 7 ) : 0 }
215+ interval = { data . length > 10 ? Math . floor ( data . length / 7 ) : 0 }
196216 />
197217 < YAxis
198218 axisLine = { false }
199219 tickLine = { false }
200220 fontSize = { 8 }
201221 tickCount = { 8 }
202- stroke = 'rgba(255, 255, 255, 0.4)'
203222 domain = { getYAxisDomain ( ) }
223+ stroke = 'rgba(255, 255, 255, 0.4)'
204224 tickFormatter = { ( value ) => {
205225 if ( lines [ 0 ] ?. isPercentage ) {
206226 return formatValue ( value , {
227+ minDecimals : Number ( value ) > 100 ? 0 : 2 ,
228+ maxDecimals : Number ( value ) > 100 ? 0 : 2 ,
229+ suffix : '%' ,
230+ abbreviated : true ,
231+ } )
232+ }
233+ if ( lines [ 0 ] ?. isCurrency ) {
234+ const adjustedValue = BN ( value ) . shiftedBy ( - PRICE_ORACLE_DECIMALS ) . toNumber ( )
235+ return formatValue ( adjustedValue , {
207236 minDecimals : 2 ,
208237 maxDecimals : 2 ,
209- suffix : '%' ,
238+ prefix : '$' ,
239+ abbreviated : true ,
210240 } )
211241 }
212- const adjustedValue = BN ( value ) . shiftedBy ( - PRICE_ORACLE_DECIMALS ) . toNumber ( )
213- return formatValue ( adjustedValue , {
214- minDecimals : 0 ,
242+ return formatValue ( value , {
243+ minDecimals : 2 ,
215244 maxDecimals : 2 ,
216245 prefix : '$' ,
217- abbreviated : true ,
218246 } )
219247 } }
220248 />
@@ -228,7 +256,9 @@ export default function DynamicLineChartBody(props: Props) {
228256 />
229257 ) }
230258 />
231- < Legend content = { < ChartLegend payload = { [ ] } data = { reversedData } /> } verticalAlign = 'top' />
259+ { legend && (
260+ < Legend content = { < ChartLegend payload = { [ ] } data = { data } /> } verticalAlign = 'top' />
261+ ) }
232262 < CartesianGrid opacity = { 0.1 } vertical = { false } />
233263 < ReferenceLine y = { 0 } stroke = 'rgba(255, 255, 255, 0.2)' strokeWidth = { 2 } />
234264 </ AreaChart >
0 commit comments