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.
80 lines
3.1 KiB
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.");
|
|
}
|
|
};
|