Skip to content

Commit 299a013

Browse files
committed
Implemented Recieved and Sent requests modals with functionality to cancel, decline, and accept friend requests
1 parent 6af90c1 commit 299a013

2 files changed

Lines changed: 181 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// src/components/popups/user_groups_select_popup.tsx
2+
3+
// import Link from "next/link";
4+
// import React from "react";
5+
import React, { useEffect, useState } from "react";
6+
7+
import {
8+
acceptFriendRequest,
9+
declineFriendRequest,
10+
getIncomingRequests,
11+
} from "../../../lib/api/friends";
12+
13+
export type FriendRequest = {
14+
id: number;
15+
sender: {
16+
id: number;
17+
username: string;
18+
};
19+
};
20+
21+
type Props = {
22+
isOpen: boolean;
23+
onClose: () => void;
24+
};
25+
26+
function UserFriendsRecievedPopup({ isOpen, onClose }: Props) {
27+
const [requests, setRequests] = useState<FriendRequest[]>([]);
28+
const [loading, setLoading] = useState(false);
29+
useEffect(() => {
30+
if (!isOpen) return;
31+
32+
setLoading(true);
33+
getIncomingRequests()
34+
.then((res) => {
35+
console.log("Incoming requests:", res.data);
36+
setRequests(res.data);
37+
})
38+
39+
.finally(() => setLoading(false));
40+
}, [isOpen]);
41+
42+
if (!isOpen) return null;
43+
return (
44+
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40">
45+
<div className="w-full max-w-md rounded-lg bg-white p-4 shadow-lg">
46+
<div className="mb-3 flex items-center justify-between">
47+
<h2 className="text-lg font-bold">Friend Requests</h2>
48+
<button onClick={onClose} className="text-gray-500 hover:text-black">
49+
50+
</button>
51+
</div>
52+
53+
{loading && <p className="text-gray-500">Loading…</p>}
54+
55+
{!loading && requests.length === 0 && (
56+
<p className="text-gray-500">No friend requests.</p>
57+
)}
58+
59+
<div className="space-y-2">
60+
{requests.map((r) => (
61+
<div
62+
key={r.id}
63+
className="flex items-center justify-between rounded border px-3 py-2"
64+
>
65+
<span className="font-medium">{r.sender.username}</span>
66+
67+
<div className="flex gap-2">
68+
<button
69+
onClick={() =>
70+
acceptFriendRequest(r.id).then(() =>
71+
setRequests((prev) =>
72+
prev.filter((req) => req.id !== r.id),
73+
),
74+
)
75+
}
76+
className="rounded bg-green-600 px-2 py-1 text-sm text-white"
77+
>
78+
Accept
79+
</button>
80+
81+
<button
82+
onClick={() =>
83+
declineFriendRequest(r.id).then(() =>
84+
setRequests((prev) =>
85+
prev.filter((req) => req.id !== r.id),
86+
),
87+
)
88+
}
89+
className="rounded bg-red-500 px-2 py-1 text-sm text-white"
90+
>
91+
Reject
92+
</button>
93+
</div>
94+
</div>
95+
))}
96+
</div>
97+
</div>
98+
</div>
99+
);
100+
}
101+
export default UserFriendsRecievedPopup;
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// src/components/popups/user_groups_select_popup.tsx
2+
3+
// import Link from "next/link";
4+
// import React from "react";
5+
import React, { useEffect, useState } from "react";
6+
7+
import { cancelFriendRequest,getSentRequests } from "../../../lib/api/friends";
8+
9+
export type FriendRequest = {
10+
id: number;
11+
receiver: {
12+
id: number;
13+
username: string;
14+
};
15+
};
16+
17+
type Props = {
18+
isOpen: boolean;
19+
onClose: () => void;
20+
};
21+
22+
function UserFriendsSentPopup({ isOpen, onClose }: Props) {
23+
const [requests, setRequests] = useState<FriendRequest[]>([]);
24+
const [loading, setLoading] = useState(false);
25+
useEffect(() => {
26+
if (!isOpen) return;
27+
28+
setLoading(true);
29+
getSentRequests()
30+
.then((res) => setRequests(res.data))
31+
.finally(() => setLoading(false));
32+
}, [isOpen]);
33+
34+
if (!isOpen) return null;
35+
return (
36+
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40">
37+
<div className="w-full max-w-md rounded-lg bg-white p-4 shadow-lg">
38+
<div className="mb-3 flex items-center justify-between">
39+
<h2 className="text-lg font-bold">Friend Requests</h2>
40+
<button onClick={onClose} className="text-gray-500 hover:text-black">
41+
42+
</button>
43+
</div>
44+
45+
{loading && <p className="text-gray-500">Loading…</p>}
46+
47+
{!loading && requests.length === 0 && (
48+
<p className="text-gray-500">No friend requests.</p>
49+
)}
50+
51+
<div className="space-y-2">
52+
{requests.map((r) => (
53+
<div
54+
key={r.id}
55+
className="flex items-center justify-between rounded border px-3 py-2"
56+
>
57+
<span className="font-medium">{r.receiver.username}</span>
58+
59+
<div className="flex gap-2">
60+
<button
61+
onClick={() =>
62+
cancelFriendRequest(r.id).then(() =>
63+
setRequests((prev) =>
64+
prev.filter((req) => req.id !== r.id),
65+
),
66+
)
67+
}
68+
className="rounded bg-red-500 px-2 py-1 text-sm text-white"
69+
>
70+
Cancel
71+
</button>
72+
</div>
73+
</div>
74+
))}
75+
</div>
76+
</div>
77+
</div>
78+
);
79+
}
80+
export default UserFriendsSentPopup;

0 commit comments

Comments
 (0)