aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-11-22 17:34:27 -0300
committerSebastian <sebasjm@gmail.com>2021-11-22 17:34:31 -0300
commit829a59e1a24d6a99ce7554d28acfd05f21baeaf8 (patch)
tree66ef9157905e71ebf9e252c533d1855f381902d0 /packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx
parenta35604fd562a72e4e266bf6a4255d89d3c1374a1 (diff)
downloadwallet-core-829a59e1a24d6a99ce7554d28acfd05f21baeaf8.tar.gz
wallet-core-829a59e1a24d6a99ce7554d28acfd05f21baeaf8.tar.bz2
wallet-core-829a59e1a24d6a99ce7554d28acfd05f21baeaf8.zip
add exchange feature
Diffstat (limited to 'packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx')
-rw-r--r--packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx152
1 files changed, 152 insertions, 0 deletions
diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx b/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx
new file mode 100644
index 000000000..5c7f94ecd
--- /dev/null
+++ b/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx
@@ -0,0 +1,152 @@
+import { i18n } from "@gnu-taler/taler-util";
+import { Fragment, h, VNode } from "preact";
+import { useState } from "preact/hooks";
+import {
+ Button,
+ ButtonSuccess,
+ ButtonWarning,
+ WarningBox,
+} from "../components/styled/index";
+import { TermsOfServiceSection } from "../cta/TermsOfServiceSection";
+import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
+import { buildTermsOfServiceState, TermsState } from "../utils";
+import * as wxApi from "../wxApi";
+
+export interface Props {
+ url: string;
+ onCancel: () => void;
+ onConfirm: () => void;
+}
+
+export function ExchangeAddConfirmPage({
+ url,
+ onCancel,
+ onConfirm,
+}: Props): VNode {
+ const detailsHook = useAsyncAsHook(async () => {
+ const tos = await wxApi.getExchangeTos(url, ["text/xml"]);
+
+ const tosState = buildTermsOfServiceState(tos);
+
+ return { tos: tosState };
+ });
+
+ const termsNotFound: TermsState = {
+ status: "notfound",
+ version: "",
+ content: undefined,
+ };
+ const terms = !detailsHook
+ ? undefined
+ : detailsHook.hasError
+ ? termsNotFound
+ : detailsHook.response.tos;
+
+ // const [errorAccepting, setErrorAccepting] = useState<string | undefined>(
+ // undefined,
+ // );
+
+ const onAccept = async (): Promise<void> => {
+ if (!terms) return;
+ try {
+ await wxApi.setExchangeTosAccepted(url, terms.version);
+ } catch (e) {
+ if (e instanceof Error) {
+ // setErrorAccepting(e.message);
+ }
+ }
+ };
+ return (
+ <View
+ url={url}
+ onAccept={onAccept}
+ onCancel={onCancel}
+ onConfirm={onConfirm}
+ terms={terms}
+ />
+ );
+}
+
+export interface ViewProps {
+ url: string;
+ terms: TermsState | undefined;
+ onAccept: (b: boolean) => Promise<void>;
+ onCancel: () => void;
+ onConfirm: () => void;
+}
+
+export function View({
+ url,
+ terms,
+ onAccept: doAccept,
+ onConfirm,
+ onCancel,
+}: ViewProps): VNode {
+ const needsReview =
+ !terms || terms.status === "changed" || terms.status === "new";
+ const [reviewed, setReviewed] = useState<boolean>(false);
+
+ return (
+ <Fragment>
+ <section>
+ <h1>Review terms of service</h1>
+ <div>
+ Exchange URL:
+ <a href={url} target="_blank" rel="noreferrer">
+ {url}
+ </a>
+ </div>
+ </section>
+ {terms && terms.status === "notfound" && (
+ <section>
+ <WarningBox>
+ {i18n.str`Exchange doesn't have terms of service`}
+ </WarningBox>
+ </section>
+ )}
+
+ {terms && (
+ <TermsOfServiceSection
+ reviewed={reviewed}
+ reviewing={true}
+ terms={terms}
+ onAccept={(value) =>
+ doAccept(value).then(() => {
+ setReviewed(value);
+ })
+ }
+ />
+ )}
+
+ <footer>
+ <Button onClick={onCancel}>
+ <i18n.Translate>Cancel</i18n.Translate>
+ </Button>
+ {!terms && (
+ <Button disabled>
+ <i18n.Translate>Loading terms..</i18n.Translate>
+ </Button>
+ )}
+ {terms && (
+ <Fragment>
+ {needsReview && !reviewed && (
+ <ButtonSuccess disabled upperCased onClick={onConfirm}>
+ {i18n.str`Add exchange`}
+ </ButtonSuccess>
+ )}
+ {(terms.status === "accepted" || (needsReview && reviewed)) && (
+ <ButtonSuccess upperCased onClick={onConfirm}>
+ {i18n.str`Add exchange`}
+ </ButtonSuccess>
+ )}
+ {terms.status === "notfound" && (
+ <ButtonWarning upperCased onClick={onConfirm}>
+ {i18n.str`Add exchange anyway`}
+ </ButtonWarning>
+ )}
+ </Fragment>
+ )}
+ </footer>
+ </Fragment>
+ );
+}