fix(chart): prevent infinite re-render loop by using useState/useEffect for dark mode detection
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useMemo } from 'react'
|
import { useMemo, useState, useEffect } from 'react'
|
||||||
import {
|
import {
|
||||||
BarChart, Bar, LineChart, Line, AreaChart, Area,
|
BarChart, Bar, LineChart, Line, AreaChart, Area,
|
||||||
PieChart, Pie, Cell, RadarChart, Radar, PolarGrid, PolarAngleAxis,
|
PieChart, Pie, Cell, RadarChart, Radar, PolarGrid, PolarAngleAxis,
|
||||||
@@ -24,11 +24,34 @@ interface NoteChartProps {
|
|||||||
height?: number
|
height?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
const isDark = () => document.documentElement.classList.contains('dark')
|
// Hook to detect dark mode without re-render loops
|
||||||
|
function useDarkMode() {
|
||||||
|
const [isDark, setIsDark] = useState(() => typeof document !== 'undefined' && document.documentElement.classList.contains('dark'))
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const checkDarkMode = () => {
|
||||||
|
setIsDark(document.documentElement.classList.contains('dark'))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initial check
|
||||||
|
checkDarkMode()
|
||||||
|
|
||||||
|
// Listen for class changes on html element
|
||||||
|
const observer = new MutationObserver(checkDarkMode)
|
||||||
|
observer.observe(document.documentElement, {
|
||||||
|
attributes: true,
|
||||||
|
attributeFilter: ['class'],
|
||||||
|
})
|
||||||
|
|
||||||
|
return () => observer.disconnect()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return isDark
|
||||||
|
}
|
||||||
|
|
||||||
function NoteChart({ type, title, data, colors, showLegend, height = 250 }: NoteChartProps) {
|
function NoteChart({ type, title, data, colors, showLegend, height = 250 }: NoteChartProps) {
|
||||||
const chartColors = colors ?? CHART_COLORS
|
const chartColors = colors ?? CHART_COLORS
|
||||||
const dark = isDark()
|
const dark = useDarkMode()
|
||||||
|
|
||||||
const ttStyle = {
|
const ttStyle = {
|
||||||
background: dark ? '#1C1C1C' : '#fff',
|
background: dark ? '#1C1C1C' : '#fff',
|
||||||
|
|||||||
Reference in New Issue
Block a user