gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated (f2b319921 -> 5fc8f95a5)


From: gnunet
Subject: [taler-wallet-core] branch master updated (f2b319921 -> 5fc8f95a5)
Date: Fri, 09 Dec 2022 16:15:23 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a change to branch master
in repository wallet-core.

    from f2b319921 use translation from commons
     new 6b6f80466 remove unused
     new 5fc8f95a5 simplify directories

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 packages/demobank-ui/src/.babelrc                  |   3 -
 .../demobank-ui/src/components/AsyncButton.tsx     |  60 ----
 packages/demobank-ui/src/components/FileButton.tsx |  71 -----
 .../src/components/{menu => }/LangSelector.tsx     |   2 +-
 .../demobank-ui/src/components/Notifications.tsx   |  74 -----
 .../src/components/fields/DateInput.tsx            | 102 ------
 .../src/components/fields/EmailInput.tsx           |  69 ----
 .../src/components/fields/FileInput.tsx            | 102 ------
 .../src/components/fields/ImageInput.tsx           |  86 -----
 .../src/components/fields/NumberInput.tsx          |  68 ----
 .../src/components/fields/TextInput.tsx            |  80 -----
 .../src/components/menu/NavigationBar.tsx          |  51 ---
 .../demobank-ui/src/components/menu/SideBar.tsx    |  74 -----
 packages/demobank-ui/src/components/menu/index.tsx | 135 --------
 .../src/components/picker/DatePicker.tsx           | 347 ---------------------
 .../components/picker/DurationPicker.stories.tsx   |  55 ----
 .../src/components/picker/DurationPicker.tsx       | 210 -------------
 packages/demobank-ui/src/index.tsx                 |   4 +-
 .../src/pages/{home => }/AccountPage.tsx           |  10 +-
 .../demobank-ui/src/pages/{home => }/BankFrame.tsx |  10 +-
 .../demobank-ui/src/pages/{home => }/LoginForm.tsx |   8 +-
 .../src/pages/{home => }/PaymentOptions.tsx        |   0
 .../src/pages/{home => }/PaytoWireTransferForm.tsx |   8 +-
 .../src/pages/{home => }/PublicHistoriesPage.tsx   |   4 +-
 .../src/pages/{home => }/QrCodeSection.stories.tsx |   0
 .../src/pages/{home => }/QrCodeSection.tsx         |   4 +-
 .../src/pages/{home => }/RegistrationPage.tsx      |  10 +-
 packages/demobank-ui/src/pages/Routing.tsx         |   6 +-
 .../src/pages/{home => }/ShowInputErrorLabel.tsx   |   0
 .../src/pages/{home => }/Transactions.tsx          |   0
 .../src/pages/{home => }/WalletWithdrawForm.tsx    |   8 +-
 .../{home => }/WithdrawalConfirmationQuestion.tsx  |   8 +-
 .../src/pages/{home => }/WithdrawalQRCode.tsx      |   2 +-
 .../src/pages/{home => }/index.stories.tsx         |   0
 packages/demobank-ui/src/stories.tsx               |   2 +-
 packages/demobank-ui/src/style/index.css           |   0
 36 files changed, 43 insertions(+), 1630 deletions(-)
 delete mode 100644 packages/demobank-ui/src/.babelrc
 delete mode 100644 packages/demobank-ui/src/components/AsyncButton.tsx
 delete mode 100644 packages/demobank-ui/src/components/FileButton.tsx
 rename packages/demobank-ui/src/components/{menu => }/LangSelector.tsx (98%)
 delete mode 100644 packages/demobank-ui/src/components/Notifications.tsx
 delete mode 100644 packages/demobank-ui/src/components/fields/DateInput.tsx
 delete mode 100644 packages/demobank-ui/src/components/fields/EmailInput.tsx
 delete mode 100644 packages/demobank-ui/src/components/fields/FileInput.tsx
 delete mode 100644 packages/demobank-ui/src/components/fields/ImageInput.tsx
 delete mode 100644 packages/demobank-ui/src/components/fields/NumberInput.tsx
 delete mode 100644 packages/demobank-ui/src/components/fields/TextInput.tsx
 delete mode 100644 packages/demobank-ui/src/components/menu/NavigationBar.tsx
 delete mode 100644 packages/demobank-ui/src/components/menu/SideBar.tsx
 delete mode 100644 packages/demobank-ui/src/components/menu/index.tsx
 delete mode 100644 packages/demobank-ui/src/components/picker/DatePicker.tsx
 delete mode 100644 
packages/demobank-ui/src/components/picker/DurationPicker.stories.tsx
 delete mode 100644 
packages/demobank-ui/src/components/picker/DurationPicker.tsx
 rename packages/demobank-ui/src/pages/{home => }/AccountPage.tsx (96%)
 rename packages/demobank-ui/src/pages/{home => }/BankFrame.tsx (94%)
 rename packages/demobank-ui/src/pages/{home => }/LoginForm.tsx (94%)
 rename packages/demobank-ui/src/pages/{home => }/PaymentOptions.tsx (100%)
 rename packages/demobank-ui/src/pages/{home => }/PaytoWireTransferForm.tsx 
(98%)
 rename packages/demobank-ui/src/pages/{home => }/PublicHistoriesPage.tsx (97%)
 rename packages/demobank-ui/src/pages/{home => }/QrCodeSection.stories.tsx 
(100%)
 rename packages/demobank-ui/src/pages/{home => }/QrCodeSection.tsx (95%)
 rename packages/demobank-ui/src/pages/{home => }/RegistrationPage.tsx (96%)
 rename packages/demobank-ui/src/pages/{home => }/ShowInputErrorLabel.tsx (100%)
 rename packages/demobank-ui/src/pages/{home => }/Transactions.tsx (100%)
 rename packages/demobank-ui/src/pages/{home => }/WalletWithdrawForm.tsx (95%)
 rename packages/demobank-ui/src/pages/{home => 
}/WithdrawalConfirmationQuestion.tsx (97%)
 rename packages/demobank-ui/src/pages/{home => }/WithdrawalQRCode.tsx (97%)
 rename packages/demobank-ui/src/pages/{home => }/index.stories.tsx (100%)
 delete mode 100644 packages/demobank-ui/src/style/index.css

diff --git a/packages/demobank-ui/src/.babelrc 
b/packages/demobank-ui/src/.babelrc
deleted file mode 100644
index 05f4dcc81..000000000
--- a/packages/demobank-ui/src/.babelrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "presets": ["preact-cli/babel"]
-}
diff --git a/packages/demobank-ui/src/components/AsyncButton.tsx 
b/packages/demobank-ui/src/components/AsyncButton.tsx
deleted file mode 100644
index 0e1391109..000000000
--- a/packages/demobank-ui/src/components/AsyncButton.tsx
+++ /dev/null
@@ -1,60 +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 { ComponentChildren, h, VNode } from "preact";
-import { useLayoutEffect, useRef } from "preact/hooks";
-import { useAsync } from "../hooks/async.js";
-
-type Props = {
-  children: ComponentChildren;
-  disabled?: boolean;
-  onClick?: () => Promise<void>;
-  grabFocus?: boolean;
-  [rest: string]: any;
-};
-
-export function AsyncButton({
-  onClick,
-  grabFocus,
-  disabled,
-  children,
-  ...rest
-}: Props): VNode {
-  const { isLoading, request } = useAsync(onClick);
-
-  const buttonRef = useRef<HTMLButtonElement>(null);
-  useLayoutEffect(() => {
-    if (grabFocus) buttonRef.current?.focus();
-  }, [grabFocus]);
-
-  // if (isSlow) {
-  //   return <LoadingModal onCancel={cancel} />;
-  // }
-  if (isLoading) return <button class="button">Loading...</button>;
-
-  return (
-    <span data-tooltip={rest["data-tooltip"]} style={{ marginLeft: 5 }}>
-      <button {...rest} ref={buttonRef} onClick={request} disabled={disabled}>
-        {children}
-      </button>
-    </span>
-  );
-}
diff --git a/packages/demobank-ui/src/components/FileButton.tsx 
b/packages/demobank-ui/src/components/FileButton.tsx
deleted file mode 100644
index d7ed52f5d..000000000
--- a/packages/demobank-ui/src/components/FileButton.tsx
+++ /dev/null
@@ -1,71 +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 { h, VNode } from "preact";
-import { useRef, useState } from "preact/hooks";
-
-const MAX_IMAGE_UPLOAD_SIZE = 1024 * 1024;
-
-export interface FileTypeContent {
-  content: string;
-  type: string;
-  name: string;
-}
-
-interface Props {
-  label: string;
-  onChange: (v: FileTypeContent | undefined) => void;
-}
-export function FileButton(props: Props): VNode {
-  const fileInputRef = useRef<HTMLInputElement>(null);
-  const [sizeError, setSizeError] = useState(false);
-  return (
-    <div>
-      <button class="button" onClick={(e) => fileInputRef.current?.click()}>
-        <span>{props.label}</span>
-      </button>
-      <input
-        ref={fileInputRef}
-        style={{ display: "none" }}
-        type="file"
-        onChange={(e) => {
-          const f: FileList | null = e.currentTarget.files;
-          if (!f || f.length != 1) return props.onChange(undefined);
-
-          if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) {
-            setSizeError(true);
-            return props.onChange(undefined);
-          }
-          setSizeError(false);
-          return f[0].arrayBuffer().then((b) => {
-            const content = new Uint8Array(b).reduce(
-              (data, byte) => data + String.fromCharCode(byte),
-              "",
-            );
-            return props.onChange({
-              content,
-              name: f[0].name,
-              type: f[0].type,
-            });
-          });
-        }}
-      />
-      {sizeError && (
-        <p class="help is-danger">File should be smaller than 1 MB</p>
-      )}
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/menu/LangSelector.tsx 
b/packages/demobank-ui/src/components/LangSelector.tsx
similarity index 98%
rename from packages/demobank-ui/src/components/menu/LangSelector.tsx
rename to packages/demobank-ui/src/components/LangSelector.tsx
index 6c0acaf42..574f42814 100644
--- a/packages/demobank-ui/src/components/menu/LangSelector.tsx
+++ b/packages/demobank-ui/src/components/LangSelector.tsx
@@ -22,7 +22,7 @@
 import { Fragment, h, VNode } from "preact";
 import { useEffect, useState } from "preact/hooks";
 import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
-import { strings as messages } from "../../i18n/strings.js";
+import { strings as messages } from "../i18n/strings.js";
 
 type LangsNames = {
   [P in keyof typeof messages]: string;
diff --git a/packages/demobank-ui/src/components/Notifications.tsx 
b/packages/demobank-ui/src/components/Notifications.tsx
deleted file mode 100644
index 6dd3a2d50..000000000
--- a/packages/demobank-ui/src/components/Notifications.tsx
+++ /dev/null
@@ -1,74 +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 { h, VNode } from "preact";
-
-export interface Notification {
-  message: string;
-  description?: string | VNode;
-  type: MessageType;
-}
-
-export type MessageType = "INFO" | "WARN" | "ERROR" | "SUCCESS";
-
-interface Props {
-  notifications: Notification[];
-  removeNotification?: (n: Notification) => void;
-}
-
-function messageStyle(type: MessageType): string {
-  switch (type) {
-    case "INFO":
-      return "message is-info";
-    case "WARN":
-      return "message is-warning";
-    case "ERROR":
-      return "message is-danger";
-    case "SUCCESS":
-      return "message is-success";
-    default:
-      return "message";
-  }
-}
-
-export function Notifications({
-  notifications,
-  removeNotification,
-}: Props): VNode {
-  return (
-    <div class="block">
-      {notifications.map((n, i) => (
-        <article key={i} class={messageStyle(n.type)}>
-          <div class="message-header">
-            <p>{n.message}</p>
-            {removeNotification && (
-              <button
-                class="delete"
-                onClick={() => removeNotification && removeNotification(n)}
-              />
-            )}
-          </div>
-          {n.description && <div class="message-body">{n.description}</div>}
-        </article>
-      ))}
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/fields/DateInput.tsx 
b/packages/demobank-ui/src/components/fields/DateInput.tsx
deleted file mode 100644
index 0eeb1b2fd..000000000
--- a/packages/demobank-ui/src/components/fields/DateInput.tsx
+++ /dev/null
@@ -1,102 +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 { format, subYears } from "date-fns";
-import { h, VNode } from "preact";
-import { useLayoutEffect, useRef, useState } from "preact/hooks";
-import { DatePicker } from "../picker/DatePicker.js";
-
-export interface DateInputProps {
-  label: string;
-  grabFocus?: boolean;
-  tooltip?: string;
-  error?: string;
-  years?: Array<number>;
-  onConfirm?: () => void;
-  bind: [string, (x: string) => void];
-}
-
-export function DateInput(props: DateInputProps): VNode {
-  const inputRef = useRef<HTMLInputElement>(null);
-  useLayoutEffect(() => {
-    if (props.grabFocus) inputRef.current?.focus();
-  }, [props.grabFocus]);
-  const [opened, setOpened] = useState(false);
-
-  const value = props.bind[0] || "";
-  const [dirty, setDirty] = useState(false);
-  const showError = dirty && props.error;
-
-  const calendar = subYears(new Date(), 30);
-
-  return (
-    <div class="field">
-      <label class="label">
-        {props.label}
-        {props.tooltip && (
-          <span class="icon has-tooltip-right" data-tooltip={props.tooltip}>
-            <i class="mdi mdi-information" />
-          </span>
-        )}
-      </label>
-      <div class="control">
-        <div class="field has-addons">
-          <p class="control">
-            <input
-              type="text"
-              class={showError ? "input is-danger" : "input"}
-              value={value}
-              onKeyPress={(e) => {
-                if (e.key === "Enter" && props.onConfirm) props.onConfirm();
-              }}
-              onInput={(e) => {
-                const text = e.currentTarget.value;
-                setDirty(true);
-                props.bind[1](text);
-              }}
-              ref={inputRef}
-            />
-          </p>
-          <p class="control">
-            <a
-              class="button"
-              onClick={() => {
-                setOpened(true);
-              }}
-            >
-              <span class="icon">
-                <i class="mdi mdi-calendar" />
-              </span>
-            </a>
-          </p>
-        </div>
-      </div>
-      <p class="help">Using the format yyyy-mm-dd</p>
-      {showError && <p class="help is-danger">{props.error}</p>}
-      <DatePicker
-        opened={opened}
-        initialDate={calendar}
-        years={props.years}
-        closeFunction={() => setOpened(false)}
-        dateReceiver={(d) => {
-          setDirty(true);
-          const v = format(d, "yyyy-MM-dd");
-          props.bind[1](v);
-        }}
-      />
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/fields/EmailInput.tsx 
b/packages/demobank-ui/src/components/fields/EmailInput.tsx
deleted file mode 100644
index 9f6624aa5..000000000
--- a/packages/demobank-ui/src/components/fields/EmailInput.tsx
+++ /dev/null
@@ -1,69 +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 { h, VNode } from "preact";
-import { useLayoutEffect, useRef, useState } from "preact/hooks";
-
-export interface TextInputProps {
-  label: string;
-  grabFocus?: boolean;
-  error?: string;
-  placeholder?: string;
-  tooltip?: string;
-  onConfirm?: () => void;
-  bind: [string, (x: string) => void];
-}
-
-export function EmailInput(props: TextInputProps): VNode {
-  const inputRef = useRef<HTMLInputElement>(null);
-  useLayoutEffect(() => {
-    if (props.grabFocus) inputRef.current?.focus();
-  }, [props.grabFocus]);
-  const value = props.bind[0];
-  const [dirty, setDirty] = useState(false);
-  const showError = dirty && props.error;
-  return (
-    <div class="field">
-      <label class="label">
-        {props.label}
-        {props.tooltip && (
-          <span class="icon has-tooltip-right" data-tooltip={props.tooltip}>
-            <i class="mdi mdi-information" />
-          </span>
-        )}
-      </label>
-      <div class="control has-icons-right">
-        <input
-          value={value}
-          required
-          placeholder={props.placeholder}
-          type="email"
-          class={showError ? "input is-danger" : "input"}
-          onKeyPress={(e) => {
-            if (e.key === "Enter" && props.onConfirm) props.onConfirm();
-          }}
-          onInput={(e) => {
-            setDirty(true);
-            props.bind[1]((e.target as HTMLInputElement).value);
-          }}
-          ref={inputRef}
-          style={{ display: "block" }}
-        />
-      </div>
-      {showError && <p class="help is-danger">{props.error}</p>}
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/fields/FileInput.tsx 
b/packages/demobank-ui/src/components/fields/FileInput.tsx
deleted file mode 100644
index cc49a632d..000000000
--- a/packages/demobank-ui/src/components/fields/FileInput.tsx
+++ /dev/null
@@ -1,102 +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 { h, VNode } from "preact";
-import { useLayoutEffect, useRef, useState } from "preact/hooks";
-
-const MAX_IMAGE_UPLOAD_SIZE = 1024 * 1024;
-
-export interface FileTypeContent {
-  content: string;
-  type: string;
-  name: string;
-}
-
-export interface FileInputProps {
-  label: string;
-  grabFocus?: boolean;
-  disabled?: boolean;
-  error?: string;
-  placeholder?: string;
-  tooltip?: string;
-  onChange: (v: FileTypeContent | undefined) => void;
-}
-
-export function FileInput(props: FileInputProps): VNode {
-  const inputRef = useRef<HTMLInputElement>(null);
-  useLayoutEffect(() => {
-    if (props.grabFocus) inputRef.current?.focus();
-  }, [props.grabFocus]);
-
-  const fileInputRef = useRef<HTMLInputElement>(null);
-  const [sizeError, setSizeError] = useState(false);
-  return (
-    <div class="field">
-      <label class="label">
-        <a class="button" onClick={(e) => fileInputRef.current?.click()}>
-          <div class="icon is-small ">
-            <i class="mdi mdi-folder" />
-          </div>
-          <span>{props.label}</span>
-        </a>
-        {props.tooltip && (
-          <span class="icon has-tooltip-right" data-tooltip={props.tooltip}>
-            <i class="mdi mdi-information" />
-          </span>
-        )}
-      </label>
-      <div class="control">
-        <input
-          ref={fileInputRef}
-          style={{ display: "none" }}
-          type="file"
-          // name={String(name)}
-          onChange={(e) => {
-            const f: FileList | null = e.currentTarget.files;
-            if (!f || f.length != 1) return props.onChange(undefined);
-
-            if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) {
-              setSizeError(true);
-              return props.onChange(undefined);
-            }
-            setSizeError(false);
-            return f[0].arrayBuffer().then((b) => {
-              const b64 = btoa(
-                new Uint8Array(b).reduce(
-                  (data, byte) => data + String.fromCharCode(byte),
-                  "",
-                ),
-              );
-              return props.onChange({
-                content: `data:${f[0].type};base64,${b64}`,
-                name: f[0].name,
-                type: f[0].type,
-              });
-            });
-          }}
-        />
-        {props.error && <p class="help is-danger">{props.error}</p>}
-        {sizeError && (
-          <p class="help is-danger">File should be smaller than 1 MB</p>
-        )}
-      </div>
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/fields/ImageInput.tsx 
b/packages/demobank-ui/src/components/fields/ImageInput.tsx
deleted file mode 100644
index 15b25f1c2..000000000
--- a/packages/demobank-ui/src/components/fields/ImageInput.tsx
+++ /dev/null
@@ -1,86 +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 { h, VNode } from "preact";
-import { useLayoutEffect, useRef, useState } from "preact/hooks";
-import emptyImage from "../../assets/empty.png";
-import { TextInputProps } from "./TextInput.js";
-
-const MAX_IMAGE_UPLOAD_SIZE = 1024 * 1024;
-
-export function ImageInput(props: TextInputProps): VNode {
-  const inputRef = useRef<HTMLInputElement>(null);
-  useLayoutEffect(() => {
-    if (props.grabFocus) inputRef.current?.focus();
-  }, [props.grabFocus]);
-
-  const value = props.bind[0];
-  // const [dirty, setDirty] = useState(false)
-  const image = useRef<HTMLInputElement>(null);
-  const [sizeError, setSizeError] = useState(false);
-  function onChange(v: string): void {
-    // setDirty(true);
-    props.bind[1](v);
-  }
-  return (
-    <div class="field">
-      <label class="label">
-        {props.label}
-        {props.tooltip && (
-          <span class="icon has-tooltip-right" data-tooltip={props.tooltip}>
-            <i class="mdi mdi-information" />
-          </span>
-        )}
-      </label>
-      <div class="control">
-        <img
-          src={!value ? emptyImage : value}
-          style={{ width: 200, height: 200 }}
-          onClick={() => image.current?.click()}
-        />
-        <input
-          ref={image}
-          style={{ display: "none" }}
-          type="file"
-          name={String(name)}
-          onChange={(e) => {
-            const f: FileList | null = e.currentTarget.files;
-            if (!f || f.length != 1) return onChange(emptyImage);
-
-            if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) {
-              setSizeError(true);
-              return onChange(emptyImage);
-            }
-            setSizeError(false);
-            return f[0].arrayBuffer().then((b) => {
-              const b64 = btoa(
-                new Uint8Array(b).reduce(
-                  (data, byte) => data + String.fromCharCode(byte),
-                  "",
-                ),
-              );
-              return onChange(`data:${f[0].type};base64,${b64}` as any);
-            });
-          }}
-        />
-        {props.error && <p class="help is-danger">{props.error}</p>}
-        {sizeError && (
-          <p class="help is-danger">Image should be smaller than 1 MB</p>
-        )}
-      </div>
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/fields/NumberInput.tsx 
b/packages/demobank-ui/src/components/fields/NumberInput.tsx
deleted file mode 100644
index 69af18c77..000000000
--- a/packages/demobank-ui/src/components/fields/NumberInput.tsx
+++ /dev/null
@@ -1,68 +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 { h, VNode } from "preact";
-import { useLayoutEffect, useRef, useState } from "preact/hooks";
-
-export interface TextInputProps {
-  label: string;
-  grabFocus?: boolean;
-  error?: string;
-  placeholder?: string;
-  tooltip?: string;
-  onConfirm?: () => void;
-  bind: [string, (x: string) => void];
-}
-
-export function PhoneNumberInput(props: TextInputProps): VNode {
-  const inputRef = useRef<HTMLInputElement>(null);
-  useLayoutEffect(() => {
-    if (props.grabFocus) inputRef.current?.focus();
-  }, [props.grabFocus]);
-  const value = props.bind[0];
-  const [dirty, setDirty] = useState(false);
-  const showError = dirty && props.error;
-  return (
-    <div class="field">
-      <label class="label">
-        {props.label}
-        {props.tooltip && (
-          <span class="icon has-tooltip-right" data-tooltip={props.tooltip}>
-            <i class="mdi mdi-information" />
-          </span>
-        )}
-      </label>
-      <div class="control has-icons-right">
-        <input
-          value={value}
-          type="tel"
-          placeholder={props.placeholder}
-          class={showError ? "input is-danger" : "input"}
-          onKeyPress={(e) => {
-            if (e.key === "Enter" && props.onConfirm) props.onConfirm();
-          }}
-          onInput={(e) => {
-            setDirty(true);
-            props.bind[1]((e.target as HTMLInputElement).value);
-          }}
-          ref={inputRef}
-          style={{ display: "block" }}
-        />
-      </div>
-      {showError && <p class="help is-danger">{props.error}</p>}
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/fields/TextInput.tsx 
b/packages/demobank-ui/src/components/fields/TextInput.tsx
deleted file mode 100644
index 5c6fe3157..000000000
--- a/packages/demobank-ui/src/components/fields/TextInput.tsx
+++ /dev/null
@@ -1,80 +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 { h, VNode } from "preact";
-import { useLayoutEffect, useRef, useState } from "preact/hooks";
-
-export interface TextInputProps {
-  inputType?: "text" | "number" | "multiline" | "password";
-  label: string;
-  grabFocus?: boolean;
-  disabled?: boolean;
-  error?: string;
-  placeholder?: string;
-  tooltip?: string;
-  onConfirm?: () => void;
-  bind: [string, (x: string) => void];
-}
-
-const TextInputType = function ({ inputType, grabFocus, ...rest }: any): VNode 
{
-  const inputRef = useRef<HTMLInputElement>(null);
-  useLayoutEffect(() => {
-    if (grabFocus) inputRef.current?.focus();
-  }, [grabFocus]);
-
-  return inputType === "multiline" ? (
-    <textarea {...rest} rows={5} ref={inputRef} style={{ height: "unset" }} />
-  ) : (
-    <input {...rest} type={inputType} ref={inputRef} />
-  );
-};
-
-export function TextInput(props: TextInputProps): VNode {
-  const value = props.bind[0];
-  const [dirty, setDirty] = useState(false);
-  const showError = dirty && props.error;
-  return (
-    <div class="field">
-      <label class="label">
-        {props.label}
-        {props.tooltip && (
-          <span class="icon has-tooltip-right" data-tooltip={props.tooltip}>
-            <i class="mdi mdi-information" />
-          </span>
-        )}
-      </label>
-      <div class="control has-icons-right">
-        <TextInputType
-          inputType={props.inputType}
-          value={value}
-          grabFocus={props.grabFocus}
-          disabled={props.disabled}
-          placeholder={props.placeholder}
-          class={showError ? "input is-danger" : "input"}
-          onKeyPress={(e: any) => {
-            if (e.key === "Enter" && props.onConfirm) props.onConfirm();
-          }}
-          onInput={(e: any) => {
-            setDirty(true);
-            props.bind[1]((e.target as HTMLInputElement).value);
-          }}
-          style={{ display: "block" }}
-        />
-      </div>
-      {showError && <p class="help is-danger">{props.error}</p>}
-    </div>
-  );
-}
diff --git a/packages/demobank-ui/src/components/menu/NavigationBar.tsx 
b/packages/demobank-ui/src/components/menu/NavigationBar.tsx
deleted file mode 100644
index 5c57d2c95..000000000
--- a/packages/demobank-ui/src/components/menu/NavigationBar.tsx
+++ /dev/null
@@ -1,51 +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 { h, VNode } from "preact";
-
-interface Props {
-  onMobileMenu: () => void;
-  title: string;
-}
-
-export function NavigationBar({ onMobileMenu, title }: Props): VNode {
-  return (
-    <nav
-      class="navbar is-fixed-top"
-      role="navigation"
-      aria-label="main navigation"
-    >
-      <div class="navbar-brand">
-        <span class="navbar-item" style={{ fontSize: 24, fontWeight: 900 }}>
-          {title}
-        </span>
-      </div>
-
-      <div class="navbar-menu ">
-        <div class="navbar-end">
-          <div class="navbar-item" style={{ paddingTop: 4, paddingBottom: 4 }}>
-            {/* <LangSelector /> */}
-          </div>
-        </div>
-      </div>
-    </nav>
-  );
-}
diff --git a/packages/demobank-ui/src/components/menu/SideBar.tsx 
b/packages/demobank-ui/src/components/menu/SideBar.tsx
deleted file mode 100644
index 32fe216ab..000000000
--- a/packages/demobank-ui/src/components/menu/SideBar.tsx
+++ /dev/null
@@ -1,74 +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 { h, VNode } from "preact";
-import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
-
-interface Props {
-  mobile?: boolean;
-}
-
-export function Sidebar({ mobile }: Props): VNode {
-  // const config = useConfigContext();
-  const config = { version: "none" };
-  // FIXME: add replacement for __VERSION__ with the current version
-  const process = { env: { __VERSION__: "0.0.0" } };
-  const { i18n } = useTranslationContext();
-
-  return (
-    <aside class="aside is-placed-left is-expanded">
-      <div class="aside-tools">
-        <div class="aside-tools-label">
-          <div>
-            <b>euFin bank</b>
-          </div>
-          <div
-            class="is-size-7 has-text-right"
-            style={{ lineHeight: 0, marginTop: -10 }}
-          >
-            Version {process.env.__VERSION__} ({config.version})
-          </div>
-        </div>
-      </div>
-      <div class="menu is-menu-main">
-        <p class="menu-label">
-          <i18n.Translate>Bank menu</i18n.Translate>
-        </p>
-        <ul class="menu-list">
-          <li>
-            <div class="ml-4">
-              <span class="menu-item-label">
-                <i18n.Translate>Select option1</i18n.Translate>
-              </span>
-            </div>
-          </li>
-          <li>
-            <div class="ml-4">
-              <span class="menu-item-label">
-                <i18n.Translate>Select option2</i18n.Translate>
-              </span>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </aside>
-  );
-}
diff --git a/packages/demobank-ui/src/components/menu/index.tsx 
b/packages/demobank-ui/src/components/menu/index.tsx
deleted file mode 100644
index c0a845a62..000000000
--- a/packages/demobank-ui/src/components/menu/index.tsx
+++ /dev/null
@@ -1,135 +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 { ComponentChildren, Fragment, h, VNode } from "preact";
-import Match from "preact-router/match";
-import { useEffect, useState } from "preact/hooks";
-import { NavigationBar } from "./NavigationBar.js";
-import { Sidebar } from "./SideBar.js";
-
-interface MenuProps {
-  title: string;
-}
-
-function WithTitle({
-  title,
-  children,
-}: {
-  title: string;
-  children: ComponentChildren;
-}): VNode {
-  useEffect(() => {
-    document.title = `${title}`;
-  }, [title]);
-  return <Fragment>{children}</Fragment>;
-}
-
-export function Menu({ title }: MenuProps): VNode {
-  const [mobileOpen, setMobileOpen] = useState(false);
-
-  return (
-    <Match>
-      {({ path }: { path: string }) => {
-        const titleWithSubtitle = title; // title ? title : (!admin ? 
getInstanceTitle(path, instance) : getAdminTitle(path, instance))
-        return (
-          <WithTitle title={titleWithSubtitle}>
-            <div
-              class={mobileOpen ? "has-aside-mobile-expanded" : ""}
-              onClick={() => setMobileOpen(false)}
-            >
-              <NavigationBar
-                onMobileMenu={() => setMobileOpen(!mobileOpen)}
-                title={titleWithSubtitle}
-              />
-
-              <Sidebar mobile={mobileOpen} />
-            </div>
-          </WithTitle>
-        );
-      }}
-    </Match>
-  );
-}
-
-interface NotYetReadyAppMenuProps {
-  title: string;
-  onLogout?: () => void;
-}
-
-interface NotifProps {
-  notification?: Notification;
-}
-export function NotificationCard({
-  notification: n,
-}: NotifProps): VNode | null {
-  if (!n) return null;
-  return (
-    <div class="notification">
-      <div class="columns is-vcentered">
-        <div class="column is-12">
-          <article
-            class={
-              n.type === "ERROR"
-                ? "message is-danger"
-                : n.type === "WARN"
-                ? "message is-warning"
-                : "message is-info"
-            }
-          >
-            <div class="message-header">
-              <p>{n.message}</p>
-            </div>
-            {n.description && <div class="message-body">{n.description}</div>}
-          </article>
-        </div>
-      </div>
-    </div>
-  );
-}
-
-export function NotYetReadyAppMenu({
-  onLogout,
-  title,
-}: NotYetReadyAppMenuProps): VNode {
-  const [mobileOpen, setMobileOpen] = useState(false);
-
-  useEffect(() => {
-    document.title = `Taler Backoffice: ${title}`;
-  }, [title]);
-
-  return (
-    <div
-      class="has-aside-mobile-expanded"
-      // class={mobileOpen ? "has-aside-mobile-expanded" : ""}
-      onClick={() => setMobileOpen(false)}
-    >
-      <NavigationBar
-        onMobileMenu={() => setMobileOpen(!mobileOpen)}
-        title={title}
-      />
-      {onLogout && <Sidebar mobile={mobileOpen} />}
-    </div>
-  );
-}
-
-export interface Notification {
-  message: string;
-  description?: string | VNode;
-  type: MessageType;
-}
-
-export type ValueOrFunction<T> = T | ((p: T) => T);
-export type MessageType = "INFO" | "WARN" | "ERROR" | "SUCCESS";
diff --git a/packages/demobank-ui/src/components/picker/DatePicker.tsx 
b/packages/demobank-ui/src/components/picker/DatePicker.tsx
deleted file mode 100644
index 0a93144ec..000000000
--- a/packages/demobank-ui/src/components/picker/DatePicker.tsx
+++ /dev/null
@@ -1,347 +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 { h, Component } from "preact";
-
-interface Props {
-  closeFunction?: () => void;
-  dateReceiver?: (d: Date) => void;
-  initialDate?: Date;
-  years?: Array<number>;
-  opened?: boolean;
-}
-interface State {
-  displayedMonth: number;
-  displayedYear: number;
-  selectYearMode: boolean;
-  currentDate: Date;
-}
-const now = new Date();
-
-const monthArrShortFull = [
-  "January",
-  "February",
-  "March",
-  "April",
-  "May",
-  "June",
-  "July",
-  "August",
-  "September",
-  "October",
-  "November",
-  "December",
-];
-
-const monthArrShort = [
-  "Jan",
-  "Feb",
-  "Mar",
-  "Apr",
-  "May",
-  "Jun",
-  "Jul",
-  "Aug",
-  "Sep",
-  "Oct",
-  "Nov",
-  "Dec",
-];
-
-const dayArr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
-
-const yearArr: number[] = [];
-
-// inspired by https://codepen.io/m4r1vs/pen/MOOxyE
-export class DatePicker extends Component<Props, State> {
-  closeDatePicker() {
-    this.props.closeFunction && this.props.closeFunction(); // Function gets 
passed by parent
-  }
-
-  /**
-   * Gets fired when a day gets clicked.
-   * @param {object} e The event thrown by the <span /> element clicked
-   */
-  dayClicked(e: any) {
-    const element = e.target; // the actual element clicked
-
-    if (element.innerHTML === "") return false; // don't continue if <span /> 
empty
-
-    // get date from clicked element (gets attached when rendered)
-    const date = new Date(element.getAttribute("data-value"));
-
-    // update the state
-    this.setState({ currentDate: date });
-    this.passDateToParent(date);
-  }
-
-  /**
-   * returns days in month as array
-   * @param {number} month the month to display
-   * @param {number} year the year to display
-   */
-  getDaysByMonth(month: number, year: number) {
-    const calendar = [];
-
-    const date = new Date(year, month, 1); // month to display
-
-    const firstDay = new Date(year, month, 1).getDay(); // first weekday of 
month
-    const lastDate = new Date(year, month + 1, 0).getDate(); // last date of 
month
-
-    let day: number | null = 0;
-
-    // the calendar is 7*6 fields big, so 42 loops
-    for (let i = 0; i < 42; i++) {
-      if (i >= firstDay && day !== null) day = day + 1;
-      if (day !== null && day > lastDate) day = null;
-
-      // append the calendar Array
-      calendar.push({
-        day: day === 0 || day === null ? null : day, // null or number
-        date: day === 0 || day === null ? null : new Date(year, month, day), 
// null or Date()
-        today:
-          day === now.getDate() &&
-          month === now.getMonth() &&
-          year === now.getFullYear(), // boolean
-      });
-    }
-
-    return calendar;
-  }
-
-  /**
-   * Display previous month by updating state
-   */
-  displayPrevMonth() {
-    if (this.state.displayedMonth <= 0)
-      this.setState({
-        displayedMonth: 11,
-        displayedYear: this.state.displayedYear - 1,
-      });
-    else
-      this.setState({
-        displayedMonth: this.state.displayedMonth - 1,
-      });
-  }
-
-  /**
-   * Display next month by updating state
-   */
-  displayNextMonth() {
-    if (this.state.displayedMonth >= 11)
-      this.setState({
-        displayedMonth: 0,
-        displayedYear: this.state.displayedYear + 1,
-      });
-    else
-      this.setState({
-        displayedMonth: this.state.displayedMonth + 1,
-      });
-  }
-
-  /**
-   * Display the selected month (gets fired when clicking on the date string)
-   */
-  displaySelectedMonth() {
-    if (this.state.selectYearMode) this.toggleYearSelector();
-    else {
-      if (!this.state.currentDate) return false;
-      this.setState({
-        displayedMonth: this.state.currentDate.getMonth(),
-        displayedYear: this.state.currentDate.getFullYear(),
-      });
-    }
-  }
-
-  toggleYearSelector() {
-    this.setState({ selectYearMode: !this.state.selectYearMode });
-  }
-
-  changeDisplayedYear(e: any) {
-    const element = e.target;
-    this.toggleYearSelector();
-    this.setState({
-      displayedYear: parseInt(element.innerHTML, 10),
-      displayedMonth: 0,
-    });
-  }
-
-  /**
-   * Pass the selected date to parent when 'OK' is clicked
-   */
-  passSavedDateDateToParent() {
-    this.passDateToParent(this.state.currentDate);
-  }
-  passDateToParent(date: Date) {
-    if (typeof this.props.dateReceiver === "function")
-      this.props.dateReceiver(date);
-    this.closeDatePicker();
-  }
-
-  componentDidUpdate() {
-    // if (this.state.selectYearMode) {
-    //   document.getElementsByClassName('selected')[0].scrollIntoView(); // 
works in every browser incl. IE, replace with scrollIntoViewIfNeeded when 
browsers support it
-    // }
-  }
-
-  constructor(props: any) {
-    super(props);
-
-    this.closeDatePicker = this.closeDatePicker.bind(this);
-    this.dayClicked = this.dayClicked.bind(this);
-    this.displayNextMonth = this.displayNextMonth.bind(this);
-    this.displayPrevMonth = this.displayPrevMonth.bind(this);
-    this.getDaysByMonth = this.getDaysByMonth.bind(this);
-    this.changeDisplayedYear = this.changeDisplayedYear.bind(this);
-    this.passDateToParent = this.passDateToParent.bind(this);
-    this.toggleYearSelector = this.toggleYearSelector.bind(this);
-    this.displaySelectedMonth = this.displaySelectedMonth.bind(this);
-
-    const initial = props.initialDate || now;
-
-    this.state = {
-      currentDate: initial,
-      displayedMonth: initial.getMonth(),
-      displayedYear: initial.getFullYear(),
-      selectYearMode: false,
-    };
-  }
-
-  render() {
-    const { currentDate, displayedMonth, displayedYear, selectYearMode } =
-      this.state;
-
-    return (
-      <div>
-        <div class={`datePicker ${this.props.opened && "datePicker--opened"}`}>
-          <div class="datePicker--titles">
-            <h3
-              style={{
-                color: selectYearMode
-                  ? "rgba(255,255,255,.87)"
-                  : "rgba(255,255,255,.57)",
-              }}
-              onClick={this.toggleYearSelector}
-            >
-              {currentDate.getFullYear()}
-            </h3>
-            <h2
-              style={{
-                color: !selectYearMode
-                  ? "rgba(255,255,255,.87)"
-                  : "rgba(255,255,255,.57)",
-              }}
-              onClick={this.displaySelectedMonth}
-            >
-              {dayArr[currentDate.getDay()]},{" "}
-              {monthArrShort[currentDate.getMonth()]} {currentDate.getDate()}
-            </h2>
-          </div>
-
-          {!selectYearMode && (
-            <nav>
-              <span onClick={this.displayPrevMonth} class="icon">
-                <i
-                  style={{ transform: "rotate(180deg)" }}
-                  class="mdi mdi-forward"
-                />
-              </span>
-              <h4>
-                {monthArrShortFull[displayedMonth]} {displayedYear}
-              </h4>
-              <span onClick={this.displayNextMonth} class="icon">
-                <i class="mdi mdi-forward" />
-              </span>
-            </nav>
-          )}
-
-          <div class="datePicker--scroll">
-            {!selectYearMode && (
-              <div class="datePicker--calendar">
-                <div class="datePicker--dayNames">
-                  {["S", "M", "T", "W", "T", "F", "S"].map((day, i) => (
-                    <span key={i}>{day}</span>
-                  ))}
-                </div>
-
-                <div onClick={this.dayClicked} class="datePicker--days">
-                  {/*
-                  Loop through the calendar object returned by 
getDaysByMonth().
-                */}
-
-                  {this.getDaysByMonth(
-                    this.state.displayedMonth,
-                    this.state.displayedYear,
-                  ).map((day) => {
-                    let selected = false;
-
-                    if (currentDate && day.date)
-                      selected =
-                        currentDate.toLocaleDateString() ===
-                        day.date.toLocaleDateString();
-
-                    return (
-                      <span
-                        key={day.day}
-                        class={
-                          (day.today ? "datePicker--today " : "") +
-                          (selected ? "datePicker--selected" : "")
-                        }
-                        disabled={!day.date}
-                        data-value={day.date}
-                      >
-                        {day.day}
-                      </span>
-                    );
-                  })}
-                </div>
-              </div>
-            )}
-
-            {selectYearMode && (
-              <div class="datePicker--selectYear">
-                {(this.props.years || yearArr).map((year) => (
-                  <span
-                    key={year}
-                    class={year === displayedYear ? "selected" : ""}
-                    onClick={this.changeDisplayedYear}
-                  >
-                    {year}
-                  </span>
-                ))}
-              </div>
-            )}
-          </div>
-        </div>
-
-        <div
-          class="datePicker--background"
-          onClick={this.closeDatePicker}
-          style={{
-            display: this.props.opened ? "block" : "none",
-          }}
-        />
-      </div>
-    );
-  }
-}
-
-for (let i = 2010; i <= now.getFullYear() + 10; i++) yearArr.push(i);
diff --git 
a/packages/demobank-ui/src/components/picker/DurationPicker.stories.tsx 
b/packages/demobank-ui/src/components/picker/DurationPicker.stories.tsx
deleted file mode 100644
index db417b949..000000000
--- a/packages/demobank-ui/src/components/picker/DurationPicker.stories.tsx
+++ /dev/null
@@ -1,55 +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 { h, FunctionalComponent } from "preact";
-import { useState } from "preact/hooks";
-import { DurationPicker as TestedComponent } from "./DurationPicker.js";
-
-export default {
-  title: "Components/Picker/Duration",
-  component: TestedComponent,
-  argTypes: {
-    onCreate: { action: "onCreate" },
-    goBack: { action: "goBack" },
-  },
-};
-
-function createExample<Props>(
-  Component: FunctionalComponent<Props>,
-  props: Partial<Props>,
-) {
-  const r = (args: any) => <Component {...args} />;
-  r.args = props;
-  return r;
-}
-
-export const Example = createExample(TestedComponent, {
-  days: true,
-  minutes: true,
-  hours: true,
-  seconds: true,
-  value: 10000000,
-});
-
-export const WithState = () => {
-  const [v, s] = useState<number>(1000000);
-  return <TestedComponent value={v} onChange={s} days minutes hours seconds />;
-};
diff --git a/packages/demobank-ui/src/components/picker/DurationPicker.tsx 
b/packages/demobank-ui/src/components/picker/DurationPicker.tsx
deleted file mode 100644
index 973f2f507..000000000
--- a/packages/demobank-ui/src/components/picker/DurationPicker.tsx
+++ /dev/null
@@ -1,210 +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 { h, VNode } from "preact";
-import { useState } from "preact/hooks";
-import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
-import "../../scss/DurationPicker.scss";
-
-export interface Props {
-  hours?: boolean;
-  minutes?: boolean;
-  seconds?: boolean;
-  days?: boolean;
-  onChange: (value: number) => void;
-  value: number;
-}
-
-// inspiration taken from https://github.com/flurmbo/react-duration-picker
-export function DurationPicker({
-  days,
-  hours,
-  minutes,
-  seconds,
-  onChange,
-  value,
-}: Props): VNode {
-  const ss = 1000;
-  const ms = ss * 60;
-  const hs = ms * 60;
-  const ds = hs * 24;
-  const { i18n } = useTranslationContext();
-
-  return (
-    <div class="rdp-picker">
-      {days && (
-        <DurationColumn
-          unit={i18n.str`days`}
-          max={99}
-          value={Math.floor(value / ds)}
-          onDecrease={value >= ds ? () => onChange(value - ds) : undefined}
-          onIncrease={value < 99 * ds ? () => onChange(value + ds) : undefined}
-          onChange={(diff) => onChange(value + diff * ds)}
-        />
-      )}
-      {hours && (
-        <DurationColumn
-          unit={i18n.str`hours`}
-          max={23}
-          min={1}
-          value={Math.floor(value / hs) % 24}
-          onDecrease={value >= hs ? () => onChange(value - hs) : undefined}
-          onIncrease={value < 99 * ds ? () => onChange(value + hs) : undefined}
-          onChange={(diff) => onChange(value + diff * hs)}
-        />
-      )}
-      {minutes && (
-        <DurationColumn
-          unit={i18n.str`minutes`}
-          max={59}
-          min={1}
-          value={Math.floor(value / ms) % 60}
-          onDecrease={value >= ms ? () => onChange(value - ms) : undefined}
-          onIncrease={value < 99 * ds ? () => onChange(value + ms) : undefined}
-          onChange={(diff) => onChange(value + diff * ms)}
-        />
-      )}
-      {seconds && (
-        <DurationColumn
-          unit={i18n.str`seconds`}
-          max={59}
-          value={Math.floor(value / ss) % 60}
-          onDecrease={value >= ss ? () => onChange(value - ss) : undefined}
-          onIncrease={value < 99 * ds ? () => onChange(value + ss) : undefined}
-          onChange={(diff) => onChange(value + diff * ss)}
-        />
-      )}
-    </div>
-  );
-}
-
-interface ColProps {
-  unit: string;
-  min?: number;
-  max: number;
-  value: number;
-  onIncrease?: () => void;
-  onDecrease?: () => void;
-  onChange?: (diff: number) => void;
-}
-
-function InputNumber({
-  initial,
-  onChange,
-}: {
-  initial: number;
-  onChange: (n: number) => void;
-}) {
-  const [value, handler] = useState<{ v: string }>({
-    v: toTwoDigitString(initial),
-  });
-
-  return (
-    <input
-      value={value.v}
-      onBlur={(e) => onChange(parseInt(value.v, 10))}
-      onInput={(e) => {
-        e.preventDefault();
-        const n = Number.parseInt(e.currentTarget.value, 10);
-        if (isNaN(n)) return handler({ v: toTwoDigitString(initial) });
-        return handler({ v: toTwoDigitString(n) });
-      }}
-      style={{
-        width: 50,
-        border: "none",
-        fontSize: "inherit",
-        background: "inherit",
-      }}
-    />
-  );
-}
-
-function DurationColumn({
-  unit,
-  min = 0,
-  max,
-  value,
-  onIncrease,
-  onDecrease,
-  onChange,
-}: ColProps): VNode {
-  const cellHeight = 35;
-  return (
-    <div class="rdp-column-container">
-      <div class="rdp-masked-div">
-        <hr class="rdp-reticule" style={{ top: cellHeight * 2 - 1 }} />
-        <hr class="rdp-reticule" style={{ top: cellHeight * 3 - 1 }} />
-
-        <div class="rdp-column" style={{ top: 0 }}>
-          <div class="rdp-cell" key={value - 2}>
-            {onDecrease && (
-              <button
-                style={{ width: "100%", textAlign: "center", margin: 5 }}
-                onClick={onDecrease}
-              >
-                <span class="icon">
-                  <i class="mdi mdi-chevron-up" />
-                </span>
-              </button>
-            )}
-          </div>
-          <div class="rdp-cell" key={value - 1}>
-            {value > min ? toTwoDigitString(value - 1) : ""}
-          </div>
-          <div class="rdp-cell rdp-center" key={value}>
-            {onChange ? (
-              <InputNumber
-                initial={value}
-                onChange={(n) => onChange(n - value)}
-              />
-            ) : (
-              toTwoDigitString(value)
-            )}
-            <div>{unit}</div>
-          </div>
-
-          <div class="rdp-cell" key={value + 1}>
-            {value < max ? toTwoDigitString(value + 1) : ""}
-          </div>
-
-          <div class="rdp-cell" key={value + 2}>
-            {onIncrease && (
-              <button
-                style={{ width: "100%", textAlign: "center", margin: 5 }}
-                onClick={onIncrease}
-              >
-                <span class="icon">
-                  <i class="mdi mdi-chevron-down" />
-                </span>
-              </button>
-            )}
-          </div>
-        </div>
-      </div>
-    </div>
-  );
-}
-
-function toTwoDigitString(n: number) {
-  if (n < 10) return `0${n}`;
-
-  return `${n}`;
-}
diff --git a/packages/demobank-ui/src/index.tsx 
b/packages/demobank-ui/src/index.tsx
index 97f68f18f..a0ce8cb59 100644
--- a/packages/demobank-ui/src/index.tsx
+++ b/packages/demobank-ui/src/index.tsx
@@ -15,8 +15,8 @@
  */
 
 import App from "./components/app.js";
-export default App;
-import { render, h } from "preact";
+
+import { h, render } from "preact";
 import "./scss/main.scss";
 
 const app = document.getElementById("app");
diff --git a/packages/demobank-ui/src/pages/home/AccountPage.tsx 
b/packages/demobank-ui/src/pages/AccountPage.tsx
similarity index 96%
rename from packages/demobank-ui/src/pages/home/AccountPage.tsx
rename to packages/demobank-ui/src/pages/AccountPage.tsx
index da22568f9..7ec4d36fb 100644
--- a/packages/demobank-ui/src/pages/home/AccountPage.tsx
+++ b/packages/demobank-ui/src/pages/AccountPage.tsx
@@ -19,11 +19,11 @@ import { useTranslationContext } from 
"@gnu-taler/web-util/lib/index.browser";
 import { ComponentChildren, Fragment, h, VNode } from "preact";
 import { useEffect } from "preact/hooks";
 import useSWR, { SWRConfig, useSWRConfig } from "swr";
-import { useBackendContext } from "../../context/backend.js";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
-import { BackendInfo } from "../../hooks/backend.js";
-import { bankUiSettings } from "../../settings.js";
-import { getIbanFromPayto, prepareHeaders } from "../../utils.js";
+import { useBackendContext } from "../context/backend.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
+import { BackendInfo } from "../hooks/backend.js";
+import { bankUiSettings } from "../settings.js";
+import { getIbanFromPayto, prepareHeaders } from "../utils.js";
 import { BankFrame } from "./BankFrame.js";
 import { LoginForm } from "./LoginForm.js";
 import { PaymentOptions } from "./PaymentOptions.js";
diff --git a/packages/demobank-ui/src/pages/home/BankFrame.tsx 
b/packages/demobank-ui/src/pages/BankFrame.tsx
similarity index 94%
rename from packages/demobank-ui/src/pages/home/BankFrame.tsx
rename to packages/demobank-ui/src/pages/BankFrame.tsx
index cb629effb..e36629e2a 100644
--- a/packages/demobank-ui/src/pages/home/BankFrame.tsx
+++ b/packages/demobank-ui/src/pages/BankFrame.tsx
@@ -16,12 +16,12 @@
 
 import { Logger } from "@gnu-taler/taler-util";
 import { ComponentChildren, Fragment, h, VNode } from "preact";
-import talerLogo from "../../assets/logo-white.svg";
-import { LangSelectorLikePy as LangSelector } from 
"../../components/menu/LangSelector.js";
-import { useBackendContext } from "../../context/backend.js";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
+import talerLogo from "../assets/logo-white.svg";
+import { LangSelectorLikePy as LangSelector } from 
"../components/LangSelector.js";
+import { useBackendContext } from "../context/backend.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
 import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
-import { bankUiSettings } from "../../settings.js";
+import { bankUiSettings } from "../settings.js";
 
 const logger = new Logger("BankFrame");
 
diff --git a/packages/demobank-ui/src/pages/home/LoginForm.tsx 
b/packages/demobank-ui/src/pages/LoginForm.tsx
similarity index 94%
rename from packages/demobank-ui/src/pages/home/LoginForm.tsx
rename to packages/demobank-ui/src/pages/LoginForm.tsx
index 4f38bc91d..61d3c1e49 100644
--- a/packages/demobank-ui/src/pages/home/LoginForm.tsx
+++ b/packages/demobank-ui/src/pages/LoginForm.tsx
@@ -17,11 +17,11 @@
 import { h, VNode } from "preact";
 import { route } from "preact-router";
 import { useEffect, useRef, useState } from "preact/hooks";
-import { useBackendContext } from "../../context/backend.js";
+import { useBackendContext } from "../context/backend.js";
 import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
-import { BackendStateHandler } from "../../hooks/backend.js";
-import { bankUiSettings } from "../../settings.js";
-import { getBankBackendBaseUrl, undefinedIfEmpty } from "../../utils.js";
+import { BackendStateHandler } from "../hooks/backend.js";
+import { bankUiSettings } from "../settings.js";
+import { getBankBackendBaseUrl, undefinedIfEmpty } from "../utils.js";
 import { ShowInputErrorLabel } from "./ShowInputErrorLabel.js";
 
 /**
diff --git a/packages/demobank-ui/src/pages/home/PaymentOptions.tsx 
b/packages/demobank-ui/src/pages/PaymentOptions.tsx
similarity index 100%
rename from packages/demobank-ui/src/pages/home/PaymentOptions.tsx
rename to packages/demobank-ui/src/pages/PaymentOptions.tsx
diff --git a/packages/demobank-ui/src/pages/home/PaytoWireTransferForm.tsx 
b/packages/demobank-ui/src/pages/PaytoWireTransferForm.tsx
similarity index 98%
rename from packages/demobank-ui/src/pages/home/PaytoWireTransferForm.tsx
rename to packages/demobank-ui/src/pages/PaytoWireTransferForm.tsx
index 36182cd93..1237f5eb1 100644
--- a/packages/demobank-ui/src/pages/home/PaytoWireTransferForm.tsx
+++ b/packages/demobank-ui/src/pages/PaytoWireTransferForm.tsx
@@ -18,14 +18,14 @@ import { Amounts, Logger, parsePaytoUri } from 
"@gnu-taler/taler-util";
 import { useLocalStorage } from "@gnu-taler/web-util/lib/index.browser";
 import { h, VNode } from "preact";
 import { StateUpdater, useEffect, useRef, useState } from "preact/hooks";
-import { useBackendContext } from "../../context/backend.js";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
+import { useBackendContext } from "../context/backend.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
 import {
   InternationalizationAPI,
   useTranslationContext,
 } from "@gnu-taler/web-util/lib/index.browser";
-import { BackendState } from "../../hooks/backend.js";
-import { prepareHeaders, undefinedIfEmpty } from "../../utils.js";
+import { BackendState } from "../hooks/backend.js";
+import { prepareHeaders, undefinedIfEmpty } from "../utils.js";
 import { ShowInputErrorLabel } from "./ShowInputErrorLabel.js";
 
 const logger = new Logger("PaytoWireTransferForm");
diff --git a/packages/demobank-ui/src/pages/home/PublicHistoriesPage.tsx 
b/packages/demobank-ui/src/pages/PublicHistoriesPage.tsx
similarity index 97%
rename from packages/demobank-ui/src/pages/home/PublicHistoriesPage.tsx
rename to packages/demobank-ui/src/pages/PublicHistoriesPage.tsx
index 1577e0dfc..be9f4aee1 100644
--- a/packages/demobank-ui/src/pages/home/PublicHistoriesPage.tsx
+++ b/packages/demobank-ui/src/pages/PublicHistoriesPage.tsx
@@ -20,9 +20,9 @@ import { ComponentChildren, Fragment, h, VNode } from 
"preact";
 import { route } from "preact-router";
 import { StateUpdater } from "preact/hooks";
 import useSWR, { SWRConfig } from "swr";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
 import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
-import { getBankBackendBaseUrl } from "../../utils.js";
+import { getBankBackendBaseUrl } from "../utils.js";
 import { BankFrame } from "./BankFrame.js";
 import { Transactions } from "./Transactions.js";
 
diff --git a/packages/demobank-ui/src/pages/home/QrCodeSection.stories.tsx 
b/packages/demobank-ui/src/pages/QrCodeSection.stories.tsx
similarity index 100%
rename from packages/demobank-ui/src/pages/home/QrCodeSection.stories.tsx
rename to packages/demobank-ui/src/pages/QrCodeSection.stories.tsx
diff --git a/packages/demobank-ui/src/pages/home/QrCodeSection.tsx 
b/packages/demobank-ui/src/pages/QrCodeSection.tsx
similarity index 95%
rename from packages/demobank-ui/src/pages/home/QrCodeSection.tsx
rename to packages/demobank-ui/src/pages/QrCodeSection.tsx
index 531df75bc..59a8ccd61 100644
--- a/packages/demobank-ui/src/pages/home/QrCodeSection.tsx
+++ b/packages/demobank-ui/src/pages/QrCodeSection.tsx
@@ -16,7 +16,7 @@
 
 import { h, VNode } from "preact";
 import { useEffect } from "preact/hooks";
-import { QR } from "../../components/QR.js";
+import { QR } from "../components/QR.js";
 import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
 
 export function QrCodeSection({
@@ -42,7 +42,7 @@ export function QrCodeSection({
       <article>
         <div class="qr-div">
           <p>{i18n.str`Use this QR code to withdraw to your mobile 
wallet:`}</p>
-          {QR({ text: talerWithdrawUri })}
+          <QR text={talerWithdrawUri} />
           <p>
             <i18n.Translate>
               Click{" "}
diff --git a/packages/demobank-ui/src/pages/home/RegistrationPage.tsx 
b/packages/demobank-ui/src/pages/RegistrationPage.tsx
similarity index 96%
rename from packages/demobank-ui/src/pages/home/RegistrationPage.tsx
rename to packages/demobank-ui/src/pages/RegistrationPage.tsx
index c21693885..c97cb56f3 100644
--- a/packages/demobank-ui/src/pages/home/RegistrationPage.tsx
+++ b/packages/demobank-ui/src/pages/RegistrationPage.tsx
@@ -17,15 +17,15 @@ import { Logger } from "@gnu-taler/taler-util";
 import { Fragment, h, VNode } from "preact";
 import { route } from "preact-router";
 import { StateUpdater, useState } from "preact/hooks";
-import { useBackendContext } from "../../context/backend.js";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
+import { useBackendContext } from "../context/backend.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
 import {
   InternationalizationAPI,
   useTranslationContext,
 } from "@gnu-taler/web-util/lib/index.browser";
-import { BackendStateHandler } from "../../hooks/backend.js";
-import { bankUiSettings } from "../../settings.js";
-import { getBankBackendBaseUrl, undefinedIfEmpty } from "../../utils.js";
+import { BackendStateHandler } from "../hooks/backend.js";
+import { bankUiSettings } from "../settings.js";
+import { getBankBackendBaseUrl, undefinedIfEmpty } from "../utils.js";
 import { BankFrame } from "./BankFrame.js";
 import { ShowInputErrorLabel } from "./ShowInputErrorLabel.js";
 
diff --git a/packages/demobank-ui/src/pages/Routing.tsx 
b/packages/demobank-ui/src/pages/Routing.tsx
index 6b00df97b..3c3aae0ce 100644
--- a/packages/demobank-ui/src/pages/Routing.tsx
+++ b/packages/demobank-ui/src/pages/Routing.tsx
@@ -18,9 +18,9 @@ import { createHashHistory } from "history";
 import { h, VNode } from "preact";
 import Router, { route, Route } from "preact-router";
 import { useEffect } from "preact/hooks";
-import { AccountPage } from "./home/AccountPage.js";
-import { PublicHistoriesPage } from "./home/PublicHistoriesPage.js";
-import { RegistrationPage } from "./home/RegistrationPage.js";
+import { AccountPage } from "./AccountPage.js";
+import { PublicHistoriesPage } from "./PublicHistoriesPage.js";
+import { RegistrationPage } from "./RegistrationPage.js";
 
 export function Routing(): VNode {
   const history = createHashHistory();
diff --git a/packages/demobank-ui/src/pages/home/ShowInputErrorLabel.tsx 
b/packages/demobank-ui/src/pages/ShowInputErrorLabel.tsx
similarity index 100%
rename from packages/demobank-ui/src/pages/home/ShowInputErrorLabel.tsx
rename to packages/demobank-ui/src/pages/ShowInputErrorLabel.tsx
diff --git a/packages/demobank-ui/src/pages/home/Transactions.tsx 
b/packages/demobank-ui/src/pages/Transactions.tsx
similarity index 100%
rename from packages/demobank-ui/src/pages/home/Transactions.tsx
rename to packages/demobank-ui/src/pages/Transactions.tsx
diff --git a/packages/demobank-ui/src/pages/home/WalletWithdrawForm.tsx 
b/packages/demobank-ui/src/pages/WalletWithdrawForm.tsx
similarity index 95%
rename from packages/demobank-ui/src/pages/home/WalletWithdrawForm.tsx
rename to packages/demobank-ui/src/pages/WalletWithdrawForm.tsx
index 440d16c6c..ed2898952 100644
--- a/packages/demobank-ui/src/pages/home/WalletWithdrawForm.tsx
+++ b/packages/demobank-ui/src/pages/WalletWithdrawForm.tsx
@@ -17,14 +17,14 @@
 import { Logger } from "@gnu-taler/taler-util";
 import { h, VNode } from "preact";
 import { StateUpdater, useEffect, useRef } from "preact/hooks";
-import { useBackendContext } from "../../context/backend.js";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
+import { useBackendContext } from "../context/backend.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
 import {
   InternationalizationAPI,
   useTranslationContext,
 } from "@gnu-taler/web-util/lib/index.browser";
-import { BackendState } from "../../hooks/backend.js";
-import { prepareHeaders, validateAmount } from "../../utils.js";
+import { BackendState } from "../hooks/backend.js";
+import { prepareHeaders, validateAmount } from "../utils.js";
 
 const logger = new Logger("WalletWithdrawForm");
 
diff --git 
a/packages/demobank-ui/src/pages/home/WithdrawalConfirmationQuestion.tsx 
b/packages/demobank-ui/src/pages/WithdrawalConfirmationQuestion.tsx
similarity index 97%
rename from 
packages/demobank-ui/src/pages/home/WithdrawalConfirmationQuestion.tsx
rename to packages/demobank-ui/src/pages/WithdrawalConfirmationQuestion.tsx
index 693f85bcd..8cfdd4e9f 100644
--- a/packages/demobank-ui/src/pages/home/WithdrawalConfirmationQuestion.tsx
+++ b/packages/demobank-ui/src/pages/WithdrawalConfirmationQuestion.tsx
@@ -17,14 +17,14 @@
 import { Logger } from "@gnu-taler/taler-util";
 import { Fragment, h, VNode } from "preact";
 import { StateUpdater } from "preact/hooks";
-import { useBackendContext } from "../../context/backend.js";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
+import { useBackendContext } from "../context/backend.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
 import {
   InternationalizationAPI,
   useTranslationContext,
 } from "@gnu-taler/web-util/lib/index.browser";
-import { BackendState } from "../../hooks/backend.js";
-import { prepareHeaders } from "../../utils.js";
+import { BackendState } from "../hooks/backend.js";
+import { prepareHeaders } from "../utils.js";
 
 const logger = new Logger("WithdrawalConfirmationQuestion");
 
diff --git a/packages/demobank-ui/src/pages/home/WithdrawalQRCode.tsx 
b/packages/demobank-ui/src/pages/WithdrawalQRCode.tsx
similarity index 97%
rename from packages/demobank-ui/src/pages/home/WithdrawalQRCode.tsx
rename to packages/demobank-ui/src/pages/WithdrawalQRCode.tsx
index 978d3a840..174c19288 100644
--- a/packages/demobank-ui/src/pages/home/WithdrawalQRCode.tsx
+++ b/packages/demobank-ui/src/pages/WithdrawalQRCode.tsx
@@ -17,7 +17,7 @@
 import { Logger } from "@gnu-taler/taler-util";
 import { Fragment, h, VNode } from "preact";
 import useSWR from "swr";
-import { PageStateType, usePageContext } from "../../context/pageState.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
 import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
 import { QrCodeSection } from "./QrCodeSection.js";
 import { WithdrawalConfirmationQuestion } from 
"./WithdrawalConfirmationQuestion.js";
diff --git a/packages/demobank-ui/src/pages/home/index.stories.tsx 
b/packages/demobank-ui/src/pages/index.stories.tsx
similarity index 100%
rename from packages/demobank-ui/src/pages/home/index.stories.tsx
rename to packages/demobank-ui/src/pages/index.stories.tsx
diff --git a/packages/demobank-ui/src/stories.tsx 
b/packages/demobank-ui/src/stories.tsx
index aab93a749..611d63879 100644
--- a/packages/demobank-ui/src/stories.tsx
+++ b/packages/demobank-ui/src/stories.tsx
@@ -20,7 +20,7 @@
  */
 import { strings } from "./i18n/strings.js";
 
-import * as pages from "./pages/home/index.stories.js";
+import * as pages from "./pages/index.stories.js";
 
 import { renderStories } from "@gnu-taler/web-util/lib/index.browser";
 
diff --git a/packages/demobank-ui/src/style/index.css 
b/packages/demobank-ui/src/style/index.css
deleted file mode 100644
index e69de29bb..000000000

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]