From 055645e17aa9424f299aa04f686de7574ab437c7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 11 Dec 2023 15:22:07 -0300 Subject: wip: #7752 --- packages/demobank-ui/src/Routing.tsx | 5 + packages/demobank-ui/src/pages/DownloadStats.tsx | 122 +++++++++++++++++++++ packages/demobank-ui/src/pages/admin/AdminHome.tsx | 7 +- 3 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 packages/demobank-ui/src/pages/DownloadStats.tsx (limited to 'packages/demobank-ui') diff --git a/packages/demobank-ui/src/Routing.tsx b/packages/demobank-ui/src/Routing.tsx index f8a625621..711b7f871 100644 --- a/packages/demobank-ui/src/Routing.tsx +++ b/packages/demobank-ui/src/Routing.tsx @@ -38,6 +38,7 @@ import { WireTransfer } from "./pages/WireTransfer.js"; import { AccountPage } from "./pages/AccountPage/index.js"; import { useSettingsContext } from "./context/settings.js"; import { useBankCoreApiContext } from "./context/config.js"; +import { DownloadStats } from "./pages/DownloadStats.js"; export function Routing(): VNode { const history = createHashHistory(); @@ -119,6 +120,10 @@ export function Routing(): VNode { path="/public-accounts" component={() => } /> + } + /> + */ + +import { AccessToken, Logger, RefreshReason, TalerCoreBankHttpClient, TalerCorebankApi, TalerError } from "@gnu-taler/taler-util"; +import { useTranslationContext } from "@gnu-taler/web-util/browser"; +import { Fragment, VNode, h } from "preact"; +import { useState } from "preact/hooks"; +import { Loading } from "@gnu-taler/web-util/browser"; +import { Transactions } from "../components/Transactions/index.js"; +import { usePublicAccounts } from "../hooks/access.js"; +import { useBackendState } from "../hooks/backend.js"; +import { useBankCoreApiContext } from "../context/config.js"; +import { getTimeframesForDate } from "./admin/AdminHome.js"; + +const logger = new Logger("PublicHistoriesPage"); + +interface Props { } + +/** + * Show histories of public accounts. + */ +export function DownloadStats({ }: Props): VNode { + const { i18n } = useTranslationContext(); + + const { state: credentials } = useBackendState(); + const creds = credentials.status !== "loggedIn" || !credentials.isUserAdministrator ? undefined : credentials + const { api, config } = useBankCoreApiContext(); + + const [state, setState] = useState() + + if (!creds) { + return
only admin can download stats
+ } + + return ( + +

{i18n.str`Stats`}

+ + progress {state} +
+ ); +} + + +async function fetchAllStatus(api: TalerCoreBankHttpClient, token: AccessToken, reference: Date, progres: (current: number, total: number) => void) { + const allMetrics = [ + TalerCorebankApi.MonitorTimeframeParam.day, + TalerCorebankApi.MonitorTimeframeParam.hour, + // TalerCorebankApi.MonitorTimeframeParam.month, + // TalerCorebankApi.MonitorTimeframeParam.year, + // TalerCorebankApi.MonitorTimeframeParam.decade, + ] + const allFrames = allMetrics.map(timeframe => ({ + timeframe, moment: getTimeframesForDate(reference, timeframe) + })) + + type Data = { + previous: TalerCorebankApi.MonitorResponse; + current: TalerCorebankApi.MonitorResponse; + } + const total = allFrames.length + + const dataResolvers = allFrames.map((frame, index) => async function getData(): Promise { + const previous = await api.getMonitor(token, { + timeframe: frame.timeframe, + which: frame.moment.previous + }) + await delay() + if (previous.type !== "ok") return undefined; + const current = await api.getMonitor(token, { + timeframe: frame.timeframe, + which: frame.moment.current + }) + await delay() + if (current.type !== "ok") return undefined; + return { previous: previous.body, current: current.body } + }); + + const csv = await dataResolvers.reduce(async (prev, resolver, index) => { + const accumulatedMap = await prev + console.log(index) + progres(index, total) + const data = await resolver() + if (!data) return accumulatedMap + + const metricName = TalerCorebankApi.MonitorTimeframeParam[allMetrics[index]] + accumulatedMap[metricName] = data + return accumulatedMap + }, Promise.resolve({} as Record)) + progres(total, total) + console.log(csv) +} +async function delay() { + return new Promise((res, rej) => { + setTimeout(() => { + res(null); + }, 1000) + }) +} \ No newline at end of file diff --git a/packages/demobank-ui/src/pages/admin/AdminHome.tsx b/packages/demobank-ui/src/pages/admin/AdminHome.tsx index 18e88a409..9c6e6cde6 100644 --- a/packages/demobank-ui/src/pages/admin/AdminHome.tsx +++ b/packages/demobank-ui/src/pages/admin/AdminHome.tsx @@ -54,7 +54,7 @@ function getDateForTimeframe(which: number, timeframe: TalerCorebankApi.MonitorT assertUnreachable(timeframe) } -function getTimeframesForDate(time: Date, timeframe: TalerCorebankApi.MonitorTimeframeParam): { current: number, previous: number } { +export function getTimeframesForDate(time: Date, timeframe: TalerCorebankApi.MonitorTimeframeParam): { current: number, previous: number } { switch (timeframe) { case TalerCorebankApi.MonitorTimeframeParam.hour: return { current: getHours(sub(time, { hours: 1 })), @@ -183,6 +183,11 @@ function Metrics(): VNode { /> + } -- cgit v1.2.3