-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[charts] Remove intrinsic size requirement #15471
Changes from 8 commits
0d7a441
5c258c0
a0e960a
f620c87
9f62e38
b110fd0
13a6ce8
38e2229
c282408
6ff7a2d
cf12e27
aee3572
ac93bca
3cae24c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,11 +4,9 @@ import * as React from 'react'; | |
import useEnhancedEffect from '@mui/utils/useEnhancedEffect'; | ||
import ownerWindow from '@mui/utils/ownerWindow'; | ||
|
||
export const useChartContainerDimensions = ( | ||
inWidth?: number, | ||
inHeight?: number, | ||
resolveSizeBeforeRender?: boolean, | ||
) => { | ||
const MAX_COMPUTE_RUN = 10; | ||
|
||
export const useChartContainerDimensions = (inWidth?: number, inHeight?: number) => { | ||
const hasInSize = inWidth !== undefined && inHeight !== undefined; | ||
const stateRef = React.useRef({ displayError: false, initialCompute: true, computeRun: 0 }); | ||
const rootRef = React.useRef<HTMLDivElement>(null); | ||
|
@@ -48,9 +46,8 @@ export const useChartContainerDimensions = ( | |
// computeRun is used to avoid infinite loops. | ||
if ( | ||
hasInSize || | ||
!resolveSizeBeforeRender || | ||
!stateRef.current.initialCompute || | ||
Comment on lines
48
to
49
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you don't need the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yep, had the commit ready, but there would be a lot of file changes Do you think we need a codemod? I don't think a lot of people would be using it 🙃 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added a BC to changelog/migration docs There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should be enough |
||
stateRef.current.computeRun > 20 | ||
stateRef.current.computeRun > MAX_COMPUTE_RUN | ||
) { | ||
return; | ||
} | ||
|
@@ -61,7 +58,7 @@ export const useChartContainerDimensions = ( | |
} else if (stateRef.current.initialCompute) { | ||
stateRef.current.initialCompute = false; | ||
} | ||
}, [width, height, computeSize, resolveSizeBeforeRender, hasInSize]); | ||
}, [width, height, computeSize, hasInSize]); | ||
|
||
useEnhancedEffect(() => { | ||
if (hasInSize) { | ||
|
@@ -111,15 +108,14 @@ export const useChartContainerDimensions = ( | |
stateRef.current.displayError = false; | ||
} | ||
} | ||
|
||
const finalWidth = inWidth ?? width; | ||
const finalHeight = inHeight ?? height; | ||
|
||
return { | ||
containerRef: rootRef, | ||
width: finalWidth, | ||
height: finalHeight, | ||
hasIntrinsicSize: Boolean(finalWidth && finalHeight), | ||
hasIntrinsicSize: Boolean(finalWidth > 0 && finalHeight > 0), | ||
JCQuintas marked this conversation as resolved.
Show resolved
Hide resolved
|
||
inWidth, | ||
inHeight, | ||
}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That let me think that the initial idea of this early return was to skip providers on first render.
If you have no width/height, you will have default width/height used to compute scales, coordinate, ... And when it renders, the
width
/height
get their real size and everything run a second time. The idea was to skip the useless step.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Providers are now on top of this component, since the datasource is the
<ChartDataProvider>
now. So I moved the check to theChartsSurface
. This means we can render the<svg/>
TAG on the first render, but everything else is only rendered if we have an intrinsic size