/* This file is part of GNU Taler (C) 2022-2024 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 { TranslatedString } from "@gnu-taler/taler-util"; import { Footer, Header, ToastBanner, notifyError, notifyException, useNavigationContext, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { ComponentChildren, VNode, h } from "preact"; import { useEffect, useErrorBoundary } from "preact/hooks"; import { privatePages } from "./Routing.js"; import { useSettingsContext } from "./context/settings.js"; import { OfficerState } from "./hooks/officer.js"; import { getAllBooleanPreferences, getLabelForPreferences, usePreferences, } from "./hooks/preferences.js"; import { HomeIcon } from "./pages/Cases.js"; /** * mapping route to view * not found (error page) * nested, index element, relative routes * link interception * form POST interception, call action * fromData => Object.fromEntries * segments in the URL * navigationState: idle, submitting, loading * form GET interception: does a navigateTo * form GET Sync: * 1.- back after submit: useEffect to sync URL to form * 2.- refresh after submit: input default value * useSubmit for form submission onChange, history replace * * post form without redirect * * * @param param0 * @returns */ const GIT_HASH = typeof __GIT_HASH__ !== "undefined" ? __GIT_HASH__ : undefined; const VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : undefined; /** * TO BE FIXED: * * 1.- when the form change to other form and both form share the same structure * the same input component may be rendered in the same place, * since input are uncontrolled the are not re-rendered and since they are * uncontrolled it will keep the value of the previous form. * One solutions could be to remove the form when unloading and when the new * form load it will start without previous vdom, preventing the cache * to create this behavior. * Other solutions could be using IDs in the fields that are constructed * with the ID of the form, so two fields of different form will need to re-render * cleaning up the state of the previous form. * * 2.- currently the design prop and the behavior prop of the flexible form * are two side of the same coin. From the design point of view, it is important * to design the form in a list-of-field manner and there may be additional * content that is not directly mapped to the form structure (object) * So maybe we want to change the current shape so the computation of the state * of the form is in a field level, but this computation required the field value and * the whole form values and state (since one field may be disabled/hidden) because * of the value of other field. * * 3.- given the previous requirement, maybe the name of the field of the form could be * a function (P: F -> V) where F is the form (or parent object) and V is the type of the * property. That will help with the typing of the forms props * * 4.- tooltip are not placed correctly: the arrow should point the question mark * and the text area should be bigger * */ /** * check this fields * * Signature of Contracting partner, 902_9e * Currency and amount of deposited assets, 902_5e * Signature on declaration of trust, 902.13e * also fundations * also life insurance * * no all state are handled by all the inputs * all the input implementation should respect * ui props and state */ export function ExchangeAmlFrame({ children, officer, }: { officer?: OfficerState, children?: ComponentChildren; }): VNode { const { i18n } = useTranslationContext(); const [error] = useErrorBoundary(); useEffect(() => { if (error) { if (error instanceof Error) { notifyException(i18n.str`Internal error, please report.`, error); } else { notifyError( i18n.str`Internal error, please report.`, String(error) as TranslatedString, ); } console.log(error); // resetError() } }, [error]); const [preferences, updatePreferences] = usePreferences(); const settings = useSettingsContext() return (
{ officer.lock(); } } sites={[]} supportedLangs={["en", "es", "de"]} >
  • Preferences
      {getAllBooleanPreferences().map((set) => { const isOn: boolean = !!preferences[set]; return (
    • {getLabelForPreferences(set, i18n)}
    • ); })}
  • {officer?.state !== "ready" ? undefined : }
    {children}
    ); } function Navigation(): VNode { const { i18n } = useTranslationContext(); const pageList = [ { route: privatePages.account, Icon: HomeIcon, label: i18n.str`Account` }, { route: privatePages.cases, Icon: HomeIcon, label: i18n.str`Cases` }, ]; const { path } = useNavigationContext(); return ( ); }