/*
This file is part of GNU Taler
(C) 2022 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
*/
import { Amounts } from "@gnu-taler/taler-util";
import { styled } from "@linaria/react";
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
import {
InputWithLabel,
LightText,
SvgIcon,
} from "../components/styled/index.js";
import { useTranslationContext } from "../context/translation.js";
import { Button } from "../mui/Button.js";
import { Grid } from "../mui/Grid.js";
import { Paper } from "../mui/Paper.js";
import { TextField } from "../mui/TextField.js";
import arrowIcon from "../svg/chevron-down.svg";
import bankIcon from "../svg/ri-bank-line.svg";
const Container = styled.div`
display: flex;
flex-direction: column;
& > * {
margin: 8px;
}
`;
interface Props {
action: "send" | "get";
amount?: string;
goToWalletManualWithdraw: (amount: string) => void;
}
type Contact = {
icon: string;
name: string;
description: string;
};
const ContactTable = styled.table`
width: 100%;
& > tr > td {
padding: 8px;
& > div:not([data-disabled]):hover {
background-color: lightblue;
}
color: black;
div[data-disabled] > * {
color: gray;
}
}
& > tr:nth-child(2n) {
background: #ebebeb;
}
`;
const MediaExample = styled.div`
text-size-adjust: 100%;
color: inherit;
font-family: inherit;
font-size: inherit;
line-height: inherit;
text-transform: none;
text-align: left;
box-sizing: border-box;
align-items: center;
display: flex;
padding: 8px 8px;
&[data-disabled]:hover {
cursor: inherit;
}
cursor: pointer;
`;
const MediaLeft = styled.div`
text-size-adjust: 100%;
color: inherit;
font-family: inherit;
font-size: inherit;
line-height: inherit;
text-transform: none;
text-align: left;
box-sizing: border-box;
padding-right: 8px;
display: block;
`;
const MediaBody = styled.div`
text-size-adjust: 100%;
font-family: inherit;
text-transform: none;
text-align: left;
box-sizing: border-box;
flex: 1 1;
font-size: 14px;
font-weight: 500;
line-height: 1.42857;
`;
const MediaRight = styled.div`
text-size-adjust: 100%;
color: inherit;
font-family: inherit;
font-size: inherit;
line-height: inherit;
text-transform: none;
text-align: left;
box-sizing: border-box;
padding-left: 8px;
`;
const CircleDiv = styled.div`
box-sizing: border-box;
align-items: center;
background-position: 50%;
background-repeat: no-repeat;
background-size: cover;
border-radius: 50%;
display: flex;
justify-content: center;
margin-left: auto;
margin-right: auto;
overflow: hidden;
text-align: center;
text-decoration: none;
text-transform: uppercase;
transition: background-color 0.15s ease, border-color 0.15s ease,
color 0.15s ease;
font-size: 16px;
background-color: #86a7bd1a;
height: 40px;
line-height: 40px;
width: 40px;
border: none;
`;
function RowExample({
info,
disabled,
}: {
info: Contact;
disabled?: boolean;
}): VNode {
return (
{info.name}
{info.description}
);
}
export function DestinationSelectionGetCash({
amount: initialAmount,
goToWalletManualWithdraw,
}: Props): VNode {
const parsedInitialAmount = !initialAmount
? undefined
: Amounts.parse(initialAmount);
const parsedInitialAmountValue = !parsedInitialAmount
? ""
: Amounts.stringifyValue(parsedInitialAmount);
const currency = parsedInitialAmount?.currency;
const [amount, setAmount] = useState(parsedInitialAmountValue);
const { i18n } = useTranslationContext();
const previous1: Contact[] = [];
const previous2: Contact[] = [
{
name: "International Bank",
icon: bankIcon,
description: "account ending with 3454",
},
{
name: "Max",
icon: bankIcon,
description: "account ending with 3454",
},
{
name: "Alex",
icon: bankIcon,
description: "account ending with 3454",
},
];
if (!currency) {
return
currency not provided
;
}
const currencyAndAmount = `${currency}:${amount}`;
const parsedAmount = Amounts.parse(currencyAndAmount);
// const dirty = parsedInitialAmountValue !== amount;
const invalid = !parsedAmount || Amounts.isZero(parsedAmount);
return (
Specify the amount and the origin
{currency}
}
value={amount}
onChange={(e) => {
setAmount(e);
}}
/>
{previous2.length > 0 ? (
Previous origins:
{previous2.map((info, i) => (
|
))}
) : undefined}
Create new origin for the money
From my bank account
From someone else
From a business or charity
From a exchange reserve or purse
);
}
export function DestinationSelectionSendCash({
amount: initialAmount,
}: Props): VNode {
const parsedInitialAmount = !initialAmount
? undefined
: Amounts.parse(initialAmount);
const parsedInitialAmountValue = !parsedInitialAmount
? ""
: Amounts.stringifyValue(parsedInitialAmount);
const currency = parsedInitialAmount?.currency;
const [amount, setAmount] = useState(parsedInitialAmountValue);
const { i18n } = useTranslationContext();
const previous1: Contact[] = [];
const previous2: Contact[] = [
{
name: "International Bank",
icon: bankIcon,
description: "account ending with 3454",
},
{
name: "Max",
icon: bankIcon,
description: "account ending with 3454",
},
{
name: "Alex",
icon: bankIcon,
description: "account ending with 3454",
},
];
if (!currency) {
return currency not provided
;
}
const currencyAndAmount = `${currency}:${amount}`;
const parsedAmount = Amounts.parse(currencyAndAmount);
const invalid = !parsedAmount || Amounts.isZero(parsedAmount);
return (
Specify the amount and the destination
{currency}
}
value={amount}
onChange={(e) => {
setAmount(e);
}}
/>
{previous2.length > 0 ? (
Previous destinations:
{previous2.map((info, i) => (
|
))}
) : undefined}
Create a destination for the money
To my bank account
To someone else
To a business or charity
To an exchange reserve or purse
);
}