aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2022-03-11 11:14:27 -0300
committerSebastian <sebasjm@gmail.com>2022-03-11 11:15:07 -0300
commitab68ecc7332281a43ce4acf28302f85a3c8f401a (patch)
treedc449a317f5a777788918eac381089af2fdda5d9
parent9337734a245001f40fe8033e11f2df062fd7560b (diff)
pending transaction, finally!
-rw-r--r--packages/taler-wallet-webextension/.storybook/preview.js2
-rw-r--r--packages/taler-wallet-webextension/babel.config-linaria.json30
-rw-r--r--packages/taler-wallet-webextension/rollup.config.js4
-rw-r--r--packages/taler-wallet-webextension/src/components/Banner.stories.tsx2
-rw-r--r--packages/taler-wallet-webextension/src/components/Banner.tsx16
-rw-r--r--packages/taler-wallet-webextension/src/components/PendingTransactions.stories.tsx143
-rw-r--r--packages/taler-wallet-webextension/src/components/PendingTransactions.tsx34
-rw-r--r--packages/taler-wallet-webextension/src/mui/Button.tsx2
-rw-r--r--packages/taler-wallet-webextension/src/popup/BalancePage.tsx24
-rw-r--r--packages/taler-wallet-webextension/src/popupEntryPoint.tsx2
-rw-r--r--packages/taler-wallet-webextension/src/walletEntryPoint.tsx10
11 files changed, 236 insertions, 33 deletions
diff --git a/packages/taler-wallet-webextension/.storybook/preview.js b/packages/taler-wallet-webextension/.storybook/preview.js
index 9c1365d3a..02d8a0e06 100644
--- a/packages/taler-wallet-webextension/.storybook/preview.js
+++ b/packages/taler-wallet-webextension/.storybook/preview.js
@@ -128,7 +128,7 @@ export const decorators = [
<Story />
</div>
}
- if (kind.startsWith('mui')) {
+ if (kind.startsWith('mui') || kind.startsWith('component')) {
return <div style={{ display: 'flex', flexWrap: 'wrap' }}>
<Story />
</div>
diff --git a/packages/taler-wallet-webextension/babel.config-linaria.json b/packages/taler-wallet-webextension/babel.config-linaria.json
new file mode 100644
index 000000000..abf87db8a
--- /dev/null
+++ b/packages/taler-wallet-webextension/babel.config-linaria.json
@@ -0,0 +1,30 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 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)
+ */
+/*
+ * Linaria need pre-process typscript files into javascript before running.
+ * We choose to use the default preact-cli config.
+ * This file should be used from @linaria/rollup plugin only
+ */
+{
+ "presets": [
+ "preact-cli/babel",
+ ]
+}
diff --git a/packages/taler-wallet-webextension/rollup.config.js b/packages/taler-wallet-webextension/rollup.config.js
index edbc69622..8058ce252 100644
--- a/packages/taler-wallet-webextension/rollup.config.js
+++ b/packages/taler-wallet-webextension/rollup.config.js
@@ -71,6 +71,10 @@ const makePlugins = () => [
image(),
linaria({
+ babelOptions: {
+ babelrc: false,
+ configFile: './babel.config-linaria.json',
+ },
sourceMap: process.env.NODE_ENV !== 'production',
}),
diff --git a/packages/taler-wallet-webextension/src/components/Banner.stories.tsx b/packages/taler-wallet-webextension/src/components/Banner.stories.tsx
index 665b0de6f..4d5b22208 100644
--- a/packages/taler-wallet-webextension/src/components/Banner.stories.tsx
+++ b/packages/taler-wallet-webextension/src/components/Banner.stories.tsx
@@ -91,7 +91,7 @@ export const PendingOperation = () => (
<Wrapper>
<Banner
title="PENDING TRANSACTIONS"
- style={{ backgroundColor: "lightblue", padding: 8 }}
+ style={{ backgroundColor: "lightcyan", padding: 8 }}
elements={[
{
icon: (
diff --git a/packages/taler-wallet-webextension/src/components/Banner.tsx b/packages/taler-wallet-webextension/src/components/Banner.tsx
index 09dfac816..37affd5b4 100644
--- a/packages/taler-wallet-webextension/src/components/Banner.tsx
+++ b/packages/taler-wallet-webextension/src/components/Banner.tsx
@@ -29,16 +29,24 @@ export function Banner({ title, elements, confirm, ...rest }: Props) {
</Grid>
</Grid>
)}
- <Grid container wrap="nowrap" spacing={1} alignItems="center">
+ <Grid container columns={1}>
{elements.map((e, i) => (
- <Fragment key={i}>
+ <Grid
+ container
+ item
+ xs={1}
+ key={i}
+ wrap="nowrap"
+ spacing={1}
+ alignItems="center"
+ >
{e.icon && (
- <Grid item>
+ <Grid item xs={"auto"}>
<Avatar>{e.icon}</Avatar>
</Grid>
)}
<Grid item>{e.description}</Grid>
- </Fragment>
+ </Grid>
))}
</Grid>
{confirm && (
diff --git a/packages/taler-wallet-webextension/src/components/PendingTransactions.stories.tsx b/packages/taler-wallet-webextension/src/components/PendingTransactions.stories.tsx
new file mode 100644
index 000000000..658a41aa8
--- /dev/null
+++ b/packages/taler-wallet-webextension/src/components/PendingTransactions.stories.tsx
@@ -0,0 +1,143 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 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 { PendingTransactionsView as TestedComponent } from "./PendingTransactions";
+import { Fragment, h, VNode } from "preact";
+import { createExample } from "../test-utils";
+import { Transaction, TransactionType } from "@gnu-taler/taler-util";
+
+export default {
+ title: "component/PendingTransactions",
+ component: TestedComponent,
+};
+
+export const OnePendingTransaction = createExample(TestedComponent, {
+ transactions: [
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ ],
+});
+
+export const ThreePendingTransactions = createExample(TestedComponent, {
+ transactions: [
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ ],
+});
+
+export const TenPendingTransactions = createExample(TestedComponent, {
+ transactions: [
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ {
+ amountEffective: "USD:10",
+ type: TransactionType.Withdrawal,
+ timestamp: {
+ t_ms: 1,
+ },
+ } as Transaction,
+ ],
+});
diff --git a/packages/taler-wallet-webextension/src/components/PendingTransactions.tsx b/packages/taler-wallet-webextension/src/components/PendingTransactions.tsx
index 99f43a62b..b2e567d7d 100644
--- a/packages/taler-wallet-webextension/src/components/PendingTransactions.tsx
+++ b/packages/taler-wallet-webextension/src/components/PendingTransactions.tsx
@@ -1,20 +1,42 @@
-import { Amounts, Transaction } from "@gnu-taler/taler-util";
+import { Amounts, NotificationType, Transaction } from "@gnu-taler/taler-util";
import { PendingTaskInfo } from "@gnu-taler/taler-wallet-core";
-import { Fragment, h, VNode } from "preact";
+import { Fragment, h, JSX } from "preact";
+import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { Avatar } from "../mui/Avatar";
import { Typography } from "../mui/Typography";
import Banner from "./Banner";
import { Time } from "./Time";
+import * as wxApi from "../wxApi";
-interface Props {
- transactions: Transaction[];
+interface Props extends JSX.HTMLAttributes {}
+
+export function PendingTransactions({}: Props) {
+ const state = useAsyncAsHook(wxApi.getTransactions, [
+ NotificationType.WithdrawGroupFinished,
+ ]);
+ const transactions =
+ !state || state.hasError ? [] : state.response.transactions;
+
+ if (!state || state.hasError) {
+ return <Fragment />;
+ }
+ return <PendingTransactionsView transactions={transactions} />;
}
-export function PendingTransactions({ transactions }: Props) {
+export function PendingTransactionsView({
+ transactions,
+}: {
+ transactions: Transaction[];
+}) {
return (
<Banner
title="PENDING OPERATIONS"
- style={{ backgroundColor: "lightblue", padding: 8 }}
+ style={{
+ backgroundColor: "lightcyan",
+ maxHeight: 150,
+ padding: 8,
+ overflowY: transactions.length > 3 ? "scroll" : "hidden",
+ }}
elements={transactions.map((t) => {
const amount = Amounts.parseOrThrow(t.amountEffective);
return {
diff --git a/packages/taler-wallet-webextension/src/mui/Button.tsx b/packages/taler-wallet-webextension/src/mui/Button.tsx
index b185504e4..ccca360fa 100644
--- a/packages/taler-wallet-webextension/src/mui/Button.tsx
+++ b/packages/taler-wallet-webextension/src/mui/Button.tsx
@@ -15,7 +15,7 @@ interface Props {
startIcon?: VNode;
variant?: "contained" | "outlined" | "text";
color?: "primary" | "secondary" | "success" | "error" | "info" | "warning";
- onClick: () => void;
+ onClick?: () => void;
}
const baseStyle = css`
diff --git a/packages/taler-wallet-webextension/src/popup/BalancePage.tsx b/packages/taler-wallet-webextension/src/popup/BalancePage.tsx
index e85c00d60..53b4e1518 100644
--- a/packages/taler-wallet-webextension/src/popup/BalancePage.tsx
+++ b/packages/taler-wallet-webextension/src/popup/BalancePage.tsx
@@ -28,7 +28,6 @@ import { JustInDevMode } from "../components/JustInDevMode";
import { Loading } from "../components/Loading";
import { LoadingError } from "../components/LoadingError";
import { MultiActionButton } from "../components/MultiActionButton";
-import PendingTransactions from "../components/PendingTransactions";
import { ButtonBoxPrimary, ButtonPrimary } from "../components/styled";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { AddNewActionView } from "../wallet/AddNewActionView";
@@ -46,19 +45,10 @@ export function BalancePage({
goToWalletHistory,
}: Props): VNode {
const [addingAction, setAddingAction] = useState(false);
- const state = useAsyncAsHook(
- async () => ({
- balance: await wxApi.getBalance(),
- pending: await wxApi.getTransactions(),
- }),
- [NotificationType.WithdrawGroupFinished],
- );
- const balances =
- !state || state.hasError ? [] : state.response.balance.balances;
- const pending =
- !state || state.hasError
- ? []
- : state.response.pending.transactions.filter((t) => t.pending);
+ const state = useAsyncAsHook(wxApi.getBalance, [
+ NotificationType.WithdrawGroupFinished,
+ ]);
+ const balances = !state || state.hasError ? [] : state.response.balances;
if (!state) {
return <Loading />;
@@ -80,7 +70,6 @@ export function BalancePage({
return (
<BalanceView
balances={balances}
- pending={pending}
goToWalletManualWithdraw={goToWalletManualWithdraw}
goToWalletDeposit={goToWalletDeposit}
goToWalletHistory={goToWalletHistory}
@@ -90,7 +79,6 @@ export function BalancePage({
}
export interface BalanceViewProps {
balances: Balance[];
- pending: Transaction[];
goToWalletManualWithdraw: () => void;
goToAddAction: () => void;
goToWalletDeposit: (currency: string) => void;
@@ -99,7 +87,6 @@ export interface BalanceViewProps {
export function BalanceView({
balances,
- pending,
goToWalletManualWithdraw,
goToWalletDeposit,
goToWalletHistory,
@@ -117,9 +104,6 @@ export function BalanceView({
return (
<Fragment>
- {/* {pending.length > 0 ? (
- <PendingTransactions transactions={pending} />
- ) : undefined} */}
<section>
<BalanceTable
balances={balances}
diff --git a/packages/taler-wallet-webextension/src/popupEntryPoint.tsx b/packages/taler-wallet-webextension/src/popupEntryPoint.tsx
index 56d1e60e8..6c9afbe84 100644
--- a/packages/taler-wallet-webextension/src/popupEntryPoint.tsx
+++ b/packages/taler-wallet-webextension/src/popupEntryPoint.tsx
@@ -26,6 +26,7 @@ import { Fragment, h, render, VNode } from "preact";
import Router, { route, Route } from "preact-router";
import { Match } from "preact-router/match";
import { useEffect } from "preact/hooks";
+import PendingTransactions from "./components/PendingTransactions";
import { PopupBox } from "./components/styled";
import { DevContextProvider } from "./context/devContext";
import { IoCProviderForRuntime } from "./context/iocContext";
@@ -82,6 +83,7 @@ function Application(): VNode {
<DevContextProvider>
{({ devMode }: { devMode: boolean }) => (
<IoCProviderForRuntime>
+ <PendingTransactions />
<Match>
{({ path }: { path: string }) => <PopupNavBar path={path} />}
</Match>
diff --git a/packages/taler-wallet-webextension/src/walletEntryPoint.tsx b/packages/taler-wallet-webextension/src/walletEntryPoint.tsx
index f2240cdf1..df969c029 100644
--- a/packages/taler-wallet-webextension/src/walletEntryPoint.tsx
+++ b/packages/taler-wallet-webextension/src/walletEntryPoint.tsx
@@ -27,6 +27,7 @@ import Router, { route, Route } from "preact-router";
import Match from "preact-router/match";
import { useEffect, useState } from "preact/hooks";
import { LogoHeader } from "./components/LogoHeader";
+import PendingTransactions from "./components/PendingTransactions";
import {
NavigationHeader,
NavigationHeaderHolder,
@@ -112,6 +113,15 @@ function Application(): VNode {
);
}}
</Match>
+ <div
+ style={{
+ backgroundColor: "lightcyan",
+ display: "flex",
+ justifyContent: "center",
+ }}
+ >
+ <PendingTransactions />
+ </div>
<WalletBox>
{globalNotification && (
<SuccessBox onClick={clearNotification}>