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

81 lines
2.6 KiB

const ElmLocalStoragePorts = function () {}
const localStorage = window.localStorage
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]) {
const responsePort = app.ports[responsePortName]
if (app.ports[getPortName]) {
app.ports[getPortName].subscribe(function (key) {
let val = null
try {
val = JSON.parse(localStorage.getItem(key))
} catch (e) {}
responsePort.send({
key,
value: val
})
})
} else {
console.warn(getPortName + ': This port is not connected.')
}
if (app.ports[setPortName]) {
app.ports[setPortName].subscribe(function (kv) {
const key = kv[0]
const 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) {
const cnt = localStorage.length
for (let i = cnt - 1; i >= 0; --i) {
const 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) {
const cnt = localStorage.length
const keys = []
for (let i = 0; i < cnt; i++) {
const 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.')
}
}