commit d1f7c01c47857a2c667a5b3ba976b1dc6126dd0d
parent 5b607cce87925f3cadac170ed162a827fc4ca7fe
Author: Jacob R. Edwards <jacob@jacobedwards.org>
Date: Wed, 2 Oct 2024 10:43:12 -0700
Add developer settings api
These are persistent per-device settings meant to be used for aiding
development. The api exports one function to get and set settings
and an object representing all the settings.
Diffstat:
1 file changed, 53 insertions(+), 0 deletions(-)
diff --git a/files/lib/dev.js b/files/lib/dev.js
@@ -0,0 +1,53 @@
+let _settings = {
+ devapi: { name: "Developer API", type: "bool", brief: "Don't use the production API" }
+}
+
+for (let k in _settings) {
+ switch (_settings[k].type) {
+ case "bool":
+ case "string":
+ break;
+ default:
+ console.error(`"${k}" developer setting has an invalid type (${_settings[k].type}); deleting`)
+ delete _settings[k]
+ continue
+ }
+ _settings[k].key = k
+}
+
+export const settings = _settings
+
+export function setting(k, v) {
+ if (v === undefined) {
+ if (settings[k] == undefined) {
+ console.error(`Tried to access undefined setting "${k}": ${new Error("").stack}`)
+ return undefined
+ }
+ return getValue(k)
+ }
+ setValue(k, v)
+}
+
+function getValue(k) {
+ let v = localStorage.getItem(storageKey(k))
+ console.log("dev.getValue", k, v)
+ if (settings[k].type === "bool") {
+ return v == "true"
+ } else if (settings[k].type === "string") {
+ return v
+ }
+ throw new Error("Invalid setting type")
+}
+
+function setValue(k, v) {
+ console.log("dev.setValue", k, v)
+ if (v == null) {
+ localStorage.removeItem(storageKey(k))
+ } else {
+ localStorage.setItem(storageKey(k), v)
+ }
+}
+
+function storageKey(k) {
+ return "dev-" + k
+}