2024-05-17 03:27:28 +08:00
|
|
|
import { makeVar } from '@apollo/client';
|
2024-05-17 20:21:20 +08:00
|
|
|
import { isEmpty } from 'radash';
|
2024-04-11 23:03:25 +08:00
|
|
|
import LocalStorage from '/imports/ui/services/storage/local';
|
|
|
|
import SessionStorage from '/imports/ui/services/storage/session';
|
2024-05-17 20:21:20 +08:00
|
|
|
import { CHANGED_SETTINGS, DEFAULT_SETTINGS, SETTINGS } from './enums';
|
2017-03-21 02:00:04 +08:00
|
|
|
|
|
|
|
class Settings {
|
2017-03-29 02:41:48 +08:00
|
|
|
constructor(defaultValues = {}) {
|
2024-03-07 01:28:18 +08:00
|
|
|
const writableDefaultValues = JSON.parse(JSON.stringify(defaultValues));
|
2024-05-17 20:21:20 +08:00
|
|
|
Object.values(SETTINGS).forEach((p) => {
|
2017-03-29 02:41:48 +08:00
|
|
|
const privateProp = `_${p}`;
|
|
|
|
this[privateProp] = {
|
2024-05-18 04:33:52 +08:00
|
|
|
reactiveVar: makeVar(undefined),
|
2017-03-29 02:41:48 +08:00
|
|
|
};
|
|
|
|
|
2024-05-17 20:21:20 +08:00
|
|
|
const varProp = `${p}Var`;
|
2024-05-17 03:27:28 +08:00
|
|
|
Object.defineProperty(this, varProp, {
|
2024-05-18 04:33:52 +08:00
|
|
|
get: () => this[privateProp].reactiveVar,
|
2024-05-17 03:27:28 +08:00
|
|
|
});
|
|
|
|
|
2017-03-29 02:41:48 +08:00
|
|
|
Object.defineProperty(this, p, {
|
2024-05-18 04:33:52 +08:00
|
|
|
get: () => this[privateProp].reactiveVar(),
|
2017-03-29 02:41:48 +08:00
|
|
|
|
2017-06-03 03:25:02 +08:00
|
|
|
set: (v) => {
|
2024-05-18 04:33:52 +08:00
|
|
|
this[privateProp].reactiveVar(v);
|
2017-03-29 02:41:48 +08:00
|
|
|
},
|
|
|
|
});
|
2017-03-21 02:00:04 +08:00
|
|
|
});
|
2020-08-19 20:36:05 +08:00
|
|
|
this.defaultSettings = {};
|
2017-10-27 19:36:27 +08:00
|
|
|
// Sets default locale to browser locale
|
2024-03-07 01:28:18 +08:00
|
|
|
writableDefaultValues.application.locale = navigator.languages ? navigator.languages[0] : false
|
2020-05-23 00:54:00 +08:00
|
|
|
|| navigator.language
|
2024-03-07 01:28:18 +08:00
|
|
|
|| writableDefaultValues.application.locale;
|
2017-10-27 19:36:27 +08:00
|
|
|
|
2024-03-07 01:28:18 +08:00
|
|
|
this.setDefault(writableDefaultValues);
|
2020-08-19 20:36:05 +08:00
|
|
|
this.loadChanged();
|
2017-03-21 02:00:04 +08:00
|
|
|
}
|
|
|
|
|
2017-03-29 02:41:48 +08:00
|
|
|
setDefault(defaultValues) {
|
2020-08-19 20:36:05 +08:00
|
|
|
Object.keys(defaultValues).forEach((key) => {
|
|
|
|
this[key] = defaultValues[key];
|
|
|
|
this.defaultSettings[`_${key}`] = defaultValues[key];
|
|
|
|
});
|
|
|
|
|
2024-04-11 23:03:25 +08:00
|
|
|
this.save(undefined, DEFAULT_SETTINGS);
|
2020-08-19 20:36:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
loadChanged() {
|
2024-05-29 21:26:11 +08:00
|
|
|
const APP_CONFIG = window.meetingClientSettings.public.app;
|
|
|
|
|
2023-05-17 22:30:06 +08:00
|
|
|
const Storage = (APP_CONFIG.userSettingsStorage === 'local') ? LocalStorage : SessionStorage;
|
2017-03-29 02:41:48 +08:00
|
|
|
const savedSettings = {};
|
2017-03-21 02:00:04 +08:00
|
|
|
|
2024-05-17 20:21:20 +08:00
|
|
|
Object.values(SETTINGS).forEach((s) => {
|
2020-08-19 20:36:05 +08:00
|
|
|
savedSettings[s] = Storage.getItem(`${CHANGED_SETTINGS}_${s}`);
|
2017-03-29 02:41:48 +08:00
|
|
|
});
|
|
|
|
|
2020-08-19 20:36:05 +08:00
|
|
|
Object.keys(savedSettings).forEach((key) => {
|
|
|
|
const savedItem = savedSettings[key];
|
|
|
|
if (!savedItem) return;
|
|
|
|
this[key] = {
|
|
|
|
...this[key],
|
|
|
|
...savedItem,
|
|
|
|
};
|
2017-03-29 02:41:48 +08:00
|
|
|
});
|
2017-06-03 03:25:02 +08:00
|
|
|
}
|
2017-03-29 02:41:48 +08:00
|
|
|
|
2024-01-30 21:03:11 +08:00
|
|
|
save(mutation, settings = CHANGED_SETTINGS) {
|
2024-05-29 21:26:11 +08:00
|
|
|
const APP_CONFIG = window.meetingClientSettings.public.app;
|
|
|
|
|
2023-05-17 22:30:06 +08:00
|
|
|
const Storage = (APP_CONFIG.userSettingsStorage === 'local') ? LocalStorage : SessionStorage;
|
2020-08-19 20:36:05 +08:00
|
|
|
if (settings === CHANGED_SETTINGS) {
|
|
|
|
Object.keys(this).forEach((k) => {
|
2024-05-18 04:33:52 +08:00
|
|
|
const values = this[k].reactiveVar && this[k].reactiveVar();
|
2020-08-19 20:36:05 +08:00
|
|
|
const defaultValues = this.defaultSettings[k];
|
|
|
|
|
|
|
|
if (!values) return;
|
|
|
|
const changedValues = Object.keys(values)
|
2024-04-11 23:03:25 +08:00
|
|
|
.filter((item) => values[item] !== defaultValues[item])
|
2020-08-19 20:36:05 +08:00
|
|
|
.reduce((acc, item) => ({
|
|
|
|
...acc,
|
|
|
|
[item]: values[item],
|
|
|
|
}), {});
|
|
|
|
|
2023-02-23 21:27:16 +08:00
|
|
|
if (isEmpty(changedValues)) Storage.removeItem(`${settings}${k}`);
|
2020-08-19 20:36:05 +08:00
|
|
|
Storage.setItem(`${settings}${k}`, changedValues);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
Object.keys(this).forEach((k) => {
|
|
|
|
Storage.setItem(`${settings}${k}`, this[k].value);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-07-29 22:17:38 +08:00
|
|
|
const userSettings = {};
|
|
|
|
|
2024-05-17 20:21:20 +08:00
|
|
|
Object.values(SETTINGS).forEach((e) => {
|
2019-07-29 22:17:38 +08:00
|
|
|
userSettings[e] = this[e];
|
|
|
|
});
|
|
|
|
|
2024-04-11 23:03:25 +08:00
|
|
|
if (typeof mutation === 'function') {
|
|
|
|
mutation(userSettings);
|
|
|
|
}
|
2017-03-29 02:41:48 +08:00
|
|
|
}
|
2017-03-21 02:00:04 +08:00
|
|
|
}
|
|
|
|
|
2024-05-29 21:26:11 +08:00
|
|
|
let SettingsSingleton = null;
|
|
|
|
export const getSettingsSingletonInstance = () => {
|
|
|
|
if (!SettingsSingleton) {
|
|
|
|
SettingsSingleton = new Settings(window.meetingClientSettings.public.app.defaultSettings);
|
|
|
|
}
|
|
|
|
return SettingsSingleton;
|
|
|
|
};
|
|
|
|
|
|
|
|
export default getSettingsSingletonInstance;
|