Skip to content

Commit 4aaf1fb

Browse files
committed
feat: Support to custom storage
1 parent ef91af5 commit 4aaf1fb

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

src/DarkMode.vue

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
</template>
1616

1717
<script>
18+
import {
19+
storage,
20+
getMediaQueryList
21+
} from './utils'
22+
1823
export default {
1924
name: 'DarkMode',
2025
@@ -34,7 +39,7 @@ export default {
3439
default: '%cm-mode'
3540
},
3641
storage: {
37-
type: String,
42+
type: [String, Object],
3843
default: 'localStorage'
3944
},
4045
metaThemeColor: {
@@ -70,7 +75,7 @@ export default {
7075
const colorSchemeTypes = ['dark', 'light']
7176
let colorScheme = null
7277
colorSchemeTypes.forEach(type => {
73-
if (this.getMediaQueryList(type).matches) {
78+
if (getMediaQueryList(type).matches) {
7479
colorScheme = type
7580
}
7681
})
@@ -90,8 +95,12 @@ export default {
9095
return this.modes[currentIndex === (this.modes.length - 1) ? 0 : currentIndex + 1]
9196
},
9297
98+
getStorage () {
99+
return storage(this.storage)
100+
},
101+
93102
getStorageColorMode () {
94-
return window[this.storage].getItem('colorMode')
103+
return this.getStorage.getItem('colorMode')
95104
},
96105
97106
isSystem () {
@@ -111,7 +120,7 @@ export default {
111120
112121
mounted () {
113122
this.metaThemeColorElement = document.querySelector('meta[name="theme-color"]')
114-
this.listenerDark = this.getMediaQueryList('dark')
123+
this.listenerDark = getMediaQueryList('dark')
115124
this.listenerDark.addListener(this.handlePreferColorScheme)
116125
this.toggleFavicon(this.getPrefersColorScheme)
117126
},
@@ -123,16 +132,12 @@ export default {
123132
methods: {
124133
setMode (chosenMode) {
125134
this.chosenMode = chosenMode
126-
window[this.storage].setItem('colorMode', this.chosenMode)
135+
this.getStorage.setItem('colorMode', this.chosenMode)
127136
this.handleColorModeClass('add')
128137
if (Object.keys(this.metaThemeColor).length) this.setMetaThemeColor(this.metaThemeColor[this.currentMode] || this.metaThemeColor[this.getPrefersColorScheme])
129138
this.$emit('change-mode', this.chosenMode)
130139
},
131140
132-
getMediaQueryList (type) {
133-
return window.matchMedia(`(prefers-color-scheme: ${type})`)
134-
},
135-
136141
setMetaThemeColor (color) {
137142
if (color) {
138143
this.$nextTick(() => {

src/utils.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export const storage = storage => {
2+
if (typeof storage !== 'string') return storage
3+
return {
4+
getItem: key => window[storage].getItem(key),
5+
setItem: (key, value) => window[storage].setItem(key, value)
6+
}
7+
}
8+
9+
export function getMediaQueryList (type) {
10+
return window.matchMedia(`(prefers-color-scheme: ${type})`)
11+
}

0 commit comments

Comments
 (0)