* Fix duplicate comment on pessimistic creation - comment creation checks for comment's ID existence in cache - invoice.confirmedAt included in useCanEdit deps for anons live comments * switch to some as sets are not worth it * only check for duplicates if a pessimistic payment method has been used * default to empty array * add comment about side-effects * record ownership of an item to avoid injecting it via live comments * trigger check only if the incoming comment is ours, cleanup * correct conditions, correct comments, light cleanup * fix: add defensive condition to ownership recorder, better name * refactor: unified comment injection logic with deduplication, useCommentsView hook; revert sessionStorage-based fix * adjust live comments naming around the codebase * listen for hmac presence for anon edits * always return the injected comment createdAt to bump live comments * refactor: improve live comments hook readability - latest comment createdAt persistence helper - preserveScroll returns the returning value of the callback - compact conditional logic - refresh code comments - refresh naming - group constants - reorder imports * flat comment injection, fetch flat comments instead of the entire subtree that would've been deduplicated anyway, cleanup * always align new comment fragment to the comments query structure * generic useCommentsView hook * update comment counts if live injecting into fragments without comments field * fix: pass parentId, if a comment has a top level parent it always has the comments field * fix: update CommentsViewAt only if we actually injected a comment into cache * correct injectComment result usage * pass markViewedAt to further centralize side effects, remove live from Item server typedefs * fix: don't update counts for ancestors that are already up to date, update commentsViewedAt per batch not per comment * port: fix coalesce, useCommentsView hook and outline changes * update hmac field in cache on paid invoice, hmac as useCanEdit effect dependency * comments and light cleanup, update useCommentsView * efficient hasComments logic for live comments, establish a gql fragment * fix: typo on topLevel evaluation * limit extra evaluations to live comments scenarios * update comments * support live comments ncomments increments for anon view tracking
197 lines
3.3 KiB
JavaScript
197 lines
3.3 KiB
JavaScript
import { gql } from '@apollo/client'
|
|
|
|
// we can't import from users because of circular dependency
|
|
const STREAK_FIELDS = gql`
|
|
fragment StreakFields on User {
|
|
optional {
|
|
streak
|
|
hasSendWallet
|
|
hasRecvWallet
|
|
}
|
|
}
|
|
`
|
|
|
|
export const COMMENT_FIELDS = gql`
|
|
${STREAK_FIELDS}
|
|
fragment CommentFields on Item {
|
|
id
|
|
position
|
|
parentId
|
|
createdAt
|
|
invoicePaidAt
|
|
deletedAt
|
|
text
|
|
user {
|
|
id
|
|
name
|
|
meMute
|
|
...StreakFields
|
|
}
|
|
sats
|
|
credits
|
|
meAnonSats @client
|
|
upvotes
|
|
freedFreebie
|
|
boost
|
|
meSats
|
|
meCredits
|
|
meDontLikeSats
|
|
meBookmark
|
|
meSubscription
|
|
outlawed
|
|
freebie
|
|
path
|
|
commentSats
|
|
commentCredits
|
|
mine
|
|
otsHash
|
|
ncomments
|
|
nDirectComments
|
|
live @client
|
|
imgproxyUrls
|
|
rel
|
|
apiKey
|
|
invoice {
|
|
id
|
|
actionState
|
|
confirmedAt
|
|
hmac
|
|
}
|
|
cost
|
|
}
|
|
`
|
|
|
|
export const COMMENT_FIELDS_NO_CHILD_COMMENTS = gql`
|
|
${STREAK_FIELDS}
|
|
fragment CommentFieldsNoChildComments on Item {
|
|
id
|
|
position
|
|
parentId
|
|
createdAt
|
|
invoicePaidAt
|
|
deletedAt
|
|
text
|
|
user {
|
|
id
|
|
name
|
|
meMute
|
|
...StreakFields
|
|
}
|
|
sats
|
|
credits
|
|
meAnonSats @client
|
|
upvotes
|
|
freedFreebie
|
|
boost
|
|
meSats
|
|
meCredits
|
|
meDontLikeSats
|
|
meBookmark
|
|
meSubscription
|
|
outlawed
|
|
freebie
|
|
path
|
|
commentSats
|
|
commentCredits
|
|
mine
|
|
otsHash
|
|
live @client
|
|
imgproxyUrls
|
|
rel
|
|
apiKey
|
|
invoice {
|
|
id
|
|
actionState
|
|
confirmedAt
|
|
hmac
|
|
}
|
|
cost
|
|
}
|
|
`
|
|
|
|
export const COMMENTS_ITEM_EXT_FIELDS = gql`
|
|
${STREAK_FIELDS}
|
|
fragment CommentItemExtFields on Item {
|
|
text
|
|
root {
|
|
id
|
|
title
|
|
bounty
|
|
ncomments
|
|
bountyPaidTo
|
|
subName
|
|
sub {
|
|
name
|
|
userId
|
|
moderated
|
|
meMuteSub
|
|
}
|
|
user {
|
|
name
|
|
id
|
|
...StreakFields
|
|
}
|
|
}
|
|
}`
|
|
|
|
// we only get the first COMMENT_DEPTH_LIMIT comments
|
|
export const COMMENTS = gql`
|
|
${COMMENT_FIELDS}
|
|
|
|
fragment CommentsRecursive on Item {
|
|
...CommentFields
|
|
comments {
|
|
comments {
|
|
...CommentFields
|
|
comments {
|
|
comments {
|
|
...CommentFields
|
|
comments {
|
|
comments {
|
|
...CommentFields
|
|
comments {
|
|
comments {
|
|
...CommentFields
|
|
comments {
|
|
comments {
|
|
...CommentFields
|
|
comments {
|
|
comments {
|
|
...CommentFields
|
|
comments {
|
|
comments {
|
|
...CommentFields
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}`
|
|
|
|
export const HAS_COMMENTS = gql`
|
|
fragment HasComments on Item {
|
|
comments
|
|
}
|
|
`
|
|
|
|
export const GET_NEW_COMMENTS = gql`
|
|
${COMMENT_FIELDS_NO_CHILD_COMMENTS}
|
|
|
|
query GetNewComments($itemId: ID, $after: Date) {
|
|
newComments(itemId: $itemId, after: $after) {
|
|
comments {
|
|
...CommentFieldsNoChildComments
|
|
}
|
|
}
|
|
}
|
|
`
|