11import { Article , ArticleList } from "@/types/Article.type" ;
22import styles from "./BestPostBoard.module.css" ;
33import Image from "next/image" ;
4- import formatDate from ".. /lib/formatDate" ;
4+ import formatDate from "@ /lib/formatDate" ;
55import { useDeviceType } from "@/contexts/DeviceTypeContext" ;
6- import { useState } from "react" ;
6+ import ImageSafe from "./ImageSafe" ;
7+ import Link from "next/link" ;
78
89const PAGE_SIZE = {
910 desktop : 3 ,
1011 tablet : 2 ,
1112 mobile : 1 ,
1213} ;
1314
14- const IMAGE_PLACEHOLDER = "/images/landscape-placeholder.svg" ;
15-
1615export default function BestPostBoard ( { articles } : { articles : ArticleList } ) {
1716 const deviceType = useDeviceType ( ) ;
1817
@@ -22,8 +21,8 @@ export default function BestPostBoard({ articles }: { articles: ArticleList }) {
2221 < h2 className = { styles . BoardTitle } > 베스트 게시글</ h2 >
2322 </ header >
2423 < div className = { styles . PostItemList } >
25- { articles . list . map ( ( article , i ) => {
26- if ( i < PAGE_SIZE [ deviceType ] ) {
24+ { articles . list . map ( ( article , postIndex ) => {
25+ if ( postIndex < PAGE_SIZE [ deviceType ] ) {
2726 return < PostItem key = { article . id } article = { article } /> ;
2827 }
2928 } ) }
@@ -33,12 +32,10 @@ export default function BestPostBoard({ articles }: { articles: ArticleList }) {
3332}
3433
3534function PostItem ( { article } : { article : Article } ) {
36- const [ imgSrc , setImgSrc ] = useState ( article . image || IMAGE_PLACEHOLDER ) ;
37-
3835 const createdAt = formatDate ( article . createdAt ) ;
3936
4037 return (
41- < div className = { styles . Item } >
38+ < Link className = { styles . Item } href = { `/board/ ${ article . id } ` } >
4239 < div className = { styles . badge } >
4340 < div className = { styles . medal } >
4441 < Image fill src = "/images/ic_medal.svg" alt = "베스트" />
@@ -48,15 +45,7 @@ function PostItem({ article }: { article: Article }) {
4845 < div className = { styles . main } >
4946 < h3 className = { styles . title } > { article . title } </ h3 >
5047 < div className = { styles . preview } >
51- < Image
52- fill
53- src = { article . image }
54- alt = { article . title }
55- style = { {
56- objectFit : "cover" ,
57- } }
58- onError = { ( ) => setImgSrc ( IMAGE_PLACEHOLDER ) }
59- />
48+ < ImageSafe src = { article . image } alt = { article . title } />
6049 </ div >
6150 </ div >
6251 < div className = { styles . util } >
@@ -69,6 +58,6 @@ function PostItem({ article }: { article: Article }) {
6958 </ div >
7059 < span > { createdAt } </ span >
7160 </ div >
72- </ div >
61+ </ Link >
7362 ) ;
7463}
0 commit comments