aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/cta/TermsOfService/state.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-webextension/src/cta/TermsOfService/state.ts')
-rw-r--r--packages/taler-wallet-webextension/src/cta/TermsOfService/state.ts136
1 files changed, 136 insertions, 0 deletions
diff --git a/packages/taler-wallet-webextension/src/cta/TermsOfService/state.ts b/packages/taler-wallet-webextension/src/cta/TermsOfService/state.ts
new file mode 100644
index 000000000..4e89bc243
--- /dev/null
+++ b/packages/taler-wallet-webextension/src/cta/TermsOfService/state.ts
@@ -0,0 +1,136 @@
+/*
+ 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/>
+ */
+
+import { useState } from "preact/hooks";
+import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js";
+import * as wxApi from "../../wxApi.js";
+import { Props, State } from "./index.js";
+import { buildTermsOfServiceState } from "./utils.js";
+
+export function useComponentState(
+ { exchangeUrl, readOnly, onChange }: Props,
+ api: typeof wxApi,
+): State {
+ const [showContent, setShowContent] = useState<boolean>(false);
+ // const [accepted, setAccepted] = useState<boolean>(false);
+ const [errorAccepting, setErrorAccepting] = useState<Error | undefined>(
+ undefined,
+ );
+
+ /**
+ * For the exchange selected, bring the status of the terms of service
+ */
+ const terms = useAsyncAsHook(async () => {
+ const exchangeTos = await api.getExchangeTos(exchangeUrl, ["text/xml"]);
+
+ const state = buildTermsOfServiceState(exchangeTos);
+
+ return { state };
+ }, []);
+
+ if (!terms) {
+ return {
+ status: "loading",
+ error: undefined,
+ };
+ }
+ if (terms.hasError) {
+ return {
+ status: "loading-error",
+ error: terms,
+ };
+ }
+
+ if (errorAccepting) {
+ return {
+ status: "error-accepting",
+ error: {
+ hasError: true,
+ operational: false,
+ message: errorAccepting.message,
+ },
+ };
+ }
+
+ const { state } = terms.response;
+
+ async function onUpdate(accepted: boolean): Promise<void> {
+ if (!state) return;
+
+ try {
+ if (accepted) {
+ await api.setExchangeTosAccepted(exchangeUrl, state.version);
+ } else {
+ // mark as not accepted
+ await api.setExchangeTosAccepted(exchangeUrl, undefined);
+ }
+ // setAccepted(accepted);
+ onChange(accepted); //external update
+ } catch (e) {
+ if (e instanceof Error) {
+ //FIXME: uncomment this and display error
+ // setErrorAccepting(e.message);
+ setErrorAccepting(e);
+ }
+ }
+ }
+
+ const accepted = state.status === "accepted";
+
+ const base: State.BaseInfo = {
+ error: undefined,
+ showingTermsOfService: {
+ value: showContent,
+ button: {
+ onClick: readOnly
+ ? undefined
+ : async () => {
+ setShowContent(!showContent);
+ },
+ },
+ },
+ terms: state,
+ termsAccepted: {
+ value: accepted,
+ button: {
+ onClick: async () => {
+ const newValue = !accepted; //toggle
+ onUpdate(newValue);
+ setShowContent(false);
+ },
+ },
+ },
+ };
+
+ if (showContent) {
+ return {
+ status: "show-content",
+ ...base,
+ };
+ }
+ //showing buttons
+ if (accepted) {
+ return {
+ status: "show-buttons-accepted",
+ ...base,
+ };
+ } else {
+ return {
+ status: "show-buttons-not-accepted",
+ ...base,
+ };
+ }
+}