114 lines
2.7 KiB
JavaScript
114 lines
2.7 KiB
JavaScript
|
import storage from "./localStorage";
|
||
|
import socket from "./socket";
|
||
|
import {config, createState} from "./settings";
|
||
|
|
||
|
export function createSettingsStore(store) {
|
||
|
return {
|
||
|
namespaced: true,
|
||
|
state: assignStoredSettings(createState(), loadFromLocalStorage()),
|
||
|
mutations: {
|
||
|
set(state, {name, value}) {
|
||
|
state[name] = value;
|
||
|
},
|
||
|
},
|
||
|
actions: {
|
||
|
syncAll({state}, force = false) {
|
||
|
if (state.syncSettings === false && force === false) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
store.commit("serverHasSettings", true);
|
||
|
|
||
|
for (const name in state) {
|
||
|
if (config[name].sync !== "never" || config[name].sync === "always") {
|
||
|
socket.emit("setting:set", {name, value: state[name]});
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
applyAll({state}) {
|
||
|
for (const settingName in config) {
|
||
|
config[settingName].apply(store, state[settingName], true);
|
||
|
}
|
||
|
},
|
||
|
update({state, commit}, {name, value, sync = false}) {
|
||
|
if (state[name] === value) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const settingConfig = config[name];
|
||
|
|
||
|
// Trying to update a non existing setting (e.g. server has an old key)
|
||
|
if (!settingConfig) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
sync === false &&
|
||
|
(state.syncSettings === false || settingConfig.sync === "never")
|
||
|
) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
commit("set", {name, value});
|
||
|
storage.set("settings", JSON.stringify(state));
|
||
|
settingConfig.apply(store, value);
|
||
|
|
||
|
if (!sync) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
(state.syncSettings && settingConfig.sync !== "never") ||
|
||
|
settingConfig.sync === "always"
|
||
|
) {
|
||
|
socket.emit("setting:set", {name, value});
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function loadFromLocalStorage() {
|
||
|
let storedSettings;
|
||
|
|
||
|
try {
|
||
|
storedSettings = JSON.parse(storage.get("settings"));
|
||
|
} catch (e) {
|
||
|
storage.remove("settings");
|
||
|
}
|
||
|
|
||
|
if (!storedSettings) {
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
// Older The Lounge versions converted highlights to an array, turn it back into a string
|
||
|
if (storedSettings.highlights !== null && typeof storedSettings.highlights === "object") {
|
||
|
storedSettings.highlights = storedSettings.highlights.join(", ");
|
||
|
}
|
||
|
|
||
|
return storedSettings;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Essentially Object.assign but does not overwrite and only assigns
|
||
|
* if key exists in both supplied objects and types match
|
||
|
*
|
||
|
* @param {object} defaultSettings
|
||
|
* @param {object} storedSettings
|
||
|
*/
|
||
|
function assignStoredSettings(defaultSettings, storedSettings) {
|
||
|
const newSettings = {...defaultSettings};
|
||
|
|
||
|
for (const key in defaultSettings) {
|
||
|
// Make sure the setting in local storage has the same type that the code expects
|
||
|
if (
|
||
|
typeof storedSettings[key] !== "undefined" &&
|
||
|
typeof defaultSettings[key] === typeof storedSettings[key]
|
||
|
) {
|
||
|
newSettings[key] = storedSettings[key];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return newSettings;
|
||
|
}
|