Nowadays well-known @material-ui is a legacy package, and all it’s components were migrated to new @mui package. Previous is no longer maintainable, and new components appear only in @mui. So, it’s reasonable question for everyone: How to migrate to the new package?
I have an answer) Of course, my thoughts were, that process shouldn’t be as complex, because this is a routine for thousands of developers. Also, mui-team wrote some instructions for migrations here and here. They works well if to follow, but with case, when you often use such construction as makeStyles/withStyles
around your project and use redefined commercial theme (as minimal.cc in my case), you may encounter some difficulties. That’s my story down below…
## No more makeStyles
available
In a few words, developers decided to use styled
lib in basement, and marked previous systems with classes
and makeStyles
as legacy. Of course, this method have a lot of advantages, but if you have a lot of usages of legacy code, you need make them to work, at least.
Thanks for developers team, they left a loophole for using legacy. Package @mui/styles should help.
The biggest trap is that definition for makeStyles
is still available in @mui/material
, but it returns some kind of shit with never
type and looks more like a stub.
Here pictures about what I mean:
## Your bro makeStyles
## Not your bro @mui/material/styles.makeStyles, returning never
So, in components you should use makeStyles
only from @mui/styles
after migration, this is the rule!
### Connecting theme overrides for material
Guide about redefining of material components available here and very simple. But, of course, with legacy – it is not as simple as in case using styled
.
As answers that I googled said, I should just replace some basic constructions with theme overrides attachments like that:
And, as you remember, in components I should use only makeStyles
from @mui/styles
. And thats the problem – looks like those packages not synchronized, and in this case I get styles overrides components on theme level (with createTheme
), but in makeStyles
I get theme
as empty object, and I can’t use any utilities or patterns or whatever:
And I get not cached exceptions and non working project at all. And it makes me sad.
But we have an ability to import ThemeProvider
from @mui/styles
also, and in this case I got correct theme
variable with all what I need in withStyles
of component, but, unfortunately, I lost all my basic themes overrides:
### Default button without any styles, that indicates that i lost all theme overrides 🙁
### But look what I got instead 🙂
### Final
So, the only decision that I’ve found is to use both of ThemeProvider
like so:
Everything works fine, in future, you can use both methods of components decorations, but I would prefer to use styled
as common one. And, of course, after all those manipulations you can remove outdated package @material-ui
from your project. You are awesome 🙂