/* This file is part of GNU Taler (C) 2022 Taler Systems S.A. GNU Taler is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Taler 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 General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ import { Codec, buildCodecForObject, codecForBoolean, codecForList, codecForMap, codecForString, codecOptional } from "@gnu-taler/taler-util"; export interface BankUiSettings { // Where libeufin backend is localted // default: window.origin without "webui/" backendBaseURL?: string; // Shows a button "create random account" in the registration form // Useful for testing // default: false allowRandomAccountCreation?: boolean; // Create all random accounts with password "123" // Useful for testing // default: false simplePasswordForRandomAccounts?: boolean; // Bank name shown in the header // default: "Taler Bank" bankName?: string; // URL where the user is going to be redirected after // clicking in Taler Logo // default: home page iconLinkURL?: string; // Mapping for every link shown in the top navitation bar // - key: link label, what the user will read // - value: link target, where the user is going to be redirected // default: empty list topNavSites?: Record; } /** * Global settings for the bank UI. */ const defaultSettings: BankUiSettings = { backendBaseURL: buildDefaultBackendBaseURL(), iconLinkURL: undefined, bankName: "Taler Bank", simplePasswordForRandomAccounts: false, allowRandomAccountCreation: false, topNavSites: {}, }; const codecForBankUISettings = (): Codec => buildCodecForObject() .property("backendBaseURL", codecOptional(codecForString())) .property("allowRandomAccountCreation", codecOptional(codecForBoolean())) .property("simplePasswordForRandomAccounts", codecOptional(codecForBoolean())) .property("bankName", codecOptional(codecForString())) .property("iconLinkURL", codecOptional(codecForString())) .property("topNavSites", codecOptional(codecForMap(codecForString()))) .build("BankUiSettings"); function removeUndefineField(obj: any): object { return Object.keys(obj).reduce((prev, cur) => { if (typeof prev[cur] === "undefined") { delete prev[cur] } return prev }, obj) } export function fetchSettings(listener: (s: BankUiSettings) => void): void { fetch("./settings.json") .then(resp => resp.json()) .then(json => codecForBankUISettings().decode(json)) .then(result => listener({ ...defaultSettings, ...removeUndefineField(result), })) .catch(e => { console.log("failed to fetch settings", e) listener(defaultSettings) }) } function buildDefaultBackendBaseURL(): string | undefined { if (typeof window !== "undefined") { const currentLocation = new URL(window.location.pathname, window.location.origin).href return currentLocation.replace("/webui", "") } return undefined }