Files
TaroTime/app/app-config.js

132 lines
3.8 KiB
JavaScript
Raw Normal View History

2026-03-08 22:24:34 -07:00
(function () {
const apiBaseUrlStorageKey = "tarot-time-api-base-url";
const apiKeyStorageKey = "tarot-time-api-key";
const defaultApiBaseUrl = "";
function normalizeBaseUrl(value) {
return String(value || "")
.trim()
.replace(/\/+$/, "");
}
function normalizeApiKey(value) {
return String(value || "").trim();
}
function normalizeConnectionSettings(settings) {
return {
apiBaseUrl: normalizeBaseUrl(settings?.apiBaseUrl),
apiKey: normalizeApiKey(settings?.apiKey)
};
}
function persistConnectionSettings(settings) {
let didPersist = true;
try {
const params = new URLSearchParams(window.location.search || "");
const queryValue = String(params.get("apiBaseUrl") || "").trim();
const queryApiKey = String(params.get("apiKey") || params.get("api_key") || "").trim();
if (queryValue) {
window.localStorage.setItem(apiBaseUrlStorageKey, normalizeBaseUrl(queryValue));
}
if (queryApiKey) {
window.localStorage.setItem(apiKeyStorageKey, normalizeApiKey(queryApiKey));
}
if (settings.apiBaseUrl) {
window.localStorage.setItem(apiBaseUrlStorageKey, settings.apiBaseUrl);
} else {
window.localStorage.removeItem(apiBaseUrlStorageKey);
}
if (settings.apiKey) {
window.localStorage.setItem(apiKeyStorageKey, settings.apiKey);
} else {
window.localStorage.removeItem(apiKeyStorageKey);
}
} catch (_error) {
didPersist = false;
}
return didPersist;
}
function readConfiguredConnectionSettings() {
try {
const params = new URLSearchParams(window.location.search || "");
const queryValue = String(params.get("apiBaseUrl") || "").trim();
const queryApiKey = String(params.get("apiKey") || params.get("api_key") || "").trim();
if (queryValue) {
window.localStorage.setItem(apiBaseUrlStorageKey, normalizeBaseUrl(queryValue));
}
if (queryApiKey) {
window.localStorage.setItem(apiKeyStorageKey, normalizeApiKey(queryApiKey));
}
const storedBaseUrl = String(window.localStorage.getItem(apiBaseUrlStorageKey) || "").trim();
const storedApiKey = String(window.localStorage.getItem(apiKeyStorageKey) || "").trim();
return normalizeConnectionSettings({
apiBaseUrl: storedBaseUrl,
apiKey: storedApiKey
});
} catch (_error) {
return normalizeConnectionSettings({
apiBaseUrl: "",
apiKey: ""
});
}
}
const initialConnectionSettings = readConfiguredConnectionSettings();
window.TarotAppConfig = {
...(window.TarotAppConfig || {}),
apiBaseUrl: initialConnectionSettings.apiBaseUrl,
apiKey: initialConnectionSettings.apiKey,
getApiBaseUrl() {
return normalizeBaseUrl(this.apiBaseUrl);
},
getApiKey() {
return normalizeApiKey(this.apiKey);
},
isConnectionConfigured() {
return Boolean(this.getApiBaseUrl());
},
getConnectionSettings() {
return {
apiBaseUrl: this.getApiBaseUrl(),
apiKey: this.getApiKey()
};
},
updateConnectionSettings(nextSettings = {}) {
const previous = this.getConnectionSettings();
const current = normalizeConnectionSettings({
...previous,
...nextSettings
});
const didPersist = persistConnectionSettings(current);
this.apiBaseUrl = current.apiBaseUrl;
this.apiKey = current.apiKey;
if (previous.apiBaseUrl !== current.apiBaseUrl || previous.apiKey !== current.apiKey) {
document.dispatchEvent(new CustomEvent("connection:updated", {
detail: {
previous,
current: { ...current }
}
}));
}
return {
...current,
didPersist
};
}
};
})();