@bitsocial/bitsocial-react-hooks 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/stores/feeds/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"assert\";\nimport {\n Comment,\n Feed,\n Feeds,\n FeedOptions,\n FeedsOptions,\n Community,\n Communities,\n Account,\n Accounts,\n CommunityPage,\n CommunitiesPages,\n FeedsCommunitiesPostCounts,\n} from \"../../types\";\nimport { getCommunityPages, getCommunityFirstPageCid } from \"../communities-pages\";\nimport accountsStore from \"../accounts\";\nimport feedSorter from \"./feed-sorter\";\nimport { communityPostsCacheExpired, commentIsValid, removeInvalidComments } from \"../../lib/utils\";\nimport { getCommentCommunityAddress, normalizeCommentCommunityAddress } from \"../../lib/pkc-compat\";\nimport {\n CommunityLookupRef,\n doesAddressMatchCommunityRef,\n getCommunityRefKeys,\n getMatchingCommunityRefKeys,\n} from \"../../lib/community-ref\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:feeds:stores\");\n\nconst getFeedCommunityRefs = (feedOptions: Partial<FeedOptions>): CommunityLookupRef[] =>\n feedOptions.communities || [];\n\nconst getFeedCommunityKeys = (feedOptions: Partial<FeedOptions>) =>\n feedOptions.communityKeys || getCommunityRefKeys(getFeedCommunityRefs(feedOptions));\n\nconst getCommentFreshness = (comment: Comment | undefined) =>\n Math.max(comment?.updatedAt ?? 0, comment?.timestamp ?? 0, 0);\n\nconst commentMatchesModQueue = (comment: Comment | undefined, modQueue?: string[]) => {\n const modQueueName = modQueue?.[0];\n if (!modQueueName) {\n return true;\n }\n if (modQueueName === \"pendingApproval\") {\n return comment?.pendingApproval === true;\n }\n return true;\n};\n\nconst getFeedPost = (\n post: Comment,\n communityRef: CommunityLookupRef,\n community: Community,\n modQueue?: string[],\n freshestComments?: { [commentCid: string]: Comment },\n) => {\n const normalizedPost = normalizeCommentCommunityAddress(post) as Comment;\n const freshestComment = post.cid\n ? normalizeCommentCommunityAddress(freshestComments?.[post.cid])\n : undefined;\n const postCommunityAddress = getCommentCommunityAddress(normalizedPost);\n if (!doesAddressMatchCommunityRef(postCommunityAddress, communityRef, community)) {\n return;\n }\n if (!commentMatchesModQueue(normalizedPost, modQueue)) {\n return;\n }\n if (\n !freshestComment ||\n getCommentFreshness(freshestComment) <= getCommentFreshness(normalizedPost)\n ) {\n return normalizedPost;\n }\n if (!commentMatchesModQueue(freshestComment, modQueue)) {\n return;\n }\n if (\n !doesAddressMatchCommunityRef(\n getCommentCommunityAddress(freshestComment),\n communityRef,\n community,\n )\n ) {\n return;\n }\n return freshestComment;\n};\n\nconst reconcileLoadedModQueueFeed = (\n feedOptions: FeedOptions,\n loadedFeed: Feed,\n filteredSortedFeed: Feed,\n) => {\n if (!feedOptions?.modQueue?.[0] || !loadedFeed?.length) {\n return loadedFeed;\n }\n\n const filteredSortedFeedByCid = new Map<string, Comment>();\n for (const post of filteredSortedFeed) {\n if (post.cid) {\n filteredSortedFeedByCid.set(post.cid, post);\n }\n }\n\n let changed = false;\n const nextLoadedFeed: Comment[] = [];\n for (const post of loadedFeed) {\n if (!post.cid) {\n nextLoadedFeed.push(post);\n continue;\n }\n\n const sourcePost = filteredSortedFeedByCid.get(post.cid);\n if (!sourcePost) {\n changed = true;\n continue;\n }\n\n if (getCommentFreshness(sourcePost) > getCommentFreshness(post)) {\n nextLoadedFeed.push(sourcePost);\n changed = true;\n continue;\n }\n\n nextLoadedFeed.push(post);\n }\n\n return changed ? nextLoadedFeed : loadedFeed;\n};\n\n/**\n * Calculate the feeds from all the loaded community pages, filter and sort them\n */\nexport const getFilteredSortedFeeds = (\n feedsOptions: FeedsOptions,\n communities: Communities,\n communitiesPages: CommunitiesPages,\n accounts: Accounts,\n freshestComments?: { [commentCid: string]: Comment },\n) => {\n // calculate each feed\n let feeds: Feeds = {};\n for (const feedName in feedsOptions) {\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n const communityKeys = getFeedCommunityKeys(feedsOptions[feedName]);\n let { sortType, accountId, filter, newerThan, modQueue } = feedsOptions[feedName];\n const newerThanTimestamp = newerThan ? Math.floor(Date.now() / 1000) - newerThan : undefined;\n\n let pageType = \"posts\";\n if (modQueue?.[0]) {\n // TODO: allow multiple modQueue at once, fow now only use first in array\n sortType = modQueue[0];\n pageType = \"modQueue\";\n }\n\n // find all fetched posts\n const bufferedFeedPosts = [];\n\n // add each comment from each page, do not filter at this stage, filter after sorting\n for (const [communityIndex, communityKey] of communityKeys.entries()) {\n const communityRef = communityRefs[communityIndex];\n // community hasn't loaded yet\n const community = communities[communityKey];\n if (!community || !communityRef) {\n continue;\n }\n\n // if cache is expired and has internet access, don't use, wait for next community update\n if (communityPostsCacheExpired(community) && window.navigator.onLine) {\n continue;\n }\n\n // use community preloaded posts if any\n const preloadedPosts = getPreloadedPosts(community, sortType);\n if (preloadedPosts) {\n for (const post of preloadedPosts) {\n // posts are manually validated, could have fake communityAddress\n if (\n !doesAddressMatchCommunityRef(getCommentCommunityAddress(post), communityRef, community)\n ) {\n break;\n }\n const nextPost = getFeedPost(post, communityRef, community, modQueue, freshestComments);\n if (nextPost) {\n bufferedFeedPosts.push(nextPost);\n }\n }\n }\n\n // add all posts from community pages\n const communityPages = getCommunityPages(\n community,\n sortType,\n communitiesPages,\n pageType,\n accountId,\n );\n for (const communityPage of communityPages) {\n if (communityPage?.comments) {\n for (const post of communityPage.comments) {\n // posts are manually validated, could have fake communityAddress\n if (\n !doesAddressMatchCommunityRef(\n getCommentCommunityAddress(post),\n communityRef,\n community,\n )\n ) {\n break;\n }\n const nextPost = getFeedPost(post, communityRef, community, modQueue, freshestComments);\n if (nextPost) {\n bufferedFeedPosts.push(nextPost);\n }\n }\n }\n }\n }\n\n // sort the feed before filtering to get more accurate results\n const originalSortType = feedsOptions[feedName].sortType;\n const sortedBufferedFeedPosts = feedSorter.sort(originalSortType, bufferedFeedPosts);\n\n // filter the feed\n const filteredSortedBufferedFeedPosts = [];\n for (const post of sortedBufferedFeedPosts) {\n // address is blocked\n if (\n accounts[accountId]?.blockedAddresses[getCommentCommunityAddress(post) || \"\"] ||\n (post.author?.address && accounts[accountId]?.blockedAddresses[post.author.address])\n ) {\n continue;\n }\n\n // comment cid is blocked\n if (accounts[accountId]?.blockedCids[post.cid]) {\n continue;\n }\n\n // if a feed has more than 1 sub, don't include pinned posts\n // TODO: add test to check if pinned are filtered\n if (post.pinned && communityKeys.length > 1) {\n continue;\n }\n\n // feedOptions filter function\n if (filter && !filter.filter(post)) {\n continue;\n }\n\n // filter posts older than newerThan option\n if (newerThanTimestamp) {\n if (sortType === \"active\") {\n if ((post.lastReplyTimestamp || post.timestamp) <= newerThanTimestamp) {\n continue;\n }\n } else {\n if (post.timestamp <= newerThanTimestamp) {\n continue;\n }\n }\n }\n\n filteredSortedBufferedFeedPosts.push(post);\n }\n\n feeds[feedName] = filteredSortedBufferedFeedPosts;\n }\n return feeds;\n};\n\nconst getPreloadedPosts = (community: Community, sortType: string) => {\n let preloadedPosts = community.posts?.pages?.[sortType]?.comments;\n if (preloadedPosts) {\n return preloadedPosts;\n }\n const hasPageCids = Object.keys(community.posts?.pageCids || {}).length !== 0;\n if (hasPageCids) {\n return;\n }\n const pages: any[] = Object.values(community.posts?.pages || {});\n if (!pages.length) {\n return;\n }\n const nextCids = pages.map((page: any) => page?.nextCid).filter((nextCid) => !!nextCid);\n if (nextCids.length > 0) {\n return;\n }\n // if has a preloaded page, but no pageCids and no nextCids, it means all posts fit in a single preloaded page\n // so any sort type can be used, and later be resorted by the client\n if (pages[0]?.comments?.length) {\n return pages[0].comments;\n }\n};\n\nexport const getLoadedFeeds = async (\n feedsOptions: FeedsOptions,\n filteredSortedFeeds: Feeds,\n loadedFeeds: Feeds,\n bufferedFeeds: Feeds,\n accounts: Accounts,\n) => {\n const nextLoadedFeeds: Feeds = { ...loadedFeeds };\n let loadedFeedsChanged = false;\n for (const feedName in feedsOptions) {\n const { pageNumber, postsPerPage, accountId } = feedsOptions[feedName];\n const pkc = accounts[accountId]?.pkc;\n const loadedFeedPostCount = pageNumber * postsPerPage;\n const currentLoadedFeed = reconcileLoadedModQueueFeed(\n feedsOptions[feedName],\n loadedFeeds[feedName] || [],\n filteredSortedFeeds[feedName] || [],\n );\n if (currentLoadedFeed !== loadedFeeds[feedName]) {\n nextLoadedFeeds[feedName] = currentLoadedFeed;\n loadedFeedsChanged = true;\n }\n const missingPostsCount =\n loadedFeedPostCount - currentLoadedFeed.filter((post) => post.index === undefined).length;\n\n // get new posts from buffered feed\n const bufferedFeed = bufferedFeeds[feedName] || [];\n\n let missingPosts: any[] = [];\n for (const post of bufferedFeed) {\n if (missingPosts.length >= missingPostsCount) {\n missingPosts = await removeInvalidComments(missingPosts, { validateReplies: false }, pkc);\n // only stop if there were no invalid comments\n if (missingPosts.length >= missingPostsCount) {\n break;\n }\n }\n missingPosts.push(post);\n }\n\n // the current loaded feed already exist and doesn't need new posts\n if (\n missingPosts.length === 0 &&\n loadedFeeds[feedName] &&\n currentLoadedFeed === loadedFeeds[feedName]\n ) {\n continue;\n }\n nextLoadedFeeds[feedName] = [...currentLoadedFeed, ...missingPosts];\n if (missingPosts.length > 0) {\n loadedFeedsChanged = true;\n }\n }\n\n // add account comments\n const accountCommentsChangedFeeds = addAccountsComments(feedsOptions, nextLoadedFeeds);\n\n // do nothing if there are no missing posts\n if (!loadedFeedsChanged && !accountCommentsChangedFeeds) {\n return loadedFeeds;\n }\n return nextLoadedFeeds;\n};\n\nexport const addAccountsComments = (feedsOptions: FeedsOptions, loadedFeeds: Feeds) => {\n let loadedFeedsChanged = false;\n const accountsComments = accountsStore.getState().accountsComments || {};\n for (const feedName in feedsOptions) {\n const { accountId, accountComments: accountCommentsOptions } = feedsOptions[feedName];\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n const { newerThan, append } = accountCommentsOptions || {};\n if (!newerThan) {\n continue;\n }\n const newerThanTimestamp =\n newerThan === Infinity ? 0 : Math.floor(Date.now() / 1000) - newerThan;\n const isNewerThan = (post: Comment) => post.timestamp > newerThanTimestamp;\n\n const accountComments = accountsComments[accountId] || [];\n const accountPosts = accountComments.filter((comment) => {\n // is a reply, not a post\n if (comment.parentCid || comment.depth > 0) {\n return false;\n }\n if (!isNewerThan(comment)) {\n return false;\n }\n return (\n getMatchingCommunityRefKeys(communityRefs, getCommentCommunityAddress(comment)).length > 0\n );\n });\n const validAccountIndices = new Set(accountPosts.map((p) => p.index));\n const accountCidToPost = new Map<string, Comment>();\n for (const p of accountPosts) {\n if (p.cid) accountCidToPost.set(p.cid, p);\n }\n\n let loadedFeed = loadedFeeds[feedName] || [];\n // prune stale local-account entries and replace when cid matches but index changed\n const prunedLoadedFeed: Comment[] = [];\n for (const post of loadedFeed) {\n if (post.index === undefined) {\n prunedLoadedFeed.push(post);\n continue;\n }\n if (!validAccountIndices.has(post.index)) {\n loadedFeedsChanged = true;\n continue;\n }\n if (post.cid) {\n const freshAccountPost = accountCidToPost.get(post.cid);\n if (freshAccountPost && freshAccountPost.index !== post.index) {\n prunedLoadedFeed.push(freshAccountPost);\n loadedFeedsChanged = true;\n continue;\n }\n }\n prunedLoadedFeed.push(post);\n }\n loadedFeed = loadedFeeds[feedName] = prunedLoadedFeed;\n\n if (!accountPosts.length) {\n continue;\n }\n // if a loaded comment doesn't have a cid, then it's pending\n // and pending account comments should always have unique timestamps\n const loadedFeedMap = new Map();\n loadedFeed.forEach((post, loadedFeedIndex) => {\n if (post.cid) loadedFeedMap.set(post.cid, loadedFeedIndex);\n if (post.index) loadedFeedMap.set(post.index, loadedFeedIndex);\n if (!post.cid) loadedFeedMap.set(post.timestamp, loadedFeedIndex);\n });\n for (const accountPost of accountPosts) {\n // account post with cid already added\n if (accountPost.cid && loadedFeedMap.has(accountPost.cid)) {\n continue;\n }\n // account post without cid already added, but now we have the cid\n if (accountPost.cid && loadedFeedMap.has(accountPost.index)) {\n const loadedFeedIndex = loadedFeedMap.get(accountPost.index);\n // update the feed with the accountPost.cid now that we have it\n loadedFeed[loadedFeedIndex] = accountPost;\n loadedFeedsChanged = true;\n continue;\n }\n if (loadedFeedMap.has(accountPost.index)) {\n continue;\n }\n // pending account post without cid already added\n if (!accountPost.cid && loadedFeedMap.has(accountPost.timestamp)) {\n continue;\n }\n if (append) {\n loadedFeed.push(accountPost);\n } else {\n loadedFeed.unshift(accountPost);\n }\n loadedFeedsChanged = true;\n }\n }\n return loadedFeedsChanged;\n};\n\nexport const getBufferedFeedsWithoutLoadedFeeds = (bufferedFeeds: Feeds, loadedFeeds: Feeds) => {\n // contruct a list of posts already loaded to remove them from buffered feeds\n const loadedFeedsPosts: { [key: string]: Set<string> } = {};\n for (const feedName in loadedFeeds) {\n loadedFeedsPosts[feedName] = new Set();\n for (const post of loadedFeeds[feedName]) {\n loadedFeedsPosts[feedName].add(post.cid);\n }\n }\n\n const newBufferedFeeds: Feeds = {};\n for (const feedName in bufferedFeeds) {\n newBufferedFeeds[feedName] = [];\n let bufferedFeedPostChanged = false;\n for (const [i, post] of bufferedFeeds[feedName].entries()) {\n if (loadedFeedsPosts[feedName]?.has(post.cid)) {\n continue;\n }\n newBufferedFeeds[feedName].push(post);\n if (\n !bufferedFeedPostChanged &&\n (newBufferedFeeds[feedName][i]?.cid !== bufferedFeeds[feedName][i]?.cid ||\n (newBufferedFeeds[feedName][i]?.updatedAt || 0) >\n (bufferedFeeds[feedName][i]?.updatedAt || 0))\n ) {\n bufferedFeedPostChanged = true;\n }\n }\n if (\n !bufferedFeedPostChanged &&\n newBufferedFeeds[feedName].length === bufferedFeeds[feedName].length\n ) {\n newBufferedFeeds[feedName] = bufferedFeeds[feedName];\n }\n }\n return newBufferedFeeds;\n};\n\nexport const getUpdatedFeeds = async (\n feedsOptions: FeedsOptions,\n filteredSortedFeeds: Feeds,\n updatedFeeds: Feeds,\n loadedFeeds: Feeds,\n accounts: Accounts,\n) => {\n // contruct a list of posts already loaded to remove them from buffered feeds\n const updatedFeedsPosts: { [feedName: string]: { [postCid: string]: any } } = {};\n for (const feedName in updatedFeeds) {\n updatedFeedsPosts[feedName] = {};\n for (const [index, updatedPost] of updatedFeeds[feedName].entries()) {\n updatedFeedsPosts[feedName][updatedPost.cid] = { index, updatedPost };\n }\n }\n\n const newUpdatedFeeds: Feeds = { ...updatedFeeds };\n for (const feedName in filteredSortedFeeds) {\n const pkc = accounts[feedsOptions[feedName]?.accountId]?.pkc;\n const updatedFeed = [...(updatedFeeds[feedName] || [])];\n const onlyHasNewPosts = updatedFeed.length === 0;\n let updatedFeedChanged = false;\n\n // add new posts from loadedFeed posts\n while (updatedFeed.length < loadedFeeds[feedName].length) {\n updatedFeed[updatedFeed.length] = loadedFeeds[feedName][updatedFeed.length];\n updatedFeedChanged = true;\n }\n\n // add updated post from filteredSortedFeed\n if (!onlyHasNewPosts) {\n const promises = [];\n for (const post of filteredSortedFeeds[feedName]) {\n if (updatedFeedsPosts[feedName]?.[post.cid]) {\n const { index, updatedPost } = updatedFeedsPosts[feedName][post.cid];\n // faster to validate comments async\n promises.push(\n (async () => {\n if (\n (post.updatedAt || 0) > (updatedPost.updatedAt || 0) &&\n (await commentIsValid(post, { validateReplies: false }, pkc))\n ) {\n updatedFeed[index] = post;\n updatedFeedChanged = true;\n }\n })(),\n );\n }\n }\n await Promise.all(promises);\n }\n\n if (updatedFeedChanged) {\n newUpdatedFeeds[feedName] = updatedFeed;\n }\n }\n return newUpdatedFeeds;\n};\n\n// find with communities have posts newer (or ranked higher) than the loaded feeds\n// can be used to display \"new posts in x, y, z subs\" alert, like on twitter\nexport const getFeedsCommunityKeysWithNewerPosts = (\n feedsOptions: FeedsOptions,\n filteredSortedFeeds: Feeds,\n loadedFeeds: Feeds,\n previousFeedsCommunityKeysWithNewerPosts: { [feedName: string]: string[] },\n) => {\n const feedsCommunityKeysWithNewerPosts: { [feedName: string]: string[] } = {};\n for (const feedName in loadedFeeds) {\n const loadedFeed = loadedFeeds[feedName];\n const cidsInLoadedFeed = new Set();\n for (const post of loadedFeed) {\n cidsInLoadedFeed.add(post.cid);\n }\n const communityKeysWithNewerPostsSet = new Set<string>();\n for (const [i, post] of filteredSortedFeeds[feedName].entries()) {\n if (i >= loadedFeed.length) {\n break;\n }\n // if any post in filteredSortedFeeds ranks higher than the loaded feed count, it's a newer post\n if (!cidsInLoadedFeed.has(post.cid)) {\n const postCommunityAddress = getCommentCommunityAddress(post);\n if (postCommunityAddress) {\n getMatchingCommunityRefKeys(\n getFeedCommunityRefs(feedsOptions[feedName] || {}),\n postCommunityAddress,\n ).forEach((communityKey) => communityKeysWithNewerPostsSet.add(communityKey));\n }\n }\n }\n const communityKeysWithNewerPosts = [...communityKeysWithNewerPostsSet];\n\n // don't update the array if the data is the same to avoid rerenders\n const previousCommunityKeysWithNewerPosts =\n previousFeedsCommunityKeysWithNewerPosts[feedName] || [];\n if (\n communityKeysWithNewerPosts.length === previousCommunityKeysWithNewerPosts.length &&\n communityKeysWithNewerPosts.toString() === previousCommunityKeysWithNewerPosts.toString()\n ) {\n feedsCommunityKeysWithNewerPosts[feedName] =\n previousFeedsCommunityKeysWithNewerPosts[feedName];\n } else {\n feedsCommunityKeysWithNewerPosts[feedName] = communityKeysWithNewerPosts;\n }\n }\n return feedsCommunityKeysWithNewerPosts;\n};\n\n// find how many posts are left in each communities in a buffereds feeds\nexport const getFeedsCommunitiesPostCounts = (feedsOptions: FeedsOptions, feeds: Feeds) => {\n const feedsCommunitiesPostCounts: FeedsCommunitiesPostCounts = {};\n for (const feedName in feedsOptions) {\n const communityKeys = getFeedCommunityKeys(feedsOptions[feedName]);\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n feedsCommunitiesPostCounts[feedName] = {};\n for (const communityKey of communityKeys) {\n feedsCommunitiesPostCounts[feedName][communityKey] = 0;\n }\n for (const comment of feeds[feedName] || []) {\n const commentCommunityAddress = getCommentCommunityAddress(comment);\n if (commentCommunityAddress) {\n getMatchingCommunityRefKeys(communityRefs, commentCommunityAddress).forEach(\n (communityKey) => {\n feedsCommunitiesPostCounts[feedName][communityKey] =\n (feedsCommunitiesPostCounts[feedName][communityKey] || 0) + 1;\n },\n );\n }\n }\n }\n return feedsCommunitiesPostCounts;\n};\n\n/**\n * Get which feeds have more posts, i.e. have not reached the final page of all subs\n */\nexport const getFeedsHaveMore = (\n feedsOptions: FeedsOptions,\n bufferedFeeds: Feeds,\n communities: Communities,\n communitiesPages: CommunitiesPages,\n accounts: Accounts,\n) => {\n const feedsHaveMore: { [feedName: string]: boolean } = {};\n feedsLoop: for (const feedName in feedsOptions) {\n // if the feed still has buffered posts, then it still has more\n if (bufferedFeeds[feedName]?.length) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n const communityKeys = getFeedCommunityKeys(feedsOptions[feedName]);\n let { sortType, accountId, modQueue } = feedsOptions[feedName];\n\n let pageType = \"posts\";\n if (modQueue?.[0]) {\n // TODO: allow multiple modQueue at once, fow now only use first in array\n sortType = modQueue[0];\n pageType = \"modQueue\";\n }\n\n communityKeysLoop: for (const [communityIndex, communityKey] of communityKeys.entries()) {\n const community = communities[communityKey];\n const communityRef = communityRefs[communityIndex];\n const isBlockedCommunity = Object.keys(accounts[accountId]?.blockedAddresses || {}).some(\n (blockedAddress) =>\n communityRef && doesAddressMatchCommunityRef(blockedAddress, communityRef, community),\n );\n\n // don't consider the sub if the address is blocked\n if (isBlockedCommunity) {\n continue communityKeysLoop;\n }\n\n // if at least 1 community hasn't loaded yet, then the feed still has more\n if (!community?.updatedAt) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n\n // if at least 1 community has posts cache expired, then the feed still has more\n if (communityPostsCacheExpired(community)) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n\n const firstPageCid = getCommunityFirstPageCid(community, sortType, pageType);\n // TODO: if a loaded community doesn't have a first page, it's unclear what we should do\n // should we try to use another sort type by default, like 'hot', or should we just ignore it?\n // 'continue' to ignore it for now\n if (!firstPageCid) {\n continue communityKeysLoop;\n }\n const pages = getCommunityPages(community, sortType, communitiesPages, pageType, accountId);\n // if first page isn't loaded yet, then the feed still has more\n if (!pages.length) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n const lastPage = pages[pages.length - 1];\n if (lastPage.nextCid) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n }\n\n // if buffered feeds are empty and no last page of any community has a next page, then has more is false\n feedsHaveMore[feedName] = false;\n }\n return feedsHaveMore;\n};\n\n// get all communities pages cids of all feeds, use to check if a communitiesStore change should trigger updateFeeds\nexport const getFeedsCommunities = (feedsOptions: FeedsOptions, communities: Communities) => {\n // find all feeds communities\n const feedsCommunityAddresses = new Set<string>();\n Object.keys(feedsOptions).forEach((i) =>\n getFeedCommunityKeys(feedsOptions[i]).forEach((a) => feedsCommunityAddresses.add(a)),\n );\n\n // use map for performance increase when checking size\n const feedsCommunities = new Map<string, Community>();\n for (const communityAddress of feedsCommunityAddresses) {\n feedsCommunities.set(communityAddress, communities[communityAddress]);\n }\n return feedsCommunities;\n};\n\nexport const feedsCommunitiesChanged = (\n previousFeedsCommunities: Map<string, Community>,\n feedsCommunities: Map<string, Community>,\n) => {\n if (previousFeedsCommunities.size !== feedsCommunities.size) {\n return true;\n }\n for (let communityAddress of previousFeedsCommunities.keys()) {\n // check if the object is still the same\n if (previousFeedsCommunities.get(communityAddress) !== feedsCommunities.get(communityAddress)) {\n return true;\n }\n }\n return false;\n};\n\n// get all communities pages cids of all feeds, use to check if a communitiesStore change should trigger updateFeeds\nexport const getFeedsCommunitiesFirstPageCids = (\n feedsCommunities: Map<string, Community>,\n): string[] => {\n // find all the feeds communities first page cids\n const feedsCommunitiesFirstPageCids = new Set<string>();\n for (const community of feedsCommunities.values()) {\n if (!community?.posts && !community?.modQueue) {\n continue;\n }\n\n // check pages\n if (community.posts?.pages) {\n for (const page of Object.values<CommunityPage>(community.posts.pages)) {\n if (page?.nextCid) {\n feedsCommunitiesFirstPageCids.add(page?.nextCid);\n }\n }\n }\n\n // check pageCids\n if (community.posts?.pageCids) {\n for (const pageCid of Object.values<string>(community.posts.pageCids)) {\n if (pageCid) {\n feedsCommunitiesFirstPageCids.add(pageCid);\n }\n }\n }\n\n // TODO: would be more performant to only check modQueue if there's a feedOptions with modQueue\n if (community.modQueue?.pageCids) {\n for (const pageCid of Object.values<string>(community.modQueue.pageCids)) {\n if (pageCid) {\n feedsCommunitiesFirstPageCids.add(pageCid);\n }\n }\n }\n }\n\n return [...feedsCommunitiesFirstPageCids].sort();\n};\n\n// get all communities posts pages first post updatedAts, use to check if a communitiesStore change should trigger updateFeeds\nexport const getFeedsCommunitiesPostsPagesFirstUpdatedAts = (\n feedsCommunities: Map<string, Community>,\n): string => {\n let feedsCommunitiesPostsPagesFirstUpdatedAts = \"\";\n for (const community of feedsCommunities.values()) {\n for (const page of Object.values<CommunityPage>(community?.posts?.pages || {})) {\n if (page?.comments?.[0]?.updatedAt) {\n feedsCommunitiesPostsPagesFirstUpdatedAts +=\n page.comments[0].cid + page.comments[0].updatedAt;\n }\n }\n }\n return feedsCommunitiesPostsPagesFirstUpdatedAts;\n};\n\n// get number of feeds community that are loaded\nexport const getFeedsCommunitiesLoadedCount = (\n feedsCommunities: Map<string, Community>,\n): number => {\n let count = 0;\n for (const community of feedsCommunities.values()) {\n if (community?.updatedAt) {\n count++;\n }\n }\n return count;\n};\n\nexport const getAccountsBlockedAddresses = (accounts: Accounts) => {\n const blockedAddressesSet = new Set<string>();\n for (const { blockedAddresses } of Object.values(accounts)) {\n for (const address in blockedAddresses) {\n if (blockedAddresses[address]) {\n blockedAddressesSet.add(address);\n }\n }\n }\n return [...blockedAddressesSet].sort();\n};\n\nexport const accountsBlockedAddressesChanged = (\n previousAccountsBlockedAddresses: { [address: string]: boolean }[],\n accountsBlockedAddresses: { [address: string]: boolean }[],\n) => {\n if (previousAccountsBlockedAddresses.length !== accountsBlockedAddresses.length) {\n return true;\n }\n for (const i in previousAccountsBlockedAddresses) {\n // check if the object is still the same\n if (previousAccountsBlockedAddresses[i] !== accountsBlockedAddresses[i]) {\n return true;\n }\n }\n return false;\n};\n\nexport const feedsHaveChangedBlockedAddresses = (\n feedsOptions: FeedsOptions,\n bufferedFeeds: Feeds,\n blockedAddresses: string[],\n previousBlockedAddresses: string[],\n) => {\n // find the difference between current and previous blocked addresses\n const changedBlockedAddresses = blockedAddresses\n .filter((x) => !previousBlockedAddresses.includes(x))\n .concat(previousBlockedAddresses.filter((x) => !blockedAddresses.includes(x)));\n\n // if changed blocked addresses arent used in the feeds, do nothing\n for (const address of changedBlockedAddresses) {\n for (const feedName in feedsOptions) {\n const feedOptions = feedsOptions[feedName];\n if (\n getMatchingCommunityRefKeys(getFeedCommunityRefs(feedOptions), address).some(\n (communityKey) => getFeedCommunityKeys(feedOptions).includes(communityKey),\n )\n ) {\n return true;\n }\n }\n }\n\n // feeds posts author addresses have a changed blocked address\n // NOTE: because of this, if an author address is unblocked, feeds won't update until some other event causes a feed update\n // it seems preferable to causing unnecessary rerenders every time an unused block event occurs\n const changedBlockedAddressesSet = new Set(changedBlockedAddresses);\n for (const feedName in bufferedFeeds) {\n for (const post of bufferedFeeds[feedName] || []) {\n if (post?.author?.address && changedBlockedAddressesSet.has(post.author.address)) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const getAccountsBlockedCids = (accounts: Accounts) => {\n const blockedCidsSet = new Set<string>();\n for (const { blockedCids } of Object.values(accounts)) {\n for (const address in blockedCids) {\n if (blockedCids[address]) {\n blockedCidsSet.add(address);\n }\n }\n }\n return [...blockedCidsSet].sort();\n};\n\nexport const accountsBlockedCidsChanged = (\n previousAccountsBlockedCids: { [address: string]: boolean }[],\n accountsBlockedCids: { [address: string]: boolean }[],\n) => {\n if (previousAccountsBlockedCids.length !== accountsBlockedCids.length) {\n return true;\n }\n for (const i in previousAccountsBlockedCids) {\n // check if the object is still the same\n if (previousAccountsBlockedCids[i] !== accountsBlockedCids[i]) {\n return true;\n }\n }\n return false;\n};\n\nexport const feedsHaveChangedBlockedCids = (\n feedsOptions: FeedsOptions,\n bufferedFeeds: Feeds,\n blockedCids: string[],\n previousBlockedCids: string[],\n) => {\n // find the difference between current and previous blocked addresses\n const changedBlockedCids = blockedCids\n .filter((x) => !previousBlockedCids.includes(x))\n .concat(previousBlockedCids.filter((x) => !blockedCids.includes(x)));\n\n // feeds posts author addresses have a changed blocked address\n // NOTE: because of this, if a cid is unblocked, feeds won't update until some other event causes a feed update\n // it seems preferable to causing unnecessary rerenders every time an unused block event occurs\n const changedBlockedCidsSet = new Set(changedBlockedCids);\n for (const feedName in bufferedFeeds) {\n for (const post of bufferedFeeds[feedName] || []) {\n if (post?.cid && changedBlockedCidsSet.has(post?.cid)) {\n return true;\n }\n }\n }\n\n return false;\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/stores/feeds/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"assert\";\nimport {\n Comment,\n Feed,\n Feeds,\n FeedOptions,\n FeedsOptions,\n Community,\n Communities,\n Account,\n Accounts,\n CommunityPage,\n CommunitiesPages,\n FeedsCommunitiesPostCounts,\n} from \"../../types\";\nimport { getCommunityPages, getCommunityFirstPageCid } from \"../communities-pages\";\nimport accountsStore from \"../accounts\";\nimport feedSorter from \"./feed-sorter\";\nimport { communityPostsCacheExpired, commentIsValid, removeInvalidComments } from \"../../lib/utils\";\nimport { getCommentCommunityAddress, normalizeCommentCommunityAddress } from \"../../lib/pkc-compat\";\nimport {\n CommunityLookupRef,\n doesAddressMatchCommunityRef,\n getCommunityRefKeys,\n getMatchingCommunityRefKeys,\n} from \"../../lib/community-ref\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:feeds:stores\");\n\nconst getFeedCommunityRefs = (feedOptions: Partial<FeedOptions>): CommunityLookupRef[] =>\n feedOptions.communities || [];\n\nconst getFeedCommunityKeys = (feedOptions: Partial<FeedOptions>) =>\n feedOptions.communityKeys || getCommunityRefKeys(getFeedCommunityRefs(feedOptions));\n\nconst getCommentFreshness = (comment: Comment | undefined) =>\n Math.max(comment?.updatedAt ?? 0, comment?.timestamp ?? 0, 0);\n\nconst commentMatchesModQueue = (comment: Comment | undefined, modQueue?: string[]) => {\n const modQueueName = modQueue?.[0];\n if (!modQueueName) {\n return true;\n }\n if (modQueueName === \"pendingApproval\") {\n return comment?.pendingApproval === true;\n }\n return true;\n};\n\nconst getFeedPost = (\n post: Comment,\n communityRef: CommunityLookupRef,\n community: Community,\n modQueue?: string[],\n freshestComments?: { [commentCid: string]: Comment },\n) => {\n const normalizedPost = normalizeCommentCommunityAddress(post) as Comment;\n const freshestComment = post.cid\n ? normalizeCommentCommunityAddress(freshestComments?.[post.cid])\n : undefined;\n const postCommunityAddress = getCommentCommunityAddress(normalizedPost);\n if (!doesAddressMatchCommunityRef(postCommunityAddress, communityRef, community)) {\n return;\n }\n if (!commentMatchesModQueue(normalizedPost, modQueue)) {\n return;\n }\n if (\n !freshestComment ||\n getCommentFreshness(freshestComment) <= getCommentFreshness(normalizedPost)\n ) {\n return normalizedPost;\n }\n if (!commentMatchesModQueue(freshestComment, modQueue)) {\n return;\n }\n if (\n !doesAddressMatchCommunityRef(\n getCommentCommunityAddress(freshestComment),\n communityRef,\n community,\n )\n ) {\n return;\n }\n return freshestComment;\n};\n\nconst reconcileLoadedModQueueFeed = (\n feedOptions: FeedOptions,\n loadedFeed: Feed,\n filteredSortedFeed: Feed,\n) => {\n if (!feedOptions?.modQueue?.[0] || !loadedFeed?.length) {\n return loadedFeed;\n }\n\n const filteredSortedFeedByCid = new Map<string, Comment>();\n for (const post of filteredSortedFeed) {\n if (post.cid) {\n filteredSortedFeedByCid.set(post.cid, post);\n }\n }\n\n let changed = false;\n const nextLoadedFeed: Comment[] = [];\n for (const post of loadedFeed) {\n if (!post.cid) {\n nextLoadedFeed.push(post);\n continue;\n }\n\n const sourcePost = filteredSortedFeedByCid.get(post.cid);\n if (!sourcePost) {\n changed = true;\n continue;\n }\n\n if (getCommentFreshness(sourcePost) > getCommentFreshness(post)) {\n nextLoadedFeed.push(sourcePost);\n changed = true;\n continue;\n }\n\n nextLoadedFeed.push(post);\n }\n\n return changed ? nextLoadedFeed : loadedFeed;\n};\n\n/**\n * Calculate the feeds from all the loaded community pages, filter and sort them\n */\nexport const getFilteredSortedFeeds = (\n feedsOptions: FeedsOptions,\n communities: Communities,\n communitiesPages: CommunitiesPages,\n accounts: Accounts,\n freshestComments?: { [commentCid: string]: Comment },\n) => {\n // calculate each feed\n let feeds: Feeds = {};\n for (const feedName in feedsOptions) {\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n const communityKeys = getFeedCommunityKeys(feedsOptions[feedName]);\n let { sortType, accountId, filter, newerThan, modQueue } = feedsOptions[feedName];\n const newerThanTimestamp = newerThan ? Math.floor(Date.now() / 1000) - newerThan : undefined;\n\n let pageType = \"posts\";\n if (modQueue?.[0]) {\n // TODO: allow multiple modQueue at once, fow now only use first in array\n sortType = modQueue[0];\n pageType = \"modQueue\";\n }\n\n // find all fetched posts\n const bufferedFeedPosts = [];\n\n // add each comment from each page, do not filter at this stage, filter after sorting\n for (const [communityIndex, communityKey] of communityKeys.entries()) {\n const communityRef = communityRefs[communityIndex];\n // community hasn't loaded yet\n const community = communities[communityKey];\n if (!community || !communityRef) {\n continue;\n }\n\n // if cache is expired and has internet access, don't use, wait for next community update\n if (communityPostsCacheExpired(community) && window.navigator.onLine) {\n continue;\n }\n\n // use community preloaded posts if any\n const preloadedPosts = getPreloadedPosts(community, sortType);\n if (preloadedPosts) {\n for (const post of preloadedPosts) {\n // posts are manually validated, could have fake communityAddress\n if (\n !doesAddressMatchCommunityRef(getCommentCommunityAddress(post), communityRef, community)\n ) {\n break;\n }\n const nextPost = getFeedPost(post, communityRef, community, modQueue, freshestComments);\n if (nextPost) {\n bufferedFeedPosts.push(nextPost);\n }\n }\n }\n\n // add all posts from community pages\n const communityPages = getCommunityPages(\n community,\n sortType,\n communitiesPages,\n pageType,\n accountId,\n );\n for (const communityPage of communityPages) {\n if (communityPage?.comments) {\n for (const post of communityPage.comments) {\n // posts are manually validated, could have fake communityAddress\n if (\n !doesAddressMatchCommunityRef(\n getCommentCommunityAddress(post),\n communityRef,\n community,\n )\n ) {\n break;\n }\n const nextPost = getFeedPost(post, communityRef, community, modQueue, freshestComments);\n if (nextPost) {\n bufferedFeedPosts.push(nextPost);\n }\n }\n }\n }\n }\n\n // sort the feed before filtering to get more accurate results\n const originalSortType = feedsOptions[feedName].sortType;\n const sortedBufferedFeedPosts = feedSorter.sort(originalSortType, bufferedFeedPosts);\n\n // filter the feed\n const filteredSortedBufferedFeedPosts = [];\n for (const post of sortedBufferedFeedPosts) {\n // address is blocked\n if (\n accounts[accountId]?.blockedAddresses[getCommentCommunityAddress(post) || \"\"] ||\n (post.author?.address && accounts[accountId]?.blockedAddresses[post.author.address])\n ) {\n continue;\n }\n\n // comment cid is blocked\n if (accounts[accountId]?.blockedCids[post.cid]) {\n continue;\n }\n\n // if a feed has more than 1 sub, don't include pinned posts\n // TODO: add test to check if pinned are filtered\n if (post.pinned && communityKeys.length > 1) {\n continue;\n }\n\n // feedOptions filter function\n if (filter && !filter.filter(post)) {\n continue;\n }\n\n // filter posts older than newerThan option\n if (newerThanTimestamp) {\n if (sortType === \"active\") {\n if ((post.lastReplyTimestamp || post.timestamp) <= newerThanTimestamp) {\n continue;\n }\n } else {\n if (post.timestamp <= newerThanTimestamp) {\n continue;\n }\n }\n }\n\n filteredSortedBufferedFeedPosts.push(post);\n }\n\n feeds[feedName] = filteredSortedBufferedFeedPosts;\n }\n return feeds;\n};\n\nconst getPreloadedPosts = (community: Community, sortType: string) => {\n let preloadedPosts = community.posts?.pages?.[sortType]?.comments;\n if (preloadedPosts) {\n return preloadedPosts;\n }\n const hasPageCids = Object.keys(community.posts?.pageCids || {}).length !== 0;\n if (hasPageCids) {\n return;\n }\n const pages: any[] = Object.values(community.posts?.pages || {});\n if (!pages.length) {\n return;\n }\n const nextCids = pages.map((page: any) => page?.nextCid).filter((nextCid) => !!nextCid);\n if (nextCids.length > 0) {\n return;\n }\n // if has a preloaded page, but no pageCids and no nextCids, it means all posts fit in a single preloaded page\n // so any sort type can be used, and later be resorted by the client\n if (pages[0]?.comments?.length) {\n return pages[0].comments;\n }\n};\n\nexport const getLoadedFeeds = async (\n feedsOptions: FeedsOptions,\n filteredSortedFeeds: Feeds,\n loadedFeeds: Feeds,\n bufferedFeeds: Feeds,\n accounts: Accounts,\n) => {\n const nextLoadedFeeds: Feeds = { ...loadedFeeds };\n let loadedFeedsChanged = false;\n for (const feedName in feedsOptions) {\n const { pageNumber, postsPerPage, accountId } = feedsOptions[feedName];\n const pkc = accounts[accountId]?.pkc;\n const loadedFeedPostCount = pageNumber * postsPerPage;\n const currentLoadedFeed = reconcileLoadedModQueueFeed(\n feedsOptions[feedName],\n loadedFeeds[feedName] || [],\n filteredSortedFeeds[feedName] || [],\n );\n if (currentLoadedFeed !== loadedFeeds[feedName]) {\n nextLoadedFeeds[feedName] = currentLoadedFeed;\n loadedFeedsChanged = true;\n }\n const missingPostsCount =\n loadedFeedPostCount - currentLoadedFeed.filter((post) => post.index === undefined).length;\n\n // get new posts from buffered feed\n const bufferedFeed = bufferedFeeds[feedName] || [];\n\n let missingPosts: any[] = [];\n for (const post of bufferedFeed) {\n if (missingPosts.length >= missingPostsCount) {\n missingPosts = await removeInvalidComments(missingPosts, { validateReplies: false }, pkc);\n // only stop if there were no invalid comments\n if (missingPosts.length >= missingPostsCount) {\n break;\n }\n }\n missingPosts.push(post);\n }\n\n // the current loaded feed already exist and doesn't need new posts\n if (\n missingPosts.length === 0 &&\n loadedFeeds[feedName] &&\n currentLoadedFeed === loadedFeeds[feedName]\n ) {\n continue;\n }\n nextLoadedFeeds[feedName] = [...currentLoadedFeed, ...missingPosts];\n if (missingPosts.length > 0) {\n loadedFeedsChanged = true;\n }\n }\n\n // add account comments\n const accountCommentsChangedFeeds = addAccountsComments(feedsOptions, nextLoadedFeeds);\n\n // do nothing if there are no missing posts\n if (!loadedFeedsChanged && !accountCommentsChangedFeeds) {\n return loadedFeeds;\n }\n return nextLoadedFeeds;\n};\n\nconst getApprovalPublicationKey = (comment: Comment) =>\n [\n comment.timestamp ?? \"\",\n comment.parentCid ?? \"\",\n comment.postCid ?? \"\",\n getCommentCommunityAddress(comment) ?? \"\",\n comment.author?.address ?? \"\",\n comment.title ?? \"\",\n comment.content ?? \"\",\n comment.link ?? \"\",\n ].join(\"\\0\");\n\nexport const addAccountsComments = (feedsOptions: FeedsOptions, loadedFeeds: Feeds) => {\n let loadedFeedsChanged = false;\n const accountsComments = accountsStore.getState().accountsComments || {};\n for (const feedName in feedsOptions) {\n const { accountId, accountComments: accountCommentsOptions } = feedsOptions[feedName];\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n const { newerThan, append } = accountCommentsOptions || {};\n if (!newerThan) {\n continue;\n }\n const newerThanTimestamp =\n newerThan === Infinity ? 0 : Math.floor(Date.now() / 1000) - newerThan;\n const isNewerThan = (post: Comment) => post.timestamp > newerThanTimestamp;\n\n const accountComments = accountsComments[accountId] || [];\n const accountPosts = accountComments.filter((comment) => {\n // is a reply, not a post\n if (comment.parentCid || comment.depth > 0) {\n return false;\n }\n if (!isNewerThan(comment)) {\n return false;\n }\n return (\n getMatchingCommunityRefKeys(communityRefs, getCommentCommunityAddress(comment)).length > 0\n );\n });\n const validAccountIndices = new Set(accountPosts.map((p) => p.index));\n const accountCidToPost = new Map<string, Comment>();\n for (const p of accountPosts) {\n if (p.cid) accountCidToPost.set(p.cid, p);\n }\n\n let loadedFeed = loadedFeeds[feedName] || [];\n const approvedPublicationKeys = new Set(\n loadedFeed\n .filter((post) => post.pendingApproval !== true)\n .map((post) => getApprovalPublicationKey(post)),\n );\n // prune stale local-account entries and replace when cid matches but index changed\n const prunedLoadedFeed: Comment[] = [];\n for (const post of loadedFeed) {\n if (post.index === undefined) {\n prunedLoadedFeed.push(post);\n continue;\n }\n if (\n post.pendingApproval === true &&\n approvedPublicationKeys.has(getApprovalPublicationKey(post))\n ) {\n loadedFeedsChanged = true;\n continue;\n }\n if (!validAccountIndices.has(post.index)) {\n loadedFeedsChanged = true;\n continue;\n }\n if (post.cid) {\n const freshAccountPost = accountCidToPost.get(post.cid);\n if (freshAccountPost && freshAccountPost.index !== post.index) {\n prunedLoadedFeed.push(freshAccountPost);\n loadedFeedsChanged = true;\n continue;\n }\n }\n prunedLoadedFeed.push(post);\n }\n loadedFeed = loadedFeeds[feedName] = prunedLoadedFeed;\n\n if (!accountPosts.length) {\n continue;\n }\n // if a loaded comment doesn't have a cid, then it's pending\n // and pending account comments should always have unique timestamps\n const loadedFeedMap = new Map();\n loadedFeed.forEach((post, loadedFeedIndex) => {\n if (post.cid) loadedFeedMap.set(post.cid, loadedFeedIndex);\n if (typeof post.index === \"number\") loadedFeedMap.set(post.index, loadedFeedIndex);\n if (!post.cid) loadedFeedMap.set(post.timestamp, loadedFeedIndex);\n if (post.pendingApproval !== true) {\n loadedFeedMap.set(getApprovalPublicationKey(post), loadedFeedIndex);\n }\n });\n for (const accountPost of accountPosts) {\n // account post with cid already added\n if (accountPost.cid && loadedFeedMap.has(accountPost.cid)) {\n continue;\n }\n if (\n accountPost.pendingApproval === true &&\n loadedFeedMap.has(getApprovalPublicationKey(accountPost))\n ) {\n continue;\n }\n // account post without cid already added, but now we have the cid\n if (accountPost.cid && loadedFeedMap.has(accountPost.index)) {\n const loadedFeedIndex = loadedFeedMap.get(accountPost.index);\n // update the feed with the accountPost.cid now that we have it\n loadedFeed[loadedFeedIndex] = accountPost;\n loadedFeedsChanged = true;\n continue;\n }\n if (loadedFeedMap.has(accountPost.index)) {\n continue;\n }\n // pending account post without cid already added\n if (!accountPost.cid && loadedFeedMap.has(accountPost.timestamp)) {\n continue;\n }\n if (append) {\n loadedFeed.push(accountPost);\n } else {\n loadedFeed.unshift(accountPost);\n }\n loadedFeedsChanged = true;\n }\n }\n return loadedFeedsChanged;\n};\n\nexport const getBufferedFeedsWithoutLoadedFeeds = (bufferedFeeds: Feeds, loadedFeeds: Feeds) => {\n // contruct a list of posts already loaded to remove them from buffered feeds\n const loadedFeedsPosts: { [key: string]: Set<string> } = {};\n for (const feedName in loadedFeeds) {\n loadedFeedsPosts[feedName] = new Set();\n for (const post of loadedFeeds[feedName]) {\n loadedFeedsPosts[feedName].add(post.cid);\n }\n }\n\n const newBufferedFeeds: Feeds = {};\n for (const feedName in bufferedFeeds) {\n newBufferedFeeds[feedName] = [];\n let bufferedFeedPostChanged = false;\n for (const [i, post] of bufferedFeeds[feedName].entries()) {\n if (loadedFeedsPosts[feedName]?.has(post.cid)) {\n continue;\n }\n newBufferedFeeds[feedName].push(post);\n if (\n !bufferedFeedPostChanged &&\n (newBufferedFeeds[feedName][i]?.cid !== bufferedFeeds[feedName][i]?.cid ||\n (newBufferedFeeds[feedName][i]?.updatedAt || 0) >\n (bufferedFeeds[feedName][i]?.updatedAt || 0))\n ) {\n bufferedFeedPostChanged = true;\n }\n }\n if (\n !bufferedFeedPostChanged &&\n newBufferedFeeds[feedName].length === bufferedFeeds[feedName].length\n ) {\n newBufferedFeeds[feedName] = bufferedFeeds[feedName];\n }\n }\n return newBufferedFeeds;\n};\n\nexport const getUpdatedFeeds = async (\n feedsOptions: FeedsOptions,\n filteredSortedFeeds: Feeds,\n updatedFeeds: Feeds,\n loadedFeeds: Feeds,\n accounts: Accounts,\n) => {\n // contruct a list of posts already loaded to remove them from buffered feeds\n const updatedFeedsPosts: { [feedName: string]: { [postCid: string]: any } } = {};\n for (const feedName in updatedFeeds) {\n updatedFeedsPosts[feedName] = {};\n for (const [index, updatedPost] of updatedFeeds[feedName].entries()) {\n updatedFeedsPosts[feedName][updatedPost.cid] = { index, updatedPost };\n }\n }\n\n const newUpdatedFeeds: Feeds = { ...updatedFeeds };\n for (const feedName in filteredSortedFeeds) {\n const pkc = accounts[feedsOptions[feedName]?.accountId]?.pkc;\n const updatedFeed = [...(updatedFeeds[feedName] || [])];\n const onlyHasNewPosts = updatedFeed.length === 0;\n let updatedFeedChanged = false;\n\n // add new posts from loadedFeed posts\n while (updatedFeed.length < loadedFeeds[feedName].length) {\n updatedFeed[updatedFeed.length] = loadedFeeds[feedName][updatedFeed.length];\n updatedFeedChanged = true;\n }\n\n // add updated post from filteredSortedFeed\n if (!onlyHasNewPosts) {\n const promises = [];\n for (const post of filteredSortedFeeds[feedName]) {\n if (updatedFeedsPosts[feedName]?.[post.cid]) {\n const { index, updatedPost } = updatedFeedsPosts[feedName][post.cid];\n // faster to validate comments async\n promises.push(\n (async () => {\n if (\n (post.updatedAt || 0) > (updatedPost.updatedAt || 0) &&\n (await commentIsValid(post, { validateReplies: false }, pkc))\n ) {\n updatedFeed[index] = post;\n updatedFeedChanged = true;\n }\n })(),\n );\n }\n }\n await Promise.all(promises);\n }\n\n if (updatedFeedChanged) {\n newUpdatedFeeds[feedName] = updatedFeed;\n }\n }\n return newUpdatedFeeds;\n};\n\n// find with communities have posts newer (or ranked higher) than the loaded feeds\n// can be used to display \"new posts in x, y, z subs\" alert, like on twitter\nexport const getFeedsCommunityKeysWithNewerPosts = (\n feedsOptions: FeedsOptions,\n filteredSortedFeeds: Feeds,\n loadedFeeds: Feeds,\n previousFeedsCommunityKeysWithNewerPosts: { [feedName: string]: string[] },\n) => {\n const feedsCommunityKeysWithNewerPosts: { [feedName: string]: string[] } = {};\n for (const feedName in loadedFeeds) {\n const loadedFeed = loadedFeeds[feedName];\n const cidsInLoadedFeed = new Set();\n for (const post of loadedFeed) {\n cidsInLoadedFeed.add(post.cid);\n }\n const communityKeysWithNewerPostsSet = new Set<string>();\n for (const [i, post] of filteredSortedFeeds[feedName].entries()) {\n if (i >= loadedFeed.length) {\n break;\n }\n // if any post in filteredSortedFeeds ranks higher than the loaded feed count, it's a newer post\n if (!cidsInLoadedFeed.has(post.cid)) {\n const postCommunityAddress = getCommentCommunityAddress(post);\n if (postCommunityAddress) {\n getMatchingCommunityRefKeys(\n getFeedCommunityRefs(feedsOptions[feedName] || {}),\n postCommunityAddress,\n ).forEach((communityKey) => communityKeysWithNewerPostsSet.add(communityKey));\n }\n }\n }\n const communityKeysWithNewerPosts = [...communityKeysWithNewerPostsSet];\n\n // don't update the array if the data is the same to avoid rerenders\n const previousCommunityKeysWithNewerPosts =\n previousFeedsCommunityKeysWithNewerPosts[feedName] || [];\n if (\n communityKeysWithNewerPosts.length === previousCommunityKeysWithNewerPosts.length &&\n communityKeysWithNewerPosts.toString() === previousCommunityKeysWithNewerPosts.toString()\n ) {\n feedsCommunityKeysWithNewerPosts[feedName] =\n previousFeedsCommunityKeysWithNewerPosts[feedName];\n } else {\n feedsCommunityKeysWithNewerPosts[feedName] = communityKeysWithNewerPosts;\n }\n }\n return feedsCommunityKeysWithNewerPosts;\n};\n\n// find how many posts are left in each communities in a buffereds feeds\nexport const getFeedsCommunitiesPostCounts = (feedsOptions: FeedsOptions, feeds: Feeds) => {\n const feedsCommunitiesPostCounts: FeedsCommunitiesPostCounts = {};\n for (const feedName in feedsOptions) {\n const communityKeys = getFeedCommunityKeys(feedsOptions[feedName]);\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n feedsCommunitiesPostCounts[feedName] = {};\n for (const communityKey of communityKeys) {\n feedsCommunitiesPostCounts[feedName][communityKey] = 0;\n }\n for (const comment of feeds[feedName] || []) {\n const commentCommunityAddress = getCommentCommunityAddress(comment);\n if (commentCommunityAddress) {\n getMatchingCommunityRefKeys(communityRefs, commentCommunityAddress).forEach(\n (communityKey) => {\n feedsCommunitiesPostCounts[feedName][communityKey] =\n (feedsCommunitiesPostCounts[feedName][communityKey] || 0) + 1;\n },\n );\n }\n }\n }\n return feedsCommunitiesPostCounts;\n};\n\n/**\n * Get which feeds have more posts, i.e. have not reached the final page of all subs\n */\nexport const getFeedsHaveMore = (\n feedsOptions: FeedsOptions,\n bufferedFeeds: Feeds,\n communities: Communities,\n communitiesPages: CommunitiesPages,\n accounts: Accounts,\n) => {\n const feedsHaveMore: { [feedName: string]: boolean } = {};\n feedsLoop: for (const feedName in feedsOptions) {\n // if the feed still has buffered posts, then it still has more\n if (bufferedFeeds[feedName]?.length) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n\n const communityRefs = getFeedCommunityRefs(feedsOptions[feedName]);\n const communityKeys = getFeedCommunityKeys(feedsOptions[feedName]);\n let { sortType, accountId, modQueue } = feedsOptions[feedName];\n\n let pageType = \"posts\";\n if (modQueue?.[0]) {\n // TODO: allow multiple modQueue at once, fow now only use first in array\n sortType = modQueue[0];\n pageType = \"modQueue\";\n }\n\n communityKeysLoop: for (const [communityIndex, communityKey] of communityKeys.entries()) {\n const community = communities[communityKey];\n const communityRef = communityRefs[communityIndex];\n const isBlockedCommunity = Object.keys(accounts[accountId]?.blockedAddresses || {}).some(\n (blockedAddress) =>\n communityRef && doesAddressMatchCommunityRef(blockedAddress, communityRef, community),\n );\n\n // don't consider the sub if the address is blocked\n if (isBlockedCommunity) {\n continue communityKeysLoop;\n }\n\n // if at least 1 community hasn't loaded yet, then the feed still has more\n if (!community?.updatedAt) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n\n // if at least 1 community has posts cache expired, then the feed still has more\n if (communityPostsCacheExpired(community)) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n\n const firstPageCid = getCommunityFirstPageCid(community, sortType, pageType);\n // TODO: if a loaded community doesn't have a first page, it's unclear what we should do\n // should we try to use another sort type by default, like 'hot', or should we just ignore it?\n // 'continue' to ignore it for now\n if (!firstPageCid) {\n continue communityKeysLoop;\n }\n const pages = getCommunityPages(community, sortType, communitiesPages, pageType, accountId);\n // if first page isn't loaded yet, then the feed still has more\n if (!pages.length) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n const lastPage = pages[pages.length - 1];\n if (lastPage.nextCid) {\n feedsHaveMore[feedName] = true;\n continue feedsLoop;\n }\n }\n\n // if buffered feeds are empty and no last page of any community has a next page, then has more is false\n feedsHaveMore[feedName] = false;\n }\n return feedsHaveMore;\n};\n\n// get all communities pages cids of all feeds, use to check if a communitiesStore change should trigger updateFeeds\nexport const getFeedsCommunities = (feedsOptions: FeedsOptions, communities: Communities) => {\n // find all feeds communities\n const feedsCommunityAddresses = new Set<string>();\n Object.keys(feedsOptions).forEach((i) =>\n getFeedCommunityKeys(feedsOptions[i]).forEach((a) => feedsCommunityAddresses.add(a)),\n );\n\n // use map for performance increase when checking size\n const feedsCommunities = new Map<string, Community>();\n for (const communityAddress of feedsCommunityAddresses) {\n feedsCommunities.set(communityAddress, communities[communityAddress]);\n }\n return feedsCommunities;\n};\n\nexport const feedsCommunitiesChanged = (\n previousFeedsCommunities: Map<string, Community>,\n feedsCommunities: Map<string, Community>,\n) => {\n if (previousFeedsCommunities.size !== feedsCommunities.size) {\n return true;\n }\n for (let communityAddress of previousFeedsCommunities.keys()) {\n // check if the object is still the same\n if (previousFeedsCommunities.get(communityAddress) !== feedsCommunities.get(communityAddress)) {\n return true;\n }\n }\n return false;\n};\n\n// get all communities pages cids of all feeds, use to check if a communitiesStore change should trigger updateFeeds\nexport const getFeedsCommunitiesFirstPageCids = (\n feedsCommunities: Map<string, Community>,\n): string[] => {\n // find all the feeds communities first page cids\n const feedsCommunitiesFirstPageCids = new Set<string>();\n for (const community of feedsCommunities.values()) {\n if (!community?.posts && !community?.modQueue) {\n continue;\n }\n\n // check pages\n if (community.posts?.pages) {\n for (const page of Object.values<CommunityPage>(community.posts.pages)) {\n if (page?.nextCid) {\n feedsCommunitiesFirstPageCids.add(page?.nextCid);\n }\n }\n }\n\n // check pageCids\n if (community.posts?.pageCids) {\n for (const pageCid of Object.values<string>(community.posts.pageCids)) {\n if (pageCid) {\n feedsCommunitiesFirstPageCids.add(pageCid);\n }\n }\n }\n\n // TODO: would be more performant to only check modQueue if there's a feedOptions with modQueue\n if (community.modQueue?.pageCids) {\n for (const pageCid of Object.values<string>(community.modQueue.pageCids)) {\n if (pageCid) {\n feedsCommunitiesFirstPageCids.add(pageCid);\n }\n }\n }\n }\n\n return [...feedsCommunitiesFirstPageCids].sort();\n};\n\n// get all communities posts pages first post updatedAts, use to check if a communitiesStore change should trigger updateFeeds\nexport const getFeedsCommunitiesPostsPagesFirstUpdatedAts = (\n feedsCommunities: Map<string, Community>,\n): string => {\n let feedsCommunitiesPostsPagesFirstUpdatedAts = \"\";\n for (const community of feedsCommunities.values()) {\n for (const page of Object.values<CommunityPage>(community?.posts?.pages || {})) {\n if (page?.comments?.[0]?.updatedAt) {\n feedsCommunitiesPostsPagesFirstUpdatedAts +=\n page.comments[0].cid + page.comments[0].updatedAt;\n }\n }\n }\n return feedsCommunitiesPostsPagesFirstUpdatedAts;\n};\n\n// get number of feeds community that are loaded\nexport const getFeedsCommunitiesLoadedCount = (\n feedsCommunities: Map<string, Community>,\n): number => {\n let count = 0;\n for (const community of feedsCommunities.values()) {\n if (community?.updatedAt) {\n count++;\n }\n }\n return count;\n};\n\nexport const getAccountsBlockedAddresses = (accounts: Accounts) => {\n const blockedAddressesSet = new Set<string>();\n for (const { blockedAddresses } of Object.values(accounts)) {\n for (const address in blockedAddresses) {\n if (blockedAddresses[address]) {\n blockedAddressesSet.add(address);\n }\n }\n }\n return [...blockedAddressesSet].sort();\n};\n\nexport const accountsBlockedAddressesChanged = (\n previousAccountsBlockedAddresses: { [address: string]: boolean }[],\n accountsBlockedAddresses: { [address: string]: boolean }[],\n) => {\n if (previousAccountsBlockedAddresses.length !== accountsBlockedAddresses.length) {\n return true;\n }\n for (const i in previousAccountsBlockedAddresses) {\n // check if the object is still the same\n if (previousAccountsBlockedAddresses[i] !== accountsBlockedAddresses[i]) {\n return true;\n }\n }\n return false;\n};\n\nexport const feedsHaveChangedBlockedAddresses = (\n feedsOptions: FeedsOptions,\n bufferedFeeds: Feeds,\n blockedAddresses: string[],\n previousBlockedAddresses: string[],\n) => {\n // find the difference between current and previous blocked addresses\n const changedBlockedAddresses = blockedAddresses\n .filter((x) => !previousBlockedAddresses.includes(x))\n .concat(previousBlockedAddresses.filter((x) => !blockedAddresses.includes(x)));\n\n // if changed blocked addresses arent used in the feeds, do nothing\n for (const address of changedBlockedAddresses) {\n for (const feedName in feedsOptions) {\n const feedOptions = feedsOptions[feedName];\n if (\n getMatchingCommunityRefKeys(getFeedCommunityRefs(feedOptions), address).some(\n (communityKey) => getFeedCommunityKeys(feedOptions).includes(communityKey),\n )\n ) {\n return true;\n }\n }\n }\n\n // feeds posts author addresses have a changed blocked address\n // NOTE: because of this, if an author address is unblocked, feeds won't update until some other event causes a feed update\n // it seems preferable to causing unnecessary rerenders every time an unused block event occurs\n const changedBlockedAddressesSet = new Set(changedBlockedAddresses);\n for (const feedName in bufferedFeeds) {\n for (const post of bufferedFeeds[feedName] || []) {\n if (post?.author?.address && changedBlockedAddressesSet.has(post.author.address)) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const getAccountsBlockedCids = (accounts: Accounts) => {\n const blockedCidsSet = new Set<string>();\n for (const { blockedCids } of Object.values(accounts)) {\n for (const address in blockedCids) {\n if (blockedCids[address]) {\n blockedCidsSet.add(address);\n }\n }\n }\n return [...blockedCidsSet].sort();\n};\n\nexport const accountsBlockedCidsChanged = (\n previousAccountsBlockedCids: { [address: string]: boolean }[],\n accountsBlockedCids: { [address: string]: boolean }[],\n) => {\n if (previousAccountsBlockedCids.length !== accountsBlockedCids.length) {\n return true;\n }\n for (const i in previousAccountsBlockedCids) {\n // check if the object is still the same\n if (previousAccountsBlockedCids[i] !== accountsBlockedCids[i]) {\n return true;\n }\n }\n return false;\n};\n\nexport const feedsHaveChangedBlockedCids = (\n feedsOptions: FeedsOptions,\n bufferedFeeds: Feeds,\n blockedCids: string[],\n previousBlockedCids: string[],\n) => {\n // find the difference between current and previous blocked addresses\n const changedBlockedCids = blockedCids\n .filter((x) => !previousBlockedCids.includes(x))\n .concat(previousBlockedCids.filter((x) => !blockedCids.includes(x)));\n\n // feeds posts author addresses have a changed blocked address\n // NOTE: because of this, if a cid is unblocked, feeds won't update until some other event causes a feed update\n // it seems preferable to causing unnecessary rerenders every time an unused block event occurs\n const changedBlockedCidsSet = new Set(changedBlockedCids);\n for (const feedName in bufferedFeeds) {\n for (const post of bufferedFeeds[feedName] || []) {\n if (post?.cid && changedBlockedCidsSet.has(post?.cid)) {\n return true;\n }\n }\n }\n\n return false;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"replies-store.d.ts","sourceRoot":"","sources":["../../../src/stores/replies/replies-store.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,OAAO,EAGP,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,aAAa,CAAC;AAwBrB,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAKxC,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,KAAK,CAAC;IACrB,WAAW,EAAE,KAAK,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC;IACpB,wBAAwB,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACzD,aAAa,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC/C,eAAe,EAAE,QAAQ,CAAC;IAC1B,6BAA6B,EAAE,QAAQ,CAAC;IACxC,uBAAuB,EAAE,QAAQ,CAAC;IAClC,SAAS,EAAE,QAAQ,CAAC;IACpB,WAAW,EAAE,QAAQ,CAAC;CACvB,CAAC;AAgBF,eAAO,MAAM,qBAAqB,GAAI,aAAa,OAAO,CAAC,kBAAkB,CAAC,WAG7E,CAAC;AAOF,QAAA,MAAM,YAAY,2EAoRf,CAAC;AAkLJ,eAAO,MAAM,iCAAiC,GAC5C,SAAS,OAAO,EAChB,aAAa,OAAO,CAAC,kBAAkB,CAAC;;;CAmCzC,CAAC;AAKF,eAAO,MAAM,iBAAiB,qBAkB7B,CAAC;AAGF,eAAO,MAAM,4BAA4B,qBAGxC,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"replies-store.d.ts","sourceRoot":"","sources":["../../../src/stores/replies/replies-store.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,OAAO,EAGP,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,aAAa,CAAC;AAwBrB,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAKxC,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,KAAK,CAAC;IACrB,WAAW,EAAE,KAAK,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC;IACpB,wBAAwB,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACzD,aAAa,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC/C,eAAe,EAAE,QAAQ,CAAC;IAC1B,6BAA6B,EAAE,QAAQ,CAAC;IACxC,uBAAuB,EAAE,QAAQ,CAAC;IAClC,SAAS,EAAE,QAAQ,CAAC;IACpB,WAAW,EAAE,QAAQ,CAAC;CACvB,CAAC;AAgBF,eAAO,MAAM,qBAAqB,GAAI,aAAa,OAAO,CAAC,kBAAkB,CAAC,WAG7E,CAAC;AAOF,QAAA,MAAM,YAAY,2EAySf,CAAC;AAkLJ,eAAO,MAAM,iCAAiC,GAC5C,SAAS,OAAO,EAChB,aAAa,OAAO,CAAC,kBAAkB,CAAC;;;CAkCzC,CAAC;AAKF,eAAO,MAAM,iBAAiB,qBAkB7B,CAAC;AAGF,eAAO,MAAM,4BAA4B,qBAGxC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -193,7 +193,14 @@ const repliesStore = createStore((setState, getState) => ({
193
193
  // calculate new feeds
194
194
  const filteredSortedFeeds = getFilteredSortedFeeds(feedsOptions, comments, repliesPages, accounts);
195
195
  const bufferedFeedsWithoutPreviousLoadedFeeds = getBufferedFeedsWithoutLoadedFeeds(filteredSortedFeeds, previousState.loadedFeeds);
196
- const loadedFeeds = yield getLoadedFeeds(feedsOptions, previousState.loadedFeeds, bufferedFeedsWithoutPreviousLoadedFeeds, accounts);
196
+ const canonicalLoadedFeeds = yield getLoadedFeeds(feedsOptions, previousState.loadedFeeds, bufferedFeedsWithoutPreviousLoadedFeeds, accounts, { addAccountComments: false });
197
+ const canonicalBufferedFeeds = getBufferedFeedsWithoutLoadedFeeds(bufferedFeedsWithoutPreviousLoadedFeeds, canonicalLoadedFeeds);
198
+ const canonicalFeedsHaveMore = getFeedsHaveMore(feedsOptions, canonicalBufferedFeeds, comments, repliesPages, accounts);
199
+ const loadedFeedsWithAccountComments = Object.assign({}, canonicalLoadedFeeds);
200
+ const accountCommentsChangedFeeds = addAccountsComments(feedsOptions, loadedFeedsWithAccountComments, canonicalFeedsHaveMore);
201
+ const loadedFeeds = accountCommentsChangedFeeds
202
+ ? loadedFeedsWithAccountComments
203
+ : canonicalLoadedFeeds;
197
204
  // after loaded feeds are caculated, remove new loaded feeds (again) from buffered feeds
198
205
  const bufferedFeeds = getBufferedFeedsWithoutLoadedFeeds(bufferedFeedsWithoutPreviousLoadedFeeds, loadedFeeds);
199
206
  const bufferedFeedsReplyCounts = getFeedsReplyCounts(feedsOptions, bufferedFeeds);
@@ -378,8 +385,8 @@ export const getRepliesFirstPageSkipValidation = (comment, feedOptions) => {
378
385
  if (filteredSortedFeeds[feedName].length > repliesPerPage) {
379
386
  bufferedFeeds[feedName] = filteredSortedFeeds[feedName].splice(repliesPerPage);
380
387
  }
381
- addAccountsComments(feedsOptions, filteredSortedFeeds);
382
388
  const feedsHaveMore = getFeedsHaveMore(feedsOptions, bufferedFeeds, comments, repliesPages, accounts);
389
+ addAccountsComments(feedsOptions, filteredSortedFeeds, feedsHaveMore);
383
390
  return { replies: filteredSortedFeeds[feedName], hasMore: feedsHaveMore[feedName] };
384
391
  };
385
392
  // reset store in between tests
@@ -1 +1 @@
1
- {"version":3,"file":"replies-store.js","sourceRoot":"","sources":["../../../src/stores/replies/replies-store.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAY3D,OAAO,WAAW,MAAM,SAAS,CAAC;AAClC,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,aAAa,MAAM,aAAa,CAAC;AACxC,OAAO,oBAAoB,MAAM,0BAA0B,CAAC;AAC5D,OAAO,iBAAiB,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,6BAA6B,EAC7B,cAAc,EACd,kCAAkC,EAClC,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,2BAA2B,EAC3B,2CAA2C,EAC3C,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAEjB,+CAA+C;AAC/C,2BAA2B;AAC3B,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,kDAAkD;AAClD,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAgB5C,MAAM,sBAAsB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACtE,MAAM,qBAAqB,GAAG,CAAC,WAAgB,EAAE,EAAE;IACjD,WAAW,qBAAQ,WAAW,CAAE,CAAC;IACjC,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAChE,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,WAAW,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,KAAK,IAAI,CAAC;IAC7D,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,IAAI,WAAW,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QACtF,WAAW,CAAC,eAAe,GAAG,sBAAsB,CAAC;IACvD,CAAC;IACD,WAAW,CAAC,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,qBAAqB,CAAC;IACjF,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,WAAwC,EAAE,EAAE;;IAChF,WAAW,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACjD,OAAO,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,SAAS,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,UAAU,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,IAAI,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,0CAAE,SAAS,IAAI,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,0CAAE,MAAM,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,IAAI,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,0CAAE,GAAG,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,UAAU,EAAE,CAAC;AAC5U,CAAC,CAAC;AAEF,kEAAkE;AAClE,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAC7B,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC,MAAM,YAAY,GAAG,WAAW,CAAe,CAAC,QAAkB,EAAE,QAAkB,EAAE,EAAE,CAAC,CAAC;IAC1F,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,EAAE;IAChB,wBAAwB,EAAE,EAAE;IAC5B,aAAa,EAAE,EAAE;IAEjB,eAAe,CAAC,gBAAsC;QACpD,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC1D,MAAM,eAAe,GAAwB,EAAE,CAAC;QAEhD,0BAA0B;QAC1B,KAAK,IAAI,WAAW,IAAI,gBAAgB,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACpD,uCAAuC;YACvC,iEAAiE;YACjE,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBACtF,SAAS;YACX,CAAC;YAED,WAAW,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;YAEjD,uDAAuD;YACvD,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;YAC3B,eAAe,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC;QAC1C,CAAC;QAED,uEAAuE;QACvE,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAgB,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAC;YACpD,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO,EAAE,YAAY,kCAAO,YAAY,GAAK,eAAe,CAAE,EAAE,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,CAAC,8BAA8B,EAAE,eAAe,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAEK,6BAA6B,CAAC,OAAgB,EAAE,WAA+B;;;YACnF,oFAAoF;YACpF,sBAAsB,EAAE,CAAC;YAEzB,mBAAmB;YACnB,MAAM,CACJ,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,EACzD,2DAA2D,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,WAAW,CACnF,CAAC;YACF,MAAM,CACJ,WAAW,CAAC,UAAU,IAAI,OAAO,WAAW,CAAC,UAAU,KAAK,QAAQ,EACpE,sEAAsE,WAAW,CAAC,UAAU,WAAW,CACxG,CAAC;YACF,MAAM,CACJ,WAAW,CAAC,QAAQ,IAAI,OAAO,WAAW,CAAC,QAAQ,KAAK,QAAQ,EAChE,oEAAoE,WAAW,CAAC,QAAQ,WAAW,CACpG,CAAC;YACF,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACzE,MAAM,CACJ,OAAO,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,0CAAE,aAAa,CAAA,KAAK,UAAU,EACjD,qEAAqE,WAAW,CAAC,SAAS,WAAW,CACtG,CAAC;YACF,MAAM,CACJ,CAAC,WAAW,CAAC,cAAc,IAAI,OAAO,WAAW,CAAC,cAAc,KAAK,QAAQ,EAC7E,0EAA0E,WAAW,CAAC,cAAc,WAAW,CAChH,CAAC;YACF,MAAM,CACJ,CAAC,WAAW,CAAC,MAAM,IAAI,OAAO,CAAA,MAAA,WAAW,CAAC,MAAM,0CAAE,MAAM,CAAA,KAAK,UAAU,EACvE,yEAAyE,MAAA,WAAW,CAAC,MAAM,0CAAE,MAAM,WAAW,CAC/G,CAAC;YACF,MAAM,CACJ,CAAC,WAAW,CAAC,MAAM,IAAI,OAAO,CAAA,MAAA,WAAW,CAAC,MAAM,0CAAE,GAAG,CAAA,KAAK,QAAQ,EAClE,sEAAsE,MAAA,WAAW,CAAC,MAAM,0CAAE,GAAG,WAAW,CACzG,CAAC;YAEF,4DAA4D;YAC5D,yGAAyG;YACzG,MAAM,4BAA4B,GAAc,EAAE,CAAC;YACnD,MAAM,iBAAiB,GAAyB,EAAE,CAAC;YAEnD,yDAAyD;YACzD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAE9D,MAAM,iCAAiC,GAAG,CAAC,OAAgB,EAAE,EAAE;;gBAC7D,iIAAiI;gBACjI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3C,iBAAiB,CAAC,IAAI,iCACjB,WAAW,KACd,UAAU,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,EACxB,YAAY,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,IAC5B,CAAC;gBAEH,iCAAiC;gBACjC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;oBACtB,KAAK,MAAM,KAAK,IAAI,CAAA,MAAA,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,KAAK,0CAAG,QAAQ,CAAC,0CAAE,QAAQ,KAAI,EAAE,EAAE,CAAC;wBACvE,iCAAiC,CAAC,KAAK,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;YACF,iCAAiC,CAAC,OAAO,CAAC,CAAC;YAE3C,sCAAsC;YACtC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;YACpD,MAAM,YAAY,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;YACxD,yFAAyF;YACzF,oBAAoB;iBACjB,QAAQ,EAAE;iBACV,kCAAkC,CAAC,4BAA4B,CAAC,CAAC;YACpE,IAAI,YAAY,EAAE,CAAC;gBACjB,GAAG,CAAC,4CAA4C,EAAE;oBAChD,OAAO;oBACP,WAAW;oBACX,QAAQ;oBACR,iBAAiB;oBACjB,4BAA4B;iBAC7B,CAAC,CAAC;gBACH,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;KAAA;IAED,uBAAuB,CAAC,QAAgB;QACtC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7E,MAAM,CACJ,YAAY,CAAC,QAAQ,CAAC,EACtB,mDAAmD,QAAQ,iCAAiC,CAC7F,CAAC;QACF,GAAG,CAAC,sCAAsC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE1D,kHAAkH;QAClH,UAAU;QACV,+GAA+G;QAC/G,4GAA4G;QAC5G,IAAI;QACJ,IACE,YAAY,CAAC,QAAQ,CAAC,CAAC,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,cAAc;YACzE,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,EAC5B,CAAC;YACD,MAAM,CACJ,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAClC,uGAAuG,CACxG,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAO,EAAE,EAAE;YAC9C,iEAAiE;YACjE,kHAAkH;YAClH,cAAc;YACd,IAAI;YACJ,MAAM,WAAW,mCACZ,YAAY,CAAC,QAAQ,CAAC,KACzB,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,UAAU,GAAG,CAAC,GAClD,CAAC;YACF,OAAO,EAAE,YAAY,kCAAO,YAAY,KAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAE,EAAE,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,mFAAmF;QACnF,kDAAkD;QAClD,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;QACjD,MAAM,CACJ,YAAY,CAAC,QAAQ,CAAC,EACtB,qCAAqC,QAAQ,iCAAiC,CAC/E,CAAC;QACF,MAAM,CACJ,YAAY,CAAC,QAAQ,CAAC,CAAC,UAAU,IAAI,CAAC,EACtC,yDAAyD,YAAY,CAAC,QAAQ,CAAC,CAAC,UAAU,gBAAgB,CAC3G,CAAC;QACF,GAAG,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE5C,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAO,EAAE,EAAE;YAC5D,MAAM,WAAW,mCACZ,YAAY,CAAC,QAAQ,CAAC,KACzB,UAAU,EAAE,CAAC,GACd,CAAC;YACF,OAAO;gBACL,YAAY,kCAAO,YAAY,KAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAE;gBAC1D,WAAW,kCAAO,WAAW,KAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAE;gBAC/C,YAAY,kCAAO,YAAY,KAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAE;aAClD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,6FAA6F;IAC7F,WAAW;QACT,IAAI,kBAAkB,EAAE,CAAC;YACvB,gBAAgB,GAAG,IAAI,CAAC;YACxB,OAAO;QACT,CAAC;QACD,kBAAkB,GAAG,IAAI,CAAC;QAE1B,mEAAmE;QACnE,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,0BAA0B,CAAC;QAEpE,UAAU,CAAC,GAAS,EAAE;YACpB,4BAA4B;YAC5B,MAAM,aAAa,GAAG,QAAQ,EAAE,CAAC;YACjC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;YACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YACtD,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;YAE9C,sBAAsB;YACtB,MAAM,mBAAmB,GAAG,sBAAsB,CAChD,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,QAAQ,CACT,CAAC;YACF,MAAM,uCAAuC,GAAG,kCAAkC,CAChF,mBAAmB,EACnB,aAAa,CAAC,WAAW,CAC1B,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,cAAc,CACtC,YAAY,EACZ,aAAa,CAAC,WAAW,EACzB,uCAAuC,EACvC,QAAQ,CACT,CAAC;YACF,wFAAwF;YACxF,MAAM,aAAa,GAAG,kCAAkC,CACtD,uCAAuC,EACvC,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;YAClF,MAAM,aAAa,GAAG,gBAAgB,CACpC,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,QAAQ,CACT,CAAC;YACF,MAAM,YAAY,GAAG,MAAM,eAAe,CACxC,YAAY,EACZ,mBAAmB,EACnB,aAAa,CAAC,YAAY,EAC1B,WAAW,EACX,QAAQ,CACT,CAAC;YAEF,gBAAgB;YAChB,QAAQ,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;gBACxB,aAAa;gBACb,WAAW;gBACX,wBAAwB;gBACxB,YAAY;gBACZ,aAAa;aACd,CAAC,CAAC,CAAC;YACJ,GAAG,CAAC,0BAA0B,EAAE;gBAC9B,YAAY;gBACZ,aAAa;gBACb,WAAW;gBACX,wBAAwB;gBACxB,YAAY;gBACZ,aAAa;gBACb,QAAQ;gBACR,YAAY;aACb,CAAC,CAAC;YAEH,kBAAkB,GAAG,KAAK,CAAC;YAE3B,oFAAoF;YACpF,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,GAAG,KAAK,CAAC;gBACzB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAA,EAAE,mBAAmB,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC,CAAC;AAEJ,IAAI,uBAAuB,GAAG,KAAK,CAAC;AACpC,MAAM,sBAAsB,GAAG,GAAS,EAAE;IACxC,IAAI,uBAAuB,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,uBAAuB,GAAG,IAAI,CAAC;IAC/B,8EAA8E;IAC9E,sCAAsC;IACtC,oBAAoB,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IACjE,+CAA+C;IAC/C,YAAY,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACrE,2CAA2C;IAC3C,iBAAiB,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAClE,sCAAsC;IACtC,aAAa,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;AAC/D,CAAC,CAAA,CAAC;AAEF,IAAI,oBAAoB,GAAuC,EAAE,CAAC;AAClE,MAAM,oCAAoC,GAAG,CAAC,sBAA2B,EAAE,EAAE;IAC3E,MAAM,EAAE,YAAY,EAAE,GAAG,sBAAsB,CAAC;IAEhD,yBAAyB;IACzB,IAAI,YAAY,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,oBAAoB,GAAG,YAAY,CAAC;IAEpC,qEAAqE;IACrE,kFAAkF;IAClF,qFAAqF;IACrF,uBAAuB;IACvB,YAAY,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,IAAI,wCAAwC,GAAa,EAAE,CAAC;AAC5D,IAAI,6BAA6B,GAAG,IAAI,GAAG,EAAoB,CAAC;AAChE,IAAI,gCAAgC,GAAmC,EAAE,CAAC;AAC1E,MAAM,4CAA4C,GAAG,CAAC,iBAAsB,EAAE,EAAE;IAC9E,MAAM,EAAE,wBAAwB,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAC3E,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,QAAQ,EAAE,CAAC;IAErD,0GAA0G;IAC1G,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACvE,MAAM,qBAAqB,GAAG,oBAAoB,CAChD,6BAA6B,EAC7B,qBAAqB,CACtB,CAAC;IACF,MAAM,+BAA+B,GACnC,gCAAgC,KAAK,wBAAwB,CAAC;IAEhE,+FAA+F;IAC/F,IAAI,CAAC,qBAAqB,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,6BAA6B,GAAG,qBAAqB,CAAC;IACtD,gCAAgC,GAAG,wBAAwB,CAAC;IAE5D,kEAAkE;IAClE,MAAM,gCAAgC,GAAG,6BAA6B,CAAC,qBAAqB,CAAC,CAAC;IAC9F,MAAM,uCAAuC,GAC3C,gCAAgC,CAAC,QAAQ,EAAE;QAC3C,wCAAwC,CAAC,QAAQ,EAAE,CAAC;IACtD,IAAI,CAAC,uCAAuC,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACjF,OAAO;IACT,CAAC;IACD,wCAAwC,GAAG,gCAAgC,CAAC;IAE5E,MAAM,EAAE,yBAAyB,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IACnE,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IAE9C,sEAAsE;IACtE,KAAK,MAAM,QAAQ,IAAI,wBAAwB,EAAE,CAAC;QAChD,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;QAC/C,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC;QAErD,2FAA2F;QAE3F,4BAA4B;QAC5B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEhF,wDAAwD;QACxD,IAAI,cAAc,IAAI,gCAAgC,EAAE,CAAC;YACvD,yBAAyB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAC1F,GAAG,CAAC,KAAK,CAAC,gEAAgE,EAAE;gBAC1E,UAAU;gBACV,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC;gBAC7B,QAAQ;gBACR,KAAK;aACN,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,kCAAkC,GAAa,EAAE,CAAC;AACtD,IAAI,qBAAqB,GAA0B,IAAI,GAAG,EAAE,CAAC;AAC7D,IAAI,gCAAgC,GAAG,CAAC,CAAC;AACzC,IAAI,gDAAgD,GAAG,EAAE,CAAC;AAC1D,MAAM,gCAAgC,GAAG,CAAC,yBAA8B,EAAE,EAAE;IAC1E,MAAM,EAAE,QAAQ,EAAE,GAAG,yBAAyB,CAAC;IAC/C,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IAE9D,6CAA6C;IAC7C,MAAM,aAAa,GAAG,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC/D,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,aAAa,CAAC,EAAE,CAAC;QAChE,OAAO;IACT,CAAC;IACD,qBAAqB,GAAG,aAAa,CAAC;IAEtC,mFAAmF;IACnF,kEAAkE;IAClE,MAAM,0BAA0B,GAAG,6BAA6B,CAAC,aAAa,CAAC,CAAC;IAEhF,8CAA8C;IAC9C,IAAI,0BAA0B,CAAC,QAAQ,EAAE,KAAK,kCAAkC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC5F,kDAAkD;QAClD,mHAAmH;QACnH,MAAM,wBAAwB,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAC;QAC5E,IAAI,wBAAwB,KAAK,gCAAgC,EAAE,CAAC;YAClE,uDAAuD;YACvD,MAAM,wCAAwC,GAC5C,2CAA2C,CAAC,aAAa,CAAC,CAAC;YAC7D,IACE,wCAAwC;gBACxC,gDAAgD,EAChD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,gDAAgD,GAAG,wCAAwC,CAAC;QAC9F,CAAC;QACD,gCAAgC,GAAG,wBAAwB,CAAC;IAC9D,CAAC;IAED,4CAA4C;IAC5C,kCAAkC,GAAG,0BAA0B,CAAC;IAChE,WAAW,EAAE,CAAC;AAChB,CAAC,CAAC;AAEF,IAAI,6BAA6B,GAAG,CAAC,CAAC;AACtC,IAAI,4BAA4B,GAAG,EAAE,CAAC;AACtC,MAAM,mCAAmC,GAAG,CAAC,kBAAuB,EAAE,EAAE;IACtE,MAAM,EAAE,gBAAgB,EAAE,GAAG,kBAAkB,CAAC;IAChD,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAA+B,CAAC,CAAC,MAAM,CACjF,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,KAAK,GAAG,eAAe,CAAC,MAAM,EAC1D,CAAC,CACF,CAAC;IAEF,yBAAyB;IACzB,IAAI,qBAAqB,KAAK,6BAA6B,EAAE,CAAC;QAC5D,oFAAoF;QACpF,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAA+B,CAAC,CAAC,MAAM,CAChF,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAC7F,EAAE,CACH,CAAC;QACF,IAAI,oBAAoB,KAAK,4BAA4B,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,4BAA4B,GAAG,oBAAoB,CAAC;IACtD,CAAC;IACD,6BAA6B,GAAG,qBAAqB,CAAC;IAEtD,4FAA4F;IAC5F,YAAY,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,OAAgB,EAChB,WAAwC,EACxC,EAAE;IACF,MAAM,QAAQ,GAAG,2BAA2B,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,EAAE,CAAC;IAC3D,MAAM,YAAY,GAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACtD,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IAE9C,qEAAqE;IACrE,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;IAE5C,qGAAqG;IACrG,MAAM,YAAY,GAAG,EAAE,CAAC;IAExB,MAAM,mBAAmB,GAAG,sBAAsB,CAChD,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,QAAQ,CACT,CAAC;IAEF,oDAAoD;IACpD,MAAM,aAAa,GAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChD,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,qBAAqB,CAAC;IAC3E,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAC1D,aAAa,CAAC,QAAQ,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjF,CAAC;IACD,mBAAmB,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,gBAAgB,CACpC,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,QAAQ,CACT,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;AACtF,CAAC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;AAC9C,qDAAqD;AACrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAS,EAAE;IAC1C,gCAAgC,GAAG,EAAE,CAAC;IACtC,wCAAwC,GAAG,EAAE,CAAC;IAC9C,6BAA6B,GAAG,IAAI,GAAG,EAAE,CAAC;IAC1C,kCAAkC,GAAG,EAAE,CAAC;IACxC,qBAAqB,GAAG,IAAI,GAAG,EAAE,CAAC;IAClC,gCAAgC,GAAG,CAAC,CAAC;IACrC,gDAAgD,GAAG,EAAE,CAAC;IACtD,oBAAoB,GAAG,EAAE,CAAC;IAC1B,6BAA6B,GAAG,CAAC,CAAC;IAClC,4BAA4B,GAAG,EAAE,CAAC;IAClC,kBAAkB,GAAG,KAAK,CAAC;IAC3B,mDAAmD;IACnD,YAAY,CAAC,OAAO,EAAE,CAAC;IACvB,yBAAyB;IACzB,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACrC,oBAAoB,CAAC,QAAQ,iCAAM,oBAAoB,CAAC,QAAQ,EAAE,KAAE,QAAQ,EAAE,EAAE,IAAG,CAAC;IACpF,uBAAuB,GAAG,KAAK,CAAC;AAClC,CAAC,CAAA,CAAC;AAEF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAS,EAAE;IACrD,MAAM,cAAc,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1F,MAAM,iBAAiB,EAAE,CAAC;AAC5B,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import assert from \"assert\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:replies:stores\");\nimport {\n Feed,\n Feeds,\n Comment,\n Comments,\n Account,\n RepliesFeedOptions,\n RepliesFeedsOptions,\n RepliesPage,\n CommentsFilter,\n} from \"../../types\";\nimport createStore from \"zustand\";\nimport localForageLru from \"../../lib/localforage-lru\";\nimport accountsStore from \"../accounts\";\nimport repliesCommentsStore from \"./replies-comments-store\";\nimport repliesPagesStore from \"../replies-pages\";\nimport {\n getFeedsCommentsFirstPageCids,\n getLoadedFeeds,\n getBufferedFeedsWithoutLoadedFeeds,\n getUpdatedFeeds,\n getFeedsReplyCounts,\n getFeedsHaveMore,\n feedsCommentsChanged,\n getFeedsComments,\n getFeedsCommentsLoadedCount,\n getFeedsCommentsRepliesPagesFirstUpdatedAts,\n getFilteredSortedFeeds,\n getSortTypeFromComment,\n addAccountsComments,\n} from \"./utils\";\n\n// reddit loads approximately 25 posts per page\n// while infinite scrolling\nexport const defaultRepliesPerPage = 25;\n\n// keep large buffer because fetching cids is slow\nconst commentRepliesLeftBeforeNextPage = 50;\n\nexport type RepliesState = {\n feedsOptions: RepliesFeedsOptions;\n bufferedFeeds: Feeds;\n loadedFeeds: Feeds;\n updatedFeeds: Feeds;\n bufferedFeedsReplyCounts: { [feedName: string]: number };\n feedsHaveMore: { [feedName: string]: boolean };\n addFeedsToStore: Function;\n addFeedToStoreOrUpdateComment: Function;\n incrementFeedPageNumber: Function;\n resetFeed: Function;\n updateFeeds: Function;\n};\n\nconst defaultAccountComments = { newerThan: Infinity, append: false };\nconst addDefaultFeedOptions = (feedOptions: any) => {\n feedOptions = { ...feedOptions };\n if (feedOptions.flat === undefined || feedOptions.flat === null) {\n feedOptions.flat = false;\n }\n feedOptions.onlyIfCached = feedOptions.onlyIfCached === true;\n if (feedOptions.accountComments === undefined || feedOptions.accountComments === null) {\n feedOptions.accountComments = defaultAccountComments;\n }\n feedOptions.repliesPerPage = feedOptions.repliesPerPage || defaultRepliesPerPage;\n return feedOptions;\n};\n\nexport const feedOptionsToFeedName = (feedOptions: Partial<RepliesFeedOptions>) => {\n feedOptions = addDefaultFeedOptions(feedOptions);\n return `${feedOptions?.accountId}-${feedOptions?.commentCid}-${feedOptions?.postCid}-${feedOptions?.sortType}-${feedOptions?.flat}-${feedOptions?.onlyIfCached}-${feedOptions?.accountComments?.newerThan}-${feedOptions?.accountComments?.append}-${feedOptions?.repliesPerPage}-${feedOptions?.filter?.key}-${feedOptions?.streamPage}`;\n};\n\n// don't updateFeeds more than once per updateFeedsMinIntervalTime\nlet updateFeedsPending = false;\nlet updateFeedsAgain = false;\nconst updateFeedsMinIntervalTime = 100;\n\nconst repliesStore = createStore<RepliesState>((setState: Function, getState: Function) => ({\n feedsOptions: {},\n bufferedFeeds: {},\n loadedFeeds: {},\n updatedFeeds: {},\n bufferedFeedsReplyCounts: {},\n feedsHaveMore: {},\n\n addFeedsToStore(feedOptionsArray: RepliesFeedOptions[]) {\n if (!feedOptionsArray.length) {\n return;\n }\n const { feedsOptions: previousFeedsOptions } = getState();\n const newFeedsOptions: RepliesFeedsOptions = {};\n\n // get all newFeedsOptions\n for (let feedOptions of feedOptionsArray) {\n const feedName = feedOptionsToFeedName(feedOptions);\n // feed is in store already, do nothing\n // if the feed already exist but is at page 0, reset it to page 1\n if (previousFeedsOptions[feedName] && previousFeedsOptions[feedName].pageNumber !== 0) {\n continue;\n }\n\n feedOptions = addDefaultFeedOptions(feedOptions);\n\n // to add a buffered feed, add a feed with pageNumber 0\n feedOptions.pageNumber = 1;\n newFeedsOptions[feedName] = feedOptions;\n }\n\n // set new feedsOptions state (first loop already skips existing feeds)\n let feedsChanged = false;\n setState(({ feedsOptions }: RepliesState) => {\n if (!Object.keys(newFeedsOptions).length) return {};\n feedsChanged = true;\n return { feedsOptions: { ...feedsOptions, ...newFeedsOptions } };\n });\n if (feedsChanged) {\n log(\"repliesStore.addFeedsToStore\", newFeedsOptions);\n }\n return feedsChanged;\n },\n\n async addFeedToStoreOrUpdateComment(comment: Comment, feedOptions: RepliesFeedOptions) {\n // init here because must be called after async accounts store finished initializing\n initializeRepliesStore();\n\n // validate options\n assert(\n comment && comment.cid && typeof comment.cid === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment comment.cid '${comment?.cid}' invalid`,\n );\n assert(\n feedOptions.commentCid && typeof feedOptions.commentCid === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.commentCid '${feedOptions.commentCid}' invalid`,\n );\n assert(\n feedOptions.sortType && typeof feedOptions.sortType === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.sortType '${feedOptions.sortType}' invalid`,\n );\n const account = accountsStore.getState().accounts[feedOptions.accountId];\n assert(\n typeof account?.pkc?.createComment === \"function\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.accountId '${feedOptions.accountId}' invalid`,\n );\n assert(\n !feedOptions.repliesPerPage || typeof feedOptions.repliesPerPage === \"number\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.repliesPerPage '${feedOptions.repliesPerPage}' invalid`,\n );\n assert(\n !feedOptions.filter || typeof feedOptions.filter?.filter === \"function\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.filter.filter '${feedOptions.filter?.filter}' invalid`,\n );\n assert(\n !feedOptions.filter || typeof feedOptions.filter?.key === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.filter.key '${feedOptions.filter?.key}' invalid`,\n );\n\n // if replies feed aren't in store yet, add them recursively\n // TODO: optimize performance by only adding feeds that are in page 1, and add more on each page increase\n const commentsToAddToStoreOrUpdate: Comment[] = [];\n const feedsToAddToStore: RepliesFeedOptions[] = [];\n\n // use the sort type availabe on the comment when missing\n const sortType = getSortTypeFromComment(comment, feedOptions);\n\n const addRepliesFeedsToStoreRecursively = (comment: Comment) => {\n // NOTE: even a comment with no replies needs a feed, to know it has 0 replies and not displace the UI when a new replies appears\n commentsToAddToStoreOrUpdate.push(comment);\n feedsToAddToStore.push({\n ...feedOptions,\n commentCid: comment?.cid,\n commentDepth: comment?.depth,\n });\n\n // flat doesn't need nested feeds\n if (!feedOptions.flat) {\n for (const reply of comment.replies?.pages?.[sortType]?.comments || []) {\n addRepliesFeedsToStoreRecursively(reply);\n }\n }\n };\n addRepliesFeedsToStoreRecursively(comment);\n\n // add feeds to store and update feeds\n const { addFeedsToStore, updateFeeds } = getState();\n const feedsChanged = addFeedsToStore(feedsToAddToStore);\n // add comments to store (do it after addFeedsToStore because it can trigger updateFeeds)\n repliesCommentsStore\n .getState()\n .addCommentsToStoreOrUpdateComments(commentsToAddToStoreOrUpdate);\n if (feedsChanged) {\n log(\"repliesStore.addFeedToStoreOrUpdateComment\", {\n comment,\n feedOptions,\n sortType,\n feedsToAddToStore,\n commentsToAddToStoreOrUpdate,\n });\n updateFeeds();\n }\n },\n\n incrementFeedPageNumber(feedName: string) {\n const { feedsOptions, loadedFeeds, bufferedFeeds, updateFeeds } = getState();\n assert(\n feedsOptions[feedName],\n `repliesStore.incrementFeedPageNumber feed name '${feedName}' does not exist in feeds store`,\n );\n log(\"repliesStore.incrementFeedPageNumber\", { feedName });\n\n // TODO: fix design issue, pageNumber shouldnt be increased when loadMore is called and repliesPerPage not reached\n // assert(\n // feedsOptions[feedName].pageNumber * feedsOptions[feedName].repliesPerPage <= loadedFeeds[feedName].length,\n // `repliesStore.incrementFeedPageNumber cannot increment feed page number before current page has loaded`\n // )\n if (\n feedsOptions[feedName].pageNumber * feedsOptions[feedName].repliesPerPage <=\n loadedFeeds[feedName].length\n ) {\n assert(\n bufferedFeeds[feedName].length > 0,\n `repliesStore.incrementFeedPageNumber cannot increment feed page number before current page has loaded`,\n );\n }\n\n setState(({ feedsOptions, loadedFeeds }: any) => {\n // don't increment page number before the current page has loaded\n // if (feedsOptions[feedName].pageNumber * feedsOptions[feedName].repliesPerPage > loadedFeeds[feedName].length) {\n // return {}\n // }\n const feedOptions = {\n ...feedsOptions[feedName],\n pageNumber: feedsOptions[feedName].pageNumber + 1,\n };\n return { feedsOptions: { ...feedsOptions, [feedName]: feedOptions } };\n });\n\n // do not update feed at the same time as increment a page number or it might cause\n // a race condition, rather schedule a feed update\n updateFeeds();\n },\n\n resetFeed(feedName: string) {\n const { feedsOptions, updateFeeds } = getState();\n assert(\n feedsOptions[feedName],\n `repliesStore.resetFeed feed name '${feedName}' does not exist in feeds store`,\n );\n assert(\n feedsOptions[feedName].pageNumber >= 1,\n `repliesStore.resetFeed cannot reset feed page number '${feedsOptions[feedName].pageNumber}' lower than 1`,\n );\n log(\"repliesStore.resetFeed\", { feedName });\n\n setState(({ feedsOptions, loadedFeeds, updatedFeeds }: any) => {\n const feedOptions = {\n ...feedsOptions[feedName],\n pageNumber: 1,\n };\n return {\n feedsOptions: { ...feedsOptions, [feedName]: feedOptions },\n loadedFeeds: { ...loadedFeeds, [feedName]: [] },\n updatedFeeds: { ...updatedFeeds, [feedName]: [] },\n };\n });\n\n updateFeeds();\n },\n\n // recalculate all feeds using new comments.replies.pages, repliesPagesStore and page numbers\n updateFeeds() {\n if (updateFeedsPending) {\n updateFeedsAgain = true;\n return;\n }\n updateFeedsPending = true;\n\n // don't update feeds more than once per updateFeedsMinIntervalTime\n const timeUntilNextUpdate = Date.now() % updateFeedsMinIntervalTime;\n\n setTimeout(async () => {\n // get state from all stores\n const previousState = getState();\n const { feedsOptions, updateFeeds } = previousState;\n const { comments } = repliesCommentsStore.getState();\n const { repliesPages } = repliesPagesStore.getState();\n const { accounts } = accountsStore.getState();\n\n // calculate new feeds\n const filteredSortedFeeds = getFilteredSortedFeeds(\n feedsOptions,\n comments,\n repliesPages,\n accounts,\n );\n const bufferedFeedsWithoutPreviousLoadedFeeds = getBufferedFeedsWithoutLoadedFeeds(\n filteredSortedFeeds,\n previousState.loadedFeeds,\n );\n const loadedFeeds = await getLoadedFeeds(\n feedsOptions,\n previousState.loadedFeeds,\n bufferedFeedsWithoutPreviousLoadedFeeds,\n accounts,\n );\n // after loaded feeds are caculated, remove new loaded feeds (again) from buffered feeds\n const bufferedFeeds = getBufferedFeedsWithoutLoadedFeeds(\n bufferedFeedsWithoutPreviousLoadedFeeds,\n loadedFeeds,\n );\n const bufferedFeedsReplyCounts = getFeedsReplyCounts(feedsOptions, bufferedFeeds);\n const feedsHaveMore = getFeedsHaveMore(\n feedsOptions,\n bufferedFeeds,\n comments,\n repliesPages,\n accounts,\n );\n const updatedFeeds = await getUpdatedFeeds(\n feedsOptions,\n filteredSortedFeeds,\n previousState.updatedFeeds,\n loadedFeeds,\n accounts,\n );\n\n // set new feeds\n setState((state: any) => ({\n bufferedFeeds,\n loadedFeeds,\n bufferedFeedsReplyCounts,\n updatedFeeds,\n feedsHaveMore,\n }));\n log(\"repliesStore.updateFeeds\", {\n feedsOptions,\n bufferedFeeds,\n loadedFeeds,\n bufferedFeedsReplyCounts,\n updatedFeeds,\n feedsHaveMore,\n comments,\n repliesPages,\n });\n\n updateFeedsPending = false;\n\n // if updateFeeds was called while updateFeedsPending = true, call updateFeeds again\n if (updateFeedsAgain) {\n updateFeedsAgain = false;\n updateFeeds();\n }\n }, timeUntilNextUpdate);\n },\n}));\n\nlet repliesStoreInitialized = false;\nconst initializeRepliesStore = async () => {\n if (repliesStoreInitialized) {\n return;\n }\n repliesStoreInitialized = true;\n // TODO: optimize subscriptions e.g. updateFeedsOnFeedsCommentsChange(comment)\n // subscribe to comments store changes\n repliesCommentsStore.subscribe(updateFeedsOnFeedsCommentsChange);\n // subscribe to bufferedFeedsReplyCounts change\n repliesStore.subscribe(addRepliesPagesOnLowBufferedFeedsReplyCounts);\n // subscribe to replies pages store changes\n repliesPagesStore.subscribe(updateFeedsOnFeedsRepliesPagesChange);\n // subscribe to accounts store changes\n accountsStore.subscribe(updateFeedsOnAccountsCommentsChange);\n};\n\nlet previousRepliesPages: { [pageCid: string]: RepliesPage } = {};\nconst updateFeedsOnFeedsRepliesPagesChange = (repliesPagesStoreState: any) => {\n const { repliesPages } = repliesPagesStoreState;\n\n // no changes, do nothing\n if (repliesPages === previousRepliesPages) {\n return;\n }\n previousRepliesPages = repliesPages;\n\n // currently only the feeds use repliesPagesStore, so any change must\n // trigger a feed update, if in the future another hook uses the repliesPagesStore\n // we should check if the replies pages changed are actually used by the feeds before\n // triggering an update\n repliesStore.getState().updateFeeds();\n};\n\nlet previousBufferedFeedsReplyCountsPageCids: string[] = [];\nlet previousBufferedFeedsComments = new Map<string, Comments>();\nlet previousBufferedFeedsReplyCounts: { [feedName: string]: number } = {};\nconst addRepliesPagesOnLowBufferedFeedsReplyCounts = (repliesStoreState: any) => {\n const { bufferedFeedsReplyCounts, feedsOptions } = repliesStore.getState();\n const { comments } = repliesCommentsStore.getState();\n\n // if feeds comments have changed, we must try adding them even if buffered replies counts haven't changed\n const bufferedFeedsComments = getFeedsComments(feedsOptions, comments);\n const _feedsCommentsChanged = feedsCommentsChanged(\n previousBufferedFeedsComments,\n bufferedFeedsComments,\n );\n const bufferedFeedsReplyCountsChanged =\n previousBufferedFeedsReplyCounts !== bufferedFeedsReplyCounts;\n\n // if feeds comments havent changed and buffered replies counts also havent changed, do nothing\n if (!_feedsCommentsChanged && !bufferedFeedsReplyCountsChanged) {\n return;\n }\n previousBufferedFeedsComments = bufferedFeedsComments;\n previousBufferedFeedsReplyCounts = bufferedFeedsReplyCounts;\n\n // in case feeds comments changed, but the first page cids haven't\n const bufferedFeedsReplyCountsPageCids = getFeedsCommentsFirstPageCids(bufferedFeedsComments);\n const bufferedFeedsReplyCountsPageCidsChanged =\n bufferedFeedsReplyCountsPageCids.toString() !==\n previousBufferedFeedsReplyCountsPageCids.toString();\n if (!bufferedFeedsReplyCountsPageCidsChanged && !bufferedFeedsReplyCountsChanged) {\n return;\n }\n previousBufferedFeedsReplyCountsPageCids = bufferedFeedsReplyCountsPageCids;\n\n const { addNextRepliesPageToStore } = repliesPagesStore.getState();\n const { accounts } = accountsStore.getState();\n\n // bufferedFeedsReplyCounts have changed, check if any of them are low\n for (const feedName in bufferedFeedsReplyCounts) {\n if (feedsOptions[feedName].onlyIfCached) {\n continue;\n }\n const account = accounts[feedsOptions[feedName].accountId];\n const feedReplyCount = bufferedFeedsReplyCounts[feedName];\n let sortType = feedsOptions[feedName].sortType;\n const commentCid = feedsOptions[feedName].commentCid;\n\n // TODO: maybe skip if comment community address, comment cid or comment author is blocked?\n\n // comment hasn't loaded yet\n if (!comments[commentCid]) {\n continue;\n }\n\n sortType = getSortTypeFromComment(comments[commentCid], feedsOptions[feedName]);\n\n // comment replies count is low, fetch next replies page\n if (feedReplyCount <= commentRepliesLeftBeforeNextPage) {\n addNextRepliesPageToStore(comments[commentCid], sortType, account).catch((error: unknown) =>\n log.error(\"repliesStore repliesPagesStore.addNextRepliesPageToStore error\", {\n commentCid,\n comment: comments[commentCid],\n sortType,\n error,\n }),\n );\n }\n }\n};\n\nlet previousFeedsCommentsFirstPageCids: string[] = [];\nlet previousFeedsComments: Map<string, Comments> = new Map();\nlet previousFeedsCommentsLoadedCount = 0;\nlet previousFeedsCommentsRepliesPagesFirstUpdatedAts = \"\";\nconst updateFeedsOnFeedsCommentsChange = (repliesCommentsStoreState: any) => {\n const { comments } = repliesCommentsStoreState;\n const { feedsOptions, updateFeeds } = repliesStore.getState();\n\n // feeds comments haven't changed, do nothing\n const feedsComments = getFeedsComments(feedsOptions, comments);\n if (!feedsCommentsChanged(previousFeedsComments, feedsComments)) {\n return;\n }\n previousFeedsComments = feedsComments;\n\n // decide if feeds comments have changed by looking at all feeds comments page cids\n // (in case that a comment changed, but its first page cid didn't)\n const feedsCommentsFirstPageCids = getFeedsCommentsFirstPageCids(feedsComments);\n\n // first page cids haven't changed, do nothing\n if (feedsCommentsFirstPageCids.toString() === previousFeedsCommentsFirstPageCids.toString()) {\n // if no new feed comments have loaded, do nothing\n // in case a comment loads with no first page cid and first pages cids don't change, need to trigger hasMore update\n const feedsCommentsLoadedCount = getFeedsCommentsLoadedCount(feedsComments);\n if (feedsCommentsLoadedCount === previousFeedsCommentsLoadedCount) {\n // if comment.replies.pages haven't changed, do nothing\n const feedsCommentsRepliesPagesFirstUpdatedAts =\n getFeedsCommentsRepliesPagesFirstUpdatedAts(feedsComments);\n if (\n feedsCommentsRepliesPagesFirstUpdatedAts ===\n previousFeedsCommentsRepliesPagesFirstUpdatedAts\n ) {\n return;\n }\n\n previousFeedsCommentsRepliesPagesFirstUpdatedAts = feedsCommentsRepliesPagesFirstUpdatedAts;\n }\n previousFeedsCommentsLoadedCount = feedsCommentsLoadedCount;\n }\n\n // feeds comments have changed, update feeds\n previousFeedsCommentsFirstPageCids = feedsCommentsFirstPageCids;\n updateFeeds();\n};\n\nlet previousAccountsCommentsCount = 0;\nlet previousAccountsCommentsCids = \"\";\nconst updateFeedsOnAccountsCommentsChange = (accountsStoreState: any) => {\n const { accountsComments } = accountsStoreState;\n const accountsCommentsCount = Object.values(accountsComments as Comment[][]).reduce(\n (count, accountComments) => count + accountComments.length,\n 0,\n );\n\n // no changes, do nothing\n if (accountsCommentsCount === previousAccountsCommentsCount) {\n // if cids haven't changed (account comments receive cids after pending), do nothing\n const accountsCommentsCids = Object.values(accountsComments as Comment[][]).reduce(\n (cids, accountComments) => cids + String(accountComments.map((comment) => comment.cid || \"\")),\n \"\",\n );\n if (accountsCommentsCids === previousAccountsCommentsCids) {\n return;\n }\n previousAccountsCommentsCids = accountsCommentsCids;\n }\n previousAccountsCommentsCount = accountsCommentsCount;\n\n // TODO: only update the feeds that are relevant to the new accountComment.parentCid/postCid\n repliesStore.getState().updateFeeds();\n};\n\n// needed to view replies instantly without waiting for zustant store react rerenders. must be synchronous\nexport const getRepliesFirstPageSkipValidation = (\n comment: Comment,\n feedOptions: Partial<RepliesFeedOptions>,\n) => {\n const feedName = `firstPageSkipValidation-${comment?.cid}`;\n const feedsOptions: any = { [feedName]: feedOptions };\n const { accounts } = accountsStore.getState();\n\n // don't use comments store, only use preloaded comment.replies.pages\n const comments = { [comment.cid]: comment };\n\n // don't use any reply pages, they can't provide instant loading like preloaded comment.replies.pages\n const repliesPages = {};\n\n const filteredSortedFeeds = getFilteredSortedFeeds(\n feedsOptions,\n comments,\n repliesPages,\n accounts,\n );\n\n // only get first page and put next page in buffered\n const bufferedFeeds: Feeds = { [feedName]: [] };\n const repliesPerPage = feedOptions.repliesPerPage || defaultRepliesPerPage;\n if (filteredSortedFeeds[feedName].length > repliesPerPage) {\n bufferedFeeds[feedName] = filteredSortedFeeds[feedName].splice(repliesPerPage);\n }\n addAccountsComments(feedsOptions, filteredSortedFeeds);\n\n const feedsHaveMore = getFeedsHaveMore(\n feedsOptions,\n bufferedFeeds,\n comments,\n repliesPages,\n accounts,\n );\n return { replies: filteredSortedFeeds[feedName], hasMore: feedsHaveMore[feedName] };\n};\n\n// reset store in between tests\nconst originalState = repliesStore.getState();\n// async function because some stores have async init\nexport const resetRepliesStore = async () => {\n previousBufferedFeedsReplyCounts = {};\n previousBufferedFeedsReplyCountsPageCids = [];\n previousBufferedFeedsComments = new Map();\n previousFeedsCommentsFirstPageCids = [];\n previousFeedsComments = new Map();\n previousFeedsCommentsLoadedCount = 0;\n previousFeedsCommentsRepliesPagesFirstUpdatedAts = \"\";\n previousRepliesPages = {};\n previousAccountsCommentsCount = 0;\n previousAccountsCommentsCids = \"\";\n updateFeedsPending = false;\n // destroy all component subscriptions to the store\n repliesStore.destroy();\n // restore original state\n repliesStore.setState(originalState);\n repliesCommentsStore.setState({ ...repliesCommentsStore.getState(), comments: {} });\n repliesStoreInitialized = false;\n};\n\n// reset database and store in between tests\nexport const resetRepliesDatabaseAndStore = async () => {\n await localForageLru.createInstance({ name: \"bitsocialReactHooks-repliesPages\" }).clear();\n await resetRepliesStore();\n};\n\nexport default repliesStore;\n"]}
1
+ {"version":3,"file":"replies-store.js","sourceRoot":"","sources":["../../../src/stores/replies/replies-store.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"assert\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:replies:stores\");\nimport {\n Feed,\n Feeds,\n Comment,\n Comments,\n Account,\n RepliesFeedOptions,\n RepliesFeedsOptions,\n RepliesPage,\n CommentsFilter,\n} from \"../../types\";\nimport createStore from \"zustand\";\nimport localForageLru from \"../../lib/localforage-lru\";\nimport accountsStore from \"../accounts\";\nimport repliesCommentsStore from \"./replies-comments-store\";\nimport repliesPagesStore from \"../replies-pages\";\nimport {\n getFeedsCommentsFirstPageCids,\n getLoadedFeeds,\n getBufferedFeedsWithoutLoadedFeeds,\n getUpdatedFeeds,\n getFeedsReplyCounts,\n getFeedsHaveMore,\n feedsCommentsChanged,\n getFeedsComments,\n getFeedsCommentsLoadedCount,\n getFeedsCommentsRepliesPagesFirstUpdatedAts,\n getFilteredSortedFeeds,\n getSortTypeFromComment,\n addAccountsComments,\n} from \"./utils\";\n\n// reddit loads approximately 25 posts per page\n// while infinite scrolling\nexport const defaultRepliesPerPage = 25;\n\n// keep large buffer because fetching cids is slow\nconst commentRepliesLeftBeforeNextPage = 50;\n\nexport type RepliesState = {\n feedsOptions: RepliesFeedsOptions;\n bufferedFeeds: Feeds;\n loadedFeeds: Feeds;\n updatedFeeds: Feeds;\n bufferedFeedsReplyCounts: { [feedName: string]: number };\n feedsHaveMore: { [feedName: string]: boolean };\n addFeedsToStore: Function;\n addFeedToStoreOrUpdateComment: Function;\n incrementFeedPageNumber: Function;\n resetFeed: Function;\n updateFeeds: Function;\n};\n\nconst defaultAccountComments = { newerThan: Infinity, append: false };\nconst addDefaultFeedOptions = (feedOptions: any) => {\n feedOptions = { ...feedOptions };\n if (feedOptions.flat === undefined || feedOptions.flat === null) {\n feedOptions.flat = false;\n }\n feedOptions.onlyIfCached = feedOptions.onlyIfCached === true;\n if (feedOptions.accountComments === undefined || feedOptions.accountComments === null) {\n feedOptions.accountComments = defaultAccountComments;\n }\n feedOptions.repliesPerPage = feedOptions.repliesPerPage || defaultRepliesPerPage;\n return feedOptions;\n};\n\nexport const feedOptionsToFeedName = (feedOptions: Partial<RepliesFeedOptions>) => {\n feedOptions = addDefaultFeedOptions(feedOptions);\n return `${feedOptions?.accountId}-${feedOptions?.commentCid}-${feedOptions?.postCid}-${feedOptions?.sortType}-${feedOptions?.flat}-${feedOptions?.onlyIfCached}-${feedOptions?.accountComments?.newerThan}-${feedOptions?.accountComments?.append}-${feedOptions?.repliesPerPage}-${feedOptions?.filter?.key}-${feedOptions?.streamPage}`;\n};\n\n// don't updateFeeds more than once per updateFeedsMinIntervalTime\nlet updateFeedsPending = false;\nlet updateFeedsAgain = false;\nconst updateFeedsMinIntervalTime = 100;\n\nconst repliesStore = createStore<RepliesState>((setState: Function, getState: Function) => ({\n feedsOptions: {},\n bufferedFeeds: {},\n loadedFeeds: {},\n updatedFeeds: {},\n bufferedFeedsReplyCounts: {},\n feedsHaveMore: {},\n\n addFeedsToStore(feedOptionsArray: RepliesFeedOptions[]) {\n if (!feedOptionsArray.length) {\n return;\n }\n const { feedsOptions: previousFeedsOptions } = getState();\n const newFeedsOptions: RepliesFeedsOptions = {};\n\n // get all newFeedsOptions\n for (let feedOptions of feedOptionsArray) {\n const feedName = feedOptionsToFeedName(feedOptions);\n // feed is in store already, do nothing\n // if the feed already exist but is at page 0, reset it to page 1\n if (previousFeedsOptions[feedName] && previousFeedsOptions[feedName].pageNumber !== 0) {\n continue;\n }\n\n feedOptions = addDefaultFeedOptions(feedOptions);\n\n // to add a buffered feed, add a feed with pageNumber 0\n feedOptions.pageNumber = 1;\n newFeedsOptions[feedName] = feedOptions;\n }\n\n // set new feedsOptions state (first loop already skips existing feeds)\n let feedsChanged = false;\n setState(({ feedsOptions }: RepliesState) => {\n if (!Object.keys(newFeedsOptions).length) return {};\n feedsChanged = true;\n return { feedsOptions: { ...feedsOptions, ...newFeedsOptions } };\n });\n if (feedsChanged) {\n log(\"repliesStore.addFeedsToStore\", newFeedsOptions);\n }\n return feedsChanged;\n },\n\n async addFeedToStoreOrUpdateComment(comment: Comment, feedOptions: RepliesFeedOptions) {\n // init here because must be called after async accounts store finished initializing\n initializeRepliesStore();\n\n // validate options\n assert(\n comment && comment.cid && typeof comment.cid === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment comment.cid '${comment?.cid}' invalid`,\n );\n assert(\n feedOptions.commentCid && typeof feedOptions.commentCid === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.commentCid '${feedOptions.commentCid}' invalid`,\n );\n assert(\n feedOptions.sortType && typeof feedOptions.sortType === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.sortType '${feedOptions.sortType}' invalid`,\n );\n const account = accountsStore.getState().accounts[feedOptions.accountId];\n assert(\n typeof account?.pkc?.createComment === \"function\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.accountId '${feedOptions.accountId}' invalid`,\n );\n assert(\n !feedOptions.repliesPerPage || typeof feedOptions.repliesPerPage === \"number\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.repliesPerPage '${feedOptions.repliesPerPage}' invalid`,\n );\n assert(\n !feedOptions.filter || typeof feedOptions.filter?.filter === \"function\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.filter.filter '${feedOptions.filter?.filter}' invalid`,\n );\n assert(\n !feedOptions.filter || typeof feedOptions.filter?.key === \"string\",\n `repliesStore.addFeedToStoreOrUpdateComment feedOptions.filter.key '${feedOptions.filter?.key}' invalid`,\n );\n\n // if replies feed aren't in store yet, add them recursively\n // TODO: optimize performance by only adding feeds that are in page 1, and add more on each page increase\n const commentsToAddToStoreOrUpdate: Comment[] = [];\n const feedsToAddToStore: RepliesFeedOptions[] = [];\n\n // use the sort type availabe on the comment when missing\n const sortType = getSortTypeFromComment(comment, feedOptions);\n\n const addRepliesFeedsToStoreRecursively = (comment: Comment) => {\n // NOTE: even a comment with no replies needs a feed, to know it has 0 replies and not displace the UI when a new replies appears\n commentsToAddToStoreOrUpdate.push(comment);\n feedsToAddToStore.push({\n ...feedOptions,\n commentCid: comment?.cid,\n commentDepth: comment?.depth,\n });\n\n // flat doesn't need nested feeds\n if (!feedOptions.flat) {\n for (const reply of comment.replies?.pages?.[sortType]?.comments || []) {\n addRepliesFeedsToStoreRecursively(reply);\n }\n }\n };\n addRepliesFeedsToStoreRecursively(comment);\n\n // add feeds to store and update feeds\n const { addFeedsToStore, updateFeeds } = getState();\n const feedsChanged = addFeedsToStore(feedsToAddToStore);\n // add comments to store (do it after addFeedsToStore because it can trigger updateFeeds)\n repliesCommentsStore\n .getState()\n .addCommentsToStoreOrUpdateComments(commentsToAddToStoreOrUpdate);\n if (feedsChanged) {\n log(\"repliesStore.addFeedToStoreOrUpdateComment\", {\n comment,\n feedOptions,\n sortType,\n feedsToAddToStore,\n commentsToAddToStoreOrUpdate,\n });\n updateFeeds();\n }\n },\n\n incrementFeedPageNumber(feedName: string) {\n const { feedsOptions, loadedFeeds, bufferedFeeds, updateFeeds } = getState();\n assert(\n feedsOptions[feedName],\n `repliesStore.incrementFeedPageNumber feed name '${feedName}' does not exist in feeds store`,\n );\n log(\"repliesStore.incrementFeedPageNumber\", { feedName });\n\n // TODO: fix design issue, pageNumber shouldnt be increased when loadMore is called and repliesPerPage not reached\n // assert(\n // feedsOptions[feedName].pageNumber * feedsOptions[feedName].repliesPerPage <= loadedFeeds[feedName].length,\n // `repliesStore.incrementFeedPageNumber cannot increment feed page number before current page has loaded`\n // )\n if (\n feedsOptions[feedName].pageNumber * feedsOptions[feedName].repliesPerPage <=\n loadedFeeds[feedName].length\n ) {\n assert(\n bufferedFeeds[feedName].length > 0,\n `repliesStore.incrementFeedPageNumber cannot increment feed page number before current page has loaded`,\n );\n }\n\n setState(({ feedsOptions, loadedFeeds }: any) => {\n // don't increment page number before the current page has loaded\n // if (feedsOptions[feedName].pageNumber * feedsOptions[feedName].repliesPerPage > loadedFeeds[feedName].length) {\n // return {}\n // }\n const feedOptions = {\n ...feedsOptions[feedName],\n pageNumber: feedsOptions[feedName].pageNumber + 1,\n };\n return { feedsOptions: { ...feedsOptions, [feedName]: feedOptions } };\n });\n\n // do not update feed at the same time as increment a page number or it might cause\n // a race condition, rather schedule a feed update\n updateFeeds();\n },\n\n resetFeed(feedName: string) {\n const { feedsOptions, updateFeeds } = getState();\n assert(\n feedsOptions[feedName],\n `repliesStore.resetFeed feed name '${feedName}' does not exist in feeds store`,\n );\n assert(\n feedsOptions[feedName].pageNumber >= 1,\n `repliesStore.resetFeed cannot reset feed page number '${feedsOptions[feedName].pageNumber}' lower than 1`,\n );\n log(\"repliesStore.resetFeed\", { feedName });\n\n setState(({ feedsOptions, loadedFeeds, updatedFeeds }: any) => {\n const feedOptions = {\n ...feedsOptions[feedName],\n pageNumber: 1,\n };\n return {\n feedsOptions: { ...feedsOptions, [feedName]: feedOptions },\n loadedFeeds: { ...loadedFeeds, [feedName]: [] },\n updatedFeeds: { ...updatedFeeds, [feedName]: [] },\n };\n });\n\n updateFeeds();\n },\n\n // recalculate all feeds using new comments.replies.pages, repliesPagesStore and page numbers\n updateFeeds() {\n if (updateFeedsPending) {\n updateFeedsAgain = true;\n return;\n }\n updateFeedsPending = true;\n\n // don't update feeds more than once per updateFeedsMinIntervalTime\n const timeUntilNextUpdate = Date.now() % updateFeedsMinIntervalTime;\n\n setTimeout(async () => {\n // get state from all stores\n const previousState = getState();\n const { feedsOptions, updateFeeds } = previousState;\n const { comments } = repliesCommentsStore.getState();\n const { repliesPages } = repliesPagesStore.getState();\n const { accounts } = accountsStore.getState();\n\n // calculate new feeds\n const filteredSortedFeeds = getFilteredSortedFeeds(\n feedsOptions,\n comments,\n repliesPages,\n accounts,\n );\n const bufferedFeedsWithoutPreviousLoadedFeeds = getBufferedFeedsWithoutLoadedFeeds(\n filteredSortedFeeds,\n previousState.loadedFeeds,\n );\n const canonicalLoadedFeeds = await getLoadedFeeds(\n feedsOptions,\n previousState.loadedFeeds,\n bufferedFeedsWithoutPreviousLoadedFeeds,\n accounts,\n { addAccountComments: false },\n );\n const canonicalBufferedFeeds = getBufferedFeedsWithoutLoadedFeeds(\n bufferedFeedsWithoutPreviousLoadedFeeds,\n canonicalLoadedFeeds,\n );\n const canonicalFeedsHaveMore = getFeedsHaveMore(\n feedsOptions,\n canonicalBufferedFeeds,\n comments,\n repliesPages,\n accounts,\n );\n const loadedFeedsWithAccountComments = { ...canonicalLoadedFeeds };\n const accountCommentsChangedFeeds = addAccountsComments(\n feedsOptions,\n loadedFeedsWithAccountComments,\n canonicalFeedsHaveMore,\n );\n const loadedFeeds = accountCommentsChangedFeeds\n ? loadedFeedsWithAccountComments\n : canonicalLoadedFeeds;\n // after loaded feeds are caculated, remove new loaded feeds (again) from buffered feeds\n const bufferedFeeds = getBufferedFeedsWithoutLoadedFeeds(\n bufferedFeedsWithoutPreviousLoadedFeeds,\n loadedFeeds,\n );\n const bufferedFeedsReplyCounts = getFeedsReplyCounts(feedsOptions, bufferedFeeds);\n const feedsHaveMore = getFeedsHaveMore(\n feedsOptions,\n bufferedFeeds,\n comments,\n repliesPages,\n accounts,\n );\n const updatedFeeds = await getUpdatedFeeds(\n feedsOptions,\n filteredSortedFeeds,\n previousState.updatedFeeds,\n loadedFeeds,\n accounts,\n );\n\n // set new feeds\n setState((state: any) => ({\n bufferedFeeds,\n loadedFeeds,\n bufferedFeedsReplyCounts,\n updatedFeeds,\n feedsHaveMore,\n }));\n log(\"repliesStore.updateFeeds\", {\n feedsOptions,\n bufferedFeeds,\n loadedFeeds,\n bufferedFeedsReplyCounts,\n updatedFeeds,\n feedsHaveMore,\n comments,\n repliesPages,\n });\n\n updateFeedsPending = false;\n\n // if updateFeeds was called while updateFeedsPending = true, call updateFeeds again\n if (updateFeedsAgain) {\n updateFeedsAgain = false;\n updateFeeds();\n }\n }, timeUntilNextUpdate);\n },\n}));\n\nlet repliesStoreInitialized = false;\nconst initializeRepliesStore = async () => {\n if (repliesStoreInitialized) {\n return;\n }\n repliesStoreInitialized = true;\n // TODO: optimize subscriptions e.g. updateFeedsOnFeedsCommentsChange(comment)\n // subscribe to comments store changes\n repliesCommentsStore.subscribe(updateFeedsOnFeedsCommentsChange);\n // subscribe to bufferedFeedsReplyCounts change\n repliesStore.subscribe(addRepliesPagesOnLowBufferedFeedsReplyCounts);\n // subscribe to replies pages store changes\n repliesPagesStore.subscribe(updateFeedsOnFeedsRepliesPagesChange);\n // subscribe to accounts store changes\n accountsStore.subscribe(updateFeedsOnAccountsCommentsChange);\n};\n\nlet previousRepliesPages: { [pageCid: string]: RepliesPage } = {};\nconst updateFeedsOnFeedsRepliesPagesChange = (repliesPagesStoreState: any) => {\n const { repliesPages } = repliesPagesStoreState;\n\n // no changes, do nothing\n if (repliesPages === previousRepliesPages) {\n return;\n }\n previousRepliesPages = repliesPages;\n\n // currently only the feeds use repliesPagesStore, so any change must\n // trigger a feed update, if in the future another hook uses the repliesPagesStore\n // we should check if the replies pages changed are actually used by the feeds before\n // triggering an update\n repliesStore.getState().updateFeeds();\n};\n\nlet previousBufferedFeedsReplyCountsPageCids: string[] = [];\nlet previousBufferedFeedsComments = new Map<string, Comments>();\nlet previousBufferedFeedsReplyCounts: { [feedName: string]: number } = {};\nconst addRepliesPagesOnLowBufferedFeedsReplyCounts = (repliesStoreState: any) => {\n const { bufferedFeedsReplyCounts, feedsOptions } = repliesStore.getState();\n const { comments } = repliesCommentsStore.getState();\n\n // if feeds comments have changed, we must try adding them even if buffered replies counts haven't changed\n const bufferedFeedsComments = getFeedsComments(feedsOptions, comments);\n const _feedsCommentsChanged = feedsCommentsChanged(\n previousBufferedFeedsComments,\n bufferedFeedsComments,\n );\n const bufferedFeedsReplyCountsChanged =\n previousBufferedFeedsReplyCounts !== bufferedFeedsReplyCounts;\n\n // if feeds comments havent changed and buffered replies counts also havent changed, do nothing\n if (!_feedsCommentsChanged && !bufferedFeedsReplyCountsChanged) {\n return;\n }\n previousBufferedFeedsComments = bufferedFeedsComments;\n previousBufferedFeedsReplyCounts = bufferedFeedsReplyCounts;\n\n // in case feeds comments changed, but the first page cids haven't\n const bufferedFeedsReplyCountsPageCids = getFeedsCommentsFirstPageCids(bufferedFeedsComments);\n const bufferedFeedsReplyCountsPageCidsChanged =\n bufferedFeedsReplyCountsPageCids.toString() !==\n previousBufferedFeedsReplyCountsPageCids.toString();\n if (!bufferedFeedsReplyCountsPageCidsChanged && !bufferedFeedsReplyCountsChanged) {\n return;\n }\n previousBufferedFeedsReplyCountsPageCids = bufferedFeedsReplyCountsPageCids;\n\n const { addNextRepliesPageToStore } = repliesPagesStore.getState();\n const { accounts } = accountsStore.getState();\n\n // bufferedFeedsReplyCounts have changed, check if any of them are low\n for (const feedName in bufferedFeedsReplyCounts) {\n if (feedsOptions[feedName].onlyIfCached) {\n continue;\n }\n const account = accounts[feedsOptions[feedName].accountId];\n const feedReplyCount = bufferedFeedsReplyCounts[feedName];\n let sortType = feedsOptions[feedName].sortType;\n const commentCid = feedsOptions[feedName].commentCid;\n\n // TODO: maybe skip if comment community address, comment cid or comment author is blocked?\n\n // comment hasn't loaded yet\n if (!comments[commentCid]) {\n continue;\n }\n\n sortType = getSortTypeFromComment(comments[commentCid], feedsOptions[feedName]);\n\n // comment replies count is low, fetch next replies page\n if (feedReplyCount <= commentRepliesLeftBeforeNextPage) {\n addNextRepliesPageToStore(comments[commentCid], sortType, account).catch((error: unknown) =>\n log.error(\"repliesStore repliesPagesStore.addNextRepliesPageToStore error\", {\n commentCid,\n comment: comments[commentCid],\n sortType,\n error,\n }),\n );\n }\n }\n};\n\nlet previousFeedsCommentsFirstPageCids: string[] = [];\nlet previousFeedsComments: Map<string, Comments> = new Map();\nlet previousFeedsCommentsLoadedCount = 0;\nlet previousFeedsCommentsRepliesPagesFirstUpdatedAts = \"\";\nconst updateFeedsOnFeedsCommentsChange = (repliesCommentsStoreState: any) => {\n const { comments } = repliesCommentsStoreState;\n const { feedsOptions, updateFeeds } = repliesStore.getState();\n\n // feeds comments haven't changed, do nothing\n const feedsComments = getFeedsComments(feedsOptions, comments);\n if (!feedsCommentsChanged(previousFeedsComments, feedsComments)) {\n return;\n }\n previousFeedsComments = feedsComments;\n\n // decide if feeds comments have changed by looking at all feeds comments page cids\n // (in case that a comment changed, but its first page cid didn't)\n const feedsCommentsFirstPageCids = getFeedsCommentsFirstPageCids(feedsComments);\n\n // first page cids haven't changed, do nothing\n if (feedsCommentsFirstPageCids.toString() === previousFeedsCommentsFirstPageCids.toString()) {\n // if no new feed comments have loaded, do nothing\n // in case a comment loads with no first page cid and first pages cids don't change, need to trigger hasMore update\n const feedsCommentsLoadedCount = getFeedsCommentsLoadedCount(feedsComments);\n if (feedsCommentsLoadedCount === previousFeedsCommentsLoadedCount) {\n // if comment.replies.pages haven't changed, do nothing\n const feedsCommentsRepliesPagesFirstUpdatedAts =\n getFeedsCommentsRepliesPagesFirstUpdatedAts(feedsComments);\n if (\n feedsCommentsRepliesPagesFirstUpdatedAts ===\n previousFeedsCommentsRepliesPagesFirstUpdatedAts\n ) {\n return;\n }\n\n previousFeedsCommentsRepliesPagesFirstUpdatedAts = feedsCommentsRepliesPagesFirstUpdatedAts;\n }\n previousFeedsCommentsLoadedCount = feedsCommentsLoadedCount;\n }\n\n // feeds comments have changed, update feeds\n previousFeedsCommentsFirstPageCids = feedsCommentsFirstPageCids;\n updateFeeds();\n};\n\nlet previousAccountsCommentsCount = 0;\nlet previousAccountsCommentsCids = \"\";\nconst updateFeedsOnAccountsCommentsChange = (accountsStoreState: any) => {\n const { accountsComments } = accountsStoreState;\n const accountsCommentsCount = Object.values(accountsComments as Comment[][]).reduce(\n (count, accountComments) => count + accountComments.length,\n 0,\n );\n\n // no changes, do nothing\n if (accountsCommentsCount === previousAccountsCommentsCount) {\n // if cids haven't changed (account comments receive cids after pending), do nothing\n const accountsCommentsCids = Object.values(accountsComments as Comment[][]).reduce(\n (cids, accountComments) => cids + String(accountComments.map((comment) => comment.cid || \"\")),\n \"\",\n );\n if (accountsCommentsCids === previousAccountsCommentsCids) {\n return;\n }\n previousAccountsCommentsCids = accountsCommentsCids;\n }\n previousAccountsCommentsCount = accountsCommentsCount;\n\n // TODO: only update the feeds that are relevant to the new accountComment.parentCid/postCid\n repliesStore.getState().updateFeeds();\n};\n\n// needed to view replies instantly without waiting for zustant store react rerenders. must be synchronous\nexport const getRepliesFirstPageSkipValidation = (\n comment: Comment,\n feedOptions: Partial<RepliesFeedOptions>,\n) => {\n const feedName = `firstPageSkipValidation-${comment?.cid}`;\n const feedsOptions: any = { [feedName]: feedOptions };\n const { accounts } = accountsStore.getState();\n\n // don't use comments store, only use preloaded comment.replies.pages\n const comments = { [comment.cid]: comment };\n\n // don't use any reply pages, they can't provide instant loading like preloaded comment.replies.pages\n const repliesPages = {};\n\n const filteredSortedFeeds = getFilteredSortedFeeds(\n feedsOptions,\n comments,\n repliesPages,\n accounts,\n );\n\n // only get first page and put next page in buffered\n const bufferedFeeds: Feeds = { [feedName]: [] };\n const repliesPerPage = feedOptions.repliesPerPage || defaultRepliesPerPage;\n if (filteredSortedFeeds[feedName].length > repliesPerPage) {\n bufferedFeeds[feedName] = filteredSortedFeeds[feedName].splice(repliesPerPage);\n }\n const feedsHaveMore = getFeedsHaveMore(\n feedsOptions,\n bufferedFeeds,\n comments,\n repliesPages,\n accounts,\n );\n addAccountsComments(feedsOptions, filteredSortedFeeds, feedsHaveMore);\n return { replies: filteredSortedFeeds[feedName], hasMore: feedsHaveMore[feedName] };\n};\n\n// reset store in between tests\nconst originalState = repliesStore.getState();\n// async function because some stores have async init\nexport const resetRepliesStore = async () => {\n previousBufferedFeedsReplyCounts = {};\n previousBufferedFeedsReplyCountsPageCids = [];\n previousBufferedFeedsComments = new Map();\n previousFeedsCommentsFirstPageCids = [];\n previousFeedsComments = new Map();\n previousFeedsCommentsLoadedCount = 0;\n previousFeedsCommentsRepliesPagesFirstUpdatedAts = \"\";\n previousRepliesPages = {};\n previousAccountsCommentsCount = 0;\n previousAccountsCommentsCids = \"\";\n updateFeedsPending = false;\n // destroy all component subscriptions to the store\n repliesStore.destroy();\n // restore original state\n repliesStore.setState(originalState);\n repliesCommentsStore.setState({ ...repliesCommentsStore.getState(), comments: {} });\n repliesStoreInitialized = false;\n};\n\n// reset database and store in between tests\nexport const resetRepliesDatabaseAndStore = async () => {\n await localForageLru.createInstance({ name: \"bitsocialReactHooks-repliesPages\" }).clear();\n await resetRepliesStore();\n};\n\nexport default repliesStore;\n"]}
@@ -3,8 +3,16 @@ import { Feeds, RepliesFeedOptions, RepliesFeedsOptions, Comment, Comments, Acco
3
3
  * Calculate the feeds from all the loaded replies pages, filter and sort them
4
4
  */
5
5
  export declare const getFilteredSortedFeeds: (feedsOptions: RepliesFeedsOptions, comments: Comments, repliesPages: RepliesPages, accounts: Accounts) => Feeds;
6
- export declare const getLoadedFeeds: (feedsOptions: RepliesFeedsOptions, loadedFeeds: Feeds, bufferedFeeds: Feeds, accounts: Accounts) => Promise<Feeds>;
7
- export declare const addAccountsComments: (feedsOptions: RepliesFeedsOptions, loadedFeeds: Feeds) => boolean;
6
+ type GetLoadedFeedsOptions = {
7
+ addAccountComments?: boolean;
8
+ feedsHaveMore?: {
9
+ [feedName: string]: boolean;
10
+ };
11
+ };
12
+ export declare const getLoadedFeeds: (feedsOptions: RepliesFeedsOptions, loadedFeeds: Feeds, bufferedFeeds: Feeds, accounts: Accounts, options?: GetLoadedFeedsOptions) => Promise<Feeds>;
13
+ export declare const addAccountsComments: (feedsOptions: RepliesFeedsOptions, loadedFeeds: Feeds, feedsHaveMore?: {
14
+ [feedName: string]: boolean;
15
+ }) => boolean;
8
16
  export declare const getBufferedFeedsWithoutLoadedFeeds: (bufferedFeeds: Feeds, loadedFeeds: Feeds) => Feeds;
9
17
  export declare const getUpdatedFeeds: (feedsOptions: RepliesFeedsOptions, filteredSortedFeeds: Feeds, updatedFeeds: Feeds, loadedFeeds: Feeds, accounts: Accounts) => Promise<Feeds>;
10
18
  export declare const getFeedsReplyCounts: (feedsOptions: RepliesFeedsOptions, feeds: Feeds) => {
@@ -22,4 +30,5 @@ export declare const getFeedsCommentsFirstPageCids: (feedsComments: Map<string,
22
30
  export declare const getFeedsCommentsRepliesPagesFirstUpdatedAts: (feedsComments: Map<string, Comment>) => string;
23
31
  export declare const getFeedsCommentsLoadedCount: (feedsComments: Map<string, Comment>) => number;
24
32
  export declare const getSortTypeFromComment: (comment: Comment, feedOptions: RepliesFeedOptions) => string;
33
+ export {};
25
34
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/stores/replies/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,EACL,kBAAkB,EAClB,mBAAmB,EACnB,OAAO,EACP,QAAQ,EAER,QAAQ,EAER,YAAY,EACb,MAAM,aAAa,CAAC;AASrB;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,cAAc,mBAAmB,EACjC,UAAU,QAAQ,EAClB,cAAc,YAAY,EAC1B,UAAU,QAAQ,UAmEnB,CAAC;AAwDF,eAAO,MAAM,cAAc,GACzB,cAAc,mBAAmB,EACjC,aAAa,KAAK,EAClB,eAAe,KAAK,EACpB,UAAU,QAAQ,mBAkEnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,cAAc,mBAAmB,EAAE,aAAa,KAAK,YAqGxF,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAAI,eAAe,KAAK,EAAE,aAAa,KAAK,UAoC1F,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,cAAc,mBAAmB,EACjC,qBAAqB,KAAK,EAC1B,cAAc,KAAK,EACnB,aAAa,KAAK,EAClB,UAAU,QAAQ,mBAmEnB,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,cAAc,mBAAmB,EAAE,OAAO,KAAK;;CAMlF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,cAAc,mBAAmB,EACjC,eAAe,KAAK,EACpB,UAAU,QAAQ,EAClB,cAAc,YAAY,EAC1B,UAAU,QAAQ;;CA+CnB,CAAC;AAGF,eAAO,MAAM,gBAAgB,GAAI,cAAc,mBAAmB,EAAE,UAAU,QAAQ,yBASrF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,uBAAuB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3C,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,YAYpC,CAAC;AAGF,eAAO,MAAM,6BAA6B,GAAI,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,EA4BzF,CAAC;AAGF,eAAO,MAAM,2CAA2C,GACtD,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAClC,MAWF,CAAC;AAGF,eAAO,MAAM,2BAA2B,GAAI,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAQjF,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,EAAE,aAAa,kBAAkB,WA0EvF,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/stores/replies/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,EACL,kBAAkB,EAClB,mBAAmB,EACnB,OAAO,EACP,QAAQ,EAER,QAAQ,EAER,YAAY,EACb,MAAM,aAAa,CAAC;AASrB;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,cAAc,mBAAmB,EACjC,UAAU,QAAQ,EAClB,cAAc,YAAY,EAC1B,UAAU,QAAQ,UAmEnB,CAAC;AAgFF,KAAK,qBAAqB,GAAG;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,cAAc,mBAAmB,EACjC,aAAa,KAAK,EAClB,eAAe,KAAK,EACpB,UAAU,QAAQ,EAClB,UAAS,qBAA0B,mBAqEpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,cAAc,mBAAmB,EACjC,aAAa,KAAK,EAClB,gBAAgB;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,YAmIhD,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAAI,eAAe,KAAK,EAAE,aAAa,KAAK,UAoC1F,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,cAAc,mBAAmB,EACjC,qBAAqB,KAAK,EAC1B,cAAc,KAAK,EACnB,aAAa,KAAK,EAClB,UAAU,QAAQ,mBAmEnB,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,cAAc,mBAAmB,EAAE,OAAO,KAAK;;CAMlF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,cAAc,mBAAmB,EACjC,eAAe,KAAK,EACpB,UAAU,QAAQ,EAClB,cAAc,YAAY,EAC1B,UAAU,QAAQ;;CA+CnB,CAAC;AAGF,eAAO,MAAM,gBAAgB,GAAI,cAAc,mBAAmB,EAAE,UAAU,QAAQ,yBASrF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,uBAAuB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3C,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,YAYpC,CAAC;AAGF,eAAO,MAAM,6BAA6B,GAAI,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,EA4BzF,CAAC;AAGF,eAAO,MAAM,2CAA2C,GACtD,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAClC,MAWF,CAAC;AAGF,eAAO,MAAM,2BAA2B,GAAI,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAQjF,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAAI,SAAS,OAAO,EAAE,aAAa,kBAAkB,WA0EvF,CAAC"}