The main server, and probably only repository in this org.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
2.9 KiB

import {randId} from "./random";
import {nullish} from "./null";
import {fetchGet, fetchPatch} from "./fetcher";
const localData = {};
const callbacks = [];
export function subscribeToLight(lightId, callback) {
const callbackId = randId();
callbacks.push({callbackId, lightId, callback});
if (lightId >= 0) {
dispatch();
fetchOne(lightId);
} else {
dispatch();
fetchAll();
}
}
export function unsubscribeFromLight(callbackId) {
const callback = callbacks.find(c => c !== null && c.callbackId === callbackId);
const index = callbacks.indexOf(callback);
callbacks[index] = null;
}
export function changeColor(lightId, newColor, newBrightness, newPower) {
const light = localData[lightId];
if (nullish(light)) {
return;
}
const oldBrightness = light.brightness;
const oldPower = light.on;
const oldColor = light.color;
light.color = newColor;
light.brightness = newBrightness;
light.on = newPower;
dispatch();
fetchPatch(`/light/${lightId}`, {
color: newColor,
brightness: newBrightness,
on: newPower,
}).then(({data, error}) => {
if (error !== null) {
light.color = oldColor;
light.brightness = oldBrightness;
light.on = oldPower;
dispatch();
return;
}
localData[lightId] = data;
dispatch();
});
}
export function changeLight(lightId, name, groupId) {
const light = localData[lightId];
if (nullish(light)) {
return;
}
const oldName = light.name;
const oldGroupId = light.groupId;
light.name = name;
light.groupId = groupId;
dispatch();
console.log({name,groupId});
fetchPatch(`/light/${lightId}`, {
name: name,
groupId: groupId,
}).then(({data, error}) => {
if (error !== null) {
light.name = oldName;
light.groupId = oldGroupId;
dispatch();
return;
}
localData[lightId] = data;
dispatch();
});
}
function fetchAll() {
fetchGet(`/light/`).then(({data, error}) => {
if (error === null) {
handleLights(data);
}
});
}
function fetchOne(id) {
fetchGet(`/light/${id}`).then(({data, error}) => {
if (error === null) {
handleLight(data);
}
});
}
function handleLights(lights) {
lights.forEach(l => handleLight(l));
for (let key in localData) {
if (localData.hasOwnProperty(key) && nullish(lights.find(l => l.id === parseInt(key, 10)))) {
delete localData[key];
}
}
dispatch(lights);
}
function handleLight(light) {
localData[light.id] = light;
dispatch(light);
}
function dispatch(data = null) {
if (data === null) {
data = Object.values(localData);
}
if (Array.isArray(data)) {
callbacks
.filter(c => c !== null)
.filter(c => c.lightId === -1)
.forEach(c => c.callback(data));
} else {
callbacks
.filter(c => c !== null)
.filter(c => c.lightId === data.id)
.forEach(c => c.callback(data));
}
}