Skip to content

Commit 206fb17

Browse files
committed
fix: mode listeners not removed (again)
1 parent 23a40b7 commit 206fb17

File tree

2 files changed

+31
-23
lines changed

2 files changed

+31
-23
lines changed

packages/vuepress-theme-reco/components/Mode/ModePicker.vue

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
v-for="(mode, index) in modeOptions"
77
:key="index"
88
:class="getClass(mode.mode)"
9-
@click="selectMode(mode)"
9+
@click="selectMode(mode.mode)"
1010
>{{ mode.title }}</li>
1111
</ul>
1212
</div>
1313
</template>
1414

1515
<script>
16-
import setMode, { activateMode } from './setMode'
17-
16+
import setMode from './setMode'
1817
export default {
1918
name: 'ModeOptions',
2019
@@ -32,21 +31,17 @@ export default {
3231
mounted () {
3332
const mode = localStorage.getItem('mode')
3433
const { mode: customizeMode } = this.$themeConfig
35-
this.currentMode = mode === null ? customizeMode === undefined ? 'auto' : customizeMode : mode
36-
activateMode(this.currentMode)
34+
this.currentMode = mode ?? customizeMode ?? 'auto'
35+
setMode(this.currentMode)
3736
},
3837
3938
methods: {
4039
selectMode (mode) {
41-
if (mode.mode === this.currentMode) {
42-
return
43-
} else if (mode.mode === 'auto') {
44-
setMode()
45-
} else {
46-
activateMode(mode.mode)
40+
if (mode !== this.currentMode) {
41+
this.currentMode = mode
42+
setMode(mode)
43+
localStorage.setItem('mode', mode)
4744
}
48-
localStorage.setItem('mode', mode.mode)
49-
this.currentMode = mode.mode
5045
},
5146
getClass (mode) {
5247
return mode !== this.currentMode ? mode : `${mode} active`

packages/vuepress-theme-reco/components/Mode/setMode.js

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import modeOptions from './modeOptions'
22

3-
export function activateMode (mode) {
3+
function activateMode (mode) {
44
const rootElement = document.querySelector(':root')
55
const options = modeOptions[mode]
66

@@ -9,23 +9,36 @@ export function activateMode (mode) {
99
}
1010
}
1111

12+
// Dark and Light autoswitches
13+
const onDark = (e) => e.matches && activateMode('dark')
14+
const onLight = (e) => e.matches && activateMode('light')
15+
16+
const darkScheme = window.matchMedia('(prefers-color-scheme: dark)')
17+
const lightScheme = window.matchMedia('(prefers-color-scheme: light)')
18+
1219
/**
1320
* Sets a color scheme for the website.
14-
* If browser supports "prefers-color-scheme" it will respect the setting for light or dark mode
21+
* If browser supports "prefers-color-scheme", 'auto' mode will respect the setting for light or dark mode
1522
* otherwise it will set a dark theme during night time
1623
*/
17-
export default function setMode () {
18-
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
19-
const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
20-
const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches
21-
const hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified
24+
export default function setMode (mode = 'auto') {
25+
if (mode !== 'auto') {
26+
darkScheme.removeListener(onDark)
27+
lightScheme.removeListener(onLight)
28+
activateMode(mode)
29+
return
30+
}
2231

23-
window.matchMedia('(prefers-color-scheme: dark)').addListener(e => e.matches && activateMode('dark'))
24-
window.matchMedia('(prefers-color-scheme: light)').addListener(e => e.matches && activateMode('light'))
32+
darkScheme.addListener(onDark)
33+
lightScheme.addListener(onLight)
34+
35+
const isDarkMode = darkScheme.matches
36+
const isLightMode = lightScheme.matches
2537

2638
if (isDarkMode) activateMode('dark')
2739
if (isLightMode) activateMode('light')
28-
if (isNotSpecified || hasNoSupport) {
40+
41+
if (!isDarkMode && !isLightMode) {
2942
console.log('You specified no preference for a color scheme or your browser does not support it. I schedule dark mode during night time.')
3043
const now = new Date()
3144
const hour = now.getHours()

0 commit comments

Comments
 (0)