diff options
author | Sebastian <sebasjm@gmail.com> | 2023-05-02 09:56:44 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-05-02 09:57:12 -0300 |
commit | a957e61a9ca05c35e6f40697a343f8c815b6edea (patch) | |
tree | 54f8a83831c6949aabbc785c455c7264d8c086b4 | |
parent | 23fca6d8677a1e88dad426691fbe1033595f16a3 (diff) |
fix #7828
7 files changed, 72 insertions, 74 deletions
diff --git a/packages/taler-wallet-webextension/src/platform/api.ts b/packages/taler-wallet-webextension/src/platform/api.ts index f8fa0a848..f985cc4f8 100644 --- a/packages/taler-wallet-webextension/src/platform/api.ts +++ b/packages/taler-wallet-webextension/src/platform/api.ts @@ -14,7 +14,11 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { CoreApiResponse, NotificationType } from "@gnu-taler/taler-util"; +import { + CoreApiResponse, + NotificationType, + TalerUri, +} from "@gnu-taler/taler-util"; import { WalletConfig, WalletConfigParameter, @@ -229,7 +233,7 @@ export interface ForegroundPlatformAPI { * * @param talerUri */ - openWalletURIFromPopup(talerUri: string): void; + openWalletURIFromPopup(talerUri: TalerUri): void; /** * Popup API diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts b/packages/taler-wallet-webextension/src/platform/chrome.ts index 51cf2f64e..0f6b5fb0d 100644 --- a/packages/taler-wallet-webextension/src/platform/chrome.ts +++ b/packages/taler-wallet-webextension/src/platform/chrome.ts @@ -20,6 +20,8 @@ import { TalerUriAction, TalerError, parseTalerUri, + TalerUri, + stringifyTalerUri, } from "@gnu-taler/taler-util"; import { WalletOperations } from "@gnu-taler/taler-wallet-core"; import { BackgroundOperations } from "../wxApi.js"; @@ -247,17 +249,8 @@ function notifyWhenAppIsReady(): Promise<void> { }); } -function openWalletURIFromPopup(maybeTalerUri: string): void { - const talerUri = maybeTalerUri.startsWith("ext+") - ? maybeTalerUri.substring(4) - : maybeTalerUri; - const uri = parseTalerUri(talerUri); - if (!uri) { - logger.warn( - `Response with HTTP 402 the Taler header but could not classify ${talerUri}`, - ); - return; - } +function openWalletURIFromPopup(uri: TalerUri): void { + const talerUri = stringifyTalerUri(uri); //FIXME: this should redirect to just one place // the target pathname should handle what happens if the endpoint is not there // like "trying to open from popup but this uri is not handled" @@ -335,7 +328,7 @@ function openWalletURIFromPopup(maybeTalerUri: string): void { } } - chrome.tabs.create({ active: true, url }, () => { + chrome.tabs.update({ active: true, url }, () => { window.close(); }); } diff --git a/packages/taler-wallet-webextension/src/platform/dev.ts b/packages/taler-wallet-webextension/src/platform/dev.ts index 1a4183bec..1d43ad549 100644 --- a/packages/taler-wallet-webextension/src/platform/dev.ts +++ b/packages/taler-wallet-webextension/src/platform/dev.ts @@ -14,7 +14,7 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { CoreApiResponse } from "@gnu-taler/taler-util"; +import { CoreApiResponse, TalerUri } from "@gnu-taler/taler-util"; import { WalletOperations } from "@gnu-taler/taler-wallet-core"; import { BackgroundOperations } from "../wxApi.js"; import { @@ -73,7 +73,7 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = { window.parent.frames["wallet" as any].location = `/wallet.html#${page}`; window.location.href = "about:blank"; }, - openWalletURIFromPopup: (page: string) => { + openWalletURIFromPopup: (page: TalerUri) => { alert("openWalletURIFromPopup not implemented yet"); }, redirectTabToWalletPage: (tabId: number, page: string) => { diff --git a/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx b/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx index b7984e4b8..ffd883098 100644 --- a/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx +++ b/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx @@ -19,10 +19,10 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { classifyTalerUri, TalerUriType } from "@gnu-taler/taler-util"; +import { parseTalerUri, TalerUri, TalerUriAction } from "@gnu-taler/taler-util"; +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { Fragment, h, VNode } from "preact"; import { Title } from "../components/styled/index.js"; -import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { Button } from "../mui/Button.js"; import { platform } from "../platform/foreground.js"; @@ -32,15 +32,15 @@ export interface Props { } function ContentByUriType({ - type, + uri, onConfirm, }: { - type: TalerUriType; + uri: TalerUri; onConfirm: () => Promise<void>; }) { const { i18n } = useTranslationContext(); - switch (type) { - case TalerUriType.TalerWithdraw: + switch (uri.type) { + case TalerUriAction.Withdraw: return ( <div> <p> @@ -52,8 +52,8 @@ function ContentByUriType({ </div> ); - case TalerUriType.TalerPayTemplate: - case TalerUriType.TalerPay: + case TalerUriAction.PayTemplate: + case TalerUriAction.Pay: return ( <div> <p> @@ -64,7 +64,7 @@ function ContentByUriType({ </Button> </div> ); - case TalerUriType.TalerTip: + case TalerUriAction.Tip: return ( <div> <p> @@ -76,7 +76,7 @@ function ContentByUriType({ </div> ); - case TalerUriType.TalerRefund: + case TalerUriAction.Refund: return ( <div> <p> @@ -88,34 +88,25 @@ function ContentByUriType({ </div> ); - case TalerUriType.TalerDevExperiment: - case TalerUriType.TalerTemplate: - case TalerUriType.TalerPayPull: - case TalerUriType.TalerPayPush: - case TalerUriType.TalerRecovery: - case TalerUriType.Unknown: - return ( - <div> - <p> - <i18n.Translate> - This page has a malformed taler uri. - </i18n.Translate> - </p> - </div> - ); - + case TalerUriAction.DevExperiment: + case TalerUriAction.PayPull: + case TalerUriAction.PayPush: + case TalerUriAction.Restore: + case TalerUriAction.Auditor: + case TalerUriAction.Exchange: + return null; default: { - const error: never = type; + const error: never = uri; return null; } } } export function TalerActionFound({ url, onDismiss }: Props): VNode { - const uriType = classifyTalerUri(url); + const talerUri = parseTalerUri(url); const { i18n } = useTranslationContext(); async function redirectToWallet(): Promise<void> { - platform.openWalletURIFromPopup(url); + platform.openWalletURIFromPopup(talerUri!); } return ( <Fragment> @@ -123,7 +114,17 @@ export function TalerActionFound({ url, onDismiss }: Props): VNode { <Title> <i18n.Translate>Taler Action</i18n.Translate> </Title> - <ContentByUriType type={uriType} onConfirm={redirectToWallet} /> + {!talerUri ? ( + <div> + <p> + <i18n.Translate> + This page has a malformed taler uri. + </i18n.Translate> + </p> + </div> + ) : ( + <ContentByUriType uri={talerUri} onConfirm={redirectToWallet} /> + )} </section> <footer> <div /> diff --git a/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx b/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx index 68a90f8b5..7f142f58b 100644 --- a/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx +++ b/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx @@ -13,13 +13,13 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { classifyTalerUri, TalerUriType } from "@gnu-taler/taler-util"; +import { parseTalerUri, TalerUriAction } from "@gnu-taler/taler-util"; +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; -import { platform } from "../platform/foreground.js"; import { InputWithLabel } from "../components/styled/index.js"; -import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { Button } from "../mui/Button.js"; +import { platform } from "../platform/foreground.js"; export interface Props { onCancel: () => Promise<void>; @@ -27,19 +27,17 @@ export interface Props { export function AddNewActionView({ onCancel }: Props): VNode { const [url, setUrl] = useState(""); - const uriType = classifyTalerUri(url); + const uri = parseTalerUri(url); const { i18n } = useTranslationContext(); async function redirectToWallet(): Promise<void> { - platform.openWalletURIFromPopup(url); + platform.openWalletURIFromPopup(uri!); } return ( <Fragment> <section> - <InputWithLabel - invalid={url !== "" && uriType === TalerUriType.Unknown} - > + <InputWithLabel invalid={url !== "" && !uri}> <label>GNU Taler URI</label> <div> <input @@ -56,21 +54,21 @@ export function AddNewActionView({ onCancel }: Props): VNode { <Button variant="contained" color="secondary" onClick={onCancel}> <i18n.Translate>Cancel</i18n.Translate> </Button> - {uriType !== TalerUriType.Unknown && ( + {uri && ( <Button variant="contained" color="success" onClick={redirectToWallet} > {(() => { - switch (uriType) { - case TalerUriType.TalerPay: + switch (uri.type) { + case TalerUriAction.Pay: return <i18n.Translate>Open pay page</i18n.Translate>; - case TalerUriType.TalerRefund: + case TalerUriAction.Refund: return <i18n.Translate>Open refund page</i18n.Translate>; - case TalerUriType.TalerTip: + case TalerUriAction.Tip: return <i18n.Translate>Open tip page</i18n.Translate>; - case TalerUriType.TalerWithdraw: + case TalerUriAction.Withdraw: return <i18n.Translate>Open withdraw page</i18n.Translate>; } return <Fragment />; diff --git a/packages/taler-wallet-webextension/src/wallet/Application.tsx b/packages/taler-wallet-webextension/src/wallet/Application.tsx index 5c75b734b..6541625c5 100644 --- a/packages/taler-wallet-webextension/src/wallet/Application.tsx +++ b/packages/taler-wallet-webextension/src/wallet/Application.tsx @@ -20,7 +20,7 @@ * @author sebasjm */ -import { TranslatedString } from "@gnu-taler/taler-util"; +import { TalerUri, TranslatedString } from "@gnu-taler/taler-util"; import { TranslationProvider, useTranslationContext, @@ -102,7 +102,7 @@ export function Application(): VNode { component={() => ( <WalletTemplate goToTransaction={redirectToTxInfo}> <QrReaderPage - onDetected={(talerActionUrl: string) => { + onDetected={(talerActionUrl: TalerUri) => { platform.openWalletURIFromPopup(talerActionUrl); }} /> diff --git a/packages/taler-wallet-webextension/src/wallet/QrReader.tsx b/packages/taler-wallet-webextension/src/wallet/QrReader.tsx index 10916496c..81f879a62 100644 --- a/packages/taler-wallet-webextension/src/wallet/QrReader.tsx +++ b/packages/taler-wallet-webextension/src/wallet/QrReader.tsx @@ -15,22 +15,21 @@ */ import { - classifyTalerUri, - TalerUriType, + parseTalerUri, + TalerUri, TranslatedString, } from "@gnu-taler/taler-util"; -import { styled } from "@linaria/react"; +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { css } from "@linaria/core"; +import { styled } from "@linaria/react"; +import jsQR, * as pr from "jsqr"; import { Fragment, h, VNode } from "preact"; -import { Ref, useEffect, useMemo, useRef, useState } from "preact/hooks"; -import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; +import { useRef, useState } from "preact/hooks"; import { Alert } from "../mui/Alert.js"; import { Button } from "../mui/Button.js"; -import { TextField } from "../mui/TextField.js"; -import jsQR, * as pr from "jsqr"; -import { InputFile } from "../mui/InputFile.js"; import { Grid } from "../mui/Grid.js"; -import { notDeepEqual } from "assert"; +import { InputFile } from "../mui/InputFile.js"; +import { TextField } from "../mui/TextField.js"; const QrCanvas = css` width: 80%; @@ -51,7 +50,7 @@ const Container = styled.div` `; export interface Props { - onDetected: (url: string) => void; + onDetected: (url: TalerUri) => void; } type XY = { x: number; y: number }; @@ -214,7 +213,7 @@ export function QrReaderPage({ onDetected }: Props): VNode { function onChange(str: string) { if (!!str) { - if (classifyTalerUri(str) === TalerUriType.Unknown) { + if (!parseTalerUri(str)) { setError( i18n.str`URI is not valid. Taler URI should start with "taler://"`, ); @@ -318,7 +317,10 @@ export function QrReaderPage({ onDetected }: Props): VNode { disabled={!!error} variant="contained" color="success" - onClick={async () => onDetected(value)} + onClick={async () => { + const uri = parseTalerUri(value); + if (uri) onDetected(uri); + }} > <i18n.Translate>Open</i18n.Translate> </Button> |