From a8c5a9696c1735a178158cbc9ac4f9bb4b6f013d Mon Sep 17 00:00:00 2001
From: Sebastian <sebasjm@gmail.com>
Date: Wed, 8 Feb 2023 17:41:19 -0300
Subject: impl accout management and refactor

---
 packages/demobank-ui/src/pages/Routing.tsx | 84 ++++++++++++++++++++++++++++--
 1 file changed, 80 insertions(+), 4 deletions(-)

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

diff --git a/packages/demobank-ui/src/pages/Routing.tsx b/packages/demobank-ui/src/pages/Routing.tsx
index 3c3aae0ce..a88af9b0b 100644
--- a/packages/demobank-ui/src/pages/Routing.tsx
+++ b/packages/demobank-ui/src/pages/Routing.tsx
@@ -14,21 +14,97 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
+import {
+  HttpResponsePaginated,
+  useTranslationContext,
+} from "@gnu-taler/web-util/lib/index.browser";
 import { createHashHistory } from "history";
 import { h, VNode } from "preact";
 import Router, { route, Route } from "preact-router";
 import { useEffect } from "preact/hooks";
-import { AccountPage } from "./AccountPage.js";
+import { Loading } from "../components/Loading.js";
+import { PageStateType, usePageContext } from "../context/pageState.js";
+import { HomePage } from "./HomePage.js";
+import { BankFrame } from "./BankFrame.js";
 import { PublicHistoriesPage } from "./PublicHistoriesPage.js";
 import { RegistrationPage } from "./RegistrationPage.js";
 
+function handleNotOkResult(
+  safe: string,
+  saveError: (state: PageStateType["error"]) => void,
+  i18n: ReturnType<typeof useTranslationContext>["i18n"],
+): <T, E>(result: HttpResponsePaginated<T, E>) => VNode {
+  return function handleNotOkResult2<T, E>(
+    result: HttpResponsePaginated<T, E>,
+  ): VNode {
+    if (result.clientError && result.isUnauthorized) {
+      route(safe);
+      return <Loading />;
+    }
+    if (result.clientError && result.isNotfound) {
+      route(safe);
+      return (
+        <div>Page not found, you are going to be redirected to {safe}</div>
+      );
+    }
+    if (result.loading) return <Loading />;
+    if (!result.ok) {
+      saveError({
+        title: i18n.str`The backend reported a problem: HTTP status #${result.status}`,
+        description: i18n.str`Diagnostic from ${result.info?.url} is "${result.message}"`,
+        debug: JSON.stringify(result.error),
+      });
+      route(safe);
+    }
+    return <div />;
+  };
+}
+
 export function Routing(): VNode {
   const history = createHashHistory();
+  const { pageStateSetter } = usePageContext();
+
+  function saveError(error: PageStateType["error"]): void {
+    pageStateSetter((prev) => ({ ...prev, error }));
+  }
+  const { i18n } = useTranslationContext();
   return (
     <Router history={history}>
-      <Route path="/public-accounts" component={PublicHistoriesPage} />
-      <Route path="/register" component={RegistrationPage} />
-      <Route path="/account" component={AccountPage} />
+      <Route
+        path="/public-accounts"
+        component={() => (
+          <BankFrame>
+            <PublicHistoriesPage
+              onLoadNotOk={handleNotOkResult("/account", saveError, i18n)}
+            />
+          </BankFrame>
+        )}
+      />
+      <Route
+        path="/register"
+        component={() => (
+          <BankFrame>
+            <RegistrationPage
+              onError={saveError}
+              onComplete={() => {
+                route("/account");
+              }}
+            />
+          </BankFrame>
+        )}
+      />
+      <Route
+        path="/account"
+        component={() => (
+          <BankFrame>
+            <HomePage
+              onRegister={() => {
+                route("/register");
+              }}
+            />
+          </BankFrame>
+        )}
+      />
       <Route default component={Redirect} to="/account" />
     </Router>
   );
-- 
cgit v1.2.3

