dishplanner/frontend/app/components/features/dishes/UserDishCard.tsx

83 lines
2.9 KiB
TypeScript
Raw Normal View History

2025-11-09 13:09:22 +01:00
import React, {useEffect} from "react";
import {DishType} from "~/types/DishType";
import {UserType} from "~/types/UserType";
import { Link } from "react-router";
2025-10-13 14:57:11 +02:00
import {PencilIcon, TrashIcon} from "@heroicons/react/24/solid";
2025-11-09 13:09:22 +01:00
import {removeUserFromDish} from "~/utils/api/dishApi";
import EditDishUserCardEditForm from "~/components/features/dishes/EditDishUserCardEditForm";
import {getUserDishForUserAndDish} from "~/utils/api/usersApi";
import Spinner from "~/components/Spinner";
import RecurrenceLabels from "~/components/features/dishes/RecurrenceLabels";
import {UserDishType} from "~/types/ScheduledUserDishType";
2025-10-13 14:57:11 +02:00
interface Props {
dish: DishType
user: UserType
reloadDish: () => void
}
2025-11-09 13:09:22 +01:00
const UserDishCard = ({dish, user, reloadDish}: Props) => {
2025-10-13 14:57:11 +02:00
const [userDish, setUserDish] = React.useState<UserDishType|null>(null);
const [userDishLoading, setUserDishLoading] = React.useState(true);
const [isEditMode, setIsEditMode] = React.useState(false);
useEffect(() => {
getUserDishForUserAndDish(user.id, dish.id)
.then((userDish) => setUserDish(userDish))
.finally(() => setUserDishLoading(false))
}, [dish, user]);
const handleRemove = () => {
removeUserFromDish(dish.id, user.id)
.then(() => reloadDish())
.catch(() => {
alert("Failed to remove user, please try again.");
});
};
if (userDishLoading || !userDish) {
return <Spinner />
}
const onUserCardSubmit = () => {
setIsEditMode(false);
reloadDish()
}
return (
<div className="my-2 w-full px-3 py-2 text-xl font-bold border border-secondary rounded">
<div className="flex gap-2">
<div className="flex-none pt-1">
{user.name}
</div>
<div className="flex-grow pt-1">
<RecurrenceLabels recurrences={userDish.recurrences} />
</div>
<div className="flex-none w-8">
2025-11-09 13:09:22 +01:00
<Link onClick={() => setIsEditMode(!isEditMode)} to="#">
2025-10-13 14:57:11 +02:00
<div className="border border-foreground p-2 rounded">
<PencilIcon width="14"/>
</div>
</Link>
</div>
<div className="flex-none w-8">
2025-11-09 13:09:22 +01:00
<Link onClick={handleRemove} to="#">
2025-10-13 14:57:11 +02:00
<div className="border border-red-500 p-2 rounded">
<TrashIcon width="14" className="text-red-500"/>
</div>
</Link>
</div>
</div>
{isEditMode && (
<div className="flex gap-2">
<EditDishUserCardEditForm userDish={userDish} onSubmit={onUserCardSubmit} />
</div>
)}
</div>
);
}
export default UserDishCard;