feat: extracted theme change logic
This commit is contained in:
46
src/use/theme.js
Normal file
46
src/use/theme.js
Normal file
@@ -0,0 +1,46 @@
|
||||
import { ref, watch } from '@vue/composition-api'
|
||||
|
||||
/**
|
||||
* @typedef {string} Theme
|
||||
*/
|
||||
|
||||
const THEMES = {
|
||||
dark: 'dark',
|
||||
light: 'light',
|
||||
purple: 'purple'
|
||||
}
|
||||
|
||||
const initialTheme = localStorage.getItem('selectedTheme') || document.documentElement.dataset.theme || THEMES.dark
|
||||
const currentTheme = ref(initialTheme)
|
||||
|
||||
watch(currentTheme, (newTheme, oldTheme) => {
|
||||
// No operation needed
|
||||
if (oldTheme === newTheme) return
|
||||
|
||||
localStorage.setItem('selectedTheme', newTheme)
|
||||
document.documentElement.dataset.theme = newTheme
|
||||
|
||||
animateAllElements()
|
||||
})
|
||||
|
||||
function animateAllElements() {
|
||||
// Animating everything to have a smoother theme switch
|
||||
const allElements = document.querySelectorAll('*')
|
||||
|
||||
allElements.forEach(el => {
|
||||
el.classList.add('changing-theme')
|
||||
})
|
||||
|
||||
document.documentElement.addEventListener('transitionend', function transitionHandler() {
|
||||
allElements.forEach(el => {
|
||||
el.classList.remove('changing-theme')
|
||||
})
|
||||
|
||||
document.documentElement.removeEventListener('transitionend', transitionHandler)
|
||||
})
|
||||
}
|
||||
|
||||
export const useTheme = () => ({
|
||||
THEMES,
|
||||
currentTheme
|
||||
})
|
||||
Reference in New Issue
Block a user