summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2023-05-02 09:56:44 -0300
committerSebastian <sebasjm@gmail.com>2023-05-02 09:57:12 -0300
commita957e61a9ca05c35e6f40697a343f8c815b6edea (patch)
tree54f8a83831c6949aabbc785c455c7264d8c086b4 /packages/taler-wallet-webextension/src
parent23fca6d8677a1e88dad426691fbe1033595f16a3 (diff)
downloadwallet-core-a957e61a9ca05c35e6f40697a343f8c815b6edea.tar.gz
wallet-core-a957e61a9ca05c35e6f40697a343f8c815b6edea.tar.bz2
wallet-core-a957e61a9ca05c35e6f40697a343f8c815b6edea.zip
fix #7828
Diffstat (limited to 'packages/taler-wallet-webextension/src')
-rw-r--r--packages/taler-wallet-webextension/src/platform/api.ts8
-rw-r--r--packages/taler-wallet-webextension/src/platform/chrome.ts17
-rw-r--r--packages/taler-wallet-webextension/src/platform/dev.ts4
-rw-r--r--packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx61
-rw-r--r--packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx26
-rw-r--r--packages/taler-wallet-webextension/src/wallet/Application.tsx4
-rw-r--r--packages/taler-wallet-webextension/src/wallet/QrReader.tsx26
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>