import { AbsoluteTime, AmountJson, Amounts, Codec, OperationResult, buildCodecForObject, codecForNumber, codecForString, codecOptional } from "@gnu-taler/taler-util"; import { DefaultForm, useTranslationContext } from "@gnu-taler/web-util/browser"; import { h } from "preact"; import { useExchangeApiContext } from "../context/config.js"; import { FormMetadata } from "../forms/index.js"; import { Pages } from "../pages.js"; import { AmlExchangeBackend } from "../utils/types.js"; export function AntiMoneyLaunderingForm({ account, formId, onSubmit }: { account: string, formId: string, onSubmit: (justification: Justification, state: AmlExchangeBackend.AmlState, threshold: AmountJson) => Promise; }) { const { i18n } = useTranslationContext() const theForm = window.amlExchangeBackoffice!.forms(i18n).find((v) => v.id === formId) if (!theForm) { return
form with id {formId} not found
} const { config } = useExchangeApiContext() const initial = { when: AbsoluteTime.now(), state: AmlExchangeBackend.AmlState.pending, threshold: Amounts.zeroOfCurrency(config.currency), }; return ( { }} onSubmit={(formValue) => { if (formValue.state === undefined || formValue.threshold === undefined) return; const st = formValue.state; const amount = formValue.threshold; const justification: Justification = { id: theForm.id, label: theForm.label, version: theForm.version, value: formValue } onSubmit(justification, st, amount); }} >
Cancel
); } export type Justification = { // form values value: T; } & Omit, "icon">, "impl"> export function stringifyJustification(j: Justification): string { return JSON.stringify(j) } type SimpleFormMetadata = { version?: number, id?: string, } export const codecForSimpleFormMetadata = (): Codec => buildCodecForObject() .property("id", codecOptional(codecForString())) .property("version", codecOptional(codecForNumber())) .build("SimpleFormMetadata"); type ParseJustificationFail = "not-json" | "id-not-found" | "form-not-found" | "version-not-found"; export function parseJustification(s: string, listOfAllKnownForms: FormMetadata[]): OperationResult<{ justification: Justification, metadata: FormMetadata }, ParseJustificationFail> { try { const justification = JSON.parse(s) const info = codecForSimpleFormMetadata().decode(justification) if (!info.id) { return { type: "fail", case: "id-not-found", detail: {} as any } } if (!info.version) { return { type: "fail", case: "version-not-found", detail: {} as any } } const found = listOfAllKnownForms.find((f) => { return f.id === info.id && f.version === info.version }) if (!found) { return { type: "fail", case: "form-not-found", detail: {} as any } } return { type: "ok", body: { justification, metadata: found } } } catch (e) { return { type: "fail", case: "not-json", detail: {} as any } } }