aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/wallet/AddAccount
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-webextension/src/wallet/AddAccount')
-rw-r--r--packages/taler-wallet-webextension/src/wallet/AddAccount/index.ts73
-rw-r--r--packages/taler-wallet-webextension/src/wallet/AddAccount/state.ts107
-rw-r--r--packages/taler-wallet-webextension/src/wallet/AddAccount/stories.tsx29
-rw-r--r--packages/taler-wallet-webextension/src/wallet/AddAccount/test.ts28
-rw-r--r--packages/taler-wallet-webextension/src/wallet/AddAccount/views.tsx249
5 files changed, 0 insertions, 486 deletions
diff --git a/packages/taler-wallet-webextension/src/wallet/AddAccount/index.ts b/packages/taler-wallet-webextension/src/wallet/AddAccount/index.ts
deleted file mode 100644
index 09609a8a1..000000000
--- a/packages/taler-wallet-webextension/src/wallet/AddAccount/index.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- 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 { Loading } from "../../components/Loading.js";
-import { HookError } from "../../hooks/useAsyncAsHook.js";
-import {
- ButtonHandler,
- SelectFieldHandler,
- TextFieldHandler
-} from "../../mui/handlers.js";
-import { compose, StateViewMap } from "../../utils/index.js";
-import { wxApi } from "../../wxApi.js";
-import { useComponentState } from "./state.js";
-import { LoadingUriView, ReadyView } from "./views.js";
-
-export interface Props {
- currency: string;
- onAccountAdded: (uri: string) => void;
- onCancel: () => void;
-}
-
-export type State = State.Loading | State.LoadingUriError | State.Ready;
-
-export namespace State {
- export interface Loading {
- status: "loading";
- error: undefined;
- }
-
- export interface LoadingUriError {
- status: "loading-error";
- error: HookError;
- }
-
- export interface BaseInfo {
- error: undefined;
- }
- export interface Ready extends BaseInfo {
- status: "ready";
- error: undefined;
- currency: string;
- accountType: SelectFieldHandler;
- uri: TextFieldHandler;
- alias: TextFieldHandler;
- onAccountAdded: ButtonHandler;
- onCancel: ButtonHandler;
- }
-}
-
-const viewMapping: StateViewMap<State> = {
- loading: Loading,
- "loading-error": LoadingUriView,
- ready: ReadyView,
-};
-
-export const AddAccountPage = compose(
- "AddAccount",
- (p: Props) => useComponentState(p, wxApi),
- viewMapping,
-);
diff --git a/packages/taler-wallet-webextension/src/wallet/AddAccount/state.ts b/packages/taler-wallet-webextension/src/wallet/AddAccount/state.ts
deleted file mode 100644
index 6c113d732..000000000
--- a/packages/taler-wallet-webextension/src/wallet/AddAccount/state.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- 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 { parsePaytoUri, stringifyPaytoUri } from "@gnu-taler/taler-util";
-import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
-import { useState } from "preact/hooks";
-import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js";
-import { wxApi } from "../../wxApi.js";
-import { Props, State } from "./index.js";
-
-export function useComponentState(
- { currency, onAccountAdded, onCancel }: Props,
- api: typeof wxApi,
-): State {
- const hook = useAsyncAsHook(() => api.wallet.call(WalletApiOperation.ListKnownBankAccounts, { currency }));
-
- const [payto, setPayto] = useState("");
- const [alias, setAlias] = useState("");
- const [type, setType] = useState("");
-
- if (!hook) {
- return {
- status: "loading",
- error: undefined,
- };
- }
- if (hook.hasError) {
- return {
- status: "loading-error",
- error: hook,
- };
- }
-
- const accountType: Record<string, string> = {
- "": "Choose one account",
- iban: "IBAN",
- bitcoin: "Bitcoin",
- "x-taler-bank": "Taler Bank",
- };
- const uri = parsePaytoUri(payto);
- const found =
- hook.response.accounts.findIndex(
- (a) => stringifyPaytoUri(a.uri) === payto,
- ) !== -1;
-
- async function addAccount(): Promise<void> {
- if (!uri || found) return;
-
- const normalizedPayto = stringifyPaytoUri(uri);
- await api.wallet.call(WalletApiOperation.AddKnownBankAccounts, {
- alias, currency, payto: normalizedPayto
- });
- onAccountAdded(payto);
- }
-
- const paytoUriError =
- found
- ? "that account is already present"
- : undefined;
-
- const unableToAdd = !type || !alias || !!paytoUriError || !uri;
-
- return {
- status: "ready",
- error: undefined,
- currency,
- accountType: {
- list: accountType,
- value: type,
- onChange: async (v) => {
- setType(v);
- },
- },
- alias: {
- value: alias,
- onInput: async (v) => {
- setAlias(v);
- },
- },
- uri: {
- value: payto,
- error: paytoUriError,
- onInput: async (v) => {
- setPayto(v);
- },
- },
- onAccountAdded: {
- onClick: unableToAdd ? undefined : addAccount,
- },
- onCancel: {
- onClick: async () => onCancel(),
- },
- };
-}
diff --git a/packages/taler-wallet-webextension/src/wallet/AddAccount/stories.tsx b/packages/taler-wallet-webextension/src/wallet/AddAccount/stories.tsx
deleted file mode 100644
index 696e424c4..000000000
--- a/packages/taler-wallet-webextension/src/wallet/AddAccount/stories.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- 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/>
- */
-
-/**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { createExample } from "../../test-utils.js";
-import { ReadyView } from "./views.js";
-
-export default {
- title: "example",
-};
-
-export const Ready = createExample(ReadyView, {});
diff --git a/packages/taler-wallet-webextension/src/wallet/AddAccount/test.ts b/packages/taler-wallet-webextension/src/wallet/AddAccount/test.ts
deleted file mode 100644
index eae4d4ca2..000000000
--- a/packages/taler-wallet-webextension/src/wallet/AddAccount/test.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- 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/>
- */
-
-/**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { expect } from "chai";
-
-describe("test description", () => {
- it("should assert", () => {
- expect([]).deep.equals([]);
- });
-});
diff --git a/packages/taler-wallet-webextension/src/wallet/AddAccount/views.tsx b/packages/taler-wallet-webextension/src/wallet/AddAccount/views.tsx
deleted file mode 100644
index d6ab7e967..000000000
--- a/packages/taler-wallet-webextension/src/wallet/AddAccount/views.tsx
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- 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 { parsePaytoUri } from "@gnu-taler/taler-util";
-import { Fragment, h, VNode } from "preact";
-import { useState } from "preact/hooks";
-import { ErrorMessage } from "../../components/ErrorMessage.js";
-import { LoadingError } from "../../components/LoadingError.js";
-import { SelectList } from "../../components/SelectList.js";
-import { Input, LightText, SubTitle } from "../../components/styled/index.js";
-import { useTranslationContext } from "../../context/translation.js";
-import { Button } from "../../mui/Button.js";
-import { TextFieldHandler } from "../../mui/handlers.js";
-import { TextField } from "../../mui/TextField.js";
-import { State } from "./index.js";
-
-export function LoadingUriView({ error }: State.LoadingUriError): VNode {
- const { i18n } = useTranslationContext();
-
- return (
- <LoadingError
- title={<i18n.Translate>Could not load</i18n.Translate>}
- error={error}
- />
- );
-}
-
-export function ReadyView({
- currency,
- error,
- accountType,
- alias,
- onAccountAdded,
- onCancel,
- uri,
-}: State.Ready): VNode {
- const { i18n } = useTranslationContext();
-
- return (
- <Fragment>
- <section>
- <SubTitle>
- <i18n.Translate>Add bank account for {currency}</i18n.Translate>
- </SubTitle>
- <LightText>
- <i18n.Translate>
- Enter the URL of an exchange you trust.
- </i18n.Translate>
- </LightText>
-
- {error && (
- <ErrorMessage
- title={<i18n.Translate>Unable add this account</i18n.Translate>}
- description={error}
- />
- )}
- <p>
- <Input>
- <SelectList
- label={<i18n.Translate>Select account type</i18n.Translate>}
- list={accountType.list}
- name="accountType"
- value={accountType.value}
- onChange={accountType.onChange}
- />
- </Input>
- </p>
- {accountType.value === "" ? undefined : (
- <Fragment>
- <p>
- <CustomFieldByAccountType type={accountType.value} field={uri} />
- </p>
- <p>
- <TextField
- label="Account alias"
- variant="standard"
- required
- fullWidth
- disabled={accountType.value === ""}
- value={alias.value}
- onChange={alias.onInput}
- />
- </p>
- </Fragment>
- )}
- </section>
- <footer>
- <Button
- variant="contained"
- color="secondary"
- onClick={onCancel.onClick}
- >
- <i18n.Translate>Cancel</i18n.Translate>
- </Button>
- <Button
- variant="contained"
- onClick={onAccountAdded.onClick}
- disabled={!onAccountAdded.onClick}
- >
- <i18n.Translate>Add</i18n.Translate>
- </Button>
- </footer>
- </Fragment>
- );
-}
-
-function BitcoinAddressAccount({ field }: { field: TextFieldHandler }): VNode {
- const { i18n } = useTranslationContext();
- const [value, setValue] = useState<string | undefined>(undefined);
- const errors = undefinedIfEmpty({
- value: !value ? i18n.str`Can't be empty` : undefined,
- });
- return (
- <Fragment>
- <TextField
- label="Bitcoin address"
- variant="standard"
- fullWidth
- value={value}
- error={value !== undefined && !!errors?.value}
- onChange={(v) => {
- setValue(v);
- if (!errors) {
- field.onInput(`payto://bitcoin/${value}`);
- }
- }}
- />
- {value !== undefined && errors?.value && (
- <ErrorMessage title={<span>{errors?.value}</span>} />
- )}
- </Fragment>
- );
-}
-
-function undefinedIfEmpty<T extends object>(obj: T): T | undefined {
- return Object.keys(obj).some((k) => (obj as any)[k] !== undefined)
- ? obj
- : undefined;
-}
-
-function TalerBankAddressAccount({
- field,
-}: {
- field: TextFieldHandler;
-}): VNode {
- const { i18n } = useTranslationContext();
- const [host, setHost] = useState<string | undefined>(undefined);
- const [account, setAccount] = useState<string | undefined>(undefined);
- const errors = undefinedIfEmpty({
- host: !host ? i18n.str`Can't be empty` : undefined,
- account: !account ? i18n.str`Can't be empty` : undefined,
- });
- return (
- <Fragment>
- <TextField
- label="Bank host"
- variant="standard"
- fullWidth
- value={host}
- error={host !== undefined && !!errors?.host}
- onChange={(v) => {
- setHost(v);
- if (!errors) {
- field.onInput(`payto://x-taler-bank/${host}/${account}`);
- }
- }}
- />{" "}
- {host !== undefined && errors?.host && (
- <ErrorMessage title={<span>{errors?.host}</span>} />
- )}
- <TextField
- label="Bank account"
- variant="standard"
- fullWidth
- value={account}
- error={account !== undefined && !!errors?.account}
- onChange={(v) => {
- setAccount(v || "");
- if (!errors) {
- field.onInput(`payto://x-taler-bank/${host}/${account}`);
- }
- }}
- />{" "}
- {account !== undefined && errors?.account && (
- <ErrorMessage title={<span>{errors?.account}</span>} />
- )}
- </Fragment>
- );
-}
-
-function IbanAddressAccount({ field }: { field: TextFieldHandler }): VNode {
- const { i18n } = useTranslationContext();
- const [value, setValue] = useState<string | undefined>(undefined);
- const errors = undefinedIfEmpty({
- value: !value ? i18n.str`Can't be empty` : undefined,
- });
- return (
- <Fragment>
- <TextField
- label="IBAN number"
- variant="standard"
- fullWidth
- value={value}
- error={value !== undefined && !!errors?.value}
- onChange={(v) => {
- setValue(v);
- if (!errors) {
- field.onInput(`payto://iba/${value}`);
- }
- }}
- />
- {value !== undefined && errors?.value && (
- <ErrorMessage title={<span>{errors?.value}</span>} />
- )}
- </Fragment>
- );
-}
-
-function CustomFieldByAccountType({
- type,
- field,
-}: {
- type: string;
- field: TextFieldHandler;
-}): VNode {
- if (type === "bitcoin") {
- return <BitcoinAddressAccount field={field} />;
- }
- if (type === "x-taler-bank") {
- return <TalerBankAddressAccount field={field} />;
- }
- if (type === "iban") {
- return <IbanAddressAccount field={field} />;
- }
- return <Fragment />;
-}