Skip to content

Commit 66b031d

Browse files
committed
feat: enhance mark as read functionality with improved UI and state management
1 parent 3ebb154 commit 66b031d

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

src/components/Elements/CardWithActions/CardItemWithActions.tsx

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import clsx from 'clsx'
12
import 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'
34
import { ShareModal } from 'src/features/shareModal'
45
import { ShareModalData } from 'src/features/shareModal/types'
56
import { Attributes, trackLinkBookmark, trackLinkUnBookmark } from 'src/lib/analytics'
67
import { useBookmarks } from 'src/stores/bookmarks'
78
import { useReadPosts } from 'src/stores/readPosts'
9+
import { useShallow } from 'zustand/shallow'
810

911
type 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

Comments
 (0)