11import { useEffect , useRef } from "react" ;
22
3- import { Rss } from "lucide-react" ;
3+ import { Rss , SquareX } from "lucide-react" ;
44
55import { PostCardGrid } from "@/components/common/Card/PostCardGrid" ;
66import { PostGridSkeleton } from "@/components/common/Card/PostCardSkeleton.tsx" ;
77import { SectionHeader } from "@/components/common/SectionHeader" ;
8+ import Filter from "@/components/filter/Filter" ;
89
10+ import { useRecentTag } from "@/hooks/common/useRecentTag" ;
911import { useInfiniteScrollQuery } from "@/hooks/queries/useInfiniteScrollQuery" ;
1012
13+ import { Badge } from "../ui/badge" ;
1114import { posts } from "@/api/services/posts" ;
15+ import { useFilterStore } from "@/store/useFilterStore" ;
16+ import { usePostTypeStore } from "@/store/usePostTypeStore" ;
1217import { Post } from "@/types/post" ;
1318
1419export default function LatestSection ( ) {
20+ const pickedFilter = useFilterStore ( ( state ) => state . filters ) ;
21+ const removeFilter = useFilterStore ( ( state ) => state . removeAll ) ;
1522 const observerTarget = useRef < HTMLDivElement > ( null ) ;
23+ const postType = usePostTypeStore ( ( state ) => state . postType ) ;
24+ const recentTags = useRecentTag ( ) ;
25+ const tags = postType === "latest" ? pickedFilter : recentTags ;
26+
1627 const { items, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } = useInfiniteScrollQuery < Post > ( {
1728 queryKey : "latest-posts" ,
1829 fetchFn : posts . latest ,
30+ tags : tags ,
1931 } ) ;
2032
2133 useEffect ( ( ) => {
@@ -37,7 +49,33 @@ export default function LatestSection() {
3749
3850 return (
3951 < section className = "flex flex-col md:p-4 min-h-[300px]" >
40- < SectionHeader icon = { Rss } text = "최신 포스트" description = "최근에 작성된 포스트" iconColor = "text-orange-500" />
52+ < div className = "flex items-center gap-3" >
53+ < SectionHeader
54+ icon = { Rss }
55+ text = "최신 포스트"
56+ description = "최근에 작성된 포스트"
57+ iconColor = "text-orange-500"
58+ secondText = "추천 포스트"
59+ secondDescription = "사용자 맞춤 추천 포스트"
60+ />
61+ { pickedFilter . length !== 0 && postType === "latest" && (
62+ < div className = " gap-2 items-center hidden md:flex" >
63+ < ul className = "flex flex-wrap gap-x-2 gap-y-2" >
64+ { pickedFilter . map ( ( filter , index ) => (
65+ < Badge key = { index } className = "hover:bg-primary" >
66+ { filter }
67+ </ Badge >
68+ ) ) }
69+ </ ul >
70+ < button onClick = { removeFilter } >
71+ < SquareX size = { 13 } color = "red" />
72+ </ button >
73+
74+ < span className = "text-gray-400 text-xs" > 카테고리 지정은 최대 5개까지 가능합니다.</ span >
75+ </ div >
76+ ) }
77+ </ div >
78+ { postType === "latest" && < Filter /> }
4179 < div className = "flex-1 mt-4 md:p-6 md:pt-0 rounded-lg" >
4280 { isLoading ? (
4381 < PostGridSkeleton count = { 8 } />
0 commit comments