/*
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 { useUiSettingsContext } from "./context/ui-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 = useUiSettingsContext()
return (
{
officer.lock();
}
}
sites={[]}
supportedLangs={["en", "es", "de"]}
>
Preferences
{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 (
);
}