@bitsocial/bitsocial-react-hooks 0.1.0
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.
- package/LICENSE +674 -0
- package/README.md +1365 -0
- package/dist/hooks/accounts/accounts.d.ts +64 -0
- package/dist/hooks/accounts/accounts.d.ts.map +1 -0
- package/dist/hooks/accounts/accounts.js +706 -0
- package/dist/hooks/accounts/accounts.js.map +1 -0
- package/dist/hooks/accounts/index.d.ts +2 -0
- package/dist/hooks/accounts/index.d.ts.map +1 -0
- package/dist/hooks/accounts/index.js +2 -0
- package/dist/hooks/accounts/index.js.map +1 -0
- package/dist/hooks/accounts/utils.d.ts +6 -0
- package/dist/hooks/accounts/utils.d.ts.map +1 -0
- package/dist/hooks/accounts/utils.js +226 -0
- package/dist/hooks/accounts/utils.js.map +1 -0
- package/dist/hooks/actions/actions.d.ts +19 -0
- package/dist/hooks/actions/actions.d.ts.map +1 -0
- package/dist/hooks/actions/actions.js +552 -0
- package/dist/hooks/actions/actions.js.map +1 -0
- package/dist/hooks/actions/index.d.ts +2 -0
- package/dist/hooks/actions/index.d.ts.map +1 -0
- package/dist/hooks/actions/index.js +2 -0
- package/dist/hooks/actions/index.js.map +1 -0
- package/dist/hooks/authors/author-avatars.d.ts +28 -0
- package/dist/hooks/authors/author-avatars.d.ts.map +1 -0
- package/dist/hooks/authors/author-avatars.js +191 -0
- package/dist/hooks/authors/author-avatars.js.map +1 -0
- package/dist/hooks/authors/authors.d.ts +37 -0
- package/dist/hooks/authors/authors.d.ts.map +1 -0
- package/dist/hooks/authors/authors.js +509 -0
- package/dist/hooks/authors/authors.js.map +1 -0
- package/dist/hooks/authors/index.d.ts +2 -0
- package/dist/hooks/authors/index.d.ts.map +1 -0
- package/dist/hooks/authors/index.js +2 -0
- package/dist/hooks/authors/index.js.map +1 -0
- package/dist/hooks/authors/utils.d.ts +4 -0
- package/dist/hooks/authors/utils.d.ts.map +1 -0
- package/dist/hooks/authors/utils.js +21 -0
- package/dist/hooks/authors/utils.js.map +1 -0
- package/dist/hooks/comments.d.ts +17 -0
- package/dist/hooks/comments.d.ts.map +1 -0
- package/dist/hooks/comments.js +351 -0
- package/dist/hooks/comments.js.map +1 -0
- package/dist/hooks/communities.d.ts +31 -0
- package/dist/hooks/communities.d.ts.map +1 -0
- package/dist/hooks/communities.js +389 -0
- package/dist/hooks/communities.js.map +1 -0
- package/dist/hooks/feeds/feeds.d.ts +18 -0
- package/dist/hooks/feeds/feeds.d.ts.map +1 -0
- package/dist/hooks/feeds/feeds.js +315 -0
- package/dist/hooks/feeds/feeds.js.map +1 -0
- package/dist/hooks/feeds/index.d.ts +2 -0
- package/dist/hooks/feeds/index.d.ts.map +1 -0
- package/dist/hooks/feeds/index.js +2 -0
- package/dist/hooks/feeds/index.js.map +1 -0
- package/dist/hooks/pkc-rpc.d.ts +7 -0
- package/dist/hooks/pkc-rpc.d.ts.map +1 -0
- package/dist/hooks/pkc-rpc.js +88 -0
- package/dist/hooks/pkc-rpc.js.map +1 -0
- package/dist/hooks/replies.d.ts +5 -0
- package/dist/hooks/replies.d.ts.map +1 -0
- package/dist/hooks/replies.js +155 -0
- package/dist/hooks/replies.js.map +1 -0
- package/dist/hooks/states.d.ts +15 -0
- package/dist/hooks/states.d.ts.map +1 -0
- package/dist/hooks/states.js +213 -0
- package/dist/hooks/states.js.map +1 -0
- package/dist/hooks/utils/use-interval.d.ts +3 -0
- package/dist/hooks/utils/use-interval.d.ts.map +1 -0
- package/dist/hooks/utils/use-interval.js +36 -0
- package/dist/hooks/utils/use-interval.js.map +1 -0
- package/dist/hooks/utils/use-previous.d.ts +1 -0
- package/dist/hooks/utils/use-previous.js +10 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/chain/chain.d.ts +36 -0
- package/dist/lib/chain/chain.d.ts.map +1 -0
- package/dist/lib/chain/chain.js +195 -0
- package/dist/lib/chain/chain.js.map +1 -0
- package/dist/lib/chain/index.d.ts +4 -0
- package/dist/lib/chain/index.d.ts.map +1 -0
- package/dist/lib/chain/index.js +4 -0
- package/dist/lib/chain/index.js.map +1 -0
- package/dist/lib/community-address.d.ts +6 -0
- package/dist/lib/community-address.d.ts.map +1 -0
- package/dist/lib/community-address.js +26 -0
- package/dist/lib/community-address.js.map +1 -0
- package/dist/lib/community-ref.d.ts +23 -0
- package/dist/lib/community-ref.d.ts.map +1 -0
- package/dist/lib/community-ref.js +113 -0
- package/dist/lib/community-ref.js.map +1 -0
- package/dist/lib/debug-utils.d.ts +9 -0
- package/dist/lib/debug-utils.d.ts.map +1 -0
- package/dist/lib/debug-utils.js +21 -0
- package/dist/lib/debug-utils.js.map +1 -0
- package/dist/lib/feed-sort-type.d.ts +2 -0
- package/dist/lib/feed-sort-type.d.ts.map +1 -0
- package/dist/lib/feed-sort-type.js +22 -0
- package/dist/lib/feed-sort-type.js.map +1 -0
- package/dist/lib/localforage-lru/index.d.ts +3 -0
- package/dist/lib/localforage-lru/index.d.ts.map +1 -0
- package/dist/lib/localforage-lru/index.js +46 -0
- package/dist/lib/localforage-lru/index.js.map +1 -0
- package/dist/lib/localforage-lru/localforage-lru.d.ts +6 -0
- package/dist/lib/localforage-lru/localforage-lru.d.ts.map +1 -0
- package/dist/lib/localforage-lru/localforage-lru.js +182 -0
- package/dist/lib/localforage-lru/localforage-lru.js.map +1 -0
- package/dist/lib/pkc-compat.d.ts +25 -0
- package/dist/lib/pkc-compat.d.ts.map +1 -0
- package/dist/lib/pkc-compat.js +131 -0
- package/dist/lib/pkc-compat.js.map +1 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.d.ts +3 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.d.ts.map +1 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.js +280 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.js.map +1 -0
- package/dist/lib/pkc-js/index.d.ts +11 -0
- package/dist/lib/pkc-js/index.d.ts.map +1 -0
- package/dist/lib/pkc-js/index.js +85 -0
- package/dist/lib/pkc-js/index.js.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.d.ts +3 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.d.ts.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.js +1235 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.js.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock.d.ts +137 -0
- package/dist/lib/pkc-js/pkc-js-mock.d.ts.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock.js +644 -0
- package/dist/lib/pkc-js/pkc-js-mock.js.map +1 -0
- package/dist/lib/polyfill.d.ts +3 -0
- package/dist/lib/polyfill.d.ts.map +1 -0
- package/dist/lib/polyfill.js +14 -0
- package/dist/lib/polyfill.js.map +1 -0
- package/dist/lib/protocol-compat.d.ts +14 -0
- package/dist/lib/protocol-compat.d.ts.map +1 -0
- package/dist/lib/protocol-compat.js +67 -0
- package/dist/lib/protocol-compat.js.map +1 -0
- package/dist/lib/test-utils.d.ts +29 -0
- package/dist/lib/test-utils.d.ts.map +1 -0
- package/dist/lib/test-utils.js +184 -0
- package/dist/lib/test-utils.js.map +1 -0
- package/dist/lib/utils/comment-moderation.d.ts +4 -0
- package/dist/lib/utils/comment-moderation.d.ts.map +1 -0
- package/dist/lib/utils/comment-moderation.js +56 -0
- package/dist/lib/utils/comment-moderation.js.map +1 -0
- package/dist/lib/utils/index.d.ts +4 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +4 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/utils.d.ts +23 -0
- package/dist/lib/utils/utils.d.ts.map +1 -0
- package/dist/lib/utils/utils.js +375 -0
- package/dist/lib/utils/utils.js.map +1 -0
- package/dist/lib/validator.d.ts +30 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +307 -0
- package/dist/lib/validator.js.map +1 -0
- package/dist/stores/accounts/account-generator.d.ts +51 -0
- package/dist/stores/accounts/account-generator.d.ts.map +1 -0
- package/dist/stores/accounts/account-generator.js +160 -0
- package/dist/stores/accounts/account-generator.js.map +1 -0
- package/dist/stores/accounts/accounts-actions-internal.d.ts +8 -0
- package/dist/stores/accounts/accounts-actions-internal.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-actions-internal.js +403 -0
- package/dist/stores/accounts/accounts-actions-internal.js.map +1 -0
- package/dist/stores/accounts/accounts-actions.d.ts +46 -0
- package/dist/stores/accounts/accounts-actions.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-actions.js +1341 -0
- package/dist/stores/accounts/accounts-actions.js.map +1 -0
- package/dist/stores/accounts/accounts-database.d.ts +34 -0
- package/dist/stores/accounts/accounts-database.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-database.js +685 -0
- package/dist/stores/accounts/accounts-database.js.map +1 -0
- package/dist/stores/accounts/accounts-store.d.ts +32 -0
- package/dist/stores/accounts/accounts-store.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-store.js +169 -0
- package/dist/stores/accounts/accounts-store.js.map +1 -0
- package/dist/stores/accounts/index.d.ts +4 -0
- package/dist/stores/accounts/index.d.ts.map +1 -0
- package/dist/stores/accounts/index.js +4 -0
- package/dist/stores/accounts/index.js.map +1 -0
- package/dist/stores/accounts/utils.d.ts +49 -0
- package/dist/stores/accounts/utils.d.ts.map +1 -0
- package/dist/stores/accounts/utils.js +419 -0
- package/dist/stores/accounts/utils.js.map +1 -0
- package/dist/stores/authors-comments/authors-comments-store.d.ts +37 -0
- package/dist/stores/authors-comments/authors-comments-store.d.ts.map +1 -0
- package/dist/stores/authors-comments/authors-comments-store.js +338 -0
- package/dist/stores/authors-comments/authors-comments-store.js.map +1 -0
- package/dist/stores/authors-comments/index.d.ts +4 -0
- package/dist/stores/authors-comments/index.d.ts.map +1 -0
- package/dist/stores/authors-comments/index.js +4 -0
- package/dist/stores/authors-comments/index.js.map +1 -0
- package/dist/stores/authors-comments/utils.d.ts +14 -0
- package/dist/stores/authors-comments/utils.d.ts.map +1 -0
- package/dist/stores/authors-comments/utils.js +81 -0
- package/dist/stores/authors-comments/utils.js.map +1 -0
- package/dist/stores/comments/comments-store.d.ts +19 -0
- package/dist/stores/comments/comments-store.d.ts.map +1 -0
- package/dist/stores/comments/comments-store.js +385 -0
- package/dist/stores/comments/comments-store.js.map +1 -0
- package/dist/stores/comments/index.d.ts +4 -0
- package/dist/stores/comments/index.d.ts.map +1 -0
- package/dist/stores/comments/index.js +4 -0
- package/dist/stores/comments/index.js.map +1 -0
- package/dist/stores/communities/communities-store.d.ts +17 -0
- package/dist/stores/communities/communities-store.d.ts.map +1 -0
- package/dist/stores/communities/communities-store.js +304 -0
- package/dist/stores/communities/communities-store.js.map +1 -0
- package/dist/stores/communities/index.d.ts +4 -0
- package/dist/stores/communities/index.d.ts.map +1 -0
- package/dist/stores/communities/index.js +4 -0
- package/dist/stores/communities/index.js.map +1 -0
- package/dist/stores/communities-pages/communities-pages-store.d.ts +23 -0
- package/dist/stores/communities-pages/communities-pages-store.d.ts.map +1 -0
- package/dist/stores/communities-pages/communities-pages-store.js +316 -0
- package/dist/stores/communities-pages/communities-pages-store.js.map +1 -0
- package/dist/stores/communities-pages/index.d.ts +4 -0
- package/dist/stores/communities-pages/index.d.ts.map +1 -0
- package/dist/stores/communities-pages/index.js +4 -0
- package/dist/stores/communities-pages/index.js.map +1 -0
- package/dist/stores/feeds/feed-sorter.d.ts +5 -0
- package/dist/stores/feeds/feed-sorter.d.ts.map +1 -0
- package/dist/stores/feeds/feed-sorter.js +135 -0
- package/dist/stores/feeds/feed-sorter.js.map +1 -0
- package/dist/stores/feeds/feeds-store.d.ts +25 -0
- package/dist/stores/feeds/feeds-store.d.ts.map +1 -0
- package/dist/stores/feeds/feeds-store.js +459 -0
- package/dist/stores/feeds/feeds-store.js.map +1 -0
- package/dist/stores/feeds/index.d.ts +4 -0
- package/dist/stores/feeds/index.d.ts.map +1 -0
- package/dist/stores/feeds/index.js +4 -0
- package/dist/stores/feeds/index.js.map +1 -0
- package/dist/stores/feeds/utils.d.ts +43 -0
- package/dist/stores/feeds/utils.d.ts.map +1 -0
- package/dist/stores/feeds/utils.js +736 -0
- package/dist/stores/feeds/utils.js.map +1 -0
- package/dist/stores/replies/index.d.ts +4 -0
- package/dist/stores/replies/index.d.ts.map +1 -0
- package/dist/stores/replies/index.js +4 -0
- package/dist/stores/replies/index.js.map +1 -0
- package/dist/stores/replies/replies-comments-store.d.ts +8 -0
- package/dist/stores/replies/replies-comments-store.d.ts.map +1 -0
- package/dist/stores/replies/replies-comments-store.js +23 -0
- package/dist/stores/replies/replies-comments-store.js.map +1 -0
- package/dist/stores/replies/replies-store.d.ts +29 -0
- package/dist/stores/replies/replies-store.d.ts.map +1 -0
- package/dist/stores/replies/replies-store.js +413 -0
- package/dist/stores/replies/replies-store.js.map +1 -0
- package/dist/stores/replies/utils.d.ts +25 -0
- package/dist/stores/replies/utils.d.ts.map +1 -0
- package/dist/stores/replies/utils.js +549 -0
- package/dist/stores/replies/utils.js.map +1 -0
- package/dist/stores/replies-pages/index.d.ts +4 -0
- package/dist/stores/replies-pages/index.d.ts.map +1 -0
- package/dist/stores/replies-pages/index.js +4 -0
- package/dist/stores/replies-pages/index.js.map +1 -0
- package/dist/stores/replies-pages/replies-pages-store.d.ts +20 -0
- package/dist/stores/replies-pages/replies-pages-store.d.ts.map +1 -0
- package/dist/stores/replies-pages/replies-pages-store.js +270 -0
- package/dist/stores/replies-pages/replies-pages-store.js.map +1 -0
- package/dist/stores/replies-pages/utils.d.ts +3 -0
- package/dist/stores/replies-pages/utils.d.ts.map +1 -0
- package/dist/stores/replies-pages/utils.js +43 -0
- package/dist/stores/replies-pages/utils.js.map +1 -0
- package/dist/types.d.ts +638 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +160 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { useEffect, useMemo, useState } from "react";
|
|
11
|
+
import { useAccount } from "../accounts/index.js";
|
|
12
|
+
import validator from "../../lib/validator.js";
|
|
13
|
+
import Logger from "@pkcprotocol/pkc-logger";
|
|
14
|
+
const log = Logger("bitsocial-react-hooks:feeds:hooks");
|
|
15
|
+
import assert from "assert";
|
|
16
|
+
import { deriveFeedSortType } from "../../lib/feed-sort-type.js";
|
|
17
|
+
import useFeedsStore from "../../stores/feeds/index.js";
|
|
18
|
+
import { addCommentModerationToComments } from "../../lib/utils/comment-moderation.js";
|
|
19
|
+
import shallow from "zustand/shallow";
|
|
20
|
+
import { getCommunityRefKeys, getUniqueSortedCommunityRefs, } from "../../lib/community-ref.js";
|
|
21
|
+
/**
|
|
22
|
+
* @param communities - The communities to fetch, e.g. [{name: 'memes.eth'}, {publicKey: '12D3KooW...'}]
|
|
23
|
+
* @param sortType - The sorting algo for the feed: 'hot' | 'new' | 'active' | 'topHour' | 'topDay' | 'topWeek' | 'topMonth' | 'topYear' | 'topAll' | 'controversialHour' | 'controversialDay' | 'controversialWeek' | 'controversialMonth' | 'controversialYear' | 'controversialAll'
|
|
24
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
25
|
+
* the active account.
|
|
26
|
+
*/
|
|
27
|
+
export function useFeed(options) {
|
|
28
|
+
assert(!options || typeof options === "object", `useFeed options argument '${options}' not an object`);
|
|
29
|
+
const opts = options || {};
|
|
30
|
+
let { communities, sortType, accountName, postsPerPage, filter, newerThan, accountComments, modQueue, } = opts;
|
|
31
|
+
const requestedSortType = sortType || "hot";
|
|
32
|
+
sortType = deriveFeedSortType(sortType, newerThan);
|
|
33
|
+
validator.validateUseFeedArguments({
|
|
34
|
+
communities,
|
|
35
|
+
communityRefs: opts.communityRefs,
|
|
36
|
+
communityAddresses: opts.communityAddresses,
|
|
37
|
+
sortType,
|
|
38
|
+
accountName,
|
|
39
|
+
postsPerPage,
|
|
40
|
+
filter,
|
|
41
|
+
newerThan,
|
|
42
|
+
accountComments,
|
|
43
|
+
});
|
|
44
|
+
const account = useAccount({ accountName });
|
|
45
|
+
const addFeedToStore = useFeedsStore((state) => state.addFeedToStore);
|
|
46
|
+
const incrementFeedPageNumber = useFeedsStore((state) => state.incrementFeedPageNumber);
|
|
47
|
+
const expandFeedTimeWindow = useFeedsStore((state) => state.expandFeedTimeWindow);
|
|
48
|
+
const resetFeed = useFeedsStore((state) => state.resetFeed);
|
|
49
|
+
const normalizedCommunityRefs = useMemo(() => communities || [], [communities]);
|
|
50
|
+
const uniqueCommunityRefs = useUniqueSortedCommunityRefs(normalizedCommunityRefs);
|
|
51
|
+
const uniqueCommunityKeys = useMemo(() => getCommunityRefKeys(uniqueCommunityRefs), [uniqueCommunityRefs]);
|
|
52
|
+
const feedName = useFeedName(account === null || account === void 0 ? void 0 : account.id, sortType, uniqueCommunityKeys, postsPerPage, filter, newerThan, accountComments, modQueue);
|
|
53
|
+
const [errors, setErrors] = useState([]);
|
|
54
|
+
const communityKeysWithNewerPosts = useFeedsStore((state) => state.feedsCommunityKeysWithNewerPosts[feedName]);
|
|
55
|
+
// add feed to store
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!uniqueCommunityRefs.length || !account) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const isBufferedFeed = false;
|
|
61
|
+
addFeedToStore(feedName, uniqueCommunityRefs, uniqueCommunityKeys, sortType, account, isBufferedFeed, postsPerPage, filter, newerThan, accountComments, modQueue, requestedSortType).catch((error) => log.error("useFeed addFeedToStore error", { feedName, error }));
|
|
62
|
+
}, [feedName]);
|
|
63
|
+
const feedKey = feedName;
|
|
64
|
+
const feed = useFeedsStore((state) => state.loadedFeeds[feedKey]);
|
|
65
|
+
const updatedFeed = useFeedsStore((state) => state.updatedFeeds[feedKey]);
|
|
66
|
+
const bufferedFeed = useFeedsStore((state) => state.bufferedFeeds[feedKey]);
|
|
67
|
+
let hasMore = useFeedsStore((state) => state.feedsHaveMore[feedKey]);
|
|
68
|
+
if (!feedName || typeof hasMore !== "boolean") {
|
|
69
|
+
hasMore = true;
|
|
70
|
+
}
|
|
71
|
+
if (!normalizedCommunityRefs.length) {
|
|
72
|
+
hasMore = false;
|
|
73
|
+
}
|
|
74
|
+
const loadMore = () => __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
try {
|
|
76
|
+
if (!uniqueCommunityRefs.length || !account) {
|
|
77
|
+
throw Error("useFeed cannot load more feed not initalized yet");
|
|
78
|
+
}
|
|
79
|
+
incrementFeedPageNumber(feedName);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
// wait 100 ms so infinite scroll doesn't spam this function
|
|
83
|
+
yield new Promise((r) => setTimeout(r, 50));
|
|
84
|
+
setErrors([...errors, e]);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
const reset = () => __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
try {
|
|
89
|
+
if (!uniqueCommunityRefs.length || !account) {
|
|
90
|
+
throw Error("useFeed cannot reset feed not initalized yet");
|
|
91
|
+
}
|
|
92
|
+
yield resetFeed(feedName);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
// wait 100 ms so infinite scroll doesn't spam this function
|
|
96
|
+
yield new Promise((r) => setTimeout(r, 50));
|
|
97
|
+
setErrors([...errors, e]);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
const expandTimeWindow = (nextNewerThan) => __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
try {
|
|
102
|
+
if (!uniqueCommunityRefs.length || !account) {
|
|
103
|
+
throw Error("useFeed cannot expand time window before feed initialized yet");
|
|
104
|
+
}
|
|
105
|
+
expandFeedTimeWindow(feedName, nextNewerThan);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
yield new Promise((r) => setTimeout(r, 50));
|
|
109
|
+
setErrors([...errors, e]);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
if (account && normalizedCommunityRefs.length) {
|
|
113
|
+
log("useFeed", {
|
|
114
|
+
feedLength: (feed === null || feed === void 0 ? void 0 : feed.length) || 0,
|
|
115
|
+
hasMore,
|
|
116
|
+
communities: normalizedCommunityRefs,
|
|
117
|
+
communityKeys: uniqueCommunityKeys,
|
|
118
|
+
sortType,
|
|
119
|
+
account,
|
|
120
|
+
feedsStoreOptions: useFeedsStore.getState().feedsOptions,
|
|
121
|
+
feedsStore: useFeedsStore.getState(),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const state = !hasMore ? "succeeded" : "fetching-ipns";
|
|
125
|
+
const normalizedFeed = useMemo(() => addCommentModerationToComments(feed), [feed]);
|
|
126
|
+
const normalizedBufferedFeed = useMemo(() => addCommentModerationToComments(bufferedFeed), [bufferedFeed]);
|
|
127
|
+
const normalizedUpdatedFeed = useMemo(() => addCommentModerationToComments(updatedFeed), [updatedFeed]);
|
|
128
|
+
return useMemo(() => ({
|
|
129
|
+
feed: normalizedFeed,
|
|
130
|
+
bufferedFeed: normalizedBufferedFeed,
|
|
131
|
+
updatedFeed: normalizedUpdatedFeed,
|
|
132
|
+
hasMore,
|
|
133
|
+
communityKeysWithNewerPosts: communityKeysWithNewerPosts || [],
|
|
134
|
+
loadMore,
|
|
135
|
+
expandTimeWindow,
|
|
136
|
+
reset,
|
|
137
|
+
state,
|
|
138
|
+
error: errors[errors.length - 1],
|
|
139
|
+
errors,
|
|
140
|
+
}), [
|
|
141
|
+
normalizedFeed,
|
|
142
|
+
normalizedBufferedFeed,
|
|
143
|
+
normalizedUpdatedFeed,
|
|
144
|
+
feedName,
|
|
145
|
+
hasMore,
|
|
146
|
+
errors,
|
|
147
|
+
communityKeysWithNewerPosts,
|
|
148
|
+
]);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Use useBufferedFeeds to buffer multiple feeds in the background so what when
|
|
152
|
+
* they are called by useFeed later, they are already preloaded.
|
|
153
|
+
*
|
|
154
|
+
* @param feedOptions - The options of the feed
|
|
155
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
156
|
+
* the active account.
|
|
157
|
+
*/
|
|
158
|
+
export function useBufferedFeeds(options) {
|
|
159
|
+
assert(!options || typeof options === "object", `useBufferedFeeds options argument '${options}' not an object`);
|
|
160
|
+
const opts = options !== null && options !== void 0 ? options : {};
|
|
161
|
+
const { feedsOptions = [], accountName } = opts;
|
|
162
|
+
validator.validateUseBufferedFeedsArguments({ feedsOptions, accountName });
|
|
163
|
+
const account = useAccount({ accountName });
|
|
164
|
+
const addFeedToStore = useFeedsStore((state) => state.addFeedToStore);
|
|
165
|
+
// do a bunch of calculations to get feedsOptionsFlattened and feedNames
|
|
166
|
+
const feedsOpts = feedsOptions;
|
|
167
|
+
const { communityRefsArrays, communityKeysArrays, sortTypes, postsPerPages, filters, newerThans, } = useMemo(() => {
|
|
168
|
+
const communityRefsArrays = [];
|
|
169
|
+
const communityKeysArrays = [];
|
|
170
|
+
const sortTypes = [];
|
|
171
|
+
const postsPerPages = [];
|
|
172
|
+
const filters = [];
|
|
173
|
+
const newerThans = [];
|
|
174
|
+
for (const feedOptions of feedsOpts) {
|
|
175
|
+
validator.validateUseFeedArguments({
|
|
176
|
+
communities: feedOptions.communities,
|
|
177
|
+
communityRefs: feedOptions.communityRefs,
|
|
178
|
+
communityAddresses: feedOptions.communityAddresses,
|
|
179
|
+
sortType: deriveFeedSortType(feedOptions.sortType, feedOptions.newerThan),
|
|
180
|
+
accountName,
|
|
181
|
+
postsPerPage: feedOptions.postsPerPage,
|
|
182
|
+
filter: feedOptions.filter,
|
|
183
|
+
newerThan: feedOptions.newerThan,
|
|
184
|
+
accountComments: feedOptions.accountComments,
|
|
185
|
+
});
|
|
186
|
+
const normalizedCommunityRefs = getUniqueSortedCommunityRefs(feedOptions.communities || []);
|
|
187
|
+
communityRefsArrays.push(normalizedCommunityRefs);
|
|
188
|
+
communityKeysArrays.push(getCommunityRefKeys(normalizedCommunityRefs));
|
|
189
|
+
sortTypes.push(deriveFeedSortType(feedOptions.sortType, feedOptions.newerThan));
|
|
190
|
+
postsPerPages.push(feedOptions.postsPerPage);
|
|
191
|
+
filters.push(feedOptions.filter);
|
|
192
|
+
newerThans.push(feedOptions.newerThan);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
communityRefsArrays,
|
|
196
|
+
communityKeysArrays,
|
|
197
|
+
sortTypes,
|
|
198
|
+
postsPerPages,
|
|
199
|
+
filters,
|
|
200
|
+
newerThans,
|
|
201
|
+
};
|
|
202
|
+
}, [feedsOpts]);
|
|
203
|
+
const feedNames = useFeedNames(account === null || account === void 0 ? void 0 : account.id, sortTypes, communityKeysArrays, postsPerPages, filters, newerThans);
|
|
204
|
+
const bufferedFeeds = useFeedsStore((state) => {
|
|
205
|
+
const bufferedFeeds = {};
|
|
206
|
+
for (const feedName of feedNames) {
|
|
207
|
+
bufferedFeeds[feedName] = state.bufferedFeeds[feedName];
|
|
208
|
+
}
|
|
209
|
+
return bufferedFeeds;
|
|
210
|
+
}, shallow);
|
|
211
|
+
// add feed to store
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
var _a;
|
|
214
|
+
for (const [i] of communityRefsArrays.entries()) {
|
|
215
|
+
const sortType = sortTypes[i];
|
|
216
|
+
const requestedSortType = ((_a = feedsOpts[i]) === null || _a === void 0 ? void 0 : _a.sortType) || sortType;
|
|
217
|
+
const uniqueCommunityRefs = communityRefsArrays[i];
|
|
218
|
+
const uniqueCommunityKeys = communityKeysArrays[i];
|
|
219
|
+
validator.validateFeedSortType(sortType);
|
|
220
|
+
const feedName = feedNames[i];
|
|
221
|
+
if (!account || !uniqueCommunityRefs.length) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (!bufferedFeeds[feedName]) {
|
|
225
|
+
const isBufferedFeed = true;
|
|
226
|
+
addFeedToStore(feedName, uniqueCommunityRefs, uniqueCommunityKeys, sortType, account, isBufferedFeed, undefined, undefined, undefined, undefined, undefined, requestedSortType).catch((error) => log.error("useBufferedFeeds addFeedToStore error", { feedName, error }));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}, [feedNames]);
|
|
230
|
+
// only give to the user the buffered feeds he requested
|
|
231
|
+
const bufferedFeedsArray = useMemo(() => {
|
|
232
|
+
const bufferedFeedsArray = [];
|
|
233
|
+
for (const feedName of feedNames) {
|
|
234
|
+
bufferedFeedsArray.push(addCommentModerationToComments(bufferedFeeds[feedName]));
|
|
235
|
+
}
|
|
236
|
+
return bufferedFeedsArray;
|
|
237
|
+
}, [bufferedFeeds, feedNames]);
|
|
238
|
+
if (account && (feedsOptions === null || feedsOptions === void 0 ? void 0 : feedsOptions.length)) {
|
|
239
|
+
log("useBufferedFeeds", {
|
|
240
|
+
bufferedFeeds,
|
|
241
|
+
feedsOptions,
|
|
242
|
+
account,
|
|
243
|
+
accountName,
|
|
244
|
+
feedsStoreOptions: useFeedsStore.getState().feedsOptions,
|
|
245
|
+
feedsStore: useFeedsStore.getState(),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
const state = "fetching-ipns";
|
|
249
|
+
return useMemo(() => ({
|
|
250
|
+
bufferedFeeds: bufferedFeedsArray,
|
|
251
|
+
state,
|
|
252
|
+
error: undefined,
|
|
253
|
+
errors: [],
|
|
254
|
+
}), [bufferedFeedsArray, feedsOptions]);
|
|
255
|
+
}
|
|
256
|
+
function useUniqueSortedCommunityRefs(communityRefs) {
|
|
257
|
+
return useMemo(() => {
|
|
258
|
+
return getUniqueSortedCommunityRefs(communityRefs);
|
|
259
|
+
}, [communityRefs]);
|
|
260
|
+
}
|
|
261
|
+
function useFeedName(accountId, sortType, uniqueCommunityKeys, postsPerPage, filter, newerThan, accountComments, modQueue) {
|
|
262
|
+
const filterKey = filter === null || filter === void 0 ? void 0 : filter.key;
|
|
263
|
+
const accountCommentsNewerThan = accountComments === null || accountComments === void 0 ? void 0 : accountComments.newerThan;
|
|
264
|
+
const accountCommentsAppend = accountComments === null || accountComments === void 0 ? void 0 : accountComments.append;
|
|
265
|
+
return useMemo(() => {
|
|
266
|
+
return (accountId +
|
|
267
|
+
"-" +
|
|
268
|
+
sortType +
|
|
269
|
+
"-" +
|
|
270
|
+
uniqueCommunityKeys +
|
|
271
|
+
"-" +
|
|
272
|
+
postsPerPage +
|
|
273
|
+
"-" +
|
|
274
|
+
filterKey +
|
|
275
|
+
"-" +
|
|
276
|
+
newerThan +
|
|
277
|
+
"-" +
|
|
278
|
+
accountCommentsNewerThan +
|
|
279
|
+
"-" +
|
|
280
|
+
accountCommentsAppend +
|
|
281
|
+
"-" +
|
|
282
|
+
modQueue);
|
|
283
|
+
}, [
|
|
284
|
+
accountId,
|
|
285
|
+
sortType,
|
|
286
|
+
uniqueCommunityKeys,
|
|
287
|
+
postsPerPage,
|
|
288
|
+
filterKey,
|
|
289
|
+
newerThan,
|
|
290
|
+
accountCommentsNewerThan,
|
|
291
|
+
accountCommentsAppend,
|
|
292
|
+
modQueue === null || modQueue === void 0 ? void 0 : modQueue.toString(),
|
|
293
|
+
]);
|
|
294
|
+
}
|
|
295
|
+
function useFeedNames(accountId, sortTypes, uniqueCommunityKeysArrays, postsPerPages, filters, newerThans) {
|
|
296
|
+
return useMemo(() => {
|
|
297
|
+
var _a;
|
|
298
|
+
const feedNames = [];
|
|
299
|
+
for (const [i] of sortTypes.entries()) {
|
|
300
|
+
feedNames.push(accountId +
|
|
301
|
+
"-" +
|
|
302
|
+
sortTypes[i] +
|
|
303
|
+
"-" +
|
|
304
|
+
uniqueCommunityKeysArrays[i] +
|
|
305
|
+
"-" +
|
|
306
|
+
postsPerPages[i] +
|
|
307
|
+
"-" +
|
|
308
|
+
((_a = filters[i]) === null || _a === void 0 ? void 0 : _a.key) +
|
|
309
|
+
"-" +
|
|
310
|
+
newerThans[i]);
|
|
311
|
+
}
|
|
312
|
+
return feedNames;
|
|
313
|
+
}, [accountId, sortTypes, uniqueCommunityKeysArrays, postsPerPages, filters, newerThans]);
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=feeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feeds.js","sourceRoot":"","sources":["../../../src/hooks/feeds/feeds.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { useAccount } from \"../accounts\";\nimport validator from \"../../lib/validator\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:feeds:hooks\");\nimport assert from \"assert\";\nimport { deriveFeedSortType } from \"../../lib/feed-sort-type\";\nimport {\n Feed,\n Feeds,\n UseBufferedFeedsOptions,\n UseBufferedFeedsResult,\n UseFeedOptions,\n UseFeedResult,\n CommentsFilter,\n} from \"../../types\";\nimport useFeedsStore from \"../../stores/feeds\";\nimport { addCommentModerationToComments } from \"../../lib/utils/comment-moderation\";\nimport shallow from \"zustand/shallow\";\nimport {\n CommunityLookupRef,\n getCommunityRefKeys,\n getUniqueSortedCommunityRefs,\n} from \"../../lib/community-ref\";\n\n/**\n * @param communities - The communities to fetch, e.g. [{name: 'memes.eth'}, {publicKey: '12D3KooW...'}]\n * @param sortType - The sorting algo for the feed: 'hot' | 'new' | 'active' | 'topHour' | 'topDay' | 'topWeek' | 'topMonth' | 'topYear' | 'topAll' | 'controversialHour' | 'controversialDay' | 'controversialWeek' | 'controversialMonth' | 'controversialYear' | 'controversialAll'\n * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use\n * the active account.\n */\nexport function useFeed(options?: UseFeedOptions): UseFeedResult {\n assert(\n !options || typeof options === \"object\",\n `useFeed options argument '${options}' not an object`,\n );\n const opts = options || {};\n let {\n communities,\n sortType,\n accountName,\n postsPerPage,\n filter,\n newerThan,\n accountComments,\n modQueue,\n } = opts;\n const requestedSortType = sortType || \"hot\";\n sortType = deriveFeedSortType(sortType, newerThan);\n\n validator.validateUseFeedArguments({\n communities,\n communityRefs: (opts as any).communityRefs,\n communityAddresses: (opts as any).communityAddresses,\n sortType,\n accountName,\n postsPerPage,\n filter,\n newerThan,\n accountComments,\n });\n const account = useAccount({ accountName });\n const addFeedToStore = useFeedsStore((state) => state.addFeedToStore);\n const incrementFeedPageNumber = useFeedsStore((state) => state.incrementFeedPageNumber);\n const expandFeedTimeWindow = useFeedsStore((state) => state.expandFeedTimeWindow);\n const resetFeed = useFeedsStore((state) => state.resetFeed);\n const normalizedCommunityRefs = useMemo(() => communities || [], [communities]);\n const uniqueCommunityRefs = useUniqueSortedCommunityRefs(normalizedCommunityRefs);\n const uniqueCommunityKeys = useMemo(\n () => getCommunityRefKeys(uniqueCommunityRefs),\n [uniqueCommunityRefs],\n );\n const feedName = useFeedName(\n account?.id,\n sortType,\n uniqueCommunityKeys,\n postsPerPage,\n filter,\n newerThan,\n accountComments,\n modQueue,\n );\n const [errors, setErrors] = useState<Error[]>([]);\n const communityKeysWithNewerPosts = useFeedsStore(\n (state) => state.feedsCommunityKeysWithNewerPosts[feedName],\n );\n\n // add feed to store\n useEffect(() => {\n if (!uniqueCommunityRefs.length || !account) {\n return;\n }\n const isBufferedFeed = false;\n addFeedToStore(\n feedName,\n uniqueCommunityRefs,\n uniqueCommunityKeys,\n sortType,\n account,\n isBufferedFeed,\n postsPerPage,\n filter,\n newerThan,\n accountComments,\n modQueue,\n requestedSortType,\n ).catch((error: unknown) => log.error(\"useFeed addFeedToStore error\", { feedName, error }));\n }, [feedName]);\n\n const feedKey = feedName;\n const feed = useFeedsStore((state) => state.loadedFeeds[feedKey]);\n const updatedFeed = useFeedsStore((state) => state.updatedFeeds[feedKey]);\n const bufferedFeed = useFeedsStore((state) => state.bufferedFeeds[feedKey]);\n let hasMore = useFeedsStore((state) => state.feedsHaveMore[feedKey]);\n if (!feedName || typeof hasMore !== \"boolean\") {\n hasMore = true;\n }\n if (!normalizedCommunityRefs.length) {\n hasMore = false;\n }\n\n const loadMore = async () => {\n try {\n if (!uniqueCommunityRefs.length || !account) {\n throw Error(\"useFeed cannot load more feed not initalized yet\");\n }\n incrementFeedPageNumber(feedName);\n } catch (e: any) {\n // wait 100 ms so infinite scroll doesn't spam this function\n await new Promise((r) => setTimeout(r, 50));\n setErrors([...errors, e]);\n }\n };\n\n const reset = async () => {\n try {\n if (!uniqueCommunityRefs.length || !account) {\n throw Error(\"useFeed cannot reset feed not initalized yet\");\n }\n await resetFeed(feedName);\n } catch (e: any) {\n // wait 100 ms so infinite scroll doesn't spam this function\n await new Promise((r) => setTimeout(r, 50));\n setErrors([...errors, e]);\n }\n };\n\n const expandTimeWindow = async (nextNewerThan?: number) => {\n try {\n if (!uniqueCommunityRefs.length || !account) {\n throw Error(\"useFeed cannot expand time window before feed initialized yet\");\n }\n expandFeedTimeWindow(feedName, nextNewerThan);\n } catch (e: any) {\n await new Promise((r) => setTimeout(r, 50));\n setErrors([...errors, e]);\n }\n };\n\n if (account && normalizedCommunityRefs.length) {\n log(\"useFeed\", {\n feedLength: feed?.length || 0,\n hasMore,\n communities: normalizedCommunityRefs,\n communityKeys: uniqueCommunityKeys,\n sortType,\n account,\n feedsStoreOptions: useFeedsStore.getState().feedsOptions,\n feedsStore: useFeedsStore.getState(),\n });\n }\n\n const state = !hasMore ? \"succeeded\" : \"fetching-ipns\";\n const normalizedFeed = useMemo(() => addCommentModerationToComments(feed), [feed]);\n const normalizedBufferedFeed = useMemo(\n () => addCommentModerationToComments(bufferedFeed),\n [bufferedFeed],\n );\n const normalizedUpdatedFeed = useMemo(\n () => addCommentModerationToComments(updatedFeed),\n [updatedFeed],\n );\n\n return useMemo(\n () => ({\n feed: normalizedFeed,\n bufferedFeed: normalizedBufferedFeed,\n updatedFeed: normalizedUpdatedFeed,\n hasMore,\n communityKeysWithNewerPosts: communityKeysWithNewerPosts || [],\n loadMore,\n expandTimeWindow,\n reset,\n state,\n error: errors[errors.length - 1],\n errors,\n }),\n [\n normalizedFeed,\n normalizedBufferedFeed,\n normalizedUpdatedFeed,\n feedName,\n hasMore,\n errors,\n communityKeysWithNewerPosts,\n ],\n );\n}\n\n/**\n * Use useBufferedFeeds to buffer multiple feeds in the background so what when\n * they are called by useFeed later, they are already preloaded.\n *\n * @param feedOptions - The options of the feed\n * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use\n * the active account.\n */\nexport function useBufferedFeeds(options?: UseBufferedFeedsOptions): UseBufferedFeedsResult {\n assert(\n !options || typeof options === \"object\",\n `useBufferedFeeds options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { feedsOptions = [], accountName } = opts;\n validator.validateUseBufferedFeedsArguments({ feedsOptions, accountName });\n const account = useAccount({ accountName });\n const addFeedToStore = useFeedsStore((state) => state.addFeedToStore);\n\n // do a bunch of calculations to get feedsOptionsFlattened and feedNames\n const feedsOpts = feedsOptions;\n const {\n communityRefsArrays,\n communityKeysArrays,\n sortTypes,\n postsPerPages,\n filters,\n newerThans,\n } = useMemo(() => {\n const communityRefsArrays: CommunityLookupRef[][] = [];\n const communityKeysArrays: string[][] = [];\n const sortTypes: string[] = [];\n const postsPerPages: (number | undefined)[] = [];\n const filters: (CommentsFilter | undefined)[] = [];\n const newerThans: (number | undefined)[] = [];\n for (const feedOptions of feedsOpts) {\n validator.validateUseFeedArguments({\n communities: feedOptions.communities,\n communityRefs: (feedOptions as any).communityRefs,\n communityAddresses: (feedOptions as any).communityAddresses,\n sortType: deriveFeedSortType(feedOptions.sortType, feedOptions.newerThan),\n accountName,\n postsPerPage: feedOptions.postsPerPage,\n filter: feedOptions.filter,\n newerThan: feedOptions.newerThan,\n accountComments: feedOptions.accountComments,\n });\n const normalizedCommunityRefs = getUniqueSortedCommunityRefs(feedOptions.communities || []);\n communityRefsArrays.push(normalizedCommunityRefs);\n communityKeysArrays.push(getCommunityRefKeys(normalizedCommunityRefs));\n sortTypes.push(deriveFeedSortType(feedOptions.sortType, feedOptions.newerThan));\n postsPerPages.push(feedOptions.postsPerPage);\n filters.push(feedOptions.filter);\n newerThans.push(feedOptions.newerThan);\n }\n return {\n communityRefsArrays,\n communityKeysArrays,\n sortTypes,\n postsPerPages,\n filters,\n newerThans,\n };\n }, [feedsOpts]);\n const feedNames = useFeedNames(\n account?.id,\n sortTypes,\n communityKeysArrays,\n postsPerPages,\n filters,\n newerThans,\n );\n\n const bufferedFeeds = useFeedsStore((state) => {\n const bufferedFeeds: Feeds = {};\n for (const feedName of feedNames) {\n bufferedFeeds[feedName] = state.bufferedFeeds[feedName];\n }\n return bufferedFeeds;\n }, shallow);\n\n // add feed to store\n useEffect(() => {\n for (const [i] of communityRefsArrays.entries()) {\n const sortType = sortTypes[i];\n const requestedSortType = feedsOpts[i]?.sortType || sortType;\n const uniqueCommunityRefs = communityRefsArrays[i];\n const uniqueCommunityKeys = communityKeysArrays[i];\n validator.validateFeedSortType(sortType);\n const feedName = feedNames[i];\n if (!account || !uniqueCommunityRefs.length) {\n continue;\n }\n if (!bufferedFeeds[feedName]) {\n const isBufferedFeed = true;\n addFeedToStore(\n feedName,\n uniqueCommunityRefs,\n uniqueCommunityKeys,\n sortType,\n account,\n isBufferedFeed,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n requestedSortType,\n ).catch((error: unknown) =>\n log.error(\"useBufferedFeeds addFeedToStore error\", { feedName, error }),\n );\n }\n }\n }, [feedNames]);\n\n // only give to the user the buffered feeds he requested\n const bufferedFeedsArray: Feed[] = useMemo(() => {\n const bufferedFeedsArray: Feed[] = [];\n for (const feedName of feedNames) {\n bufferedFeedsArray.push(addCommentModerationToComments(bufferedFeeds[feedName]));\n }\n return bufferedFeedsArray;\n }, [bufferedFeeds, feedNames]);\n\n if (account && feedsOptions?.length) {\n log(\"useBufferedFeeds\", {\n bufferedFeeds,\n feedsOptions,\n account,\n accountName,\n feedsStoreOptions: useFeedsStore.getState().feedsOptions,\n feedsStore: useFeedsStore.getState(),\n });\n }\n\n const state = \"fetching-ipns\";\n\n return useMemo(\n () => ({\n bufferedFeeds: bufferedFeedsArray,\n state,\n error: undefined,\n errors: [],\n }),\n [bufferedFeedsArray, feedsOptions],\n );\n}\n\nfunction useUniqueSortedCommunityRefs(communityRefs?: CommunityLookupRef[]) {\n return useMemo(() => {\n return getUniqueSortedCommunityRefs(communityRefs);\n }, [communityRefs]);\n}\n\nfunction useFeedName(\n accountId: string,\n sortType: string,\n uniqueCommunityKeys: string[],\n postsPerPage?: number,\n filter?: CommentsFilter,\n newerThan?: number,\n accountComments?: UseFeedOptions[\"accountComments\"],\n modQueue?: string[],\n) {\n const filterKey = filter?.key;\n const accountCommentsNewerThan = accountComments?.newerThan;\n const accountCommentsAppend = accountComments?.append;\n return useMemo(() => {\n return (\n accountId +\n \"-\" +\n sortType +\n \"-\" +\n uniqueCommunityKeys +\n \"-\" +\n postsPerPage +\n \"-\" +\n filterKey +\n \"-\" +\n newerThan +\n \"-\" +\n accountCommentsNewerThan +\n \"-\" +\n accountCommentsAppend +\n \"-\" +\n modQueue\n );\n }, [\n accountId,\n sortType,\n uniqueCommunityKeys,\n postsPerPage,\n filterKey,\n newerThan,\n accountCommentsNewerThan,\n accountCommentsAppend,\n modQueue?.toString(),\n ]);\n}\n\nfunction useFeedNames(\n accountId: string,\n sortTypes: string[],\n uniqueCommunityKeysArrays: string[][],\n postsPerPages: (number | undefined)[],\n filters: (CommentsFilter | undefined)[],\n newerThans: (number | undefined)[],\n) {\n return useMemo(() => {\n const feedNames: string[] = [];\n for (const [i] of sortTypes.entries()) {\n feedNames.push(\n accountId +\n \"-\" +\n sortTypes[i] +\n \"-\" +\n uniqueCommunityKeysArrays[i] +\n \"-\" +\n postsPerPages[i] +\n \"-\" +\n filters[i]?.key +\n \"-\" +\n newerThans[i],\n );\n }\n return feedNames;\n }, [accountId, sortTypes, uniqueCommunityKeysArrays, postsPerPages, filters, newerThans]);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/feeds/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/feeds/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC","sourcesContent":["export * from \"./feeds\";\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { UsePkcRpcSettingsOptions, UsePkcRpcSettingsResult } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
4
|
+
* the active account.
|
|
5
|
+
*/
|
|
6
|
+
export declare function usePkcRpcSettings(options?: UsePkcRpcSettingsOptions): UsePkcRpcSettingsResult;
|
|
7
|
+
//# sourceMappingURL=pkc-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkc-rpc.d.ts","sourceRoot":"","sources":["../../src/hooks/pkc-rpc.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAkB,MAAM,UAAU,CAAC;AAM7F;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,uBAAuB,CAoF7F"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { useState, useMemo, useEffect } from "react";
|
|
11
|
+
import { useAccount } from "./accounts/index.js";
|
|
12
|
+
import assert from "assert";
|
|
13
|
+
import { getProtocolClient, getRpcClients } from "../lib/pkc-compat.js";
|
|
14
|
+
const getFirstRpcClient = (protocolClient) => Object.values(getRpcClients(protocolClient) || {})[0];
|
|
15
|
+
/**
|
|
16
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
17
|
+
* the active account.
|
|
18
|
+
*/
|
|
19
|
+
export function usePkcRpcSettings(options) {
|
|
20
|
+
assert(!options || typeof options === "object", `usePkcRpcSettings options argument '${options}' not an object`);
|
|
21
|
+
const { accountName } = options !== null && options !== void 0 ? options : {};
|
|
22
|
+
const account = useAccount({ accountName });
|
|
23
|
+
const protocolClient = getProtocolClient(account);
|
|
24
|
+
const rpcClient = getFirstRpcClient(protocolClient);
|
|
25
|
+
const [pkcRpcSettingsState, setPkcRpcSettingsState] = useState();
|
|
26
|
+
const [state, setState] = useState("initializing");
|
|
27
|
+
const [errors, setErrors] = useState([]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (!account || !protocolClient)
|
|
30
|
+
return;
|
|
31
|
+
if (!rpcClient)
|
|
32
|
+
return;
|
|
33
|
+
if (rpcClient.settings != null)
|
|
34
|
+
setPkcRpcSettingsState(rpcClient.settings);
|
|
35
|
+
const rpcState = rpcClient.state;
|
|
36
|
+
if (rpcState != null && rpcState !== "")
|
|
37
|
+
setState(rpcState);
|
|
38
|
+
const onRpcSettingsChange = (pkcRpcSettings) => {
|
|
39
|
+
setPkcRpcSettingsState(pkcRpcSettings);
|
|
40
|
+
};
|
|
41
|
+
const onRpcStateChange = (rpcState) => {
|
|
42
|
+
setState(rpcState);
|
|
43
|
+
};
|
|
44
|
+
const onRpcError = (e) => {
|
|
45
|
+
setErrors((prevErrors) => [...prevErrors, e]);
|
|
46
|
+
};
|
|
47
|
+
rpcClient.on("settingschange", onRpcSettingsChange);
|
|
48
|
+
rpcClient.on("statechange", onRpcStateChange);
|
|
49
|
+
rpcClient.on("error", onRpcError);
|
|
50
|
+
// clean up
|
|
51
|
+
return () => {
|
|
52
|
+
rpcClient.removeListener("settingschange", onRpcSettingsChange);
|
|
53
|
+
rpcClient.removeListener("statechange", onRpcStateChange);
|
|
54
|
+
rpcClient.removeListener("error", onRpcError);
|
|
55
|
+
};
|
|
56
|
+
}, [account === null || account === void 0 ? void 0 : account.id, rpcClient, protocolClient]);
|
|
57
|
+
const updatePkcRpcSettings = (pkcRpcSettings) => __awaiter(this, void 0, void 0, function* () {
|
|
58
|
+
assert(account, `can't use usePkcRpcSettings.setPkcRpcSettings before initialized`);
|
|
59
|
+
assert(pkcRpcSettings && typeof pkcRpcSettings === "object", `usePkcRpcSettings.setPkcRpcSettings pkcRpcSettings argument '${pkcRpcSettings}' not an object`);
|
|
60
|
+
const currentRpcClient = getFirstRpcClient(getProtocolClient(account));
|
|
61
|
+
assert(currentRpcClient, `can't use usePkcRpcSettings.setPkcRpcSettings no account.pkc.clients.pkcRpcClients`);
|
|
62
|
+
try {
|
|
63
|
+
yield currentRpcClient.setSettings(pkcRpcSettings);
|
|
64
|
+
setState("succeeded");
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
setErrors((prevErrors) => [...prevErrors, e]);
|
|
68
|
+
setState("failed");
|
|
69
|
+
}
|
|
70
|
+
const rpcStateAfter = currentRpcClient.state;
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
setState((prevState) => {
|
|
73
|
+
if (prevState !== rpcStateAfter && rpcStateAfter != null && rpcStateAfter !== "") {
|
|
74
|
+
return rpcStateAfter;
|
|
75
|
+
}
|
|
76
|
+
return prevState;
|
|
77
|
+
});
|
|
78
|
+
}, 10000);
|
|
79
|
+
});
|
|
80
|
+
return useMemo(() => ({
|
|
81
|
+
pkcRpcSettings: pkcRpcSettingsState,
|
|
82
|
+
setPkcRpcSettings: updatePkcRpcSettings,
|
|
83
|
+
state,
|
|
84
|
+
error: errors === null || errors === void 0 ? void 0 : errors[errors.length - 1],
|
|
85
|
+
errors,
|
|
86
|
+
}), [pkcRpcSettingsState, account === null || account === void 0 ? void 0 : account.id, state, errors]);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=pkc-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkc-rpc.js","sourceRoot":"","sources":["../../src/hooks/pkc-rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useMemo, useEffect } from \"react\";\nimport { useAccount } from \"./accounts\";\nimport assert from \"assert\";\nimport { UsePkcRpcSettingsOptions, UsePkcRpcSettingsResult, PkcRpcSettings } from \"../types\";\nimport { getProtocolClient, getRpcClients } from \"../lib/pkc-compat\";\n\nconst getFirstRpcClient = (protocolClient: any) =>\n Object.values(getRpcClients(protocolClient) || {})[0] as any;\n\n/**\n * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use\n * the active account.\n */\nexport function usePkcRpcSettings(options?: UsePkcRpcSettingsOptions): UsePkcRpcSettingsResult {\n assert(\n !options || typeof options === \"object\",\n `usePkcRpcSettings options argument '${options}' not an object`,\n );\n const { accountName } = options ?? {};\n const account = useAccount({ accountName });\n const protocolClient = getProtocolClient(account);\n const rpcClient = getFirstRpcClient(protocolClient);\n const [pkcRpcSettingsState, setPkcRpcSettingsState] = useState<PkcRpcSettings>();\n const [state, setState] = useState<string>(\"initializing\");\n const [errors, setErrors] = useState<Error[]>([]);\n\n useEffect(() => {\n if (!account || !protocolClient) return;\n if (!rpcClient) return;\n\n if (rpcClient.settings != null) setPkcRpcSettingsState(rpcClient.settings);\n const rpcState = rpcClient.state;\n if (rpcState != null && rpcState !== \"\") setState(rpcState);\n\n const onRpcSettingsChange = (pkcRpcSettings: PkcRpcSettings) => {\n setPkcRpcSettingsState(pkcRpcSettings);\n };\n const onRpcStateChange = (rpcState: string) => {\n setState(rpcState);\n };\n const onRpcError = (e: any) => {\n setErrors((prevErrors) => [...prevErrors, e]);\n };\n\n rpcClient.on(\"settingschange\", onRpcSettingsChange);\n rpcClient.on(\"statechange\", onRpcStateChange);\n rpcClient.on(\"error\", onRpcError);\n\n // clean up\n return () => {\n rpcClient.removeListener(\"settingschange\", onRpcSettingsChange);\n rpcClient.removeListener(\"statechange\", onRpcStateChange);\n rpcClient.removeListener(\"error\", onRpcError);\n };\n }, [account?.id, rpcClient, protocolClient]);\n\n const updatePkcRpcSettings = async (pkcRpcSettings: PkcRpcSettings) => {\n assert(account, `can't use usePkcRpcSettings.setPkcRpcSettings before initialized`);\n assert(\n pkcRpcSettings && typeof pkcRpcSettings === \"object\",\n `usePkcRpcSettings.setPkcRpcSettings pkcRpcSettings argument '${pkcRpcSettings}' not an object`,\n );\n const currentRpcClient = getFirstRpcClient(getProtocolClient(account));\n assert(\n currentRpcClient,\n `can't use usePkcRpcSettings.setPkcRpcSettings no account.pkc.clients.pkcRpcClients`,\n );\n\n try {\n await currentRpcClient.setSettings(pkcRpcSettings);\n setState(\"succeeded\");\n } catch (e: any) {\n setErrors((prevErrors) => [...prevErrors, e]);\n setState(\"failed\");\n }\n\n const rpcStateAfter = currentRpcClient.state;\n setTimeout(() => {\n setState((prevState) => {\n if (prevState !== rpcStateAfter && rpcStateAfter != null && rpcStateAfter !== \"\") {\n return rpcStateAfter;\n }\n return prevState;\n });\n }, 10000);\n };\n\n return useMemo(\n () => ({\n pkcRpcSettings: pkcRpcSettingsState,\n setPkcRpcSettings: updatePkcRpcSettings,\n state,\n error: errors?.[errors.length - 1],\n errors,\n }),\n [pkcRpcSettingsState, account?.id, state, errors],\n );\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { UseRepliesOptions, UseRepliesResult } from "../types.js";
|
|
2
|
+
/** Pure helper to append an error to the errors array; used for deterministic coverage of reset/loadMore catch paths. */
|
|
3
|
+
export declare function appendErrorToErrors(prevErrors: Error[], e: Error): Error[];
|
|
4
|
+
export declare function useReplies(options?: UseRepliesOptions): UseRepliesResult;
|
|
5
|
+
//# sourceMappingURL=replies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replies.d.ts","sourceRoot":"","sources":["../../src/hooks/replies.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAQ/D,yHAAyH;AACzH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,CAE1E;AAED,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CAuLxE"}
|