Fix non-thread live comments recursion logic (#2324)
* fix: recurse through existing comments only if we're in the newComments subtree or if it's the start of a thread * cleanup: better comment * cleanup: re-order parameters, comment touchup
This commit is contained in:
parent
160b04ceaa
commit
9e2c35c641
@ -69,8 +69,8 @@ function prepareComments (data, client, newComments) {
|
||||
}
|
||||
|
||||
// traverses all new comments and their children
|
||||
// if we're showing all new comments of a thread, we also consider their existing children
|
||||
function traverseNewComments (client, item, onLevel, threadComment = false, currentDepth = 1) {
|
||||
// if it's a thread, or we're in a new comment subtree, we also consider their existing children
|
||||
function traverseNewComments (client, item, onLevel, currentDepth, inSubtree) {
|
||||
// if we're at the depth limit, stop traversing, we've reached the bottom of the visible thread
|
||||
if (currentDepth >= COMMENT_DEPTH_LIMIT) return
|
||||
|
||||
@ -87,23 +87,24 @@ function traverseNewComments (client, item, onLevel, threadComment = false, curr
|
||||
// at each level, we can execute a callback passing the current item's new comments, depth and ID
|
||||
onLevel(freshNewComments, currentDepth, item.id)
|
||||
|
||||
// traverse the new comment's new comments and their children
|
||||
for (const newComment of freshNewComments) {
|
||||
traverseNewComments(client, newComment, onLevel, threadComment, currentDepth + 1)
|
||||
traverseNewComments(client, newComment, onLevel, currentDepth + 1, true)
|
||||
}
|
||||
}
|
||||
|
||||
// if we're showing all new comments of a thread
|
||||
// we consider every child comment recursively
|
||||
if (threadComment && item.comments?.comments) {
|
||||
// check for new comments in existing children
|
||||
// only if we're in a new comment subtree, or it's a thread
|
||||
if (inSubtree && item.comments?.comments) {
|
||||
for (const child of item.comments.comments) {
|
||||
traverseNewComments(client, child, onLevel, threadComment, currentDepth + 1)
|
||||
traverseNewComments(client, child, onLevel, currentDepth + 1, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// recursively processes and displays all new comments
|
||||
// handles comment injection at each level, respecting depth limits
|
||||
function injectNewComments (client, item, currentDepth, sort, threadComment = false) {
|
||||
function injectNewComments (client, item, sort, currentDepth, thread) {
|
||||
traverseNewComments(client, item, (newComments, depth, itemId) => {
|
||||
if (newComments.length > 0) {
|
||||
// traverseNewComments also passes the depth of the current item
|
||||
@ -114,11 +115,11 @@ function injectNewComments (client, item, currentDepth, sort, threadComment = fa
|
||||
commentUpdateFragment(client, itemId, (data) => prepareComments(data, client, newComments))
|
||||
}
|
||||
}
|
||||
}, threadComment, currentDepth)
|
||||
}, currentDepth, thread)
|
||||
}
|
||||
|
||||
// counts all new comments of an item
|
||||
function countAllNewComments (client, item, thread = false, currentDepth = 1) {
|
||||
function countAllNewComments (client, item, currentDepth, thread) {
|
||||
let newCommentsCount = 0
|
||||
let threadChildren = false
|
||||
|
||||
@ -130,7 +131,7 @@ function countAllNewComments (client, item, thread = false, currentDepth = 1) {
|
||||
if (depth > 1 && newComments.length > 0) {
|
||||
threadChildren = true
|
||||
}
|
||||
}, thread, currentDepth)
|
||||
}, currentDepth, thread)
|
||||
|
||||
return { newCommentsCount, threadChildren }
|
||||
}
|
||||
@ -164,8 +165,8 @@ export function ShowNewComments ({ topLevel, item, sort, depth = 0 }) {
|
||||
const thread = item.path?.split('.').length === 2
|
||||
|
||||
// recurse through all new comments and their children
|
||||
// if the item is a thread, we consider every existing child comment
|
||||
const { newCommentsCount, threadChildren } = countAllNewComments(client, item, thread, depth)
|
||||
// if the item is a thread, we also consider all of their existing children
|
||||
const { newCommentsCount, threadChildren } = countAllNewComments(client, item, depth, thread)
|
||||
|
||||
// only if the item is a thread and its children have new comments, we show "show all new comments"
|
||||
const threadComment = thread && threadChildren
|
||||
@ -173,7 +174,7 @@ export function ShowNewComments ({ topLevel, item, sort, depth = 0 }) {
|
||||
const showNewComments = useCallback(() => {
|
||||
// a top level comment doesn't pass depth, we pass its default value of 0 to signify this
|
||||
// child comments are injected from the depth they're at
|
||||
injectNewComments(client, item, depth, sort, threadComment)
|
||||
injectNewComments(client, item, sort, depth, threadComment)
|
||||
}, [client, sort, item, depth])
|
||||
|
||||
const text = !threadComment
|
||||
|
Loading…
x
Reference in New Issue
Block a user