Skip to content
Snippets Groups Projects
PlantDetails.tsx 6.67 KiB
Newer Older
import "../stylesheets/PlantDetails.css";
import "font-awesome/css/font-awesome.min.css";
import {useEffect, useState} from "react";
import {Plant} from "../utils/schemas";
import {useParams} from "react-router";
import {IBackendConnector} from "../utils/IBackendConnector";
import useGrowbrosFetcher from "../utils/useGrowbrosFetcher";
Holzheu Hannah's avatar
Holzheu Hannah committed
function PlantDetails() {
    const {plantId} = useParams();

    const [plant, setPlant] = useState<Plant | null>(null);
Karsch Lukas's avatar
Karsch Lukas committed
    const [error, setError] = useState<object>();

    const bc: IBackendConnector = useGrowbrosFetcher();

    useEffect(() => {
        (async () => {
            const result = await bc.getSinglePlant(Number(plantId!));
            if (result.err) {
                setError(result.err);
            } else {
                setPlant(result.value!);
            }
        })();
    }, [setPlant, setError]);

    if (plant) {
        const attributes = [
            {title: "Lateinischer Name", value: plant.latinName},
            {title: "Beschreibung", value: plant.description},
            {title: "Herkunft", value: plant.origin},
            {title: "Anbautipps", value: plant.growingTips},
            {
                title: "Anbauzeitraum",
                value: `Von Kalenderwoche ${plant.plantWeekStart} bis Kalenderwoche ${plant.plantWeekEnd}`,
            },
            {
                title: "Erntezeitraum",
                value: `Von Kalenderwoche ${plant.harvestWeekStart} bis Kalenderwoche ${plant.harvestWeekEnd}`,
            },
            {title: "Bodentyp", value: plant.groundType},
            {title: "Nährstoffbedarf", value: plant.nutrientDemand},
            {title: "Wasserbedarf", value: plant.waterDemand},
            {title: "Lichtbedarf", value: plant.lightingDemand},
        ];

        return (
            <>
                {
                    error
Karsch Lukas's avatar
Karsch Lukas committed
                        ? <p>FEHLER!</p>
                        : <div style={{display: "flex", flexDirection: "column"}}>
                            <div className="plantDetails">
                                <h1>{plant.name}</h1>
                                <img src={plant.imageUrl}></img>

                                {attributes.map(
                                    (attribute, index) =>
                                        !!attribute.value && (
                                            <div className="infoBox" key={index}>
                                                <div className="title">{attribute.title}</div>
                                                <p>{attribute.value}</p>
                                            </div>
                                        )
                                )}
                            </div>
                            <div
                                className="buttons"
                                style={{
                                    display: "flex",
                                    justifyContent: "space-around",
                                    margin: "0 0 40px 0",
                                }}
                            >
                                <ButtonAddToGarden plantId={plant.id}></ButtonAddToGarden>
                                <ButtonRemoveFromGarden plantId={plant.id}></ButtonRemoveFromGarden>
                                <ButtonAddToWishlist plantId={plant.id}></ButtonAddToWishlist>
                                <ButtonRemoveFromWishlist plantId={plant.id}></ButtonRemoveFromWishlist>
                            </div>
                        </div>
                }
            </>
        );
    }
}

function ButtonAddToGarden({plantId}: any) {
    const [status, setStatus] = useState<null | String>(null);

    const bc: IBackendConnector = useGrowbrosFetcher();

    const handleButtonClick = async () => {
        await bc.addToGarden(plantId);
    };
        <>
            {status && (
                <div
                    className={`status-message ${
                        status.includes("erfolgreich") ? "success-message" : "error-message"
                    }`}
                >
                    {status}
                </div>
Karsch Lukas's avatar
Karsch Lukas committed
            <button title="Zum Garten hinzufügen" onClick={handleButtonClick}>
function ButtonRemoveFromGarden({plantId}: any) {
    const [status, setStatus] = useState<null | String>(null);

    const bc: IBackendConnector = useGrowbrosFetcher();

    const handleButtonClick = async () => {
        await bc.removeEntryFromGarden(plantId);
    };

    return (
        <>
            {status && (
                <div
                    className={`status-message ${
                        status.includes("erfolgreich") ? "success-message" : "error-message"
                    }`}
                >
                    {status}
                </div>
            )}
            <button title="Aus dem Garten entfernen" onClick={handleButtonClick}>
                <i className="fa fa-spoon fa-rotate-180 fa-2x"></i>
            </button>
        </>
    );
}

//TODO status+error handling
//TODO css für status message
function ButtonAddToWishlist({plantId}: any) {
    const [status, setStatus] = useState<null | String>(null);

    const bc: IBackendConnector = useGrowbrosFetcher();

    const handleButtonClick = async () => {
        await bc.addToWishlist(plantId);
    };

    return (
        <>
            {status && (
                <div
                    className={`status-message ${
                        status.includes("erfolgreich") ? "success-message" : "error-message"
                    }`}
                >
                    {" "}
                    {status}
                </div>
            )}
            <button title="Zur Wunschliste hinzufügen" onClick={handleButtonClick}>
                <i className="fa fa-heart"></i>
            </button>
        </>
    );
function ButtonRemoveFromWishlist({plantId}: any) {
    const [status, setStatus] = useState<null | String>(null);

    const bc: IBackendConnector = useGrowbrosFetcher();

    const handleButtonClick = async () => {
        await bc.removeFromWishlist(plantId);
    };

    return (
        <>
            {status && (
                <div
                    className={`status-message ${
                        status.includes("erfolgreich") ? "success-message" : "error-message"
                    }`}
                >
                    {status}
                </div>
            )}
            <button title="Aus der Wunschliste entfernen" onClick={handleButtonClick}>
                <i className="fa-solid fa-heart-crack"></i>
            </button>
        </>
    );
}

export default PlantDetails;