commit 7190993954333bbd427cae2262096428c551a532 parent ab034bde5d1035d15b48da4a7f1f954cfb586c48 Author: Sebastian <sebasjm@gmail.com> Date: Mon, 12 May 2025 16:55:23 -0300 fix #9713 #9728 Diffstat:
13 files changed, 135 insertions(+), 35 deletions(-)
diff --git a/packages/taler-wallet-webextension/.gitignore b/packages/taler-wallet-webextension/.gitignore @@ -3,3 +3,4 @@ extension/ /.linaria-cache/ /lib /coverage +/extension-dev/ diff --git a/packages/taler-wallet-webextension/build.mjs b/packages/taler-wallet-webextension/build.mjs @@ -21,6 +21,7 @@ import { shakerPlugin } from "@linaria/shaker"; await build({ type: "production", + importMeta: import.meta, source: { js: [ "src/popupEntryPoint.tsx", diff --git a/packages/taler-wallet-webextension/dev.mjs b/packages/taler-wallet-webextension/dev.mjs @@ -22,15 +22,18 @@ import linaria from "@linaria/esbuild"; const allStaticFiles = getFilesInDirectory("src/pwa"); const devEntryPoints = [ - "src/popupEntryPoint.dev.tsx", - "src/walletEntryPoint.dev.tsx", - "src/background.dev.ts", - "src/browserWorkerEntry.ts", - "src/stories.tsx", + {in:"src/popupEntryPoint.tsx", out: "popupEntryPoint"}, + {in:"src/walletEntryPoint.tsx", out: "walletEntryPoint"}, + {in:"src/background.ts", out: "background"}, + {in:"src/browserWorkerEntry.ts", out: "browserWorkerEntry"}, + {in:"src/taler-wallet-interaction-loader.ts", out: "taler-wallet-interaction-loader"}, + {in:"src/taler-wallet-interaction-support.ts", out: "taler-wallet-interaction-support"}, + {in:"src/stories.tsx", out: "stories"}, ]; const build = initializeDev({ type: "development", + importMeta: import.meta, source: { js: devEntryPoints, assets: allStaticFiles, @@ -51,6 +54,8 @@ const build = initializeDev({ sourceMap: true, }); }, +}, { + dontDoLiveReload: true }); await build(); diff --git a/packages/taler-wallet-webextension/set-up-dev-wallet.sh b/packages/taler-wallet-webextension/set-up-dev-wallet.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# This file is in the public domain. + +set -eu + +if [[ ! -e package.json ]]; then + echo "Please run this from the root of the repo.">&2 + exit 1 +fi + +vers_manifest=$(jq -r '.version' manifest-common.json) + +# Create version form Manifest v2 +zipfile="taler-wallet-webextension-${vers_manifest}-v2.zip" + +rm -rf extension-dev +mkdir -p extension-dev/{v2,v3} + +TEMP_DIR=extension-dev/v2 +jq -s 'add | .name = "GNU Taler Wallet" ' manifest-common.json manifest-v2.json > $TEMP_DIR/manifest.json +cp -r static $TEMP_DIR/static +cp -r static-dev $TEMP_DIR/static +mkdir $TEMP_DIR/dist + +(cd $TEMP_DIR && zip -q -r "../$zipfile" dist static manifest.json) + +# Create version form Manifest v3 +zipfile="taler-wallet-webextension-${vers_manifest}-v3.zip" + +TEMP_DIR=extension-dev/v3 +jq -s 'add | .name = "GNU Taler Wallet" ' manifest-common.json manifest-v3.json > $TEMP_DIR/manifest.json +cp -r static $TEMP_DIR/static +cp -r static-dev $TEMP_DIR/static +mkdir $TEMP_DIR/dist +cp -r service_worker.js $TEMP_DIR + +(cd $TEMP_DIR && zip -q -r "../$zipfile" dist static manifest.json service_worker.js) + +echo now run the development server +echo FOR v3: 'INSTALL_DIR=$PWD/extension-dev/v3/dist ./dev.mjs' +echo FOR v2: 'INSTALL_DIR=$PWD/extension-dev/v2/dist ./dev.mjs' +\ No newline at end of file diff --git a/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx b/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx @@ -27,8 +27,8 @@ import { TransactionIdStr, } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; -import beer from "../../../static-dev/beer.png"; -import merchantIcon from "../../../static-dev/merchant-icon.jpeg"; +import beer from "../../../static-stories/beer.png"; +import merchantIcon from "../../../static-stories/merchant-icon.jpeg"; import { nullFunction } from "../../mui/handlers.js"; import { BaseView } from "./views.js"; diff --git a/packages/taler-wallet-webextension/src/cta/Refund/stories.tsx b/packages/taler-wallet-webextension/src/cta/Refund/stories.tsx @@ -20,7 +20,7 @@ */ import { Amounts } from "@gnu-taler/taler-util"; -import beer from "../../../static-dev/beer.png"; +import beer from "../../../static-stories/beer.png"; import * as tests from "@gnu-taler/web-util/testing"; import { IgnoredView, ReadyView } from "./views.js"; export default { diff --git a/packages/taler-wallet-webextension/src/wallet/Transaction.stories.tsx b/packages/taler-wallet-webextension/src/wallet/Transaction.stories.tsx @@ -44,7 +44,7 @@ import { WithdrawalType, } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; -import beer from "../../static-dev/beer.png"; +import beer from "../../static-stories/beer.png"; import { TransactionView as TestedComponent } from "./Transaction.js"; export default { @@ -75,7 +75,7 @@ const commonTransaction: TransactionCommon = { "pending" > as TransactionCommon; -import merchantIcon from "../../static-dev/merchant-icon.jpeg"; +import merchantIcon from "../../static-stories/merchant-icon.jpeg"; const exampleData = { withdraw: { diff --git a/packages/taler-wallet-webextension/src/wallet/Transaction.tsx b/packages/taler-wallet-webextension/src/wallet/Transaction.tsx @@ -277,10 +277,10 @@ function TransactionTemplate({ }} /> ) : ( - <WarningBox> + <InfoBox> <div style={{ justifyContent: "center", lineHeight: "25px" }}> <i18n.Translate> - This transaction is not completed + This transaction is pending to complete. </i18n.Translate> <Link onClick={onRetry} style={{ padding: 0 }}> <SvgIcon @@ -290,7 +290,7 @@ function TransactionTemplate({ /> </Link> </div> - </WarningBox> + </InfoBox> ))} {transaction.txState.major === TransactionMajorState.Aborted && ( <InfoBox> @@ -905,6 +905,16 @@ export function TransactionView({ <i18n.Translate>Invoice</i18n.Translate> </Header> + {transaction.txState.major === TransactionMajorState.Pending && + transaction.txState.minor === TransactionMinorState.Ready && + transaction.talerUri && + !transaction.error && ( + <Part + title={i18n.str`URI`} + text={<ShowQrWithCopy text={transaction.talerUri} startOpen />} + kind="neutral" + /> + )} {transaction.info.summary ? ( <Part title={i18n.str`Subject`} @@ -917,16 +927,6 @@ export function TransactionView({ text={transaction.exchangeBaseUrl as TranslatedString} kind="neutral" /> - {transaction.txState.major === TransactionMajorState.Pending && - transaction.txState.minor === TransactionMinorState.Ready && - transaction.talerUri && - !transaction.error && ( - <Part - title={i18n.str`URI`} - text={<ShowQrWithCopy text={transaction.talerUri} />} - kind="neutral" - /> - )} <Part title={i18n.str`Details`} text={ @@ -1004,6 +1004,13 @@ export function TransactionView({ <i18n.Translate>Transfer</i18n.Translate> </Header> + {transaction.talerUri && ( + <Part + title={i18n.str`URI`} + text={<ShowQrWithCopy text={transaction.talerUri} startOpen />} + kind="neutral" + /> + )} {transaction.info.summary ? ( <Part title={i18n.str`Subject`} @@ -1016,13 +1023,6 @@ export function TransactionView({ text={transaction.exchangeBaseUrl as TranslatedString} kind="neutral" /> - {transaction.talerUri && ( - <Part - title={i18n.str`URI`} - text={<ShowQrWithCopy text={transaction.talerUri} />} - kind="neutral" - /> - )} <Part title={i18n.str`Details`} text={ @@ -1938,8 +1938,14 @@ function NicePayto({ payto }: { payto: PaytoUri }): VNode { return <Fragment>{stringifyPaytoUri(payto)}</Fragment>; } -function ShowQrWithCopy({ text }: { text: string }): VNode { - const [showing, setShowing] = useState(false); +function ShowQrWithCopy({ + text, + startOpen, +}: { + text: string; + startOpen?: boolean; +}): VNode { + const [showing, setShowing] = useState(startOpen); const { i18n } = useTranslationContext(); async function copy(): Promise<void> { navigator.clipboard.writeText(text); diff --git a/packages/taler-wallet-webextension/static-dev/wallet.html b/packages/taler-wallet-webextension/static-dev/wallet.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html> + +<head> + <title>GNU Taler Wallet - WebExtension (dev)</title> + <meta charset="utf-8" /> + <meta name="taler-support" content="uri,api" /> + <link rel="stylesheet" type="text/css" href="/dist/walletEntryPoint.css" /> + <link rel="stylesheet" type="text/css" href="/static/font/import.css" /> + <link rel="icon" + href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> + <script src="/dist/walletEntryPoint.dev.js"></script> + <style> + html { + font-family: sans-serif; + /* 1 */ + } + + h1 { + font-size: 2em; + } + + input { + font: inherit; + } + + body { + margin: 0; + font-size: 100%; + padding: 0; + background-color: #f8faf7; + font-family: Arial, Helvetica, sans-serif; + } + </style> +</head> + +<body> + <div id="container" class="wallet-container"></div> +</body> + +</html> diff --git a/packages/taler-wallet-webextension/static-dev/beer.png b/packages/taler-wallet-webextension/static-stories/beer.png Binary files differ. diff --git a/packages/taler-wallet-webextension/static-dev/merchant-icon.jpeg b/packages/taler-wallet-webextension/static-stories/merchant-icon.jpeg Binary files differ. diff --git a/packages/web-util/src/index.build.ts b/packages/web-util/src/index.build.ts @@ -220,7 +220,7 @@ export interface BuildParams { importMeta?: ImportMeta; source: { assets: Assets | Assets[]; - js: string[]; + js: string[] | Record<string,string>; }; public?: string; /** @@ -358,10 +358,13 @@ export function initializeDevOnWebUtils( */ export function initializeDev( config: BuildParams, + options: {dontDoLiveReload?: boolean} = {}, ): () => Promise<esbuild.BuildResult> { function buildDevelopment() { const { esBuildOptions } = computeConfig(config); - esBuildOptions.inject = [LIVE_RELOAD_SCRIPT]; + if (!options.dontDoLiveReload) { + esBuildOptions.inject = [LIVE_RELOAD_SCRIPT]; + } return esbuild.build(esBuildOptions); } return buildDevelopment; diff --git a/packages/web-util/src/serve.ts b/packages/web-util/src/serve.ts @@ -79,7 +79,8 @@ export async function serve(opts: { }); }); - const sendToAllClients = function (data: object): void { + const sendToAllClients = function (data: {type: string, data: object}): void { + logger.info(`notifying: ${data.type}`); wss.clients.forEach(function each(client) { if (client.readyState === WebSocket.OPEN) { client.send(JSON.stringify(data));