-
-
Notifications
You must be signed in to change notification settings - Fork 83
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
Follow system color scheme #210
Changes from all commits
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -593,19 +593,62 @@ export const AppContextProvider = ({ children }: AppContextProviderProps) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, []); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [colorMode, setColorMode] = useState<"light" | "dark">("light"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const calculateColorMode = useCallback(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (state._colorMode === "light" || state._colorMode === "dark") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setColorMode(state._colorMode); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return state._colorMode; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window.systemColorScheme?.value && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
["light", "dark"].includes(window.systemColorScheme?.value) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return window.systemColorScheme?.value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return window.matchMedia("(prefers-color-scheme: light)").matches | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? "light" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
: "dark"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, [state._colorMode]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [colorMode, setColorMode] = useState<"light" | "dark">( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
calculateColorMode() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setColorMode(calculateColorMode()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (state._colorMode === "system") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const themeListener = () => setColorMode(calculateColorMode()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const mql = window.matchMedia("(prefers-color-scheme: light)"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setColorMode(mql.matches ? "light" : "dark"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const themeListener = (e: MediaQueryListEvent) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setColorMode(e.matches ? "light" : "dark"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mql?.addEventListener("change", themeListener); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return () => mql?.removeEventListener("change", themeListener); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mql.addEventListener("change", themeListener); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window.systemColorSchemeCallbacks && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Array.isArray(window.systemColorSchemeCallbacks) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window.systemColorSchemeCallbacks.push(themeListener); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mql.removeEventListener("change", themeListener); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+621
to
+631
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. Ensure compatibility with older browsers for media query listeners The Here is how you can modify the code to support both methods: // Add event listener for theme changes
- mql.addEventListener("change", themeListener);
+ if (mql.addEventListener) {
+ mql.addEventListener("change", themeListener);
+ } else {
+ mql.addListener(themeListener);
+ } And in the cleanup function: // Remove event listener
- mql.removeEventListener("change", themeListener);
+ if (mql.removeEventListener) {
+ mql.removeEventListener("change", themeListener);
+ } else {
+ mql.removeListener(themeListener);
+ } This ensures compatibility with browsers that only support the older 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window.systemColorSchemeCallbacks && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Array.isArray(window.systemColorSchemeCallbacks) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window.systemColorSchemeCallbacks = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window.systemColorSchemeCallbacks.filter( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(cb) => cb !== themeListener | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, [state._colorMode, setColorMode]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, [state._colorMode, calculateColorMode]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
window.ReactNativeWebView?.postMessage( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JSON.stringify({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type: "color-mode", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value: colorMode, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, [colorMode]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const importAppState = useCallback((appState: AppState) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setStateRaw(appState); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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.
Specify function types explicitly instead of using
Function
Using
Function
as a type is discouraged because it lacks type safety and can lead to bugs. It's better to define the function type explicitly to ensure type safety.Apply this diff to fix the type definition:
This change defines
systemColorSchemeCallbacks
as an array of functions that take no arguments and return void, which aligns with the expected callback signature used in your code.📝 Committable suggestion
🧰 Tools
🪛 Biome (1.9.4)
[error] 36-36: Don't use 'Function' as a type.
Prefer explicitly define the function shape. This type accepts any function-like value, which can be a common source of bugs.
(lint/complexity/noBannedTypes)
🪛 eslint
[error] 36-36: Don't use
Function
as a type. TheFunction
type accepts any function-like value.It provides no type safety when calling the function, which can be a common source of bugs.
It also accepts things like class declarations, which will throw at runtime as they will not be called with
new
.If you are expecting the function to accept certain arguments, you should explicitly define the function shape.
(@typescript-eslint/ban-types)