diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index fadd4e1..6657a80 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -114,7 +114,10 @@ function App() { /> } /> - } />{" "} + } + />{" "} {/* added route for individual group page */} = ({ + basketId, + memberid, + currentUserId, +}) => { + // Initialize the members state with the filtered memberid prop + const [members, setMembers] = useState(() => + memberid.filter((member) => member._id.toString() !== currentUserId), + ); + + useEffect(() => { + // This effect runs when memberid prop changes + setMembers( + memberid.filter((member) => member._id.toString() !== currentUserId), + ); + }, [memberid, currentUserId]); + + // Function to handle button click and log members to the console + const handleLogMembers = () => { + console.log("Members:", members); + }; + const AddToBasket = async (basketId: string, friendId: string) => { + try { + const res = await fetch(`http://localhost:3001/baskets/${basketId}`); + let basket; + if (res.ok) { + basket = await res.json(); + if (!basket.members.includes(friendId)) { + basket.members.push(friendId); + console.log("Pushed friend ID to basket's member list"); + const updatedRes1 = await fetch( + `http://localhost:3001/baskets/${basketId}`, + { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ members: basket.members }), + }, + ); + if (updatedRes1.ok) { + console.log("Friend added to group's member list successfully"); + } else { + console.error("Failed to update group"); + } + } else { + console.log("Friend is already in basket"); + } + } else { + console.log("Basket not Found"); + } + } catch (error) { + console.error("Error adding friend:", error); + } + }; + + return ( +
+ + + + + + + + Members + +
    + {members.map((member) => ( +
  • + {member.username} + +
  • + ))} +
+
+ +
+
+
+ ); +}; + +export default AddFriendToBasket; diff --git a/frontend/src/components/Basket.tsx b/frontend/src/components/Basket.tsx index 14892fd..7db40a3 100644 --- a/frontend/src/components/Basket.tsx +++ b/frontend/src/components/Basket.tsx @@ -1,7 +1,6 @@ import { Avatar, Box, - Button, Divider, Flex, Heading, @@ -12,6 +11,9 @@ import { useEffect, useState } from "react"; import BasketItem from "./BasketItem"; import "../styles/Basket.css"; import NewItemOptions from "./NewItemOptions"; +import EditBasket from "./EditBasket"; +import AddFriendToBasket from "./AddFriendToBasket"; +import { IUser } from "../../../backend/models/userSchema"; export interface Basket { _id: string; // added id @@ -26,14 +28,22 @@ interface Props { basketId: string; stateObj: { user: any; token: any }; isOwnerView: boolean; + groupMembers: IUser[]; + LoggedInUser: IUser | null; } -const BasketComp = ({ basketId, stateObj, isOwnerView }: Props) => { +const BasketComp = ({ + basketId, + stateObj, + groupMembers, + LoggedInUser, +}: Props) => { const [basketObj, setBasket] = useState({} as Basket); const [error, setError] = useState({ msg: "", isErrored: false, }); + console.log("basket user", stateObj); const fetchBasket = () => { return fetch(`http://localhost:3001/baskets/${basketId}`); @@ -44,7 +54,7 @@ const BasketComp = ({ basketId, stateObj, isOwnerView }: Props) => { .then((res) => res.status === 200 ? res.json() - : Promise.reject(`Error code ${res.status}`) + : Promise.reject(`Error code ${res.status}`), ) .then((data) => { setBasket({ @@ -66,7 +76,7 @@ const BasketComp = ({ basketId, stateObj, isOwnerView }: Props) => { }, [basketId]); const memberView = `${basketObj.memberIds === undefined ? "none" : basketObj?.memberIds?.length > 1 ? "auto" : "none"}`; - const groupOwnerView = `${isOwnerView ? "auto" : "none"}`; + const basketMemberView = basketObj?.memberIds?.includes(stateObj?.user?._id); return ( @@ -131,28 +141,19 @@ const BasketComp = ({ basketId, stateObj, isOwnerView }: Props) => { - - + + diff --git a/frontend/src/components/BasketItem.tsx b/frontend/src/components/BasketItem.tsx index 0402896..c9d4db2 100644 --- a/frontend/src/components/BasketItem.tsx +++ b/frontend/src/components/BasketItem.tsx @@ -33,7 +33,7 @@ const BasketItem = ({ itemId, basketMemberView }: Props) => { .then((res) => res.status === 200 ? res.json() - : Promise.reject(`Error code ${res.status}`) + : Promise.reject(`Error code ${res.status}`), ) .then((data) => { setItem({ diff --git a/frontend/src/components/EditBasket.tsx b/frontend/src/components/EditBasket.tsx index 3fa6185..5012766 100644 --- a/frontend/src/components/EditBasket.tsx +++ b/frontend/src/components/EditBasket.tsx @@ -115,9 +115,7 @@ const EditBasket: React.FC = ({ basketId }) => { return ( - + = ({ basketId }) => { > Delete - ) : ( diff --git a/frontend/src/components/EditGroup.tsx b/frontend/src/components/EditGroup.tsx index 9f67437..33785e7 100644 --- a/frontend/src/components/EditGroup.tsx +++ b/frontend/src/components/EditGroup.tsx @@ -25,7 +25,7 @@ import {} from "@chakra-ui/react"; //Number input for number type interface Props { - GroupId: string; + GroupId: string | undefined; } const Editgroup: React.FC = ({ GroupId }) => { @@ -116,9 +116,7 @@ const Editgroup: React.FC = ({ GroupId }) => { return ( - + = ({ GroupId }) => { > Delete - ) : ( @@ -259,21 +246,7 @@ const Editgroup: React.FC = ({ GroupId }) => { {" "} {groupData.groupPub === "true" ? "Private" : "Public"} - - - + )} diff --git a/frontend/src/components/EditItem.tsx b/frontend/src/components/EditItem.tsx index bc0c92f..b2d0058 100644 --- a/frontend/src/components/EditItem.tsx +++ b/frontend/src/components/EditItem.tsx @@ -302,9 +302,9 @@ const EditItem: React.FC = ({ itemId }) => { - + + + + Create new basket + +
+ + + + + + + Error: {errored.msg} + + + +
+ +
+
+ + ); +}; + +export default NewBasketOptions; diff --git a/frontend/src/components/NewItemOptions.tsx b/frontend/src/components/NewItemOptions.tsx index 79a70c1..a0e55ae 100644 --- a/frontend/src/components/NewItemOptions.tsx +++ b/frontend/src/components/NewItemOptions.tsx @@ -92,11 +92,9 @@ const NewItemOptions = ({ }; return ( - + - Add Item + Add Item diff --git a/frontend/src/pages/IndividualGroupPage.tsx b/frontend/src/pages/IndividualGroupPage.tsx index cc09db7..d6f6b67 100644 --- a/frontend/src/pages/IndividualGroupPage.tsx +++ b/frontend/src/pages/IndividualGroupPage.tsx @@ -18,8 +18,14 @@ import { IoArrowBack, IoSearch } from "react-icons/io5"; import { IGroup } from "../../../backend/models/groupSchema"; import { IUser } from "../../../backend/models/userSchema"; import BasketComp, { Basket } from "../components/Basket"; +import Editgroup from "../components/EditGroup"; +import NewBasketOptions from "../components/NewBasketOptions"; -function IndividualGroupPage() { +type Props = { + LoggedInUser: IUser | null; +}; + +const IndividualGroupPage: React.FC = ({ LoggedInUser }) => { const { groupId } = useParams<{ groupId: string }>(); const [group, setGroup] = useState(null); const [loading, setLoading] = useState(true); @@ -30,7 +36,7 @@ function IndividualGroupPage() { const fetchGroup = async () => { try { const fetchedGroup = await fetch( - `http://localhost:3001/groups/${groupId}` + `http://localhost:3001/groups/${groupId}`, ); if (fetchedGroup.ok) { const data = await fetchedGroup.json(); @@ -56,7 +62,7 @@ function IndividualGroupPage() { } else { throw new Error(`Failed to fetch user: ${res.statusText}`); } - }) + }), ); setMembers(fetchedMembers); } catch (err) { @@ -74,7 +80,7 @@ function IndividualGroupPage() { } else { throw new Error(`Failed to fetch basket: ${res.statusText}`); } - }) + }), ); setBaskets(fetchedBaskets); } catch (err) { @@ -143,7 +149,7 @@ function IndividualGroupPage() { flexDirection="column" padding="20px" flex="1" - overflowY="auto" + overflowY="scroll" alignItems="center" > {loading ? ( @@ -156,28 +162,24 @@ function IndividualGroupPage() { borderWidth="1px" borderRadius="2xl" backgroundColor="rgba(255, 255, 255, 0.8)" + overflow="auto" > - + + {group.groupName} - + + + - + Members - + {members.map((member) => ( {member.username} ))} - - - - - Created On - - {new Date(group.created).toLocaleDateString()} - - - - Description - - - {group.description || "No description given"} - + - + + + + Created On + + + {new Date(group.created).toLocaleDateString()} + + + + + Description + + + {group.description || "No description given"} + + + + Baskets - + + {baskets.map((basket) => ( ))} @@ -257,6 +270,6 @@ function IndividualGroupPage() { ); -} +}; export default IndividualGroupPage; diff --git a/frontend/src/pages/MyGroupsPage.tsx b/frontend/src/pages/MyGroupsPage.tsx index 6030819..3086feb 100644 --- a/frontend/src/pages/MyGroupsPage.tsx +++ b/frontend/src/pages/MyGroupsPage.tsx @@ -16,6 +16,7 @@ import PageSelector from "../components/PageSelector"; import { Link } from "react-router-dom"; import "../styles/MyGroups.css"; import NewGroupOptions from "../components/NewGroupOptions"; + import { IGroup } from "../../../backend/models/groupSchema"; import { IUser } from "../../../backend/models/userSchema"; diff --git a/frontend/src/styles/Basket.css b/frontend/src/styles/Basket.css index a5eadd6..935e3b8 100644 --- a/frontend/src/styles/Basket.css +++ b/frontend/src/styles/Basket.css @@ -1,7 +1,7 @@ .basket { border-color: #c1c1c1; border-width: 5px; - overflow: hidden; + overflow: scroll; color: var(--col-secondary); }