|
1 | 1 | "use client"; |
2 | 2 |
|
3 | | -import { useEffect, useState } from "react"; |
| 3 | +import { useEffect, useMemo, useState } from "react"; |
4 | 4 | import DefaultPagination from "@/components/ui/pagination"; |
5 | | -import { useFeedsStore } from "@/store/feeds-store"; // Adjust path as needed |
| 5 | +import { useFeedsStore } from "@/store/feeds-store"; |
6 | 6 |
|
7 | 7 | import Post from "./PostCard"; |
8 | 8 |
|
9 | 9 | interface FeedProp { |
10 | 10 | isAdmin: boolean; |
11 | | - onCreatePost?: () => void; |
| 11 | + searchQuery?: string; |
12 | 12 | } |
13 | 13 |
|
14 | | -export default function Feed({ isAdmin }: FeedProp) { |
| 14 | +export default function Feed({ isAdmin, searchQuery }: FeedProp) { |
15 | 15 | const posts = useFeedsStore((state) => state.posts); |
16 | 16 | const fetchPosts = useFeedsStore((state) => state.fetchPosts); |
17 | 17 |
|
18 | 18 | const [currentPage, setCurrentPage] = useState(1); |
19 | 19 |
|
| 20 | + useEffect(() => { |
| 21 | + fetchPosts(); |
| 22 | + }, [fetchPosts]); |
| 23 | + |
| 24 | + // Filter posts by title or author's first/last name (case-insensitive) |
| 25 | + const filteredPosts = useMemo(() => { |
| 26 | + if (!searchQuery || searchQuery.trim() === "") return posts; |
| 27 | + |
| 28 | + const query = searchQuery.toLowerCase(); |
| 29 | + |
| 30 | + return posts.filter((post) => { |
| 31 | + const titleMatch = post.title?.toLowerCase().includes(query); |
| 32 | + const firstNameMatch = post.author_id?.first_name |
| 33 | + ?.toLowerCase() |
| 34 | + .includes(query); |
| 35 | + const lastNameMatch = post.author_id?.last_name |
| 36 | + ?.toLowerCase() |
| 37 | + .includes(query); |
| 38 | + |
| 39 | + return titleMatch || firstNameMatch || lastNameMatch; |
| 40 | + }); |
| 41 | + }, [posts, searchQuery]); |
| 42 | + |
20 | 43 | const postsPerPage = 6; |
21 | | - const totalPages = Math.ceil(posts.length / postsPerPage); |
| 44 | + const totalPages = Math.ceil(filteredPosts.length / postsPerPage); |
22 | 45 | const startIndex = (currentPage - 1) * postsPerPage; |
23 | | - const currentPosts = posts.slice(startIndex, startIndex + postsPerPage); |
| 46 | + const currentPosts = filteredPosts.slice( |
| 47 | + startIndex, |
| 48 | + startIndex + postsPerPage, |
| 49 | + ); |
24 | 50 |
|
| 51 | + // Reset to first page when search changes |
25 | 52 | useEffect(() => { |
26 | | - fetchPosts(); |
27 | | - }, [fetchPosts]); |
| 53 | + setCurrentPage(1); |
| 54 | + }, [searchQuery]); |
28 | 55 |
|
29 | 56 | const handleDeletePost = (deletedPostId: string | number) => { |
30 | 57 | useFeedsStore.setState((state) => ({ |
@@ -52,13 +79,16 @@ export default function Feed({ isAdmin }: FeedProp) { |
52 | 79 | /> |
53 | 80 | ))} |
54 | 81 | </div> |
55 | | - <DefaultPagination |
56 | | - totalPages={totalPages} |
57 | | - currentPage={currentPage} |
58 | | - handleNextPage={handleNextPage} |
59 | | - handlePreviousPage={handlePreviousPage} |
60 | | - setCurrentPage={setCurrentPage} |
61 | | - /> |
| 82 | + |
| 83 | + {filteredPosts.length > 0 && ( |
| 84 | + <DefaultPagination |
| 85 | + totalPages={totalPages} |
| 86 | + currentPage={currentPage} |
| 87 | + handleNextPage={handleNextPage} |
| 88 | + handlePreviousPage={handlePreviousPage} |
| 89 | + setCurrentPage={setCurrentPage} |
| 90 | + /> |
| 91 | + )} |
62 | 92 | </> |
63 | 93 | ); |
64 | 94 | } |
0 commit comments