From d2554bedf3984ba4eb3a52b5649daa9c7c686c39 Mon Sep 17 00:00:00 2001
From: Sebastian <sebasjm@gmail.com>
Date: Wed, 7 Dec 2022 15:44:16 -0300
Subject: no-fix: remove 'any' and login status is taken from backend

---
 .../demobank-ui/src/pages/home/AccountPage.tsx     | 91 ++++++++--------------
 1 file changed, 34 insertions(+), 57 deletions(-)

(limited to 'packages/demobank-ui/src/pages/home/AccountPage.tsx')

diff --git a/packages/demobank-ui/src/pages/home/AccountPage.tsx b/packages/demobank-ui/src/pages/home/AccountPage.tsx
index 2bc05c332..16ff601ec 100644
--- a/packages/demobank-ui/src/pages/home/AccountPage.tsx
+++ b/packages/demobank-ui/src/pages/home/AccountPage.tsx
@@ -16,14 +16,15 @@
 
 import { Amounts, HttpStatusCode } from "@gnu-taler/taler-util";
 import { hooks } from "@gnu-taler/web-util/lib/index.browser";
-import { h, Fragment, VNode } from "preact";
-import { StateUpdater, useEffect, useState } from "preact/hooks";
+import { ComponentChildren, Fragment, h, VNode } from "preact";
+import { StateUpdater, useEffect } from "preact/hooks";
 import useSWR, { SWRConfig, useSWRConfig } from "swr";
+import { useBackendContext } from "../../context/backend.js";
 import { PageStateType, usePageContext } from "../../context/pageState.js";
 import { useTranslationContext } from "../../context/translation.js";
-import { useBackendState } from "../../hooks/backend.js";
+import { BackendInfo } from "../../hooks/backend.js";
 import { bankUiSettings } from "../../settings.js";
-import { getIbanFromPayto } from "../../utils.js";
+import { getIbanFromPayto, prepareHeaders } from "../../utils.js";
 import { BankFrame } from "./BankFrame.js";
 import { LoginForm } from "./LoginForm.js";
 import { PaymentOptions } from "./PaymentOptions.js";
@@ -31,11 +32,10 @@ import { TalerWithdrawalQRCode } from "./TalerWithdrawalQRCode.js";
 import { Transactions } from "./Transactions.js";
 
 export function AccountPage(): VNode {
-  const [backendState, backendStateSetter] = useBackendState();
+  const backend = useBackendContext();
   const { i18n } = useTranslationContext();
-  const { pageState, pageStateSetter } = usePageContext();
 
-  if (!pageState.isLoggedIn) {
+  if (backend.state.status === "loggedOut") {
     return (
       <BankFrame>
         <h1 class="nav">{i18n.str`Welcome to ${bankUiSettings.bankName}!`}</h1>
@@ -44,28 +44,9 @@ export function AccountPage(): VNode {
     );
   }
 
-  if (typeof backendState === "undefined") {
-    pageStateSetter((prevState) => ({
-      ...prevState,
-
-      isLoggedIn: false,
-      error: {
-        title: i18n.str`Page has a problem: logged in but backend state is lost.`,
-      },
-    }));
-    return <p>Error: waiting for details...</p>;
-  }
-  console.log("Showing the profile page..");
   return (
-    <SWRWithCredentials
-      username={backendState.username}
-      password={backendState.password}
-      backendUrl={backendState.url}
-    >
-      <Account
-        accountLabel={backendState.username}
-        backendState={backendState}
-      />
+    <SWRWithCredentials info={backend.state}>
+      <Account accountLabel={backend.state.username} />
     </SWRWithCredentials>
   );
 }
@@ -73,16 +54,20 @@ export function AccountPage(): VNode {
 /**
  * Factor out login credentials.
  */
-function SWRWithCredentials(props: any): VNode {
-  const { username, password, backendUrl } = props;
-  const headers = new Headers();
-  headers.append("Authorization", `Basic ${btoa(`${username}:${password}`)}`);
-  console.log("Likely backend base URL", backendUrl);
+function SWRWithCredentials({
+  children,
+  info,
+}: {
+  children: ComponentChildren;
+  info: BackendInfo;
+}): VNode {
+  const { username, password, url: backendUrl } = info;
+  const headers = prepareHeaders(username, password);
   return (
     <SWRConfig
       value={{
         fetcher: (url: string) => {
-          return fetch(backendUrl + url || "", { headers }).then((r) => {
+          return fetch(new URL(url, backendUrl).href, { headers }).then((r) => {
             if (!r.ok) throw { status: r.status, json: r.json() };
 
             return r.json();
@@ -90,7 +75,7 @@ function SWRWithCredentials(props: any): VNode {
         },
       }}
     >
-      {props.children}
+      {children as any}
     </SWRConfig>
   );
 }
@@ -100,9 +85,9 @@ function SWRWithCredentials(props: any): VNode {
  * is mostly needed to provide the user's credentials to POST
  * to the bank.
  */
-function Account(Props: any): VNode {
+function Account({ accountLabel }: { accountLabel: string }): VNode {
   const { cache } = useSWRConfig();
-  const { accountLabel, backendState } = Props;
+
   // Getting the bank account balance:
   const endpoint = `access-api/accounts/${accountLabel}`;
   const { data, error, mutate } = useSWR(endpoint, {
@@ -112,14 +97,9 @@ function Account(Props: any): VNode {
     // revalidateOnFocus: false,
     // revalidateOnReconnect: false,
   });
+  const backend = useBackendContext();
   const { pageState, pageStateSetter: setPageState } = usePageContext();
-  const {
-    withdrawalInProgress,
-    withdrawalId,
-    isLoggedIn,
-    talerWithdrawUri,
-    timestamp,
-  } = pageState;
+  const { withdrawalId, talerWithdrawUri, timestamp } = pageState;
   const { i18n } = useTranslationContext();
   useEffect(() => {
     mutate();
@@ -129,10 +109,11 @@ function Account(Props: any): VNode {
    * This part shows a list of transactions: with 5 elements by
    * default and offers a "load more" button.
    */
-  const [txPageNumber, setTxPageNumber] = useTransactionPageNumber();
-  const txsPages = [];
-  for (let i = 0; i <= txPageNumber; i++)
-    txsPages.push(<Transactions accountLabel={accountLabel} pageNumber={i} />);
+  // const [txPageNumber, setTxPageNumber] = useTransactionPageNumber();
+  // const txsPages = [];
+  // for (let i = 0; i <= txPageNumber; i++) {
+  //   txsPages.push(<Transactions accountLabel={accountLabel} pageNumber={i} />);
+  // }
 
   if (typeof error !== "undefined") {
     console.log("account error", error, endpoint);
@@ -143,10 +124,10 @@ function Account(Props: any): VNode {
      */
     switch (error.status) {
       case 404: {
+        backend.clear();
         setPageState((prevState: PageStateType) => ({
           ...prevState,
 
-          isLoggedIn: false,
           error: {
             title: i18n.str`Username or account label '${accountLabel}' not found.  Won't login.`,
           },
@@ -170,10 +151,9 @@ function Account(Props: any): VNode {
       }
       case HttpStatusCode.Unauthorized:
       case HttpStatusCode.Forbidden: {
+        backend.clear();
         setPageState((prevState: PageStateType) => ({
           ...prevState,
-
-          isLoggedIn: false,
           error: {
             title: i18n.str`Wrong credentials given.`,
           },
@@ -181,10 +161,9 @@ function Account(Props: any): VNode {
         return <p>Wrong credentials...</p>;
       }
       default: {
+        backend.clear();
         setPageState((prevState: PageStateType) => ({
           ...prevState,
-
-          isLoggedIn: false,
           error: {
             title: i18n.str`Account information could not be retrieved.`,
             debug: JSON.stringify(error),
@@ -211,13 +190,11 @@ function Account(Props: any): VNode {
    * the outcome.
    */
   console.log(`maybe new withdrawal ${talerWithdrawUri}`);
-  if (talerWithdrawUri) {
+  if (talerWithdrawUri && withdrawalId) {
     console.log("Bank created a new Taler withdrawal");
     return (
       <BankFrame>
         <TalerWithdrawalQRCode
-          accountLabel={accountLabel}
-          backendState={backendState}
           withdrawalId={withdrawalId}
           talerWithdrawUri={talerWithdrawUri}
         />
@@ -266,7 +243,7 @@ function Account(Props: any): VNode {
           <h2>{i18n.str`Latest transactions:`}</h2>
           <Transactions
             balanceValue={balanceValue}
-            pageNumber="0"
+            pageNumber={0}
             accountLabel={accountLabel}
           />
         </article>
-- 
cgit v1.2.3

