mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
SdrCard calls LocalSdrControls through radio store actions instead of DOM listeners, and renders its gain options from the receiver's own R820T gain steps with page-language labels. The display and radio stores share one owner list (createOwners): the newest connected owner with an action answers it.
44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
/**
|
|
* The owners answering a store's controls. A view calls `act(name, ...args)`;
|
|
* the newest connected owner with an action of that name answers it, so an
|
|
* owner that connects again replaces itself, and owners of different actions
|
|
* sit side by side.
|
|
* @returns {{connect: Function, detach: Function, act: Function}}
|
|
*/
|
|
export function createOwners() {
|
|
/** @type {Array<{actions: object}>} Oldest first. */
|
|
const owners = [];
|
|
|
|
/**
|
|
* Answer the actions named in `actions`.
|
|
* @param {Record<string, Function>} actions
|
|
* @returns {object} Token for detach().
|
|
*/
|
|
function connect(actions) {
|
|
const token = { actions };
|
|
owners.push(token);
|
|
return token;
|
|
}
|
|
|
|
/** Stop answering for the owner holding `token`; the others stay. */
|
|
function detach(token) {
|
|
const index = owners.indexOf(token);
|
|
if (index >= 0) owners.splice(index, 1);
|
|
}
|
|
|
|
/**
|
|
* A control's change: call the newest connected owner's action of that
|
|
* name, if any.
|
|
* @param {string} name
|
|
* @param {...unknown} args
|
|
*/
|
|
function act(name, ...args) {
|
|
for (let index = owners.length - 1; index >= 0; index -= 1) {
|
|
const action = owners[index].actions[name];
|
|
if (action) return void action(...args);
|
|
}
|
|
}
|
|
|
|
return { connect, detach, act };
|
|
}
|