11import React , { useRef , useEffect , useMemo } from 'react' ;
22import * as d3 from 'd3' ;
33import { calculateLowerMargin , calculateUpperMargin } from './ReClammMath' ;
4+ import { Tooltip } from '../../components/chart/Tooltip' ;
45
56interface ReClammChartProps {
67 realTimeBalanceA : number ;
@@ -42,14 +43,17 @@ export const ReClammChart: React.FC<ReClammChartProps> = ({
4243 const xForPointB =
4344 realTimeInvariant / realTimeVirtualBalances . virtualBalanceB ;
4445
46+ const firstChartX =
47+ realTimeVirtualBalances . virtualBalanceA -
48+ MARGIN * ( xForPointB - realTimeVirtualBalances . virtualBalanceA ) ;
49+ const lastChartX =
50+ xForPointB +
51+ MARGIN * ( xForPointB - realTimeVirtualBalances . virtualBalanceA ) ;
52+ const chartXRange = lastChartX - firstChartX ;
53+
4554 // Create regular curve points
4655 const curvePoints = Array . from ( { length : NUM_POINTS } , ( _ , i ) => {
47- const x =
48- ( 1 - MARGIN ) * realTimeVirtualBalances . virtualBalanceA +
49- ( i *
50- ( ( 1 + MARGIN ) * xForPointB -
51- ( 1 - MARGIN ) * realTimeVirtualBalances . virtualBalanceA ) ) /
52- NUM_POINTS ;
56+ const x = firstChartX + ( i * chartXRange ) / NUM_POINTS ;
5357 const y = realTimeInvariant / x ;
5458
5559 return { x, y } ;
@@ -348,6 +352,8 @@ export const ReClammChart: React.FC<ReClammChartProps> = ({
348352 . attr ( 'stroke-width' , 2 )
349353 . attr ( 'd' , line ) ;
350354
355+ const tooltip = Tooltip ( ) ;
356+
351357 // Add special points (min/max prices) for both real-time and current
352358 svg
353359 . selectAll ( '.point-price' )
@@ -358,23 +364,29 @@ export const ReClammChart: React.FC<ReClammChartProps> = ({
358364 . attr ( 'cx' , d => xScale ( d . x ) )
359365 . attr ( 'cy' , d => yScale ( d . y ) )
360366 . attr ( 'r' , 5 )
361- . attr ( 'fill' , 'red' ) ;
362-
363- // Add tooltip div
364- const tooltip = d3
365- . select ( 'body' )
366- . append ( 'div' )
367- . attr ( 'class' , 'tooltip' )
368- . style ( 'opacity' , 0 )
369- . style ( 'position' , 'absolute' )
370- . style ( 'background-color' , 'white' )
371- . style ( 'border' , '1px solid #ddd' )
372- . style ( 'border-radius' , '4px' )
373- . style ( 'padding' , '8px' )
374- . style ( 'pointer-events' , 'none' )
375- . style ( 'font-size' , '12px' ) ;
367+ . attr ( 'fill' , 'red' )
368+ . on ( 'mouseover' , ( event , d ) => {
369+ tooltip
370+ . style ( 'opacity' , 1 )
371+ . html (
372+ `Balance A: ${ (
373+ d . x - realTimeVirtualBalances . virtualBalanceA
374+ ) . toFixed (
375+ 2
376+ ) } <br/>Balance B: ${ ( d . y - realTimeVirtualBalances . virtualBalanceB ) . toFixed ( 2 ) } `
377+ )
378+ . style ( 'left' , event . pageX + 10 + 'px' )
379+ . style ( 'top' , event . pageY - 10 + 'px' ) ;
380+ } )
381+ . on ( 'mouseout' , ( ) => {
382+ tooltip . style ( 'opacity' , 0 ) ;
383+ } )
384+ . on ( 'mousemove' , event => {
385+ tooltip
386+ . style ( 'left' , event . pageX + 10 + 'px' )
387+ . style ( 'top' , event . pageY - 10 + 'px' ) ;
388+ } ) ;
376389
377- // Modify the balance points section
378390 svg
379391 . selectAll ( '.point-balance' )
380392 . data ( specialPoints . slice ( 4 , 6 ) ) // Real-time and current balances
@@ -389,9 +401,9 @@ export const ReClammChart: React.FC<ReClammChartProps> = ({
389401 tooltip
390402 . style ( 'opacity' , 1 )
391403 . html (
392- `Real Balance A: ${ realTimeBalanceA . toFixed (
404+ `Balance A: ${ realTimeBalanceA . toFixed (
393405 2
394- ) } <br/>Real Balance B: ${ realTimeBalanceB . toFixed ( 2 ) } `
406+ ) } <br/>Balance B: ${ realTimeBalanceB . toFixed ( 2 ) } `
395407 )
396408 . style ( 'left' , event . pageX + 10 + 'px' )
397409 . style ( 'top' , event . pageY - 10 + 'px' ) ;
@@ -415,7 +427,28 @@ export const ReClammChart: React.FC<ReClammChartProps> = ({
415427 . attr ( 'cx' , d => xScale ( d . x ) )
416428 . attr ( 'cy' , d => yScale ( d . y ) )
417429 . attr ( 'r' , 5 )
418- . attr ( 'fill' , 'blue' ) ;
430+ . attr ( 'fill' , 'blue' )
431+ . on ( 'mouseover' , ( event , d ) => {
432+ tooltip
433+ . style ( 'opacity' , 1 )
434+ . html (
435+ `Balance A: ${ (
436+ d . x - realTimeVirtualBalances . virtualBalanceA
437+ ) . toFixed (
438+ 2
439+ ) } <br/>Balance B: ${ ( d . y - realTimeVirtualBalances . virtualBalanceB ) . toFixed ( 2 ) } `
440+ )
441+ . style ( 'left' , event . pageX + 10 + 'px' )
442+ . style ( 'top' , event . pageY - 10 + 'px' ) ;
443+ } )
444+ . on ( 'mouseout' , ( ) => {
445+ tooltip . style ( 'opacity' , 0 ) ;
446+ } )
447+ . on ( 'mousemove' , event => {
448+ tooltip
449+ . style ( 'left' , event . pageX + 10 + 'px' )
450+ . style ( 'top' , event . pageY - 10 + 'px' ) ;
451+ } ) ;
419452
420453 // Add axis labels
421454 svg
0 commit comments