mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-09-27 15:05:38 -04:00

the #shared alias used by Nuxt cannot be easily disabled and to prevent breackage with jiti, we make use of it
79 lines
1.8 KiB
TypeScript
79 lines
1.8 KiB
TypeScript
import { useCookie } from 'nuxt/app';
|
|
import { computed, onMounted } from 'vue';
|
|
|
|
import { useHead } from '#imports';
|
|
import { sessionCookieSetting } from '#shared/cookieSettings.ts';
|
|
import { useMainStore } from '~/store/index.ts';
|
|
|
|
export type Mode = 'light' | 'dark' | 'automatic';
|
|
|
|
export default () => {
|
|
const store = useMainStore();
|
|
useHead(() => {
|
|
if (store.darkMode) {
|
|
return {
|
|
bodyAttrs: {
|
|
'data-theme': 'dark',
|
|
'data-bs-theme': 'dark',
|
|
},
|
|
};
|
|
} else {
|
|
return {};
|
|
}
|
|
});
|
|
|
|
const darkModeCookie = useCookie<boolean>('darkMode', sessionCookieSetting);
|
|
store.darkMode = darkModeCookie.value;
|
|
|
|
const isDark = computed({
|
|
get() {
|
|
return store.darkMode;
|
|
},
|
|
set(darkMode) {
|
|
store.darkMode = darkMode;
|
|
darkModeCookie.value = darkMode;
|
|
},
|
|
});
|
|
|
|
const getMode = (): Mode => {
|
|
if (!import.meta.client) {
|
|
return 'automatic';
|
|
}
|
|
|
|
return localStorage.getItem('mode') as Mode | null || 'automatic';
|
|
};
|
|
const setMode = (mode: Mode): void => {
|
|
if (!import.meta.client) {
|
|
return;
|
|
}
|
|
|
|
localStorage.setItem('mode', mode);
|
|
};
|
|
|
|
const detectDark = (): boolean => {
|
|
if (!import.meta.client) {
|
|
return false;
|
|
}
|
|
|
|
switch (getMode()) {
|
|
case 'light':
|
|
return false;
|
|
case 'dark':
|
|
return true;
|
|
case 'automatic':
|
|
default:
|
|
return window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
}
|
|
};
|
|
onMounted(() => {
|
|
isDark.value = detectDark();
|
|
});
|
|
|
|
return {
|
|
getMode,
|
|
setMode,
|
|
detectDark,
|
|
isDark,
|
|
};
|
|
};
|