|
1 | | -import React from "react"; |
| 1 | +import React, { useEffect, useState } from 'react'; |
| 2 | +import { ArticleContent } from '../types/article'; |
| 3 | +import { getArticleList } from '../api/article'; |
| 4 | +import ArticlePagination from './pagenation'; |
| 5 | + |
| 6 | +// 날짜 변환 함수 (YYYY-MM-DD) |
| 7 | +const formatDate = (dateString: string) => { |
| 8 | + const date = new Date(dateString); |
| 9 | + return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일`; |
| 10 | +}; |
| 11 | + |
| 12 | +// type (article -> 아티클, video -> 영상, all -> 전체) |
| 13 | +const typeToName = (type: string) => { |
| 14 | + if (type === 'article') return '아티클'; |
| 15 | + if (type === 'video') return '영상'; |
| 16 | + return '전체'; |
| 17 | +}; |
2 | 18 |
|
3 | 19 | const HomePage: React.FC = () => { |
4 | | - const bookmarks = [ |
5 | | - { |
6 | | - id: 1, |
7 | | - title: "오래된 아이템...", |
8 | | - date: "2024-06-06", |
9 | | - category: "가구 장식", |
10 | | - }, |
11 | | - { |
12 | | - id: 2, |
13 | | - title: "또다른 오래된...", |
14 | | - date: "2024-06-05", |
15 | | - category: "가구 장식", |
16 | | - }, |
17 | | - ]; |
| 20 | + const [articles, setArticles] = useState<ArticleContent[]>([]); |
| 21 | + const [page, setPage] = useState(1); |
| 22 | + const [size] = useState(5); |
| 23 | + const [totalPages, setTotalPages] = useState(1); |
| 24 | + |
| 25 | + useEffect(() => { |
| 26 | + const fetchArticles = async () => { |
| 27 | + const type = 'all'; |
| 28 | + const category = 'all'; |
| 29 | + const response = await getArticleList(type, category, page); |
| 30 | + setArticles(response.content); |
| 31 | + setTotalPages(Math.ceil(response.total / size)); |
| 32 | + }; |
| 33 | + |
| 34 | + fetchArticles(); |
| 35 | + }, [page, size]); |
| 36 | + |
| 37 | + const handlePageChange = (newPage: number) => { |
| 38 | + if (newPage >= 1 && newPage <= totalPages) { |
| 39 | + setPage(newPage); |
| 40 | + } |
| 41 | + }; |
18 | 42 |
|
19 | 43 | return ( |
20 | 44 | <div className="m-8 ml-14"> |
21 | 45 | <div className="text-2xl font-bold mb-4">북마크</div> |
22 | 46 | <div className="flex justify-between items-center mb-6"> |
23 | | - <div className="text-gray-500">찜한 콘텐츠 {bookmarks.length}</div> |
| 47 | + <div className="text-gray-500">찜한 콘텐츠 {articles.length}</div> |
24 | 48 | </div> |
25 | 49 | <div className="space-y-4"> |
26 | | - {bookmarks.map((bookmark) => ( |
| 50 | + {articles.map((items) => ( |
27 | 51 | <div |
28 | | - key={bookmark.id} |
| 52 | + key={items.article.articleId} |
29 | 53 | className="flex items-center bg-white p-4 shadow rounded-lg border border-gray-200" |
30 | 54 | > |
31 | | - <div className="w-24 h-24 bg-gray-100 rounded-lg flex-shrink-0"></div> |
| 55 | + <div className="w-24 h-24 bg-gray-100 rounded-lg flex-shrink-0"> |
| 56 | + <img |
| 57 | + src={items.article.img_link} |
| 58 | + alt={items.article.title} |
| 59 | + className="w-24 h-24 object-cover rounded-lg" |
| 60 | + /> |
| 61 | + </div> |
32 | 62 | <div className="ml-4 flex-1"> |
33 | | - <div className="text-lg font-bold text-gray-800"> |
34 | | - {bookmark.title} |
| 63 | + <div className="text-lg font-bold text-gray-800 whitespace-nowrap overflow-hidden overflow-ellipsis max-xl:max-w-[200px]"> |
| 64 | + {items.article.title} |
| 65 | + </div> |
| 66 | + <div className="text-gray-500"> |
| 67 | + {typeToName(items.article.type)} |
| 68 | + </div> |
| 69 | + <div className="text-sm text-gray-400"> |
| 70 | + {formatDate(items.article.date)} |
35 | 71 | </div> |
36 | | - <div className="text-gray-500">{bookmark.category}</div> |
37 | | - <div className="text-sm text-gray-400">{bookmark.date}</div> |
38 | 72 | </div> |
39 | 73 | </div> |
40 | 74 | ))} |
41 | 75 | </div> |
| 76 | + |
| 77 | + <ArticlePagination |
| 78 | + totalPages={totalPages} |
| 79 | + onPageChange={handlePageChange} |
| 80 | + /> |
42 | 81 | </div> |
43 | 82 | ); |
44 | 83 | }; |
|
0 commit comments