Skip to content
Snippets Groups Projects
Purchase.js 2.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { useState } from "react";
    
    meskio's avatar
    meskio committed
    import { Redirect } from "react-router-dom";
    
    import { Row, Col, Button, Alert } from "react-bootstrap";
    
    meskio's avatar
    meskio committed
    import ProductPicker from "../ProductPicker";
    
    import MemberPicker from "../member/MemberPicker";
    
    import Sender from "../Sender";
    
    meskio's avatar
    meskio committed
    import { printMoney } from "../util";
    
    meskio's avatar
    meskio committed
    
    
    function Purchase(props) {
      const [purchase, setPurchase] = useState([]);
      const [member, setMember] = useState(null);
      const [total, setTotal] = useState(0);
      const [transaction, setTransaction] = useState(null);
      const [noMoney, setNoMoney] = useState(false);
    
    meskio's avatar
    meskio committed
    
    
      if (transaction !== null) {
        return <Redirect to={"/transaction/" + transaction.ID} />;
    
    meskio's avatar
    meskio committed
      }
    
    meskio's avatar
    meskio committed
    
    
      const url =
        props.member && member
          ? "/api/member/" + member.num + "/purchase"
    
    meskio's avatar
    meskio committed
          : "/api/purchase";
    
    
      const updatePurchase = (newPurchase) => {
        const add = (acc, p) => acc + p.price * p.amount;
        const newTotal = newPurchase.reduce(add, 0);
        setPurchase(newPurchase);
        setTotal(newTotal);
      };
    
    meskio's avatar
    meskio committed
    
    
      const body = () =>
        purchase.map((p) => {
          return {
            code: p.code,
            amount: p.amount,
          };
        });
    
    meskio's avatar
    meskio committed
    
    
      const onError = (status) => {
        if (status === 400) {
          setNoMoney(true);
          return true;
    
    meskio's avatar
    meskio committed
        }
    
        return false;
      };
    
    meskio's avatar
    meskio committed
    
    
      const disabled = (props.member && !member) || total === 0;
    
      return (
    
        <Sender url={url} body={body} onSuccess={setTransaction} onError={onError}>
          {noMoney && (
            <Alert variant="warning">
              No tienes suficiente dinero para realizar esta compra.
            </Alert>
          )}
    
    meskio's avatar
    meskio committed
    
    
          {props.member && <MemberPicker member={member} onChange={setMember} />}
    
          <ProductPicker amount picks={purchase} setPicks={updatePurchase} />
          <br />
          <Row>
            <Col>
              <h3>Total: {printMoney(total)}</h3>
            </Col>
            <Col>
              <div className="text-right">
                <Button variant="primary" type="submit" disabled={disabled}>
                  Finalizar compra
                </Button>
              </div>
            </Col>
          </Row>
        </Sender>
    
    meskio's avatar
    meskio committed
    }
    
    export default Purchase;