1+ import clsx from 'clsx'
12import React , { useCallback , useEffect , useState } from 'react'
2- import { BiBookmarkMinus , BiBookmarkPlus , 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'
5- import { Attributes , trackLinkBookmark , trackLinkUnBookmark } from 'src/lib/analytics'
6+ import {
7+ Attributes ,
8+ trackLinkBookmark ,
9+ trackLinkUnBookmark ,
10+ trackMarkAsRead ,
11+ } from 'src/lib/analytics'
612import { useBookmarks } from 'src/stores/bookmarks'
13+ import { useReadPosts } from 'src/stores/readPosts'
14+ import { useShallow } from 'zustand/shallow'
715
816type CardItemWithActionsProps = {
917 item : {
@@ -32,11 +40,36 @@ export const CardItemWithActions = ({
3240 const [ shareModalData , setShareModalData ] = useState < ShareModalData > ( )
3341
3442 const { bookmarkPost, unbookmarkPost, userBookmarks } = useBookmarks ( )
43+ const { isRead, markAsRead, markAsUnread } = useReadPosts (
44+ useShallow ( ( state ) => ( {
45+ markAsRead : state . markAsRead ,
46+ markAsUnread : state . markAsUnread ,
47+ isRead : state . readPostIds . includes ( item . id ) ,
48+ } ) )
49+ )
3550 const [ isBookmarked , setIsBookmarked ] = useState (
3651 userBookmarks . some ( ( bm ) => bm . source === source && bm . url === item . url )
3752 )
3853
39- const onBookmarkClick = useCallback ( ( ) => {
54+ const onMarkAsReadClicked = useCallback ( ( ) => {
55+ if ( isRead ) {
56+ markAsUnread ( item . id )
57+ } else {
58+ markAsRead ( item . id )
59+ }
60+
61+ if ( isRead ) {
62+ const analyticsAttrs = {
63+ [ Attributes . TRIGERED_FROM ] : 'card' ,
64+ [ Attributes . TITLE ] : item . title ,
65+ [ Attributes . LINK ] : item . url ,
66+ [ Attributes . SOURCE ] : source ,
67+ }
68+ trackMarkAsRead ( analyticsAttrs )
69+ }
70+ } , [ isRead , item . id ] )
71+
72+ const onBookmarkClicked = useCallback ( ( ) => {
4073 const itemToBookmark = {
4174 title : item . title ,
4275 url : item . url ,
@@ -70,7 +103,7 @@ export const CardItemWithActions = ({
70103 setShareModalData ( { title : item . title , link : item . url , source : source } )
71104 } , [ item . title , item . url , source ] )
72105 return (
73- < div key = { item . id } className = " blockRow" >
106+ < div key = { item . id } className = { clsx ( ' blockRow' , { isRead } ) } >
74107 < ShareModal
75108 showModal = { setShareModalData !== undefined }
76109 closeModal = { ( ) => setShareModalData ( undefined ) }
@@ -95,11 +128,18 @@ export const CardItemWithActions = ({
95128 { showBookmarkAction && (
96129 < button
97130 className = { `blockActionButton ${ isBookmarked ? 'active' : '' } ` }
98- onClick = { onBookmarkClick }
131+ onClick = { onBookmarkClicked }
99132 aria-label = "Bookmark item" >
100133 { ! isBookmarked ? < BiBookmarkPlus /> : < BiBookmarkMinus /> }
101134 </ button >
102135 ) }
136+
137+ < button
138+ className = { `blockActionButton ${ isRead ? 'active' : '' } ` }
139+ onClick = { onMarkAsReadClicked }
140+ aria-label = { isRead ? 'Mark as unread' : 'Mark as read' } >
141+ < BiCheckDouble />
142+ </ button >
103143 </ div >
104144 </ div >
105145 )
0 commit comments