aboutsummaryrefslogtreecommitdiffstats
path: root/thallium-frontend/src/pages/StorePage.tsx
blob: 0ebc228451bce73b5f5e20a270af52f7d33845a2 (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
import { useSelector } from "react-redux";
import { RootState } from "../store";
import { useEffect, useState } from "react";

import { Template, getTemplates } from "../api/templates";
import { APIMissingTokenError } from "../api/client";
import StoreItem from "../components/StoreItem";
import styled from "styled-components";
import { Link } from "react-router-dom";

import LoadingBar from "../components/LoadingBar";


const StoreGrid = styled.div`
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
    gap: 2rem;
    margin-left: 1rem;
    margin-right: 1rem;
    width: 80%;
`;

const StorePage = () => {
    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);
            }
        });
    }, [voucherToken]);

    return (
        <>
            <h1>Giveaway Store</h1>
            {loading && <LoadingBar />}
            <StoreGrid>
                {storeItems?.map((item) => (
                    <StoreItem key={item.template_id} template={item} />
                ))}
            </StoreGrid>
            {permissionDenied && (
                <>
                    <p>You need to have a valid voucher code to access the store.</p>
                    <Link to="/">Redeem a voucher</Link>
                </>
            )}
        </>
    );
};

export default StorePage;