Skip to content
Snippets Groups Projects
Purchase.js 3.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • meskio's avatar
    meskio committed
    import React from 'react';
    import { Redirect } from 'react-router-dom';
    
    meskio's avatar
    meskio committed
    import { Container, Row, Col, Button, Alert, Spinner } from 'react-bootstrap';
    import ProductPicker from '../ProductPicker';
    
    meskio's avatar
    meskio committed
    import AuthContext from '../AuthContext';
    
    meskio's avatar
    meskio committed
    import { printMoney } from '../util';
    
    meskio's avatar
    meskio committed
    
    class Purchase extends React.Component {
        static contextType = AuthContext;
    
        constructor(props) {
            super(props);
            this.state = {
                purchase: [],
                total: 0,
    
    meskio's avatar
    meskio committed
                transactionId: null,
    
    meskio's avatar
    meskio committed
                isLoading: false,
    
    meskio's avatar
    meskio committed
                noMoney: false,
    
    meskio's avatar
    meskio committed
                error: null
            };
        }
    
    
    meskio's avatar
    meskio committed
        setPurchase(purchase) {
    
    meskio's avatar
    meskio committed
            const add = (acc, p) => acc + (p.price*p.ammount);
            const total = purchase.reduce(add, 0);
    
    meskio's avatar
    meskio committed
            this.setState({ purchase, total });
    
    meskio's avatar
    meskio committed
        }
    
        send() {
            this.setState({isLoading: true, error: null, noMoney: false});
            const body = JSON.stringify(this.state.purchase.map(p => {
                return {
    
    meskio's avatar
    meskio committed
                    code: p.code,
                    ammount: p.ammount
    
    meskio's avatar
    meskio committed
                };
            }));
            fetch("/api/purchase", {headers: {'x-authentication': this.context.token}, method: "POST", body})
                .then(response => {
                    if (response.status === 400) {
                        var error = new Error("Not enough money");
                        error.name ="not-money";
                        throw error;
                    } else if (!response.ok) {
                        throw new Error(response.status.toString()+' '+response.statusText);
                    }
                    return response.json();
                })
                .then(p => {
    
    meskio's avatar
    meskio committed
                    this.setState({transactionId: p.ID, isLoading: false});
    
    meskio's avatar
    meskio committed
                })
                .catch(error => {
                    if (error.name === "not-money") {
    
    meskio's avatar
    meskio committed
                        this.setState({isLoading: false, noMoney: true});
    
    meskio's avatar
    meskio committed
                    } else {
    
    meskio's avatar
    meskio committed
                        this.setState({isLoading: false, error: error.message})
    
    meskio's avatar
    meskio committed
                    }
                });
        }
    
        render() {
            if (this.state.isLoading) {
                return <Spinner animation="border" />;
            }
    
            let alert;
    
    meskio's avatar
    meskio committed
            if (this.state.noMoney) {
    
    meskio's avatar
    meskio committed
                alert = (
                    <Alert variant="warning">
                       No tienes suficiente dinero para realizar esta compra.
                    </Alert>
                );
            } else if (this.state.error != null) {
                alert = (
                    <Alert variant="danger">
                       Ha ocurrido un error enviando la compra: {this.state.error}
                    </Alert>
                );
            }
    
    meskio's avatar
    meskio committed
            if (this.state.transactionId !== null) {
                return <Redirect to={"/transaction/"+this.state.transactionId} />;
    
    meskio's avatar
    meskio committed
            }
    
            return (
    
    meskio's avatar
    meskio committed
                <Container>
    
    meskio's avatar
    meskio committed
                    {alert}
    
    meskio's avatar
    meskio committed
                    <ProductPicker ammount
                        picks={this.state.purchase}
                        setPicks={purchase => this.setPurchase(purchase)}
                    />
    
    meskio's avatar
    meskio committed
                    <br />
                    <Row>
                        <Col>
                            <h3>Total: {printMoney(this.state.total)}</h3>
                        </Col>
                        <Col>
                            <div className="text-right">
    
    meskio's avatar
    meskio committed
                                <Button onClick={() => this.send()}>Finalizar compra</Button>
    
    meskio's avatar
    meskio committed
                            </div>
                        </Col>
                    </Row>
    
    meskio's avatar
    meskio committed
                </Container>
    
    meskio's avatar
    meskio committed
            );
        }
    }
    
    export default Purchase;