diff options
Diffstat (limited to 'packages/demobank-ui/src/pages/Routing.tsx')
-rw-r--r-- | packages/demobank-ui/src/pages/Routing.tsx | 84 |
1 files changed, 80 insertions, 4 deletions
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> ); |