Skip to content

Commit

Permalink
Merge pull request #127 from Gather307/72-create-the-add-basket-compo…
Browse files Browse the repository at this point in the history
…nent

Everybody say HURRAH for merge!
  • Loading branch information
zmattes04 authored May 30, 2024
2 parents f3def21 + da99e40 commit f36f8cb
Show file tree
Hide file tree
Showing 14 changed files with 483 additions and 141 deletions.
5 changes: 4 additions & 1 deletion frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,10 @@ function App() {
/>
}
/>
<Route path="/groups/:groupId" element={<IndividualGroupPage />} />{" "}
<Route
path="/groups/:groupId"
element={<IndividualGroupPage LoggedInUser={user} />}
/>{" "}
{/* added route for individual group page */}
<Route
path="/items"
Expand Down
133 changes: 133 additions & 0 deletions frontend/src/components/AddFriendToBasket.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import React, { useState, useEffect } from "react";
import {
Button,
Popover,
PopoverTrigger,
PopoverContent,
PopoverHeader,
PopoverBody,
PopoverFooter,
PopoverCloseButton,
PopoverArrow,
} from "@chakra-ui/react";
import { IUser } from "../../../backend/models/userSchema";

interface Props {
basketId: string;
memberid: IUser[];
currentUserId: string | undefined; // Add a prop for the current user's ID
}

// Uses member ids that are passed in from basket.tsx
const AddFriendToBasket: React.FC<Props> = ({
basketId,
memberid,
currentUserId,
}) => {
// Initialize the members state with the filtered memberid prop
const [members, setMembers] = useState<IUser[]>(() =>
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 (
<div>
<Popover>
<PopoverTrigger>
<Button
bgColor="var(--col-secondary)"
color="white"
_hover={{
bg: "var(--col-tertiary)",
color: "var(--col-dark)",
}}
onClick={handleLogMembers}
>
Add Users
</Button>
</PopoverTrigger>
<PopoverContent
bg="var(--col-bright)"
color="var(--col-dark)"
border="2px"
borderColor="var(--col-dark)"
>
<PopoverArrow />
<PopoverCloseButton />
<PopoverHeader fontWeight="bold">Members</PopoverHeader>
<PopoverBody>
<ul>
{members.map((member) => (
<li
key={member._id.toString()}
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
padding: "5px",
}}
>
<span>{member.username}</span>
<Button
size="sm"
onClick={() => AddToBasket(basketId, member._id.toString())}
>
Add to Basket
</Button>
</li>
))}
</ul>
</PopoverBody>
<PopoverFooter></PopoverFooter>
</PopoverContent>
</Popover>
</div>
);
};

export default AddFriendToBasket;
43 changes: 22 additions & 21 deletions frontend/src/components/Basket.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import {
Avatar,
Box,
Button,
Divider,
Flex,
Heading,
Expand All @@ -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
Expand All @@ -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<Basket>({} as Basket);
const [error, setError] = useState({
msg: "",
isErrored: false,
});
console.log("basket user", stateObj);

const fetchBasket = () => {
return fetch(`http://localhost:3001/baskets/${basketId}`);
Expand All @@ -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({
Expand All @@ -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 (
Expand Down Expand Up @@ -131,28 +141,19 @@ const BasketComp = ({ basketId, stateObj, isOwnerView }: Props) => {
</Text>
<Flex
width="100%"
justifyContent={"space-around"}
padding="5px"
flexDir={{
xl: "row",
base: "column",
}}
>
<Button
fontSize="0.9rem"
marginRight="10px"
p="3px"
bgColor="var(--col-secondary)"
opacity="70%"
>
Edit basket
</Button>
<Button
fontSize="0.9rem"
display={groupOwnerView}
p="3px"
bgColor="rgba(255, 100, 100, 0.3)"
>
Remove from group
</Button>
<AddFriendToBasket
basketId={basketId.toString()}
memberid={groupMembers}
currentUserId={LoggedInUser?._id.toString()}
/>
<EditBasket basketId={basketId.toString()} />
</Flex>
</Flex>
</>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/BasketItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down
15 changes: 1 addition & 14 deletions frontend/src/components/EditBasket.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,7 @@ const EditBasket: React.FC<Props> = ({ basketId }) => {
return (
<Popover>
<PopoverTrigger>
<Button onClick={() => setIsEditing(false)}>
Some clickable basket component / more button
</Button>
<Button onClick={() => setIsEditing(true)}>Edit</Button>
</PopoverTrigger>

<PopoverContent
Expand Down Expand Up @@ -184,17 +182,6 @@ const EditBasket: React.FC<Props> = ({ basketId }) => {
>
Delete
</Button>
<Button
mt={2}
_hover={{
bg: "var(--col-tertiary)",
color: "var(--col-dark)",
}}
ml="auto"
onClick={() => setIsEditing(false)}
>
Cancel
</Button>
</HStack>
</>
) : (
Expand Down
33 changes: 3 additions & 30 deletions frontend/src/components/EditGroup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<Props> = ({ GroupId }) => {
Expand Down Expand Up @@ -116,9 +116,7 @@ const Editgroup: React.FC<Props> = ({ GroupId }) => {
return (
<Popover>
<PopoverTrigger>
<Button onClick={() => setIsEditing(false)}>
Some clickable group component / more button
</Button>
<Button onClick={() => setIsEditing(true)}>Edit Group</Button>
</PopoverTrigger>

<PopoverContent
Expand Down Expand Up @@ -232,17 +230,6 @@ const Editgroup: React.FC<Props> = ({ GroupId }) => {
>
Delete
</Button>
<Button
mt={2}
_hover={{
bg: "var(--col-tertiary)",
color: "var(--col-dark)",
}}
ml="auto"
onClick={() => setIsEditing(false)}
>
Cancel
</Button>
</HStack>
</>
) : (
Expand All @@ -259,21 +246,7 @@ const Editgroup: React.FC<Props> = ({ GroupId }) => {
</Text>{" "}
{groupData.groupPub === "true" ? "Private" : "Public"}
</Box>
<HStack width="100%">
<Button
bgColor="var(--col-secondary)"
color="white"
_hover={{
bg: "var(--col-tertiary)",
color: "var(--col-dark)",
}}
mt={4}
ml="auto"
onClick={() => setIsEditing(true)}
>
Edit group
</Button>
</HStack>
<HStack width="100%"></HStack>
</>
)}
</VStack>
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/EditItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -302,9 +302,9 @@ const EditItem: React.FC<Props> = ({ itemId }) => {
</Stack>
</RadioGroup>
</FormControl>
<HStack
<HStack
display={"flex"}
width="100%"
width="100%"
justifyContent="space-around"
>
<Button
Expand Down
26 changes: 24 additions & 2 deletions frontend/src/components/Friends_List_Component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,33 @@ const Friends_List: React.FC<Props> = ({

const addToGroup = async (friendId: string, groupId: string) => {
try {
const res1 = await fetch(`http://localhost:3001/groups/${groupId}`);

const res = await fetch(`http://localhost:3001/users/${friendId}`);
let friend;

if (res.ok) {
let group;
if (res.ok && res1.ok) {
friend = await res.json();
group = await res1.json();
if (!group.members.includes(friendId)) {
group.members.push(friendId);
console.log("Pushed friend ID to group's member list");
const updatedRes1 = await fetch(
`http://localhost:3001/groups/${groupId}`,
{
method: "PATCH",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ members: group.members }),
},
);
if (updatedRes1.ok) {
console.log("Friend added to group's member list successfully");
} else {
console.error("Failed to update group");
}
}
if (!friend.groups.includes(groupId)) {
friend.groups.push(groupId);
console.log("Pushed to list");
Expand Down
Loading

0 comments on commit f36f8cb

Please sign in to comment.