summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/wallet/CreateManualWithdraw.tsx
blob: be2cbe41d153012851093792387bc2b400b27d89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import { VNode } from "preact";
import { useEffect, useRef, useState } from "preact/hooks";
import { ErrorMessage } from "../components/ErrorMessage";
import { ButtonPrimary, Input, InputWithLabel, LightText, WalletBox } from "../components/styled";

export interface Props {
  error: string | undefined;
  currency: string | undefined;
  initialExchange?: string;
  initialAmount?: string;
  onExchangeChange: (exchange: string) => void;
  onCreate: (exchangeBaseUrl: string, amount: AmountJson) => Promise<void>;
}

export function CreateManualWithdraw({ onExchangeChange, initialExchange, initialAmount, error, currency, onCreate }: Props): VNode {
  const [exchange, setExchange] = useState(initialExchange || "");
  const [amount, setAmount] = useState(initialAmount || "");
  const parsedAmount = Amounts.parse(`${currency}:${amount}`)

  let timeout = useRef<number | undefined>(undefined);
  useEffect(() => {
    if (timeout) window.clearTimeout(timeout.current)
    timeout.current = window.setTimeout(async () => {
      onExchangeChange(exchange)
    }, 1000);
  }, [exchange])


  return (
    <WalletBox>
      <section>
        <ErrorMessage title={error && "Can't create the reserve"} description={error} />
        <h2>Manual Withdrawal</h2>
        <LightText>Choose a exchange to create a reserve and then fill the reserve to withdraw the coins</LightText>
        <p>
          <Input invalid={!!exchange && !currency}>
            <label>Exchange</label>
            <input type="text" placeholder="https://" value={exchange} onChange={(e) => setExchange(e.currentTarget.value)} />
            <small>http://exchange.taler:8081</small>
          </Input>
          {currency && <InputWithLabel invalid={!!amount && !parsedAmount}>
            <label>Amount</label>
            <div>
              <div>{currency}</div>
              <input type="number" style={{ paddingLeft: `${currency.length}em` }} value={amount} onChange={e => setAmount(e.currentTarget.value)} />
            </div>
          </InputWithLabel>}
        </p>
      </section>
      <footer>
        <div />
        <ButtonPrimary disabled={!parsedAmount || !exchange} onClick={() => onCreate(exchange, parsedAmount!)}>Create</ButtonPrimary>
      </footer>
    </WalletBox>
  );
}