* check new comments every 10 seconds * enhance: clear newComments on child comments when we show a topLevel new comment; cleanup: resolvers, logs * handle comments of comments, new structure to clear newComments on childs * use original recursive comments data structure * correct comment structure after deduplication * faster newComments query deduplication, don't need to know how many comments are there * cleanup: comments on newComments fetches and dedupes * cleanup, use correct function declarations * stop polling after 30 minutes, pause polling if user is not on the page * ActionTooltip indicating that the user is in a live comment section * handleVisibilityChange to control polling by visibility * paused polling styling, check activity on 1 minute intervals and visibility change, light cleanup * user can resume polling without refreshing the page * better naming, straightforward dedupeComment on newComment arrival * cleanup: better naming, get latest comment creation, correct order of comment injection * cleanup: refactor live comments related functions to use-live-comments.js * refactor: clearer naming, optimized polling and date retrieval logic, use of constants, general cleanup * ui: place ShowNewComments in the bottom-right corner of nested comments * fix: make updateQuery sort-aware to correctly inject the comment in the correct Item query * cleanup: better naming; fix: usecallback on live comments component; fix leak on useEffect because of missing sort atomic apollo cache manipulations; manage top sort not being present in item query cache queue nested comments without a parent, retry on the next poll fix commit messages * fix: don't show unpaid comments; cleanup: compact cache merge/dedupe, queue comments via state * fix: read new comments fragments to inject fresh new comments, fixing dropped comments; ui: show amount of new comments refactor: correct function positioning; cleanup: useless logs * enhance: queuedComments Ref, cache-and-network fetch policy; freshNewComments readFragment fallback to received comment * cleanup: detailed comments and better ShowNewComment text * fix: while showing new comments, also update ncomments for UI and pagination * refactor: ShowNewComments is its own component; cleanup: proven useless dedupe on ShowNewComments, count nested ncomments from fresh new comments * enhance: direct latest comment createdAt calc with reduce * cleanup queue on unmount * feat: live comments indicator for bottomed-out replies, ncomments updates; fix: nested comment structures - new comments indicator for bottomed-out replies - ncomments sync for parent and its ancestors - limited comments fragment for comments that don't have CommentsRecursive - reduce cache complexity by removing useless roundtrips ux: live comments indicator on bottomedOut replies fix: dedupe newComments before displaying ShowNewComments to avoid false positives enhance: store ids of new comments in the cache, instead of carrying full comments that would get discarded anyway hotfix: newComments deduplication ID mismatch, filter null comments from freshNewComments fix: ncomments not updating for all comment levels; refactor: share Reply update ancestors' ncomments function with ShowNewComments cleanup: better naming to indicate the total number of comments including nested comments fix: increment parent comment ncomments cleanup: Items that will have comments will always have a structure where item.comments is true cleanup: reduce code complexity checking the nested comment update result instead of preventively reading the fragment cleanup: avoid double-updating ncomments on parent fix: don't use CommentsRecursive for bottomed-out comments cleanup: better fragment naming; add TODO for absolute bottom comments * backport live comments logic enhancements use-live-comments: - remove useless dedupe against already present comments - check newComments.comments length to tell if there are new comments - code reordering show-new-comments: - show all new comments recursively for nested comments - get always the newest comments to inject also their own child new comments - update local storage commentsViewedAt on comment injection - respect depth on comment injection comments.js - apollo cache manipulations now live here * hotfix: handle undefined item.comments.comments on dedupe * hotfix: limited fragment for recursive comment collection; protect from null fragments; add missing deps to memoization * docs: clarify ncomments updates * cleanup: remove unused export * count and show only the direct new comments and recursively their children enhance: dedupe against existing comments only in the component enhance: recursive count/injection share the same logic * fix regression on top level counting * hotfix: introduce readNestedCommentsFragment in lib/comments.js * fix: count also existing comments of a new comment; cleanup: use readCommentFragment also for prepareComments; reduce freshNewComments usage * add support for comments at the deepest level fixes: - client-side navigation re-fetched all new comments because 'after' was cached, now the latest new comment time persists in sessionStorage enhancements: - use CommentWithNewMinimal fragment fallback for comments at the deepest level - tweak ReplyOnAnotherPage to show also how many direct new comments are there cleanup: - queue management is not needed anymore, therefore it has been removed * cleanup: remove logs * revert counting on ReplyOnAnotherPage, TODO for enhancements PR * move ShowNewComments to CommentsHeader for top level comments * fix: update commentsViewedAfterComment to support ncomments * fix typo, lint * cleanup: remove old CSS * enhance: inject topLevel and its children new comments, simplify injection logic - top-level and nested comment handling share the same recursion logic - ShowNewComments references the item object for every type of comments — note: item from item-full.js is passed to comments.js - depth now starts at 0 to support top level comments - injection and counting now reach the deepest level, updating also the deepest comment * cleanup: remove unused topLevel prop * fix: deepest comments don't have CommentsRecursive structure, don't access it on injection * move top level ShowNewComments above CommentsHeader; preserve space to avoid vertical layout shifting * cleanup: remove unused item on CommentsHeader --------- Co-authored-by: Keyan <34140557+huumn@users.noreply.github.com>
182 lines
4.5 KiB
JavaScript
182 lines
4.5 KiB
JavaScript
import { gql } from 'graphql-tag'
|
|
|
|
export default gql`
|
|
extend type Query {
|
|
items(sub: String, sort: String, type: String, cursor: String, name: String, when: String, from: String, to: String, by: String, limit: Limit): Items
|
|
item(id: ID!): Item
|
|
pageTitleAndUnshorted(url: String!): TitleUnshorted
|
|
dupes(url: String!): [Item!]
|
|
related(cursor: String, title: String, id: ID, minMatch: String, limit: Limit): Items
|
|
search(q: String, sub: String, cursor: String, what: String, sort: String, when: String, from: String, to: String): Items
|
|
auctionPosition(sub: String, id: ID, boost: Int): Int!
|
|
boostPosition(sub: String, id: ID, boost: Int): BoostPositions!
|
|
itemRepetition(parentId: ID): Int!
|
|
newComments(rootId: ID, after: Date): Comments!
|
|
}
|
|
|
|
type BoostPositions {
|
|
home: Boolean!
|
|
sub: Boolean!
|
|
homeMaxBoost: Int!
|
|
subMaxBoost: Int!
|
|
}
|
|
|
|
type TitleUnshorted {
|
|
title: String
|
|
unshorted: String
|
|
}
|
|
|
|
type ItemActResult {
|
|
id: ID!
|
|
sats: Int!
|
|
path: String
|
|
act: String!
|
|
}
|
|
|
|
type ItemAct {
|
|
id: ID!
|
|
act: String!
|
|
invoice: Invoice
|
|
}
|
|
|
|
extend type Mutation {
|
|
bookmarkItem(id: ID): Item
|
|
pinItem(id: ID): Item
|
|
subscribeItem(id: ID): Item
|
|
deleteItem(id: ID): Item
|
|
upsertLink(
|
|
id: ID, sub: String, title: String!, url: String!, text: String, boost: Int, forward: [ItemForwardInput],
|
|
hash: String, hmac: String): ItemPaidAction!
|
|
upsertDiscussion(
|
|
id: ID, sub: String, title: String!, text: String, boost: Int, forward: [ItemForwardInput],
|
|
hash: String, hmac: String): ItemPaidAction!
|
|
upsertBounty(
|
|
id: ID, sub: String, title: String!, text: String, bounty: Int, boost: Int, forward: [ItemForwardInput],
|
|
hash: String, hmac: String): ItemPaidAction!
|
|
upsertJob(
|
|
id: ID, sub: String!, title: String!, company: String!, location: String, remote: Boolean,
|
|
text: String!, url: String!, boost: Int, status: String, logo: Int): ItemPaidAction!
|
|
upsertPoll(
|
|
id: ID, sub: String, title: String!, text: String, options: [String!]!, boost: Int, forward: [ItemForwardInput], pollExpiresAt: Date,
|
|
randPollOptions: Boolean, hash: String, hmac: String): ItemPaidAction!
|
|
updateNoteId(id: ID!, noteId: String!): Item!
|
|
upsertComment(id: ID, text: String!, parentId: ID, boost: Int, hash: String, hmac: String): ItemPaidAction!
|
|
act(id: ID!, sats: Int, act: String, hasSendWallet: Boolean): ItemActPaidAction!
|
|
pollVote(id: ID!): PollVotePaidAction!
|
|
toggleOutlaw(id: ID!): Item!
|
|
}
|
|
|
|
type PollVoteResult {
|
|
id: ID!
|
|
}
|
|
|
|
type PollOption {
|
|
id: ID,
|
|
option: String!
|
|
count: Int!
|
|
}
|
|
|
|
type Poll {
|
|
meVoted: Boolean!
|
|
meInvoiceId: Int
|
|
meInvoiceActionState: InvoiceActionState
|
|
count: Int!
|
|
options: [PollOption!]!
|
|
randPollOptions: Boolean
|
|
}
|
|
|
|
type Items {
|
|
cursor: String
|
|
items: [Item!]!
|
|
pins: [Item!]
|
|
ad: Item
|
|
}
|
|
|
|
type Comments {
|
|
cursor: String
|
|
comments: [Item!]!
|
|
}
|
|
|
|
enum InvoiceActionState {
|
|
PENDING
|
|
PENDING_HELD
|
|
HELD
|
|
PAID
|
|
FAILED
|
|
}
|
|
|
|
type Item {
|
|
id: ID!
|
|
createdAt: Date!
|
|
updatedAt: Date!
|
|
invoicePaidAt: Date
|
|
deletedAt: Date
|
|
deleteScheduledAt: Date
|
|
reminderScheduledAt: Date
|
|
title: String
|
|
searchTitle: String
|
|
url: String
|
|
searchText: String
|
|
text: String
|
|
parentId: Int
|
|
parent: Item
|
|
root: Item
|
|
user: User!
|
|
userId: Int!
|
|
depth: Int
|
|
mine: Boolean!
|
|
boost: Int!
|
|
bounty: Int
|
|
bountyPaidTo: [Int]
|
|
noteId: String
|
|
sats: Int!
|
|
credits: Int!
|
|
commentSats: Int!
|
|
commentCredits: Int!
|
|
lastCommentAt: Date
|
|
upvotes: Int!
|
|
meSats: Int!
|
|
meCredits: Int!
|
|
meDontLikeSats: Int!
|
|
meBookmark: Boolean!
|
|
meSubscription: Boolean!
|
|
meForward: Boolean
|
|
outlawed: Boolean!
|
|
freebie: Boolean!
|
|
freedFreebie: Boolean!
|
|
bio: Boolean!
|
|
paidImgLink: Boolean
|
|
ncomments: Int!
|
|
nDirectComments: Int!
|
|
comments(sort: String, cursor: String): Comments!
|
|
newComments(rootId: ID, after: Date): Comments!
|
|
path: String
|
|
position: Int
|
|
prior: Int
|
|
isJob: Boolean!
|
|
pollCost: Int
|
|
poll: Poll
|
|
pollExpiresAt: Date
|
|
company: String
|
|
location: String
|
|
remote: Boolean
|
|
sub: Sub
|
|
subName: String
|
|
status: String!
|
|
uploadId: Int
|
|
otsHash: String
|
|
parentOtsHash: String
|
|
forwards: [ItemForward]
|
|
imgproxyUrls: JSONObject
|
|
rel: String
|
|
apiKey: Boolean
|
|
invoice: Invoice
|
|
cost: Int!
|
|
}
|
|
|
|
input ItemForwardInput {
|
|
nym: String!
|
|
pct: Int!
|
|
}
|
|
`
|