mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-02-23 06:19:38 +08:00
102 lines
2.2 KiB
JavaScript
102 lines
2.2 KiB
JavaScript
import Emitter from "./emitter";
|
|
import { load, store } from "./storage";
|
|
|
|
const SETTINGS_KEY = "settings";
|
|
|
|
export const EDITOR_FONT_SIZE = {
|
|
normal: 14,
|
|
large: 16,
|
|
};
|
|
|
|
export const EDITOR_MODE = {
|
|
default: "default",
|
|
emacs: "emacs",
|
|
vim: "vim",
|
|
};
|
|
|
|
export const EDITOR_THEME = {
|
|
default: "default",
|
|
light: "light",
|
|
};
|
|
|
|
const DEFAULTSETTINGS = {
|
|
editor_auto_completion: true,
|
|
editor_auto_signature: true,
|
|
editor_font_size: EDITOR_FONT_SIZE.normal,
|
|
editor_theme: EDITOR_THEME.default,
|
|
editor_ligatures: false,
|
|
editor_markdown_word_wrap: true,
|
|
editor_mode: EDITOR_MODE.default,
|
|
custom_view_show_section: true,
|
|
custom_view_show_markdown: true,
|
|
custom_view_show_output: true,
|
|
custom_view_spotlight: false,
|
|
};
|
|
|
|
/**
|
|
* Stores local configuration and persists it across browser sessions.
|
|
*/
|
|
class SettingsStore {
|
|
/** @private */
|
|
_onChange = new Emitter();
|
|
|
|
constructor() {
|
|
this.settings = DEFAULTSETTINGS;
|
|
|
|
this.loadSettings();
|
|
}
|
|
|
|
/**
|
|
* Returns the current settings.
|
|
*/
|
|
get() {
|
|
return this.settings;
|
|
}
|
|
|
|
/**
|
|
* Stores new settings.
|
|
*
|
|
* The given attributes are merged into the current settings.
|
|
*/
|
|
update(newSettings) {
|
|
const prevSettings = this.settings;
|
|
this.settings = { ...this.settings, ...newSettings };
|
|
this._onChange.dispatch(this.settings, prevSettings);
|
|
this.storeSettings();
|
|
}
|
|
|
|
/**
|
|
* Registers to settings changes.
|
|
*
|
|
* The given function is called immediately with the current
|
|
* settings and then on every change.
|
|
*
|
|
* Returns a subscription object with `destroy` method that
|
|
* unsubscribes from changes.
|
|
*/
|
|
getAndSubscribe(callback) {
|
|
callback(this.settings);
|
|
return this._onChange.addListener(callback);
|
|
}
|
|
|
|
/** @private */
|
|
loadSettings() {
|
|
const settings = load(SETTINGS_KEY);
|
|
|
|
if (settings) {
|
|
// Rewrite settings for backward compatibility
|
|
if (!Object.values(EDITOR_THEME).includes(settings.editor_theme)) {
|
|
delete settings.editor_theme;
|
|
}
|
|
|
|
this.settings = { ...this.settings, ...settings };
|
|
}
|
|
}
|
|
|
|
/** @private */
|
|
storeSettings() {
|
|
store(SETTINGS_KEY, this.settings);
|
|
}
|
|
}
|
|
|
|
export const settingsStore = new SettingsStore();
|