/** * 출처: https://github.com/73nko/advanced-d3/blob/master/13-using-d3-with-react-js/src/completed/Chart/utils.js */ import { useEffect, useState, useRef } from "react"; export const combineChartDimensions = (dimensions: any) => { let parsedDimensions = { marginTop: 40, marginRight: 30, marginBottom: 40, marginLeft: 75, ...dimensions, }; return { ...parsedDimensions, boundedHeight: Math.max( parsedDimensions.height - parsedDimensions.marginTop - parsedDimensions.marginBottom, 0 ), boundedWidth: Math.max( parsedDimensions.width - parsedDimensions.marginLeft - parsedDimensions.marginRight, 0 ), }; }; export const useChartDimensions = (passedSettings: any) => { const ref = useRef(); const dimensions = combineChartDimensions(passedSettings); const [width, changeWidth] = useState(0); const [height, changeHeight] = useState(0); useEffect(() => { if (dimensions.width && dimensions.height) return; const element = ref.current; const resizeObserver = new ResizeObserver((entries) => { if (!Array.isArray(entries)) return; if (!entries.length) return; const entry = entries[0]; if (width !== entry.contentRect.width) changeWidth(entry.contentRect.width); if (height !== entry.contentRect.height) changeHeight(entry.contentRect.height); }); element && resizeObserver.observe(element); return () => element && resizeObserver.unobserve(element); }, [passedSettings, height, width, dimensions]); const newSettings = combineChartDimensions({ ...dimensions, width: dimensions.width || width, height: dimensions.height || height, }); return [ref, newSettings]; };