taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit df47d099d8cf774c5df61c19b6a1921745b1312e
parent 7347a5d794f3829b19b5963753fe0adbacd573f8
Author: Sebastian <sebasjm@gmail.com>
Date:   Tue,  8 Apr 2025 18:58:33 -0300

fix #9712

Diffstat:
Mpackages/kyc-ui/dev.mjs | 4++--
Dpackages/web-util/src/forms/ExternalLink.tsx | 39---------------------------------------
Dpackages/web-util/src/forms/InputDownloadLink.tsx | 83-------------------------------------------------------------------------------
Mpackages/web-util/src/forms/field-types.ts | 4++--
Apackages/web-util/src/forms/fields/ExternalLink.tsx | 44++++++++++++++++++++++++++++++++++++++++++++
Apackages/web-util/src/forms/fields/InputDownloadLink.tsx | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpackages/web-util/src/forms/gana/accept-tos.stories.tsx | 2+-
Mpackages/web-util/src/forms/gana/accept-tos.ts | 13++-----------
8 files changed, 135 insertions(+), 138 deletions(-)

diff --git a/packages/kyc-ui/dev.mjs b/packages/kyc-ui/dev.mjs @@ -43,6 +43,6 @@ serve({ port: 8080, source: "./src", onSourceUpdate: build, - appSamplePath: "/kyc-spa/ZBNB5AS4F4MARC983KZ64EMHHNWGF9GDD4J0CA4EPCVERCEK64S0", - appPath: "/kyc-spa/:token", +// appSamplePath: "/kyc-spa/ZBNB5AS4F4MARC983KZ64EMHHNWGF9GDD4J0CA4EPCVERCEK64S0", +// appPath: "/kyc-spa/:token", }); diff --git a/packages/web-util/src/forms/ExternalLink.tsx b/packages/web-util/src/forms/ExternalLink.tsx @@ -1,39 +0,0 @@ -import { TranslatedString } from "@gnu-taler/taler-util"; -import { VNode, h } from "preact"; -import { RenderAddon } from "./fields/InputLine.js"; -import { Addon } from "./FormProvider.js"; - -interface Props { - label: TranslatedString; - url: string; - media?: string; - tooltip?: TranslatedString; - help?: TranslatedString; - before?: Addon; - after?: Addon; -} - -export function ExternalLink({ - before, - after, - label, - url, - media, - tooltip, - help, -}: Props): VNode { - return ( - <div class="sm:col-span-6"> - {before !== undefined && <RenderAddon addon={before} />} - <a href={url} class="underline" target="_blank" rel="noreferrer"> - {label} - </a> - {after !== undefined && <RenderAddon addon={after} />} - {help && ( - <p class="mt-2 text-sm text-gray-500" id="email-description"> - {help} - </p> - )} - </div> - ); -} diff --git a/packages/web-util/src/forms/InputDownloadLink.tsx b/packages/web-util/src/forms/InputDownloadLink.tsx @@ -1,83 +0,0 @@ -import { TranslatedString } from "@gnu-taler/taler-util"; -import { VNode, h } from "preact"; -import { RenderAddon } from "./fields/InputLine.js"; -import { Addon, UIFormProps } from "./FormProvider.js"; -import { noHandlerPropsAndNoContextForField } from "../index.browser.js"; - -interface Props { - label: TranslatedString; - url: string; - media?: string; - tooltip?: TranslatedString; - help?: TranslatedString; - before?: Addon; - after?: Addon; -} - -export function InputDownloadLink(props: Props & UIFormProps<boolean>): VNode { - const { - media, - url, - label, - tooltip, - help, - required, - disabled, - before, - after, - } = props; - const { value, onChange, error } = - props.handler ?? noHandlerPropsAndNoContextForField(props.name); - - return ( - <div class="col-span-6" data-downloaded={!!value}> - {before !== undefined && <RenderAddon addon={before} />} - <a - href="#" - onClick={(e) => { - onChange(true); - return ( - fetch(url, { - headers: { - "Content-Type": media ?? "text/html", - }, - cache: "no-cache", - }) - // .then((r) => r.text()) - .then((r) => r.arrayBuffer()) - .then((r) => { - const b64 = window.btoa( - new Uint8Array(r).reduce( - (data, byte) => data + String.fromCharCode(byte), - "", - ), - ); - - const a = document.createElement("a"); - a.href = `data:${media ?? "text/html"};base64,${b64}`; - a.download = ""; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - return; - }) - ); - }} - media={media} - download - > - {label} - </a> - {required ? ( - <span class="text-sm leading-6 text-red-600 pl-2">*</span> - ) : undefined} - - {after !== undefined && <RenderAddon addon={after} />} - {help && ( - <p class="mt-2 text-sm text-gray-500" id="email-description"> - {help} - </p> - )} - </div> - ); -} diff --git a/packages/web-util/src/forms/field-types.ts b/packages/web-util/src/forms/field-types.ts @@ -1,7 +1,7 @@ import { VNode } from "preact"; import { Caption } from "./Caption.js"; -import { InputDownloadLink } from "./InputDownloadLink.js"; -import { ExternalLink } from "./ExternalLink.js"; +import { InputDownloadLink } from "./fields/InputDownloadLink.js"; +import { ExternalLink } from "./fields/ExternalLink.js"; import { InputAbsoluteTime } from "./fields/InputAbsoluteTime.js"; import { InputAmount } from "./fields/InputAmount.js"; import { InputArray } from "./fields/InputArray.js"; diff --git a/packages/web-util/src/forms/fields/ExternalLink.tsx b/packages/web-util/src/forms/fields/ExternalLink.tsx @@ -0,0 +1,44 @@ +import { TranslatedString } from "@gnu-taler/taler-util"; +import { VNode, h } from "preact"; +import { RenderAddon } from "./InputLine.js"; +import { Addon } from "../FormProvider.js"; + +interface Props { + label: TranslatedString; + url: string; + media?: string; + tooltip?: TranslatedString; + help?: TranslatedString; + before?: Addon; + after?: Addon; +} + +export function ExternalLink({ + before, + after, + label, + url, + media, + tooltip, + help, +}: Props): VNode { + return ( + <div class="sm:col-span-6"> + {before !== undefined && <RenderAddon addon={before} />} + <a + href={url} + class="underline text-blue-600 hover:text-blue-900 visited:text-purple-600" + target="_blank" + rel="noreferrer" + > + {label} + </a> + {after !== undefined && <RenderAddon addon={after} />} + {help && ( + <p class="mt-2 text-sm text-gray-500" id="email-description"> + {help} + </p> + )} + </div> + ); +} diff --git a/packages/web-util/src/forms/fields/InputDownloadLink.tsx b/packages/web-util/src/forms/fields/InputDownloadLink.tsx @@ -0,0 +1,84 @@ +import { TranslatedString } from "@gnu-taler/taler-util"; +import { VNode, h } from "preact"; +import { RenderAddon } from "./InputLine.js"; +import { Addon, UIFormProps } from "../FormProvider.js"; +import { noHandlerPropsAndNoContextForField } from "../../index.browser.js"; + +interface Props { + label: TranslatedString; + url: string; + media?: string; + tooltip?: TranslatedString; + help?: TranslatedString; + before?: Addon; + after?: Addon; +} + +export function InputDownloadLink(props: Props & UIFormProps<boolean>): VNode { + const { + media, + url, + label, + tooltip, + help, + required, + disabled, + before, + after, + } = props; + const { value, onChange, error } = + props.handler ?? noHandlerPropsAndNoContextForField(props.name); + + return ( + <div class="col-span-6" data-downloaded={!!value}> + {before !== undefined && <RenderAddon addon={before} />} + <a + href="#" + class="underline text-blue-600 hover:text-blue-900 visited:text-purple-600" + onClick={(e) => { + onChange(true); + return ( + fetch(url, { + headers: { + "Content-Type": media ?? "text/html", + }, + cache: "no-cache", + }) + // .then((r) => r.text()) + .then((r) => r.arrayBuffer()) + .then((r) => { + const b64 = window.btoa( + new Uint8Array(r).reduce( + (data, byte) => data + String.fromCharCode(byte), + "", + ), + ); + + const a = document.createElement("a"); + a.href = `data:${media ?? "text/html"};base64,${b64}`; + a.download = ""; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + return; + }) + ); + }} + media={media} + download + > + {label} + </a> + {required ? ( + <span class="text-sm leading-6 text-red-600 pl-2">*</span> + ) : undefined} + + {after !== undefined && <RenderAddon addon={after} />} + {help && ( + <p class="mt-2 text-sm text-gray-500" id="email-description"> + {help} + </p> + )} + </div> + ); +} diff --git a/packages/web-util/src/forms/gana/accept-tos.stories.tsx b/packages/web-util/src/forms/gana/accept-tos.stories.tsx @@ -33,7 +33,7 @@ export const EmptyForm = tests.createExample(DefaultForm, { }, design: acceptTos(i18n, { tos_url: "https://exchange.demo.taler.net/terms", - provider_name: "Demo Exchange", + provider_name: "Taler Operations AG", }), }); diff --git a/packages/web-util/src/forms/gana/accept-tos.ts b/packages/web-util/src/forms/gana/accept-tos.ts @@ -58,19 +58,10 @@ export const acceptTos = ( type: "single-column" as const, fields: filterUndefined<UIFormElementConfig>([ { - type: "htmlIframe", - label: context?.provider_name ?? `Link`, + type: "external-link", url: context.tos_url, + label: context.provider_name ?? context.tos_url, }, - // { - // type: "download-link", - // id: TalerFormAttributes.DOWNLOADED_TERMS_OF_SERVICE, - // url: context.tos_url, - // label: "Download text version", - // media: "text/plain", - // required: true, - // help: i18n.str`You must download to proceed` - // }, { type: "download-link", id: TalerFormAttributes.DOWNLOADED_TERMS_OF_SERVICE,