From 1adcad18557e25d155cafdaaac0ee4ea5ab4e23a Mon Sep 17 00:00:00 2001 From: tomato6966 Date: Sat, 18 Jan 2025 20:11:49 +0100 Subject: [PATCH] add a little responsiveness --- .../Chart/AssetPerformanceModal.tsx | 169 ++++++++++-------- .../Chart/PortfolioPerformanceModal.tsx | 138 ++++++++------ 2 files changed, 173 insertions(+), 134 deletions(-) diff --git a/src/components/Chart/AssetPerformanceModal.tsx b/src/components/Chart/AssetPerformanceModal.tsx index 4bcb5e0..f6a93f8 100644 --- a/src/components/Chart/AssetPerformanceModal.tsx +++ b/src/components/Chart/AssetPerformanceModal.tsx @@ -1,5 +1,5 @@ import { X } from "lucide-react"; -import { memo } from "react"; +import { memo, useEffect } from "react"; import { CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts"; @@ -13,6 +13,14 @@ interface AssetPerformanceModalProps { export const AssetPerformanceModal = memo(({ assetName, performances, onClose }: AssetPerformanceModalProps) => { const sortedPerformances = [...performances].sort((a, b) => a.year - b.year); + // Prevent body scroll when modal is open + useEffect(() => { + document.body.style.overflow = 'hidden'; + return () => { + document.body.style.overflow = 'unset'; + }; + }, []); + const CustomizedDot = (props: any) => { const { cx, cy, payload } = props; return ( @@ -26,83 +34,94 @@ export const AssetPerformanceModal = memo(({ assetName, performances, onClose }: }; return ( -
-
-
-

{assetName} - Yearly Performance

-
-
- - - - - `${value.toFixed(2)}%`} - /> - `€${value.toFixed(2)}`} - /> - { - if (name === 'Performance') return [`${value.toFixed(2)}%`, name]; - return [`€${value.toFixed(2)}`, name]; - }} - labelFormatter={(year) => `Year ${year}`} - /> - } - strokeWidth={2} - yAxisId="left" - /> - - - - - - - - - -
-
- {sortedPerformances.map(({ year, percentage, price }) => ( -
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30' - }`} - > -
{year}
-
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400' - }`}> - {percentage.toFixed(2)}% -
- {price && ( -
- €{price.toFixed(2)} + + {/* Content - Scrollable */} +
+ {/* Chart */} +
+ + + + + `${value.toFixed(2)}%`} + /> + `€${value.toFixed(2)}`} + /> + { + if (name === 'Performance') return [`${value.toFixed(2)}%`, name]; + return [`€${value.toFixed(2)}`, name]; + }} + labelFormatter={(year) => `Year ${year}`} + /> + } + strokeWidth={2} + yAxisId="left" + /> + + + + + + + + + +
+ + {/* Performance Cards */} +
+ {sortedPerformances.map(({ year, percentage, price }) => ( +
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30' + }`} + > +
{year}
+
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400' + }`}> + {percentage.toFixed(2)}%
- )} -
- ))} + {price && ( +
+ €{price.toFixed(2)} +
+ )} +
+ ))} +
diff --git a/src/components/Chart/PortfolioPerformanceModal.tsx b/src/components/Chart/PortfolioPerformanceModal.tsx index f696da1..1cabfeb 100644 --- a/src/components/Chart/PortfolioPerformanceModal.tsx +++ b/src/components/Chart/PortfolioPerformanceModal.tsx @@ -1,5 +1,5 @@ import { X } from "lucide-react"; -import { memo } from "react"; +import { memo, useEffect } from "react"; import { CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts"; @@ -11,6 +11,15 @@ interface PortfolioPerformanceModalProps { export const PortfolioPerformanceModal = memo(({ performances, onClose }: PortfolioPerformanceModalProps) => { const sortedPerformances = [...performances].sort((a, b) => a.year - b.year); + + // Prevent body scroll when modal is open + useEffect(() => { + document.body.style.overflow = 'hidden'; + return () => { + document.body.style.overflow = 'unset'; + }; + }, []); + const CustomizedDot = (props: any) => { const { cx, cy, payload } = props; return ( @@ -24,69 +33,80 @@ export const PortfolioPerformanceModal = memo(({ performances, onClose }: Portfo }; return ( -
-
-
+
+
+ {/* Header - Fixed */} +

Portfolio Performance History

-
-
- - - - - `${value.toFixed(2)}%`} - /> - `€${value.toLocaleString()}`} - /> - { - if (name === 'Performance') return [`${value.toFixed(2)}%`, name]; - return [`€${value.toLocaleString()}`, 'Portfolio Value']; - }} - labelFormatter={(year) => `Year ${year}`} - /> - } - strokeWidth={2} - yAxisId="left" - /> - - - - - - - - -
-
- {sortedPerformances.map(({ year, percentage }) => ( -
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30' - }`} - > -
{year}
-
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400' - }`}> - {percentage.toFixed(2)}% + + {/* Content - Scrollable */} +
+ {/* Chart */} +
+ + + + + `${value.toFixed(2)}%`} + /> + `€${value.toLocaleString()}`} + /> + { + if (name === 'Performance') return [`${value.toFixed(2)}%`, name]; + return [`€${value.toLocaleString()}`, 'Portfolio Value']; + }} + labelFormatter={(year) => `Year ${year}`} + /> + } + strokeWidth={2} + yAxisId="left" + /> + + + + + + + + +
+ + {/* Performance Cards */} +
+ {sortedPerformances.map(({ year, percentage }) => ( +
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30' + }`} + > +
{year}
+
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400' + }`}> + {percentage.toFixed(2)}% +
-
- ))} + ))} +