49 lines
1.2 KiB
JavaScript
Executable File
49 lines
1.2 KiB
JavaScript
Executable File
import { getItem, setItem } from 'fp-ts-local-storage';
|
|
import { constant, constVoid } from 'fp-ts/lib/function';
|
|
import { getOrElse, none, some } from 'fp-ts/lib/Option';
|
|
import { provide, shallowRef, watch } from 'vue';
|
|
export const DEFAULT_THEME_INJECTION = {
|
|
currentTheme: shallowRef(none),
|
|
isThemeable: shallowRef(false),
|
|
setTheme: constVoid
|
|
};
|
|
export const THEME_INJECTION_SYMBOL = Symbol('theme');
|
|
const persistentTheme = getOrElse(constant('dark'))(getItem('theme')());
|
|
export const ProvideThemePropDefinitions = {
|
|
isThemeable: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
persistTheme: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
};
|
|
export function provideTheme(props) {
|
|
const isThemeable = shallowRef(props.isThemeable);
|
|
watch(() => props.isThemeable, themeable => {
|
|
isThemeable.value = themeable;
|
|
});
|
|
const currentTheme = shallowRef(some(persistentTheme));
|
|
|
|
function setTheme(newTheme) {
|
|
currentTheme.value = some(newTheme);
|
|
|
|
if (props.persistTheme) {
|
|
setItem('theme', newTheme)();
|
|
}
|
|
}
|
|
|
|
const injection = {
|
|
isThemeable,
|
|
currentTheme,
|
|
setTheme
|
|
};
|
|
provide(THEME_INJECTION_SYMBOL, injection);
|
|
return {
|
|
setTheme,
|
|
currentTheme,
|
|
isThemeable
|
|
};
|
|
}
|
|
//# sourceMappingURL=provideTheme.js.map
|