DEV Community

Cover image for A UseDarkMode react hook for everyone!

A UseDarkMode react hook for everyone!

Will Holmes on May 23, 2022

So a while ago I came across an issue whilst developing. I was creating a solution in nextjs with typescript and using tailwind to help with my cs...
Collapse
 
kamil7x profile image
Kamil Trusiak

For general use, it's okay to rely on media query.

But in case of Tailwind, it also has option to set dark mode manually, by using dark class on parent element. tailwindcss.com/docs/dark-mode

I think it would be nice to include this case (maybe some configuration option?)

Collapse
 
willholmes profile image
Will Holmes

I'm not sure I follow. So above you'll see how I demonstrate the usage of the dark class. But this hook allows you to get the exact value that the dark class will use, just in your react code as well.

Collapse
 
kamil7x profile image
Kamil Trusiak

You can change tailwind config to darkMode: 'class' and then you can use <body class="dark"> to set dark mode regardless of user's prefers-color-scheme value.

Here you have an example play.tailwindcss.com/nQueSOesIA

In this case your hook might report incorrect value.

Collapse
 
tzwel profile image
tzwel

holy shit does tailwind always look like this?

Collapse
 
kamil7x profile image
Kamil Trusiak

No, I just used black and white, because didn't want to think too much about it

Thread Thread
 
tzwel profile image
tzwel

i meant the syntax

Thread Thread
 
kamil7x profile image
Kamil Trusiak

Yes. It's a set of utility classes. It has also possibility to configure values for default classes and create classes on the fly. But the latter isn't used very frequently in my opinion.

Thread Thread
 
tzwel profile image
tzwel

bruh

Collapse
 
bryce profile image
Bryce Dorn

Looks good! May want to add a cleanup function with a removeEventListener though?

Collapse
 
willholmes profile image
Will Holmes

Yep! On the todo :)

Collapse
 
raaynaldo profile image
Raynaldo Sutisna

I'm sorry I don't really understand, but I'm curious why we need a cleanup function here?

Collapse
 
bryce profile image
Bryce Dorn

It prevents memory leaks in older browsers; if the hook is rendered and later removed the event listener in some cases will still remain. Garbage collection has improved over the years but browsers like IE haven't received these updates so it's good to manually remove event listeners for consistent behavior.

Thread Thread
 
willholmes profile image
Will Holmes

Thanks for the suggestion Bryce, this has been added in the latest version 1.0.2

Thread Thread
 
raaynaldo profile image
Raynaldo Sutisna

Oh I see. Thanks Bryce! You were refering to the npm package? I thought you were refering to the code snippet in this blog. Thanks for the explanation. I was wondering why we need cleanup function for hook