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

fix(dark-mode): avoid localStorage overwrite by system dark mode status #636

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

qwqcode
Copy link

@qwqcode qwqcode commented Sep 17, 2024

Problem Description

While using useDarkMode, I noticed that after refreshing the page, the value saved in localStorage does not take effect (observing that localStorage is always overwritten by the current system's dark mode status), even though I set the initializeWithValue option to true (the documentation states, "If true (default), the hook will initialize by reading localStorage").

Cause of the Issue

The value saved in localStorage does not take effect on the next page load because the value retrieved by const isDarkOS = useMediaQuery() immediately overwrites the result read from useLocalStorage() when the useDarkMode hook initializes (since useIsomorphicLayoutEffect executes immediately). This behavior is unexpected, causing the functionality of saving the dark mode state to localStorage to fail.

Fix

Add const allowDarkOSChange = useIsMounted(). Before the page is mounted, prevent applying the dark mode result from isDarkOS, rather than immediately executing and overwriting the value from localStorage.

Test cases have been added to verify the existence of this issue, and the problem was confirmed. The code modification has passed the tests successfully.

fixes #512

Copy link

changeset-bot bot commented Sep 17, 2024

🦋 Changeset detected

Latest commit: bd1cd0c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
usehooks-ts Patch
www Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link

@adamwdennis adamwdennis left a comment

Choose a reason for hiding this comment

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

LGTM

@adamwdennis
Copy link

@qwqcode this needs a changeset

Copy link

@JamesWatling JamesWatling left a comment

Choose a reason for hiding this comment

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

Yes this helps so much!

@qwqcode
Copy link
Author

qwqcode commented Oct 11, 2024

@qwqcode this needs a changeset

Got it, I added it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

useDarkMode resets
3 participants