Skip to content

Commit 0795506

Browse files
authored
Merge pull request #421 from CodebilityDev/miguel/fix-feeds-restriction
miguel/fix feeds restriction
2 parents 4de0b76 + f782d24 commit 0795506

5 files changed

Lines changed: 54 additions & 25 deletions

File tree

‎apps/codebility/app/home/feeds/_components/Feed.tsx‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { useFeedsStore } from "@/store/feeds-store"; // Adjust path as needed
77
import Post from "./Post";
88

99
interface FeedProp {
10-
isMentor: boolean;
10+
isAdmin: boolean;
1111
onCreatePost?: () => void;
1212
}
1313

14-
export default function Feed({ isMentor }: FeedProp) {
14+
export default function Feed({ isAdmin }: FeedProp) {
1515
const posts = useFeedsStore((state) => state.posts);
1616
const fetchPosts = useFeedsStore((state) => state.fetchPosts);
1717

@@ -47,7 +47,7 @@ export default function Feed({ isMentor }: FeedProp) {
4747
<Post
4848
key={post.id}
4949
post={post}
50-
isMentor={isMentor}
50+
isAdmin={isAdmin}
5151
onDelete={handleDeletePost}
5252
/>
5353
))}

‎apps/codebility/app/home/feeds/_components/Post.tsx‎

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { useState } from "react";
1+
import { useEffect, useState } from "react";
22
import Image from "next/image";
33
import Link from "next/link";
44
import FeedPostModal from "@/components/modals/FeedPostModal";
55
import { Box } from "@/components/shared/dashboard";
66
import { defaultAvatar } from "@/public/assets/images";
7+
import { useUserStore } from "@/store/codev-store";
78
import { format } from "date-fns";
89
import { ArrowBigUp } from "lucide-react";
910
import toast from "react-hot-toast";
@@ -14,12 +15,29 @@ import PostUpvote from "./PostUpvote";
1415

1516
interface PostProps {
1617
post: PostType;
17-
isMentor?: boolean;
18+
isAdmin?: boolean;
1819
onDelete?: (deletedPostId: string | number) => void;
1920
}
2021

21-
export default function Post({ post, isMentor, onDelete }: PostProps) {
22+
export default function Post({ post, isAdmin, onDelete }: PostProps) {
2223
const [isModalOpen, setIsModalOpen] = useState(false);
24+
const [isAuthor, setIsAuthor] = useState(false);
25+
const { user } = useUserStore();
26+
27+
useEffect(() => {
28+
const checkIfAuthor = async () => {
29+
if (!user) return;
30+
if (user.id === post.author_id?.id) {
31+
setIsAuthor(true);
32+
} else {
33+
setIsAuthor(false);
34+
}
35+
};
36+
37+
if (user) {
38+
checkIfAuthor();
39+
}
40+
}, [user]);
2341

2442
const handleDelete = async (e: React.MouseEvent) => {
2543
e.stopPropagation();
@@ -37,12 +55,6 @@ export default function Post({ post, isMentor, onDelete }: PostProps) {
3755
}
3856
};
3957

40-
const handleUpvote = (e: React.MouseEvent) => {
41-
e.stopPropagation();
42-
e.preventDefault();
43-
// You can add upvote logic here
44-
};
45-
4658
const openModal = () => setIsModalOpen(true);
4759
const closeModal = () => setIsModalOpen(false);
4860
return (
@@ -52,7 +64,7 @@ export default function Post({ post, isMentor, onDelete }: PostProps) {
5264
onClick={openModal}
5365
>
5466
{/* Delete Button in top-right */}
55-
{isMentor && (
67+
{(isAdmin || isAuthor) && (
5668
<button
5769
className="invisible absolute right-2 top-2 rounded bg-red-500 px-2 py-1 text-white hover:bg-red-600 group-hover:visible"
5870
onClick={handleDelete}

‎apps/codebility/app/home/feeds/_components/PostView.tsx‎

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,36 @@ export default function PostView({ postId }: PostViewProps) {
3333
const [post, setPost] = useState<PostType | null>(null);
3434
const [error, setError] = useState<string | null>(null);
3535
const [isModalOpen, setIsModalOpen] = useState(false);
36-
const [isMentor, setIsMentor] = useState(true);
36+
const [isAdmin, setIsAdmin] = useState(true);
37+
const [isAuthor, setIsAuthor] = useState(false);
3738
const { user } = useUserStore();
3839

3940
useEffect(() => {
4041
const fetchRole = async () => {
4142
if (!user) return;
4243
const role = await getUserRole(user.role_id ?? null);
43-
setIsMentor(role === "Mentor" || role === "Admin");
44+
setIsAdmin(role === "Admin");
45+
};
46+
47+
const checkIfAuthor = async () => {
48+
console.log(
49+
"CHECKING USER ID AND AUTHOR ID: ",
50+
user?.id,
51+
post?.author_id?.id,
52+
);
53+
if (!user) return;
54+
if (user.id === post?.author_id?.id) {
55+
setIsAuthor(true);
56+
} else {
57+
setIsAuthor(false);
58+
}
4459
};
4560

4661
if (user) {
4762
fetchRole();
63+
checkIfAuthor();
4864
}
49-
}, [user]);
65+
}, [user, post]);
5066

5167
const fetchPost = async () => {
5268
if (!supabase) return;
@@ -56,6 +72,7 @@ export default function PostView({ postId }: PostViewProps) {
5672
.select(
5773
`*,
5874
author_id(
75+
id,
5976
first_name,
6077
last_name,
6178
image_url
@@ -125,7 +142,7 @@ export default function PostView({ postId }: PostViewProps) {
125142
</ReactMarkdown>
126143
</div>
127144

128-
{isMentor && (
145+
{(isAdmin || isAuthor) && (
129146
<Button className="mb-4 mt-4 w-auto" onClick={openModal}>
130147
Edit Post
131148
</Button>

‎apps/codebility/app/home/feeds/_services/query.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const getPosts = async () => {
1111
.select(`
1212
*,
1313
author_id(
14+
id,
1415
first_name,
1516
last_name,
1617
image_url
@@ -32,6 +33,7 @@ export type PostType = {
3233
title: string;
3334
content: string;
3435
author_id?: {
36+
id: string;
3537
first_name: string;
3638
last_name: string;
3739
image_url?: string;

‎apps/codebility/app/home/feeds/page.tsx‎

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import Feed from "./_components/Feed";
99
import { getUserRole } from "./_services/action";
1010

1111
export default function FeedsPage() {
12-
const [isMentor, setIsMentor] = useState(true);
12+
const [isAdmin, setIsAdmin] = useState(true);
1313
const [isModalOpen, setIsModalOpen] = useState(false);
1414
const { user } = useUserStore();
1515

1616
useEffect(() => {
1717
const fetchRole = async () => {
1818
if (!user) return;
1919
const role = await getUserRole(user.role_id ?? null);
20-
setIsMentor(role === "Mentor" || role === "Admin");
20+
setIsAdmin(role === "Admin");
2121
};
2222

2323
if (user) {
@@ -37,12 +37,10 @@ export default function FeedsPage() {
3737
Codebility community.
3838
</p>
3939
</div>
40-
{isMentor && (
41-
<Button className="mb-4 mt-4 w-auto" onClick={openModal}>
42-
Create Post
43-
</Button>
44-
)}
45-
<Feed isMentor={isMentor} />
40+
<Button className="mb-4 mt-4 w-auto" onClick={openModal}>
41+
Create Post
42+
</Button>
43+
<Feed isAdmin={isAdmin} />
4644
</div>
4745

4846
<CreatePostModal isOpen={isModalOpen} onClose={closeModal} />

0 commit comments

Comments
 (0)