diff --git a/webapp/src/components/tabContentComponents/aboutComponents/devTools.vue b/webapp/src/components/tabContentComponents/aboutComponents/devTools.vue index 6f940114..5fbc9e19 100644 --- a/webapp/src/components/tabContentComponents/aboutComponents/devTools.vue +++ b/webapp/src/components/tabContentComponents/aboutComponents/devTools.vue @@ -31,7 +31,7 @@ export default { methods: { overrideAPIHost(event) { - if (this.reloadWhenOverridingOrigin) { + if (!this.reloadWhenOverridingOrigin) { this.origin = this.overrideOrigin; event.preventDefault(); } diff --git a/webapp/src/stores/settings.js b/webapp/src/stores/settings.js index d1ba13b9..72fc8e23 100644 --- a/webapp/src/stores/settings.js +++ b/webapp/src/stores/settings.js @@ -99,7 +99,13 @@ export const useSettingsStore = defineStore( { // PiniaPluginPersistedState will now automatically persist ONLY these specific refs to localStorage persist: { - paths: ["appTheme", "disableStream", "navigationStepSize", "navigationInvert"], + pick: [ + "appTheme", + "overrideOrigin", + "disableStream", + "navigationStepSize", + "navigationInvert", + ], }, }, ); diff --git a/webapp/src/stores/wot.js b/webapp/src/stores/wot.js index 42de7d49..2b4f9dce 100644 --- a/webapp/src/stores/wot.js +++ b/webapp/src/stores/wot.js @@ -2,114 +2,120 @@ import { defineStore } from "pinia"; import { ref, computed } from "vue"; import axios from "axios"; -export const useWotStore = defineStore("wot", () => { - // State - const thingDescriptions = ref({}); - const servient = ref(null); - const helpers = ref(null); - // Actions - function addThingDescription(thingName, thingDescription) { - thingDescriptions.value[thingName] = thingDescription; - } - - function removeThingDescription(thingName) { - delete thingDescriptions.value[thingName]; - } - - function removeAllThingDescriptions() { - thingDescriptions.value = {}; - } - - async function fetchThingDescription(uri, name = null) { - // Fetch the thing description from the given URI and consume it - // NB this should only be called once, or we'll duplicate effort. - // Deduplication should be done elsewhere. - const response = await axios.get(uri); - const td = response.data; - const thingName = name || uri.replace(/\/$/, "").split("/").pop(); - addThingDescription(thingName, td); - } - - async function fetchThingDescriptions(uri) { - // Fetch thing descriptions from the given URI - const response = await axios.get(uri); - if (response.status !== 200) throw "Could not retrieve thing descriptions"; - for (const k in response.data) { - let thingName = k.replace(/\/$/, "").replace(/^\//, ""); - addThingDescription(thingName, response.data[k]); +export const useWotStore = defineStore( + "wot", + () => { + // State + const thingDescriptions = ref({}); + const servient = ref(null); + const helpers = ref(null); + // Actions + function addThingDescription(thingName, thingDescription) { + thingDescriptions.value[thingName] = thingDescription; } - } - const thingList = computed(() => Object.keys(thingDescriptions.value)); + function removeThingDescription(thingName) { + delete thingDescriptions.value[thingName]; + } - const thingAvailable = computed(() => (thingName) => { - return thingName in thingDescriptions.value; - }); + function removeAllThingDescriptions() { + thingDescriptions.value = {}; + } - const thingAffordanceAvailable = computed(() => (thing, affordanceType, affordance) => { - const td = thingDescriptions.value[thing]; - if (!td || !td[affordanceType]) return false; - return affordance in td[affordanceType]; - }); + async function fetchThingDescription(uri, name = null) { + // Fetch the thing description from the given URI and consume it + // NB this should only be called once, or we'll duplicate effort. + // Deduplication should be done elsewhere. + const response = await axios.get(uri); + const td = response.data; + const thingName = name || uri.replace(/\/$/, "").split("/").pop(); + addThingDescription(thingName, td); + } - const thingFormUrl = computed( - () => - (thing, affordanceType, affordance, op, allowUndefined = true) => { - // Find the URL for a particular operation - const td = thingDescriptions.value[thing]; - if (!td) { - if (allowUndefined) return undefined; - throw `Could not find form for ${affordanceType} ${thing}/${affordance} with op ${op}`; - } - const affordances = td[affordanceType]; - if (!affordances || !(affordance in affordances)) { - if (allowUndefined) return undefined; - throw `Could not find form for ${affordanceType} ${thing}/${affordance} with op ${op}`; - } - let href = findFormHref(affordances[affordance], op); - if (href === undefined) { - if (allowUndefined) return undefined; - throw `Could not find form for ${affordanceType} ${thing}/${affordance} with op ${op}`; - } - // If we've found an href, prepend the `base` URL if appropriate - if (href.startsWith("http")) return href; - if ("base" in td) { - let base = td.base; - if (href.startsWith("/")) href = href.slice(1); - if (!base.endsWith("/")) base += "/"; - return base + href; - } - return href; - }, - ); + async function fetchThingDescriptions(uri) { + // Fetch thing descriptions from the given URI + const response = await axios.get(uri); + if (response.status !== 200) throw "Could not retrieve thing descriptions"; + for (const k in response.data) { + let thingName = k.replace(/\/$/, "").replace(/^\//, ""); + addThingDescription(thingName, response.data[k]); + } + } - const thingPropertyUrl = computed(() => (thing, property, op, allowUndefined) => { - // Find the URL for a particular property - return thingFormUrl.value(thing, "properties", property, op, allowUndefined); - }); + const thingList = computed(() => Object.keys(thingDescriptions.value)); - const thingActionUrl = computed(() => (thing, action, op, allowUndefined) => { - // Find the URL for a particular action - return thingFormUrl.value(thing, "actions", action, op, allowUndefined); - }); + const thingAvailable = computed(() => (thingName) => { + return thingName in thingDescriptions.value; + }); - return { - thingDescriptions, - servient, - helpers, // State - thingList, - thingAvailable, // Helpers - thingFormUrl, - thingPropertyUrl, - thingActionUrl, - fetchThingDescription, - fetchThingDescriptions, // Actions - addThingDescription, - removeThingDescription, - removeAllThingDescriptions, - thingAffordanceAvailable, - }; -}); + const thingAffordanceAvailable = computed(() => (thing, affordanceType, affordance) => { + const td = thingDescriptions.value[thing]; + if (!td || !td[affordanceType]) return false; + return affordance in td[affordanceType]; + }); + + const thingFormUrl = computed( + () => + (thing, affordanceType, affordance, op, allowUndefined = true) => { + // Find the URL for a particular operation + const td = thingDescriptions.value[thing]; + if (!td) { + if (allowUndefined) return undefined; + throw `Could not find form for ${affordanceType} ${thing}/${affordance} with op ${op}`; + } + const affordances = td[affordanceType]; + if (!affordances || !(affordance in affordances)) { + if (allowUndefined) return undefined; + throw `Could not find form for ${affordanceType} ${thing}/${affordance} with op ${op}`; + } + let href = findFormHref(affordances[affordance], op); + if (href === undefined) { + if (allowUndefined) return undefined; + throw `Could not find form for ${affordanceType} ${thing}/${affordance} with op ${op}`; + } + // If we've found an href, prepend the `base` URL if appropriate + if (href.startsWith("http")) return href; + if ("base" in td) { + let base = td.base; + if (href.startsWith("/")) href = href.slice(1); + if (!base.endsWith("/")) base += "/"; + return base + href; + } + return href; + }, + ); + + const thingPropertyUrl = computed(() => (thing, property, op, allowUndefined) => { + // Find the URL for a particular property + return thingFormUrl.value(thing, "properties", property, op, allowUndefined); + }); + + const thingActionUrl = computed(() => (thing, action, op, allowUndefined) => { + // Find the URL for a particular action + return thingFormUrl.value(thing, "actions", action, op, allowUndefined); + }); + + return { + thingDescriptions, + servient, + helpers, // State + thingList, + thingAvailable, // Helpers + thingFormUrl, + thingPropertyUrl, + thingActionUrl, + fetchThingDescription, + fetchThingDescriptions, // Actions + addThingDescription, + removeThingDescription, + removeAllThingDescriptions, + thingAffordanceAvailable, + }; + }, + { + persist: false, + }, +); export function findFormHref(affordance, op) { // Find the form in the affordance that matches the given operation type