Skip to content
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

[useMediaQuery] Fix hydrationCompleted true before hydrated #18683

Merged

Conversation

toddmazierski
Copy link
Contributor

@toddmazierski toddmazierski commented Dec 4, 2019

Fix a bug where the hydrationCompleted variable in useMediaQuery()
can be set to true before all components in the document are actually
hydrated.

Apply the patch suggested in #18670 that removes this optimization in
favor of more consistent rendering behavior.

Modify the test for this optimization to check for its absence, and
elsewhere, remove the use of the testReset() test helper function.

Closes #18670

Fix a bug where the `hydrationCompleted` variable in `useMediaQuery()`
can be set to `true` before all components in the document are actually
hydrated.

Apply the patch suggested in mui#18670 that removes this optimization in
favor of more consistent rendering behavior.

Modify the test for this optimization to check for its absence, and
elsewhere, remove the use of the `testReset()` test helper function.
@oliviertassinari oliviertassinari changed the title [useMediaQuery] hydrationCompleted true before hydrated [useMediaQuery] Fix hydrationCompleted true before hydrated Dec 4, 2019
@mui-pr-bot
Copy link

Details of bundle changes.

Comparing: dfe2779...afdffe5

bundle Size Change Size Gzip Change Gzip
@material-ui/core[umd] ▼ -21 B (-0.01% ) 311 kB ▼ -16 B (-0.02% ) 89.6 kB
docs.main ▼ -18 B (-0.00% ) 609 kB ▼ -10 B (-0.01% ) 194 kB
@material-ui/core ▼ -14 B (-0.00% ) 354 kB ▼ -15 B (-0.02% ) 96.7 kB
Hidden ▼ -14 B (-0.02% ) 64.8 kB ▼ -11 B (-0.05% ) 20.2 kB
useMediaQuery ▼ -14 B (-0.56% ) 2.47 kB ▼ -10 B (-0.96% ) 1.04 kB
@material-ui/lab -- 173 kB -- 52.2 kB
@material-ui/styles -- 51 kB -- 15.3 kB
@material-ui/system -- 14.8 kB -- 4.06 kB
AppBar -- 62.7 kB -- 19.5 kB
Autocomplete -- 127 kB -- 39.7 kB
Avatar -- 61.7 kB -- 19.3 kB
Backdrop -- 66.6 kB -- 20.5 kB
Badge -- 64.2 kB -- 19.9 kB
BottomNavigation -- 61.3 kB -- 19.1 kB
BottomNavigationAction -- 74.3 kB -- 23.4 kB
Box -- 69.6 kB -- 21 kB
Breadcrumbs -- 66.9 kB -- 20.8 kB
Button -- 78.3 kB -- 23.9 kB
ButtonBase -- 72.8 kB -- 22.7 kB
ButtonGroup -- 80.9 kB -- 24.8 kB
Card -- 61.6 kB -- 19.2 kB
CardActionArea -- 73.9 kB -- 23.2 kB
CardActions -- 60.9 kB -- 19 kB
CardContent -- 60.9 kB -- 19 kB
CardHeader -- 64 kB -- 20 kB
CardMedia -- 61.2 kB -- 19.2 kB
Checkbox -- 80.6 kB -- 25.3 kB
Chip -- 81.4 kB -- 24.8 kB
CircularProgress -- 63 kB -- 19.8 kB
ClickAwayListener -- 3.87 kB -- 1.56 kB
Collapse -- 66.8 kB -- 20.6 kB
colorManipulator -- 3.85 kB -- 1.52 kB
Container -- 62 kB -- 19.3 kB
CssBaseline -- 56.4 kB -- 17.6 kB
Dialog -- 81.5 kB -- 25.4 kB
DialogActions -- 61 kB -- 19 kB
DialogContent -- 61.1 kB -- 19.1 kB
DialogContentText -- 62.9 kB -- 19.7 kB
DialogTitle -- 63.2 kB -- 19.7 kB
Divider -- 61.5 kB -- 19.2 kB
docs.landing -- 52.4 kB -- 11.4 kB
Drawer -- 83.2 kB -- 25.2 kB
ExpansionPanel -- 70.1 kB -- 21.8 kB
ExpansionPanelActions -- 61 kB -- 19 kB
ExpansionPanelDetails -- 60.8 kB -- 19 kB
ExpansionPanelSummary -- 76.9 kB -- 24.2 kB
Fab -- 75.6 kB -- 23.5 kB
Fade -- 22.4 kB -- 7.71 kB
FilledInput -- 72.3 kB -- 22.4 kB
FormControl -- 63.3 kB -- 19.6 kB
FormControlLabel -- 64.4 kB -- 20.1 kB
FormGroup -- 60.9 kB -- 19 kB
FormHelperText -- 62.1 kB -- 19.4 kB
FormLabel -- 62.4 kB -- 19.2 kB
Grid -- 64 kB -- 20 kB
GridList -- 61.4 kB -- 19.2 kB
GridListTile -- 62.6 kB -- 19.5 kB
GridListTileBar -- 62.1 kB -- 19.3 kB
Grow -- 23.1 kB -- 7.83 kB
Icon -- 61.7 kB -- 19.2 kB
IconButton -- 75 kB -- 23.3 kB
Input -- 71.3 kB -- 22.1 kB
InputAdornment -- 64 kB -- 20 kB
InputBase -- 69.4 kB -- 21.7 kB
InputLabel -- 64.2 kB -- 20 kB
LinearProgress -- 64.2 kB -- 20 kB
Link -- 65.5 kB -- 20.6 kB
List -- 61.3 kB -- 19 kB
ListItem -- 75.9 kB -- 23.6 kB
ListItemAvatar -- 61 kB -- 19 kB
ListItemIcon -- 61.1 kB -- 19 kB
ListItemSecondaryAction -- 60.9 kB -- 19 kB
ListItemText -- 63.8 kB -- 19.9 kB
ListSubheader -- 61.6 kB -- 19.3 kB
Menu -- 87.1 kB -- 26.8 kB
MenuItem -- 77 kB -- 23.9 kB
MenuList -- 64.9 kB -- 20.2 kB
MobileStepper -- 66.6 kB -- 20.8 kB
Modal -- 14.2 kB -- 4.99 kB
NativeSelect -- 75.6 kB -- 23.7 kB
NoSsr -- 2.19 kB -- 1.03 kB
OutlinedInput -- 72.8 kB -- 22.6 kB
Paper -- 61.1 kB -- 19 kB
Popover -- 81.5 kB -- 25.1 kB
Popper -- 28.6 kB -- 10.2 kB
Portal -- 2.87 kB -- 1.29 kB
Radio -- 81.5 kB -- 25.6 kB
RadioGroup -- 62.1 kB -- 19.4 kB
Rating -- 68.9 kB -- 22.1 kB
RootRef -- 4.43 kB -- 1.67 kB
Select -- 113 kB -- 33.5 kB
Skeleton -- 61.4 kB -- 19.3 kB
Slide -- 24.5 kB -- 8.32 kB
Slider -- 74.5 kB -- 23.3 kB
Snackbar -- 76 kB -- 23.7 kB
SnackbarContent -- 64.5 kB -- 20.2 kB
SpeedDial -- 84.9 kB -- 26.7 kB
SpeedDialAction -- 115 kB -- 36.5 kB
SpeedDialIcon -- 63.5 kB -- 19.9 kB
Step -- 61.5 kB -- 19.2 kB
StepButton -- 81.1 kB -- 25.5 kB
StepConnector -- 61.6 kB -- 19.3 kB
StepContent -- 67.9 kB -- 21.2 kB
StepIcon -- 63.5 kB -- 19.7 kB
StepLabel -- 67.5 kB -- 21.1 kB
Stepper -- 63.6 kB -- 20 kB
styles/createMuiTheme -- 15.6 kB -- 5.47 kB
SvgIcon -- 61.9 kB -- 19.3 kB
SwipeableDrawer -- 90.6 kB -- 28 kB
Switch -- 80 kB -- 25 kB
Tab -- 75.2 kB -- 23.7 kB
Table -- 61.4 kB -- 19.2 kB
TableBody -- 61 kB -- 19 kB
TableCell -- 62.9 kB -- 19.7 kB
TableFooter -- 61 kB -- 19 kB
TableHead -- 61 kB -- 19 kB
TablePagination -- 140 kB -- 40.7 kB
TableRow -- 61.4 kB -- 19.1 kB
TableSortLabel -- 76.2 kB -- 23.9 kB
Tabs -- 84.3 kB -- 26.5 kB
TextareaAutosize -- 5.06 kB -- 2.11 kB
TextField -- 122 kB -- 35.5 kB
ToggleButton -- 75 kB -- 23.7 kB
ToggleButtonGroup -- 62.1 kB -- 19.4 kB
Toolbar -- 61.2 kB -- 19.1 kB
Tooltip -- 99.4 kB -- 31.4 kB
TreeItem -- 72.5 kB -- 22.8 kB
TreeView -- 65.3 kB -- 20.4 kB
Typography -- 62.5 kB -- 19.5 kB
useAutocomplete -- 12.4 kB -- 4.56 kB
Zoom -- 22.5 kB -- 7.71 kB

Generated by 🚫 dangerJS against afdffe5

@oliviertassinari
Copy link
Member

@toddmazierski It's a great first pull request on Material-UI 👌🏻. Thank you for working on it!

@@ -54,7 +51,6 @@ function useMediaQuery(queryInput, options = {}) {

React.useEffect(() => {
let active = true;
hydrationCompleted = true;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the depth-first use effect would "complete" hydration for everyone.
This flag could be set only on top level component as long as its useEffect would be called after all children ones.

Copy link
Member

@oliviertassinari oliviertassinari May 25, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@theKashey Interesting, a top-level use effect could be a good edge in case progressive hydration https://youtu.be/k-A2VfuUROg?t=993 come officially to React 😁.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using the hack from the video for last two years (well used a bit less performant hack before)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I start to think that we need a second top-level Provider for Material-UI (in addition to ThemeProvider), maybe a ConfigProvider that bundles different concerns so we don't end up with this API, but we can still use different context internally:

How
 Many
   Providers
     Until
       We
         Say
          It's   
            Enough?

A provider that could host:

cc @mui-org/core

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using the hack from the video for last two years (well used a bit less performant hack before)

Oh, so the useEffect at the root is a dead end? Each partially hydrated tree would need its own provider. I think that we can stick to the noSsr boolean, simpler.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, so the useEffect at the root is a dead end?

No-no, it works just perfectly. And the additional Provider to update SSR status would be just great.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug 🐛 Something doesn't work hook: useMediaQuery
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[useMediaQuery] hydrationCompleted is true before hydrated
4 participants