// Copyright (C) 2023 Vaughn Nugent // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import { runtime, storage } from "webextension-polyfill" import { isEmpty, isEqual, merge } from 'lodash' import { configureApi, debugLog } from '@vnuge/vnlib.browser' import { readonly, ref } from "vue"; import { BridgeMessage } from "webext-bridge"; import { JsonObject } from "type-fest"; export interface PluginConfig extends JsonObject { readonly apiUrl: string; readonly accountBasePath: string; readonly nostrEndpoint: string; readonly heartbeat: boolean; readonly maxHistory: number; readonly darkMode: boolean; readonly autoInject: boolean; } //Default storage config const defaultConfig : PluginConfig = { apiUrl: import.meta.env.VITE_API_URL, accountBasePath: import.meta.env.VITE_ACCOUNTS_BASE_PATH, nostrEndpoint: import.meta.env.VITE_NOSTR_ENDPOINT, heartbeat: import.meta.env.VITE_HEARTBEAT_ENABLED === 'true', maxHistory: 50, darkMode: false, autoInject: true }; export const useSettings = (() =>{ const currentConfig = ref({} as PluginConfig); const getCurrentConfig = async () => { const { siteConfig } = await storage.local.get('siteConfig'); //Store a default config if none exists if(isEmpty(siteConfig)){ await storage.local.set({ siteConfig: defaultConfig }); } //Merge the default config with the site config return merge(defaultConfig, siteConfig) } const restoreApiSettings = async () => { //Set the current config currentConfig.value = await getCurrentConfig();; //Configure the vnlib api configureApi({ session: { cookiesEnabled: false, bidSize: 32, storage: localStorage }, user: { accountBasePath: currentConfig.value.accountBasePath, storage: localStorage, }, axios: { baseURL: currentConfig.value.apiUrl, tokenHeader: import.meta.env.VITE_WEB_TOKEN_HEADER, } }) } const saveConfig = async (config: PluginConfig) : Promise => { await storage.local.set({ siteConfig: config }); } const onGetSiteConfig = async ({ } :BridgeMessage): Promise => { return { ...currentConfig.value } } const onSetSitConfig = async ({ sender, data }: BridgeMessage) : Promise => { //Config messages should only come from the options page if (sender.context !== 'options') { throw new Error('Unauthorized'); } //Save the config await saveConfig(data); //Restore the api settings restoreApiSettings(); debugLog('Config settings saved!'); } runtime.onInstalled.addListener(() => { restoreApiSettings(); debugLog('Server settings restored from storage'); }); runtime.onConnect.addListener(async () => { //refresh the config on connect currentConfig.value = await getCurrentConfig(); }) return () =>{ return{ getCurrentConfig, restoreApiSettings, saveConfig, currentConfig:readonly(currentConfig), onGetSiteConfig, onSetSitConfig } } })()