|
1 |
| -import { h, FC, useEffect, useState } from 'renderer' |
| 1 | +import { h, FC, useEffect, useState, useCallback } from 'renderer' |
2 | 2 | import inView from 'element-in-view'
|
3 | 3 | import { InstanceOptions } from '../docup'
|
4 | 4 | import { Navbar } from './Navbar'
|
@@ -103,16 +103,34 @@ export const App: FC<{ options: InstanceOptions }> = ({ options }) => {
|
103 | 103 | }, [])
|
104 | 104 |
|
105 | 105 | useEffect(() => {
|
106 |
| - if (options.useSystemTheme !== false) { |
107 |
| - if (window.matchMedia('(prefers-color-scheme: dark)').matches) { |
108 |
| - document.documentElement.classList.add('dark') |
109 |
| - } |
110 |
| - } |
111 | 106 | // Update location.hash on scrolling
|
112 | 107 | window.addEventListener('scroll', handleScroll)
|
113 | 108 | return () => window.removeEventListener('scroll', handleScroll)
|
114 | 109 | }, [])
|
115 | 110 |
|
| 111 | + const mediaQuery = '(prefers-color-scheme: dark)' |
| 112 | + const updateDarkModeClass = useCallback(() => { |
| 113 | + if (options.useSystemTheme === false) return |
| 114 | + |
| 115 | + if (window.matchMedia(mediaQuery).matches) { |
| 116 | + document.documentElement.classList.add('dark') |
| 117 | + } else { |
| 118 | + document.documentElement.classList.remove('dark') |
| 119 | + } |
| 120 | + }, [options.useSystemTheme]) |
| 121 | + |
| 122 | + useEffect(() => { |
| 123 | + updateDarkModeClass() |
| 124 | + |
| 125 | + const listener = () => updateDarkModeClass() |
| 126 | + const m = window.matchMedia(mediaQuery) |
| 127 | + m.addEventListener('change', listener) |
| 128 | + |
| 129 | + return () => { |
| 130 | + m.removeEventListener('change', listener) |
| 131 | + } |
| 132 | + }, []) |
| 133 | + |
116 | 134 | return (
|
117 | 135 | <div>
|
118 | 136 | {showSidebar && (
|
|
0 commit comments