aboutsummaryrefslogtreecommitdiffstats
path: root/thallium-frontend/src/components/CartConfirm.tsx
blob: c12bc57fa023513b40cbb32551caa492b4907c84 (plain) (blame)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { useDispatch, useSelector } from "react-redux";
import { RootState } from "../store";
import { useState, useEffect } from "react";
import { getTemplates, Template, Variant } from "../api/templates";
import { APIError, APIMissingTokenError } from "../api/client";
import LoadingBar from "./LoadingBar";
import { Link } from "react-router-dom";
import styled from "styled-components";
import Button from "./forms/Button";
import { removeCartItem, CartItem as CartItemType } from "../slices/cart";

interface CartItemProps {
    product: Template,
    variant: Variant,
    quantity: number,
    cartItem: CartItemType
}

const CartItemHolder = styled.div`
display: flex;
align-items: center;

span {
    flex-grow: 1;
}

div {
    text-align: right;
    margin-right: 20px;
}

h3, p {
    margin: 0;
}

img {
    width: 20%;
    background-color: ${({theme}) => theme.backgroundColor};
}

margin-bottom: 10px;
`;

const CartItem: React.FC<CartItemProps> = ({ product, variant, quantity, cartItem }: CartItemProps) => {
    /* return <div>{product.title} - {variant.size} / {variant.colour} - {quantity} unit{quantity === 1 ? "" : "s"}</div> */
    const dispatch = useDispatch();

    return <CartItemHolder>
        <img src={product.mockup_file_url}/>
        <span></span>
        <div>
            <h3>{product.title}</h3>
            <p><strong>Size:</strong> {variant.size}</p>
            {variant.colour && <p><strong>Colour:</strong> {variant.colour}</p>}
            <p><strong>Quantity:</strong> {quantity}</p>
        </div>
    <Button onClick={() => {
        dispatch(removeCartItem(cartItem));
    }}>
          Remove
        </Button>
    </CartItemHolder>;
};

const CartConfirm = () => {
    const cart = useSelector((state: RootState) => state.cart);
    /* TODO: Refactor to hook */
    const voucherToken = useSelector((state: RootState) => state.authorization.voucherToken);
    const [storeItems, setStoreItems] = useState<Template[] | null>(null);
    const [permissionDenied, setPermissionDenied] = useState<boolean>(false);
    const [loading, setLoading] = useState<boolean>(true);

    useEffect(() => {
        getTemplates(true).then((items) => {
            setStoreItems(items);
            setLoading(false);
        }).catch((err: unknown) => {
            setStoreItems([]);
            setLoading(false);
            if (err instanceof APIMissingTokenError) {
                setPermissionDenied(true);
            } else if (err instanceof APIError) {
                if ([401, 403].includes(err.status)) {
                    setPermissionDenied(true);
                }
            }
        });
    }, [voucherToken]);

    return <>
        {loading && <LoadingBar/>}
        {permissionDenied && (
            <>
                <p>You need to have a valid voucher code to access the store.</p>
                <Link to="/">Redeem a voucher</Link>
            </>
        )}
        {storeItems && cart.cart.map((cartItem) => {
            const item = storeItems.find((v) => v.template_id === cartItem.product_template_id);
            const variant = item?.variants?.find((variant) => variant.variant_id === cartItem.variant_id);

            if (item && variant) {
                return <CartItem key={cartItem.variant_id} product={item} variant={variant} quantity={cartItem.quantity} cartItem={cartItem} />;
            }
        })}

        {cart.cart.length === 0 && <>
            <strong>You have no items in your cart!</strong>
            <p>Return to the store page to add some items</p>
        </>}
    </>;
};

export default CartConfirm;