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.
YACSWA/frontend/www/elm-local-storage-ports.js

80 lines
3.1 KiB

var ElmLocalStoragePorts = function() {};
ElmLocalStoragePorts.prototype.subscribe =
function(app, getPortName, setPortName, clearPortName, responsePortName, listKeysPortName) {
if (!getPortName) getPortName = "getItem";
if (!setPortName) setPortName = "setItem";
if (!clearPortName) clearPortName = "clear";
if (!listKeysPortName) listKeysPortName = "listKeys";
if (!responsePortName) responsePortName = "response";
if (app.ports[responsePortName]) {
var responsePort = app.ports[responsePortName];
if (app.ports[getPortName]) {
app.ports[getPortName].subscribe(function(key) {
var val = null;
try {
val = JSON.parse(localStorage.getItem(key))
} catch (e) {}
responsePort.send({
key:key,
value:val
})
});
} else {
console.warn(getPortName + ": This port is not connected.");
}
if (app.ports[setPortName]) {
app.ports[setPortName].subscribe(function(kv) {
var key = kv[0];
var json = kv[1];
if (json === null) {
localStorage.removeItem(key);
} else {
localStorage.setItem(key, JSON.stringify(json));
}
});
} else {
console.warn(setPortName + ": This port is not connected.");
}
if (app.ports[clearPortName]) {
app.ports[clearPortName].subscribe(function(prefix) {
if (prefix) {
var cnt = localStorage.length;
for (var i = cnt - 1; i >= 0; --i) {
var key = localStorage.key(i);
if (key && key.startsWith(prefix)) {
localStorage.removeItem(key);
}
}
} else {
localStorage.clear();
}
});
} else {
console.warn(clearPortName + ": This port is not connected.");
}
if (app.ports[listKeysPortName]) {
app.ports[listKeysPortName].subscribe(function(prefix) {
var cnt = localStorage.length;
var keys = [];
for (var i = 0; i < cnt; i++) {
var key = localStorage.key(i);
if (key && key.startsWith(prefix)) {
keys.push(key);
}
}
responsePort.send(keys);
});
} else {
console.warn(listKeysPortName + ": This port is not connected.");
}
} else {
console.warn(responsePortName + ": This port is not connected.");
}
};