1+ import clsx from 'clsx'
12import React , { useCallback , useEffect , useState } from 'react'
2- import { BiBookmarkMinus , BiBookmarkPlus , BiCheckCircle , BiShareAlt } from 'react-icons/bi'
3+ import { BiBookmarkMinus , BiBookmarkPlus , BiCheckDouble , BiShareAlt } from 'react-icons/bi'
34import { ShareModal } from 'src/features/shareModal'
45import { ShareModalData } from 'src/features/shareModal/types'
56import { Attributes , trackLinkBookmark , trackLinkUnBookmark } from 'src/lib/analytics'
67import { useBookmarks } from 'src/stores/bookmarks'
78import { useReadPosts } from 'src/stores/readPosts'
9+ import { useShallow } from 'zustand/shallow'
810
911type CardItemWithActionsProps = {
1012 item : {
@@ -33,8 +35,13 @@ export const CardItemWithActions = ({
3335 const [ shareModalData , setShareModalData ] = useState < ShareModalData > ( )
3436
3537 const { bookmarkPost, unbookmarkPost, userBookmarks } = useBookmarks ( )
36- const { readPostIds, markAsRead, markAsUnread } = useReadPosts ( )
37- const isRead = readPostIds . includes ( item . id )
38+ const { isRead, markAsRead, markAsUnread } = useReadPosts (
39+ useShallow ( ( state ) => ( {
40+ markAsRead : state . markAsRead ,
41+ markAsUnread : state . markAsUnread ,
42+ isRead : state . readPostIds . includes ( item . id ) ,
43+ } ) )
44+ )
3845 const [ isBookmarked , setIsBookmarked ] = useState (
3946 userBookmarks . some ( ( bm ) => bm . source === source && bm . url === item . url )
4047 )
@@ -45,7 +52,7 @@ export const CardItemWithActions = ({
4552 } else {
4653 markAsRead ( item . id )
4754 }
48- } , [ isRead , markAsRead , markAsUnread , item . id ] )
55+ } , [ isRead , item . id ] )
4956
5057 const onBookmarkClick = useCallback ( ( ) => {
5158 const itemToBookmark = {
@@ -81,7 +88,7 @@ export const CardItemWithActions = ({
8188 setShareModalData ( { title : item . title , link : item . url , source : source } )
8289 } , [ item . title , item . url , source ] )
8390 return (
84- < div key = { item . id } className = " blockRow" >
91+ < div key = { item . id } className = { clsx ( ' blockRow' , { isRead } ) } >
8592 < ShareModal
8693 showModal = { setShareModalData !== undefined }
8794 closeModal = { ( ) => setShareModalData ( undefined ) }
@@ -112,15 +119,12 @@ export const CardItemWithActions = ({
112119 </ button >
113120 ) }
114121
115- < span className = "markAsReadAction" >
116- < span className = "markAsReadTooltip" > { isRead ? 'Mark as unread' : 'Mark as read' } </ span >
117- < button
118- className = "blockActionButton"
119- onClick = { onMarkAsReadClick }
120- aria-label = { isRead ? 'Mark as unread' : 'Mark as read' } >
121- < BiCheckCircle />
122- </ button >
123- </ span >
122+ < button
123+ className = { `blockActionButton ${ isRead ? 'active' : '' } ` }
124+ onClick = { onMarkAsReadClick }
125+ aria-label = { isRead ? 'Mark as unread' : 'Mark as read' } >
126+ < BiCheckDouble />
127+ </ button >
124128 </ div >
125129 </ div >
126130 )
0 commit comments