felicity-lims/webapp/composables/preferences.ts

60 lines
1.6 KiB
TypeScript
Raw Normal View History

import { toRefs, reactive } from 'vue';
2022-04-04 02:54:31 +08:00
const state = reactive({
departments: [],
theme: {
2023-04-10 09:29:10 +08:00
variant: 'light',
icon: 'sun',
},
2022-04-04 02:54:31 +08:00
expandedMenu: true,
});
2023-04-10 09:29:10 +08:00
export default function userPreferenceComposable() {
function changeTheme(theme: string): void {
2023-04-10 09:29:10 +08:00
if (theme === 'dark') {
localStorage.theme = 'dark';
2023-04-10 09:29:10 +08:00
document.documentElement.classList.add('dark');
} else {
localStorage.theme = 'light';
2023-04-10 09:29:10 +08:00
document.documentElement.classList.remove('dark');
}
2023-04-10 09:29:10 +08:00
}
2023-04-10 09:29:10 +08:00
function initPreferences(preference: any): void {
state.departments = preference.departments;
state.theme.variant = preference.theme;
state.theme.icon = preference.theme === 'light' ? 'sun' : 'moon';
state.expandedMenu = preference.expandedMenu;
2023-04-10 09:29:10 +08:00
changeTheme(preference.theme);
}
function toggleTheme(): void {
2023-04-10 09:29:10 +08:00
if (state.theme.variant === 'dark') {
state.theme.variant = 'light';
2023-04-10 09:29:10 +08:00
state.theme.icon = 'sun';
changeTheme('light');
} else {
state.theme.variant = 'dark';
state.theme.icon = 'moon';
changeTheme('dark');
}
}
function loadPreferedTheme() {
2023-04-10 09:29:10 +08:00
if ('theme' in localStorage) {
const theme = localStorage.getItem('theme') ?? 'light';
state.theme.variant = theme;
2023-04-10 09:29:10 +08:00
state.theme.icon = theme === 'light' ? 'sun' : 'moon';
}
2023-04-10 09:29:10 +08:00
changeTheme(state.theme.variant);
}
return {
2023-04-10 09:29:10 +08:00
...toRefs(state),
initPreferences,
loadPreferedTheme,
toggleTheme,
};
}