Skip to content

Commit d232d7f

Browse files
committed
feat: reload/update live settings
1 parent 076027f commit d232d7f

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

src/utils/settings/index.js

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const registry = new Map();
2929
const events = eventEmitter();
3030
const configs = new Map();
3131
let dialog = null;
32+
let updateLock = false;
3233

3334
/**
3435
* @returns {tabManager}
@@ -81,13 +82,18 @@ function init(page) {
8182
}
8283

8384
function createSetting(setting = defaultSetting) {
85+
// TODO: hidden creates a hidden setting?
8486
if (setting.hidden) return null;
8587
const ret = $('<div>').addClass('flex-start');
8688
const { key, type } = setting;
89+
events.emit(`create:${key}`);
8790
ret.addClass(getCSSName(type.name));
88-
const current = value(key);
8991
const container = $(`<div>`).addClass('flex-stretch');
90-
const el = $(type.element(current, (...args) => setting.update(...args), {
92+
const el = $(type.element(setting.value, (...args) => {
93+
if (!updateLock) updateLock = setting;
94+
setting.update(...args);
95+
if (updateLock === setting) updateLock = false;
96+
}, {
9197
data: setting.data,
9298
remove: setting.remove,
9399
container,
@@ -101,11 +107,6 @@ function createSetting(setting = defaultSetting) {
101107
});
102108

103109
const label = $(`<label for="${key}">`).html(translateText(setting.name));
104-
// TODO: Allow disabling progmatically, not just on setting load
105-
if (setting.disabled) {
106-
el.prop('disabled', true);
107-
label.addClass('disabled');
108-
}
109110
const labelPlacement = type.labelFirst();
110111
if (labelPlacement) {
111112
ret.append(label, ' ', el);
@@ -133,6 +134,16 @@ function createSetting(setting = defaultSetting) {
133134
ret.append(' ', reset);
134135
}
135136
ret.append(container);
137+
138+
function refresh() {
139+
// TODO: hidden is technically dynamic
140+
// TODO: reset is technically dynamic
141+
el.prop('disabled', setting.disabled);
142+
label.toggleClass('disabled', setting.disabled);
143+
}
144+
refresh();
145+
untilClose(`refresh:${key}`, refresh, `create:${key}`);
146+
136147
return ret;
137148
}
138149

@@ -153,8 +164,17 @@ function getMessage(page) {
153164
return categories[name] || createCategory(name);
154165
}
155166
category();
156-
each(pageSettings, (data) => {
157-
category(data.category).append(createSetting(data));
167+
each(pageSettings, (data = defaultSetting) => {
168+
let element = createSetting(data);
169+
category(data.category).append(element);
170+
171+
function refresh() {
172+
if (updateLock === data) return; // Setting is updating itself
173+
const newElement = createSetting(data);
174+
element.replaceWith(newElement);
175+
element = newElement;
176+
}
177+
untilClose(data.key, refresh);
158178
});
159179
if (!category('N/A').html()) {
160180
category('N/A').remove();
@@ -381,3 +401,10 @@ each(types, (Type) => registerType(new Type()));
381401
function getCSSName(name = '', prefix = 'setting-') {
382402
return `${prefix}${name.replaceAll(/[^_a-zA-Z0-9-]/g, '-')}`;
383403
}
404+
405+
function untilClose(key, callback, extra = '') {
406+
events.on(key, callback);
407+
events.once(['close', extra].join(' ').trim(), () => {
408+
events.off(key, callback);
409+
});
410+
}

0 commit comments

Comments
 (0)