2022-12-06 15:25:05 +01:00
|
|
|
/*
|
|
|
|
This file is part of GNU Taler
|
|
|
|
(C) 2022 Taler Systems S.A.
|
|
|
|
|
|
|
|
GNU Taler is free software; you can redistribute it and/or modify it under the
|
|
|
|
terms of the GNU General Public License as published by the Free Software
|
|
|
|
Foundation; either version 3, or (at your option) any later version.
|
|
|
|
|
|
|
|
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
|
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
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/>
|
|
|
|
*/
|
|
|
|
|
2023-04-26 19:47:42 +02:00
|
|
|
import {
|
|
|
|
HttpStatusCode,
|
|
|
|
stringifyWithdrawUri,
|
|
|
|
WithdrawUriResult,
|
|
|
|
} from "@gnu-taler/taler-util";
|
|
|
|
import {
|
|
|
|
RequestError,
|
|
|
|
useTranslationContext,
|
2023-05-05 13:36:48 +02:00
|
|
|
} from "@gnu-taler/web-util/browser";
|
2022-12-06 15:25:05 +01:00
|
|
|
import { h, VNode } from "preact";
|
|
|
|
import { useEffect } from "preact/hooks";
|
2022-12-09 16:15:15 +01:00
|
|
|
import { QR } from "../components/QR.js";
|
2023-04-26 19:47:42 +02:00
|
|
|
import { useAccessAnonAPI } from "../hooks/access.js";
|
|
|
|
import { notifyError } from "../hooks/notification.js";
|
|
|
|
import { buildRequestErrorMessage } from "../utils.js";
|
2022-12-06 15:25:05 +01:00
|
|
|
|
|
|
|
export function QrCodeSection({
|
2023-04-07 22:30:01 +02:00
|
|
|
withdrawUri,
|
2023-02-28 23:03:43 +01:00
|
|
|
onAborted,
|
2022-12-06 15:25:05 +01:00
|
|
|
}: {
|
2023-04-07 22:30:01 +02:00
|
|
|
withdrawUri: WithdrawUriResult;
|
2023-02-28 23:03:43 +01:00
|
|
|
onAborted: () => void;
|
2022-12-06 15:25:05 +01:00
|
|
|
}): VNode {
|
|
|
|
const { i18n } = useTranslationContext();
|
|
|
|
useEffect(() => {
|
|
|
|
//Taler Wallet WebExtension is listening to headers response and tab updates.
|
|
|
|
//In the SPA there is no header response with the Taler URI so
|
|
|
|
//this hack manually triggers the tab update after the QR is in the DOM.
|
2022-12-07 16:50:54 +01:00
|
|
|
// WebExtension will be using
|
|
|
|
// https://developer.chrome.com/docs/extensions/reference/tabs/#event-onUpdated
|
2023-04-07 22:30:01 +02:00
|
|
|
document.title = `${document.title} ${withdrawUri.withdrawalOperationId}`;
|
2022-12-06 15:25:05 +01:00
|
|
|
}, []);
|
2023-04-07 22:30:01 +02:00
|
|
|
const talerWithdrawUri = stringifyWithdrawUri(withdrawUri);
|
2022-12-06 15:25:05 +01:00
|
|
|
|
2023-04-26 19:47:42 +02:00
|
|
|
const { abortWithdrawal } = useAccessAnonAPI();
|
2022-12-06 15:25:05 +01:00
|
|
|
return (
|
|
|
|
<section id="main" class="content">
|
|
|
|
<h1 class="nav">{i18n.str`Transfer to Taler Wallet`}</h1>
|
|
|
|
<article>
|
|
|
|
<div class="qr-div">
|
|
|
|
<p>{i18n.str`Use this QR code to withdraw to your mobile wallet:`}</p>
|
2022-12-09 16:07:01 +01:00
|
|
|
<QR text={talerWithdrawUri} />
|
2022-12-06 15:25:05 +01:00
|
|
|
<p>
|
2022-12-09 15:03:30 +01:00
|
|
|
<i18n.Translate>
|
|
|
|
Click{" "}
|
2023-04-13 17:17:50 +02:00
|
|
|
<a href={talerWithdrawUri}>{i18n.str`this taler:// link`}</a> to
|
|
|
|
open your Taler wallet
|
2022-12-22 22:39:18 +01:00
|
|
|
</i18n.Translate>{" "}
|
2022-12-06 15:25:05 +01:00
|
|
|
</p>
|
|
|
|
<br />
|
2023-02-08 21:41:19 +01:00
|
|
|
<a
|
|
|
|
class="pure-button btn-cancel"
|
2023-04-26 19:47:42 +02:00
|
|
|
onClick={async (e) => {
|
|
|
|
e.preventDefault();
|
|
|
|
try {
|
|
|
|
await abortWithdrawal(withdrawUri.withdrawalOperationId);
|
|
|
|
onAborted();
|
|
|
|
} catch (error) {
|
|
|
|
if (error instanceof RequestError) {
|
|
|
|
notifyError(
|
|
|
|
buildRequestErrorMessage(i18n, error.cause, {
|
|
|
|
onClientError: (status) =>
|
|
|
|
status === HttpStatusCode.Conflict
|
|
|
|
? i18n.str`The reserve operation has been confirmed previously and can't be aborted`
|
|
|
|
: undefined,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
notifyError({
|
|
|
|
title: i18n.str`Operation failed, please report`,
|
|
|
|
description:
|
|
|
|
error instanceof Error
|
|
|
|
? error.message
|
|
|
|
: JSON.stringify(error),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}}
|
2023-02-08 21:41:19 +01:00
|
|
|
>{i18n.str`Abort`}</a>
|
2022-12-06 15:25:05 +01:00
|
|
|
</div>
|
|
|
|
</article>
|
|
|
|
</section>
|
|
|
|
);
|
|
|
|
}
|