Skip to content

Commit 0fa97fe

Browse files
committed
enhance: overhaul newly injected comments highlighting method, use client injected field
1 parent ded6f5b commit 0fa97fe

File tree

5 files changed

+35
-10
lines changed

5 files changed

+35
-10
lines changed

api/typeDefs/item.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ export default gql`
150150
nDirectComments: Int!
151151
comments(sort: String, cursor: String): Comments!
152152
newComments(rootId: ID, after: Date): Comments!
153+
injected: Boolean!
153154
path: String
154155
position: Int
155156
prior: Int

components/comment.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,19 +140,35 @@ export default function Comment ({
140140
}
141141
}, [item.id, cache, router.query.commentId])
142142

143+
const unsetOutline = () => {
144+
ref.current.classList.add('outline-new-comment-unset')
145+
// if the comment is injected, we need to change injected to false
146+
// so that the next time the comment is rendered, it won't be outlined
147+
if (item.injected) {
148+
cache.writeFragment({
149+
id: `Item:${item.id}`,
150+
fragment: gql`
151+
fragment CommentInjected on Item {
152+
injected @client
153+
}`,
154+
data: {
155+
injected: false
156+
}
157+
})
158+
}
159+
}
160+
143161
useEffect(() => {
162+
// an injected new comment needs a different class to reliably outline every new comment
163+
if (item.injected && me?.id !== item.user?.id) {
164+
ref.current.classList.add('outline-new-injected-comment')
165+
}
166+
144167
if (router.query.commentsViewedAt &&
145168
me?.id !== item.user?.id &&
146-
!item.newComments &&
147169
new Date(item.createdAt).getTime() > router.query.commentsViewedAt) {
148170
ref.current.classList.add('outline-new-comment')
149171
}
150-
151-
// an injected new comment has the newComments field, a different class is needed
152-
// to reliably outline every new comment
153-
if (item.newComments && me?.id !== item.user?.id) {
154-
ref.current.classList.add('outline-new-injected-comment')
155-
}
156172
}, [item.id])
157173

158174
const bottomedOut = depth === COMMENT_DEPTH_LIMIT || (item.comments?.comments.length === 0 && item.nDirectComments > 0)
@@ -167,8 +183,8 @@ export default function Comment ({
167183
return (
168184
<div
169185
ref={ref} className={includeParent ? '' : `${styles.comment} ${collapse === 'yep' ? styles.collapsed : ''}`}
170-
onMouseEnter={() => ref.current.classList.add('outline-new-comment-unset')}
171-
onTouchStart={() => ref.current.classList.add('outline-new-comment-unset')}
186+
onMouseEnter={unsetOutline}
187+
onTouchStart={unsetOutline}
172188
>
173189
<div className={`${itemStyles.item} ${styles.item}`}>
174190
{item.outlawed && !me?.privates?.wildWestMode

components/show-new-comments.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ function prepareComments (client, newComments) {
4949
return null
5050
}
5151

52-
return fragment
52+
return { ...fragment, injected: true }
5353
}).filter(Boolean)
5454

5555
// count the total number of new comments including its nested new comments

fragments/comments.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export const COMMENT_FIELDS = gql`
4848
ncomments
4949
nDirectComments
5050
newComments @client
51+
injected @client
5152
imgproxyUrls
5253
rel
5354
apiKey
@@ -130,6 +131,7 @@ export const COMMENT_WITH_NEW_RECURSIVE = gql`
130131
}
131132
}
132133
newComments @client
134+
injected @client
133135
}
134136
`
135137

@@ -144,6 +146,7 @@ export const COMMENT_WITH_NEW_LIMITED = gql`
144146
}
145147
}
146148
newComments @client
149+
injected @client
147150
}
148151
`
149152

lib/apollo.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,11 @@ function getClient (uri) {
318318
return newComments || []
319319
}
320320
},
321+
injected: {
322+
read (injected) {
323+
return injected || false
324+
}
325+
},
321326
meAnonSats: {
322327
read (existingAmount, { readField }) {
323328
if (SSR) return null

0 commit comments

Comments
 (0)