@@ -8,45 +8,52 @@ import theme from 'styles/theme';
88import { setLike , setDisLike } from 'utils/apis/postApi' ;
99import { setNotification } from 'utils/apis/userApi' ;
1010import useLocalToken from 'hooks/useLocalToken' ;
11+ import useScrollPosition from 'hooks/useScrollPosition' ;
1112import { useUserContext } from 'contexts/UserContext' ;
1213import { IMAGE_URLS } from 'utils/constants/images' ;
1314import displayedAt from 'utils/functions/displayedAt' ;
1415
15- const PostBody = ( { post, isDetailPage = false } ) => {
16+ const PostBody = ( { index , post, isDetailPage = false } ) => {
1617 const { _id : postId , image, likes, comments, createdAt, author } = post || { } ;
17- const { content, contents , tags } = JSON . parse ( post ?. title ) ;
18+ const { content, tags } = JSON . parse ( post ?. title ) ;
1819 const [ onHeart , setOnHeart ] = useState ( false ) ;
1920 const [ heartCount , setHeartCount ] = useState ( likes . length ) ;
2021 const [ likeId , setLikeId ] = useState ( '' ) ;
2122 const [ isShown , setIsShown ] = useState ( false ) ;
2223 const [ localToken ] = useLocalToken ( ) ;
2324 const { currentUser } = useUserContext ( ) ;
24-
25+ const [ , setCurrentPostIndex ] = useScrollPosition ( ) ;
2526 const navigate = useNavigate ( ) ;
2627
27- const handleTodetailpage = useCallback ( ( ) => {
28+ useEffect ( ( ) => {
29+ let likeId ;
30+ const isMyLikePost =
31+ likes . filter ( ( { user, _id } ) => {
32+ if ( user === currentUser . id ) {
33+ likeId = _id ;
34+ return true ;
35+ }
36+ } ) . length > 0 ;
37+ if ( isMyLikePost ) {
38+ setOnHeart ( true ) ;
39+ setLikeId ( likeId ) ;
40+ }
41+ } , [ currentUser , likes ] ) ;
42+
43+ const navigateToDetailPage = useCallback ( ( ) => {
2844 if ( isDetailPage ) {
2945 return ;
3046 }
47+ setCurrentPostIndex ( index + 1 ) ;
3148 navigate ( `/post/detail/${ postId } ` , {
3249 state : {
3350 post,
51+ index,
3452 } ,
3553 } ) ;
36- } , [ postId , post , isDetailPage , navigate ] ) ;
54+ } , [ setCurrentPostIndex , index , postId , post , isDetailPage , navigate ] ) ;
3755
38- const handleTagClick = useCallback (
39- ( tag ) => {
40- navigate ( `/tag/${ tag . slice ( 1 ) } ` , {
41- state : {
42- tag,
43- } ,
44- } ) ;
45- } ,
46- [ navigate ] ,
47- ) ;
48-
49- const handleHeartClick = useCallback ( async ( ) => {
56+ const handleClickHeart = useCallback ( async ( ) => {
5057 setOnHeart ( ! onHeart ) ;
5158 if ( ! onHeart ) {
5259 setHeartCount ( heartCount + 1 ) ;
@@ -66,28 +73,25 @@ const PostBody = ({ post, isDetailPage = false }) => {
6673 }
6774 } , [ onHeart , heartCount , postId , likeId , author . _id , currentUser , localToken ] ) ;
6875
69- useEffect ( ( ) => {
70- let likeId ;
71- const isMyLikePost =
72- likes . filter ( ( { user, _id } ) => {
73- if ( user === currentUser . id ) {
74- likeId = _id ;
75- return true ;
76- }
77- } ) . length > 0 ;
78- if ( isMyLikePost ) {
79- setOnHeart ( true ) ;
80- setLikeId ( likeId ) ;
81- }
82- } , [ currentUser , likes ] ) ;
76+ const handleClickTag = useCallback (
77+ ( tag ) => {
78+ setCurrentPostIndex ( index + 1 ) ;
79+ navigate ( `/tag/${ tag . slice ( 1 ) } ` , {
80+ state : {
81+ tag,
82+ } ,
83+ } ) ;
84+ } ,
85+ [ index , setCurrentPostIndex , navigate ] ,
86+ ) ;
8387
84- const handleMoreClick = ( ) => {
88+ const handleClickMore = ( ) => {
8589 setIsShown ( true ) ;
8690 } ;
8791
8892 return (
8993 < Container >
90- < ImageWrapper onClick = { handleTodetailpage } isDetailPage = { isDetailPage } >
94+ < ImageWrapper onClick = { navigateToDetailPage } isDetailPage = { isDetailPage } >
9195 < Image
9296 src = { image ? image : IMAGE_URLS . POST_DEFAULT_IMG }
9397 defaultImageUrl = { IMAGE_URLS . POST_DEFAULT_IMG }
@@ -98,13 +102,12 @@ const PostBody = ({ post, isDetailPage = false }) => {
98102 < Contents >
99103 < IconButtons >
100104 < IconButton
101- className = "heart-button"
102105 name = { onHeart ? 'HEART_RED' : 'HEART' } // Todo: 상수화
103- onClick = { handleHeartClick }
106+ onClick = { handleClickHeart }
104107 >
105108 < IconButtonText > { heartCount } </ IconButtonText >
106109 </ IconButton >
107- < IconButton className = "comment-button" name = "COMMENT" onClick = { handleTodetailpage } >
110+ < IconButton name = "COMMENT" onClick = { navigateToDetailPage } >
108111 < IconButtonText > { comments . length } </ IconButtonText >
109112 </ IconButton >
110113 </ IconButtons >
@@ -113,12 +116,12 @@ const PostBody = ({ post, isDetailPage = false }) => {
113116 { content }
114117 </ Paragraph >
115118 { ! isDetailPage && content ?. length > 50 && ! isShown && (
116- < MoreText onClick = { handleMoreClick } > 더보기</ MoreText >
119+ < MoreText onClick = { handleClickMore } > 더보기</ MoreText >
117120 ) }
118121 </ TextContainer >
119122 < Tags >
120123 { tags . map ( ( tag , i ) => (
121- < Tag key = { i } onClick = { ( ) => handleTagClick ( tag ) } >
124+ < Tag key = { i } onClick = { ( ) => handleClickTag ( tag ) } >
122125 { tag [ 0 ] === '#' ? tag : `#${ tag } ` }
123126 </ Tag >
124127 ) ) }
@@ -155,7 +158,7 @@ const IconButtons = styled.div`
155158 display: flex;
156159` ;
157160
158- const IconButton = ( { name, className , children, onClick } ) => {
161+ const IconButton = ( { name, children, onClick } ) => {
159162 const style = {
160163 padding : 0 ,
161164 borderRadius : '0' ,
@@ -167,7 +170,7 @@ const IconButton = ({ name, className, children, onClick }) => {
167170 color : theme . color . fontBlack ,
168171 } ;
169172 return (
170- < button className = { className } style = { style } onClick = { onClick } >
173+ < button style = { style } onClick = { onClick } >
171174 < Icon name = { name } size = { 22 } />
172175 { children }
173176 </ button >
0 commit comments