@bitsocial/bitsocial-react-hooks 0.1.19 → 0.1.21
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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
## [0.1.21](https://github.com/bitsocialnet/bitsocial-react-hooks/compare/v0.1.20...v0.1.21) (2026-06-24)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **accounts:** handle empty account comment lookups ([#65](https://github.com/bitsocialnet/bitsocial-react-hooks/issues/65)) ([eb1bd79](https://github.com/bitsocialnet/bitsocial-react-hooks/commit/eb1bd797180c620eed611cffd879abdb5c793578))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## [0.1.20](https://github.com/bitsocialnet/bitsocial-react-hooks/compare/v0.1.19...v0.1.20) (2026-06-24)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **accounts:** enrich local account comment authors ([cac2376](https://github.com/bitsocialnet/bitsocial-react-hooks/commit/cac237656b25ac5611fa861528845463f761998d))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
1
19
|
## [0.1.19](https://github.com/bitsocialnet/bitsocial-react-hooks/compare/v0.1.18...v0.1.19) (2026-06-18)
|
|
2
20
|
|
|
3
21
|
|
package/README.md
CHANGED
|
@@ -964,6 +964,7 @@ for (const accountComment of accountComments) {
|
|
|
964
964
|
console.log("comment", accountComment.index, "is status", accountComment.state);
|
|
965
965
|
}
|
|
966
966
|
// `state` becomes `failed` as soon as a pending local publish records terminal failure (`publishingState === "failed"` and `state === "stopped"`) or a publish error, instead of waiting for the 20-minute fallback.
|
|
967
|
+
// local account comments returned by useAccountComment and useAccountComments include the account author's address and shortAddress when an older cached account comment is missing author identity fields.
|
|
967
968
|
// note: accountComment.index can change after deletions; prefer commentCid for stable identifiers
|
|
968
969
|
|
|
969
970
|
// all my own votes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/hooks/accounts/accounts.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,OAAO,EAKP,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/hooks/accounts/accounts.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,OAAO,EAKP,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AA4DrB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,8BAMhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CAoBxE;AAED;;GAEG;AACH,wBAAgB,WAAW;;;;;EAiC1B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,4BAA4B,GACrC,2BAA2B,CA+I7B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CA2C1F;AAsCD,eAAO,MAAM,+BAA+B,GAAI,YAAY,MAAM,EAAE,EAAE,gBAAgB,MAAM,EAAE,YACzC,CAAC;AAyCtD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,wBAAwB,CAyJhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,uBAAuB,CAgD7F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,qBAAqB,CA8GvF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAyBpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,qBAAqB,CA0DvF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CA4J1F;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,wBAAwB,CA+ChG"}
|
|
@@ -20,6 +20,7 @@ import { COMMENT_MODERATION_AUTHOR_SUMMARY_KEY, getAccountEditPropertySummary, }
|
|
|
20
20
|
import { getCanonicalCommunityAddress, getEquivalentCommunityAddressGroupKey, pickPreferredEquivalentCommunityAddress, } from "../../lib/community-address.js";
|
|
21
21
|
import { addCommentModeration } from "../../lib/utils/comment-moderation.js";
|
|
22
22
|
import useInterval from "../utils/use-interval.js";
|
|
23
|
+
import PkcJs from "../../lib/pkc-js/index.js";
|
|
23
24
|
const getCommentEditPropertyValue = (comment, propertyName) => {
|
|
24
25
|
var _a, _b;
|
|
25
26
|
if (propertyName !== COMMENT_MODERATION_AUTHOR_SUMMARY_KEY) {
|
|
@@ -294,6 +295,18 @@ const getAccountHistorySortType = (sortType, order) => {
|
|
|
294
295
|
}
|
|
295
296
|
return order === "desc" ? "new" : "old";
|
|
296
297
|
};
|
|
298
|
+
const getAccountCommentWithAccountAuthor = (accountComment, account, accountId) => {
|
|
299
|
+
var _a;
|
|
300
|
+
const accountAuthor = account === null || account === void 0 ? void 0 : account.author;
|
|
301
|
+
if (!accountId ||
|
|
302
|
+
accountComment.accountId !== accountId ||
|
|
303
|
+
!(accountAuthor === null || accountAuthor === void 0 ? void 0 : accountAuthor.address) ||
|
|
304
|
+
((_a = accountComment.author) === null || _a === void 0 ? void 0 : _a.address)) {
|
|
305
|
+
return accountComment;
|
|
306
|
+
}
|
|
307
|
+
const accountShortAddress = accountAuthor.shortAddress || PkcJs.PKC.getShortAddress({ address: accountAuthor.address });
|
|
308
|
+
return Object.assign(Object.assign({}, accountComment), { author: Object.assign(Object.assign(Object.assign(Object.assign({}, accountAuthor), accountComment.author), { address: accountAuthor.address }), (accountShortAddress ? { shortAddress: accountShortAddress } : {})) });
|
|
309
|
+
};
|
|
297
310
|
export function useAccountComments(options) {
|
|
298
311
|
assert(!options || typeof options === "object", `useAccountComments options argument '${options}' not an object`);
|
|
299
312
|
const { accountName, filter, commentCid, commentIndices, communityAddress, parentCid, newerThan, page, pageSize, sortType, order, } = options || {};
|
|
@@ -301,6 +314,7 @@ export function useAccountComments(options) {
|
|
|
301
314
|
const accountId = useAccountId(accountName);
|
|
302
315
|
const accountCommentsIndexes = useAccountsStore((state) => state.accountsCommentsIndexes[accountId || ""]);
|
|
303
316
|
const commentCidToAccountComment = useAccountsStore((state) => state.commentCidsToAccountsComments[commentCid || ""]);
|
|
317
|
+
const account = useAccountsStore((state) => state.accounts[accountId || ""]);
|
|
304
318
|
const accountComments = useAccountsStore((state) => state.accountsComments[accountId || ""]);
|
|
305
319
|
const [accountCommentStates, setAccountCommentStates] = useState([]);
|
|
306
320
|
const accountHistorySortType = getAccountHistorySortType(sortType, order);
|
|
@@ -379,8 +393,8 @@ export function useAccountComments(options) {
|
|
|
379
393
|
}, delay, immediate);
|
|
380
394
|
const filteredAccountCommentsWithStates = useMemo(() => {
|
|
381
395
|
const states = getAccountCommentsStates(filteredAccountComments);
|
|
382
|
-
return filteredAccountComments.map((comment, i) => (Object.assign(Object.assign({}, comment), { state: states[i] })));
|
|
383
|
-
}, [filteredAccountComments, accountCommentStates]);
|
|
396
|
+
return filteredAccountComments.map((comment, i) => (Object.assign(Object.assign({}, getAccountCommentWithAccountAuthor(comment, account, accountId || undefined)), { state: states[i] })));
|
|
397
|
+
}, [filteredAccountComments, accountCommentStates, account, accountId]);
|
|
384
398
|
if (options) {
|
|
385
399
|
log("useAccountComments", {
|
|
386
400
|
accountId,
|
|
@@ -414,11 +428,14 @@ export function useAccountComment(options) {
|
|
|
414
428
|
const { commentIndex, commentCid, accountName } = opts;
|
|
415
429
|
const accountId = useAccountId(accountName);
|
|
416
430
|
const commentCidToAccountComment = useAccountsStore((state) => state.commentCidsToAccountsComments[commentCid || ""]);
|
|
431
|
+
const account = useAccountsStore((state) => state.accounts[accountId || ""]);
|
|
417
432
|
const accountComments = useAccountsStore((state) => state.accountsComments[accountId || ""]);
|
|
418
433
|
const normalizedCommentIndex = commentIndex === undefined ? undefined : Number(commentIndex);
|
|
419
|
-
const resolvedCommentIndex = typeof normalizedCommentIndex === "number" &&
|
|
434
|
+
const resolvedCommentIndex = typeof normalizedCommentIndex === "number" &&
|
|
435
|
+
Number.isInteger(normalizedCommentIndex) &&
|
|
436
|
+
normalizedCommentIndex >= 0
|
|
420
437
|
? normalizedCommentIndex
|
|
421
|
-
:
|
|
438
|
+
: commentCidToAccountComment && commentCidToAccountComment.accountId === accountId
|
|
422
439
|
? commentCidToAccountComment.accountCommentIndex
|
|
423
440
|
: undefined;
|
|
424
441
|
const storedAccountComment = useMemo(() => {
|
|
@@ -427,11 +444,15 @@ export function useAccountComment(options) {
|
|
|
427
444
|
}
|
|
428
445
|
return accountComments === null || accountComments === void 0 ? void 0 : accountComments[resolvedCommentIndex];
|
|
429
446
|
}, [accountComments, resolvedCommentIndex]);
|
|
430
|
-
const accountComment = (storedAccountComment || {});
|
|
431
447
|
const state = storedAccountComment
|
|
432
448
|
? getAccountCommentsStates([storedAccountComment])[0]
|
|
433
449
|
: "initializing";
|
|
434
|
-
return useMemo(() =>
|
|
450
|
+
return useMemo(() => {
|
|
451
|
+
const accountComment = (storedAccountComment
|
|
452
|
+
? getAccountCommentWithAccountAuthor(storedAccountComment, account, accountId || undefined)
|
|
453
|
+
: {});
|
|
454
|
+
return Object.assign(Object.assign({}, accountComment), { state, error: accountComment.error, errors: accountComment.errors || [] });
|
|
455
|
+
}, [storedAccountComment, account, accountId, state]);
|
|
435
456
|
}
|
|
436
457
|
/**
|
|
437
458
|
* Returns the own user's votes stored locally, even those not yet published by the community owner.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/hooks/accounts/accounts.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState, useEffect } from \"react\";\nimport isEqual from \"lodash.isequal\";\nimport useAccountsStore from \"../../stores/accounts\";\nimport useCommunitiesStore from \"../../stores/communities\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:accounts:hooks\");\nimport assert from \"assert\";\nimport { useListCommunities, useCommunities } from \"../communities\";\nimport type {\n AccountComment,\n AccountComments,\n Account,\n Accounts,\n AccountVote,\n AccountsComments,\n AccountsCommentsReplies,\n UseAccountCommunitiesOptions,\n UseAccountCommunitiesResult,\n UseAccountVoteOptions,\n UseAccountVoteResult,\n UseAccountVotesOptions,\n UseAccountVotesResult,\n UseAccountCommentsOptions,\n UseAccountCommentsResult,\n UseAccountCommentOptions,\n UseAccountCommentResult,\n UseNotificationsOptions,\n UseNotificationsResult,\n UseAccountEditsOptions,\n UseAccountEditsResult,\n UseEditedCommentOptions,\n UseEditedCommentResult,\n UseAccountOptions,\n UseAccountResult,\n UsePubsubSubscribeOptions,\n UsePubsubSubscribeResult,\n} from \"../../types\";\nimport {\n useAccountsWithCalculatedProperties,\n useAccountWithCalculatedProperties,\n useCalculatedNotifications,\n} from \"./utils\";\nimport {\n COMMENT_MODERATION_AUTHOR_SUMMARY_KEY,\n getAccountEditPropertySummary,\n} from \"../../stores/accounts/utils\";\nimport {\n getCanonicalCommunityAddress,\n getEquivalentCommunityAddressGroupKey,\n pickPreferredEquivalentCommunityAddress,\n} from \"../../lib/community-address\";\nimport { addCommentModeration } from \"../../lib/utils/comment-moderation\";\nimport useInterval from \"../utils/use-interval\";\n\nconst getCommentEditPropertyValue = (comment: any, propertyName: string) => {\n if (propertyName !== COMMENT_MODERATION_AUTHOR_SUMMARY_KEY) {\n return comment?.[propertyName];\n }\n\n const commentModeration = comment?.commentModeration;\n if (\n commentModeration &&\n typeof commentModeration === \"object\" &&\n Object.prototype.hasOwnProperty.call(commentModeration, \"author\")\n ) {\n return commentModeration.author;\n }\n\n return comment?.author?.community?.banExpiresAt !== undefined\n ? { banExpiresAt: comment.author.community.banExpiresAt }\n : undefined;\n};\n\nconst applyEditedCommentProperty = (comment: any, propertyName: string, value: any) => {\n if (propertyName !== COMMENT_MODERATION_AUTHOR_SUMMARY_KEY) {\n comment[propertyName] = value;\n return;\n }\n\n comment.commentModeration = comment.commentModeration ? { ...comment.commentModeration } : {};\n if (value === undefined) {\n delete comment.commentModeration.author;\n } else {\n comment.commentModeration.author = value;\n }\n\n comment.author = comment.author ? { ...comment.author } : {};\n comment.author.community = comment.author.community ? { ...comment.author.community } : {};\n if (value?.banExpiresAt === undefined) {\n delete comment.author.community.banExpiresAt;\n } else {\n comment.author.community.banExpiresAt = value.banExpiresAt;\n }\n};\n\n/**\n * @param accountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, return\n * the active account id.\n */\nexport function useAccountId(accountName?: string) {\n const accountId = useAccountsStore((state) => state.accountNamesToAccountIds[accountName || \"\"]);\n // don't consider active account if account name is defined\n const activeAccountId = useAccountsStore((state) => !accountName && state.activeAccountId);\n const accountIdToUse = accountName ? accountId : activeAccountId;\n return accountIdToUse;\n}\n\n/**\n * @param accountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, return\n * the active account.\n */\nexport function useAccount(options?: UseAccountOptions): UseAccountResult {\n assert(\n !options || typeof options === \"object\",\n `useAccount options argument '${options}' not an object`,\n );\n const { accountName } = options || {};\n // get state\n const accountId = useAccountId(accountName);\n const accountStore = useAccountsStore((state) => state.accounts[accountId || \"\"]);\n const accountComments = useAccountsStore((state) => state.accountsComments[accountId || \"\"]);\n const accountCommentsReplies = useAccountsStore(\n (state) => state.accountsCommentsReplies[accountId || \"\"],\n );\n const account = useAccountWithCalculatedProperties(\n accountStore,\n accountComments,\n accountCommentsReplies,\n );\n log(\"useAccount\", { accountId, account, accountName });\n return account;\n}\n\n/**\n * Return all accounts in the order of `accountsStore.accountIds`. To reorder, use `accountsActions.setAccountsOrder(accountNames)`.\n */\nexport function useAccounts() {\n const accountIds = useAccountsStore((state) => state.accountIds);\n const accountsStore = useAccountsStore((state) => state.accounts);\n const accountsComments = useAccountsStore((state) => state.accountsComments);\n const accountsCommentsReplies = useAccountsStore((state) => state.accountsCommentsReplies);\n const accounts = useAccountsWithCalculatedProperties(\n accountsStore,\n accountsComments,\n accountsCommentsReplies,\n );\n const accountsArray: Account[] = useMemo(() => {\n const accountsArray = [];\n if (accountIds?.length && accounts) {\n for (const accountId of accountIds) {\n accountsArray.push(accounts[accountId]);\n }\n }\n return accountsArray;\n }, [accounts, accountIds]);\n\n log(\"useAccounts\", { accounts, accountIds });\n\n const state = accountsArray?.length ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n accounts: accountsArray,\n state,\n error: undefined,\n errors: [],\n }),\n [accountsArray, state],\n );\n}\n\n/**\n * Returns all communities where the account is a creator or moderator\n */\nexport function useAccountCommunities(\n options?: UseAccountCommunitiesOptions,\n): UseAccountCommunitiesResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountCommunities options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { accountName, onlyIfCached } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const accountsStoreAccountCommunities = useAccountsStore(\n (state) => state.accounts[accountIdKey]?.communities,\n );\n\n // get all unique account community addresses\n const ownerCommunityAddresses = useListCommunities(accountName);\n const groupedCommunityAddresses = useMemo(() => {\n const accountCommunityAddresses = [];\n if (accountsStoreAccountCommunities) {\n for (const communityAddress in accountsStoreAccountCommunities) {\n accountCommunityAddresses.push(communityAddress);\n }\n }\n const allCommunityAddresses = [\n ...new Set([...ownerCommunityAddresses, ...accountCommunityAddresses]),\n ].sort();\n const groupedAddresses = new Map<string, string[]>();\n for (const communityAddress of allCommunityAddresses) {\n const groupKey = getEquivalentCommunityAddressGroupKey(communityAddress);\n const addresses = groupedAddresses.get(groupKey);\n if (addresses) {\n addresses.push(communityAddress);\n } else {\n groupedAddresses.set(groupKey, [communityAddress]);\n }\n }\n return [...groupedAddresses.entries()].map(([groupKey, addresses]) => ({\n groupKey,\n addresses,\n preferredAddress: pickPreferredEquivalentCommunityAddress(addresses),\n }));\n }, [accountsStoreAccountCommunities, ownerCommunityAddresses]);\n const uniqueCommunityAddresses = useMemo(\n () => groupedCommunityAddresses.map(({ preferredAddress }) => preferredAddress),\n [groupedCommunityAddresses],\n );\n\n // fetch all community data\n const {\n communities: communitiesArray,\n state: communitiesState,\n error: communitiesError,\n errors: communitiesErrors,\n } = useCommunities({\n communities: uniqueCommunityAddresses.map((communityAddress) => ({ name: communityAddress })),\n accountName,\n onlyIfCached,\n });\n const communityFetchErrors = useCommunitiesStore((state: any) =>\n uniqueCommunityAddresses.flatMap((communityAddress) => state.errors[communityAddress] || []),\n );\n const canonicalAddressByGroupKey = useMemo(() => {\n const canonicalAddresses: { [groupKey: string]: string } = {};\n for (const [i, { groupKey, preferredAddress }] of groupedCommunityAddresses.entries()) {\n const fetchedAddress = communitiesArray[i]?.address;\n canonicalAddresses[groupKey] = getCanonicalCommunityAddress(\n fetchedAddress || preferredAddress,\n );\n }\n return canonicalAddresses;\n }, [groupedCommunityAddresses, communitiesArray]);\n const communities: any = useMemo(() => {\n const communities: any = {};\n for (const [i, community] of communitiesArray.entries()) {\n const { groupKey, preferredAddress } = groupedCommunityAddresses[i];\n const canonicalAddress = canonicalAddressByGroupKey[groupKey];\n communities[canonicalAddress] = {\n ...communities[canonicalAddress],\n ...community,\n // make sure the canonical address is defined even if the community hasn't fetched yet\n address: canonicalAddress,\n };\n }\n return communities;\n }, [communitiesArray, groupedCommunityAddresses, canonicalAddressByGroupKey]);\n\n // merged community data with account.communities data\n const accountCommunities: any = useMemo(() => {\n const accountCommunities: any = { ...communities };\n if (accountsStoreAccountCommunities) {\n for (const communityAddress in accountsStoreAccountCommunities) {\n const groupKey = getEquivalentCommunityAddressGroupKey(communityAddress);\n const canonicalAddress = canonicalAddressByGroupKey[groupKey];\n accountCommunities[canonicalAddress] = {\n ...accountCommunities[canonicalAddress],\n ...accountsStoreAccountCommunities[communityAddress],\n address: canonicalAddress,\n };\n }\n }\n // add pkc.communities data\n for (const communityAddress of ownerCommunityAddresses) {\n const groupKey = getEquivalentCommunityAddressGroupKey(communityAddress);\n const canonicalAddress = canonicalAddressByGroupKey[groupKey];\n accountCommunities[canonicalAddress] = {\n ...accountCommunities[canonicalAddress],\n address: canonicalAddress,\n role: { role: \"owner\" },\n };\n }\n return accountCommunities;\n }, [\n accountsStoreAccountCommunities,\n ownerCommunityAddresses,\n communities,\n canonicalAddressByGroupKey,\n ]);\n\n if (accountId) {\n log(\"useAccountCommunities\", { accountCommunities });\n }\n\n const pendingAccountCommunities = Object.values(accountCommunities).some(\n (community: any) => community?.address && !community?.updatedAt,\n );\n const errors = communityFetchErrors.length ? communityFetchErrors : communitiesErrors;\n const error = communitiesError || errors[errors.length - 1];\n const state = !accountId\n ? \"initializing\"\n : error\n ? \"failed\"\n : pendingAccountCommunities\n ? \"fetching-ipns\"\n : communitiesState;\n\n return useMemo(\n () => ({\n accountCommunities,\n state,\n error,\n errors,\n }),\n [accountCommunities, state, error, errors],\n );\n}\n\n/**\n * Returns an account's notifications in an array. Unread notifications have a field markedAsRead: false.\n *\n * @param accountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, return\n * the active account's notifications.\n */\nexport function useNotifications(options?: UseNotificationsOptions): UseNotificationsResult {\n assert(\n !options || typeof options === \"object\",\n `useNotifications options argument '${options}' not an object`,\n );\n const { accountName } = options || {};\n // get state\n const accountId = useAccountId(accountName);\n const account = useAccountsStore((state) => state.accounts[accountId || \"\"]);\n const accountCommentsReplies = useAccountsStore(\n (state) => state.accountsCommentsReplies[accountId || \"\"],\n );\n const accountsActionsInternal = useAccountsStore((state) => state.accountsActionsInternal);\n const notifications = useCalculatedNotifications(account, accountCommentsReplies);\n const [errors, setErrors] = useState<Error[]>([]);\n\n const markAsRead = async () => {\n try {\n if (!account) {\n throw Error(\"useNotifications cannot mark as read accounts not initalized yet\");\n }\n accountsActionsInternal.markNotificationsAsRead(account);\n } catch (e: any) {\n setErrors([...errors, e]);\n }\n };\n\n if (account) {\n log(\"useNotifications\", { notifications });\n }\n\n const state = accountId ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n notifications,\n markAsRead,\n state,\n error: errors[errors.length - 1],\n errors,\n }),\n [notifications, errors],\n );\n}\n\nconst getAccountCommentsStates = (accountComments: AccountComment[]) => {\n // Without a cid, the account comment is still a local pending publish. pkc-js marks\n // terminal publish failures when `publishingState === \"failed\"` and publication `state`\n // is `\"stopped\"`, so we derive failed from that terminal pair or recorded publish errors.\n const now = Math.round(Date.now() / 1000);\n const expiryTime = now - 60 * 20;\n\n const states: string[] = [];\n for (const accountComment of accountComments) {\n let state = \"succeeded\";\n if (!accountComment.cid) {\n const ac = accountComment as AccountComment & {\n error?: Error;\n errors?: Error[];\n publishingState?: string;\n state?: string;\n };\n const resolvedPublishFailed =\n (ac.publishingState === \"failed\" && ac.state === \"stopped\") ||\n ac.error != null ||\n (Array.isArray(ac.errors) && ac.errors.length > 0);\n\n if (resolvedPublishFailed) {\n state = \"failed\";\n } else if (accountComment.timestamp > expiryTime) {\n state = \"pending\";\n } else {\n state = \"failed\";\n }\n }\n states.push(state);\n }\n\n return states;\n};\n\nexport const haveAccountCommentStatesChanged = (nextStates: string[], previousStates: string[]) =>\n nextStates.toString() !== previousStates.toString();\n\nconst getAccountHistorySortType = (\n sortType?: \"new\" | \"old\",\n order?: \"asc\" | \"desc\",\n): \"new\" | \"old\" => {\n if (sortType === \"new\" || sortType === \"old\") {\n return sortType;\n }\n return order === \"desc\" ? \"new\" : \"old\";\n};\n\nexport function useAccountComments(options?: UseAccountCommentsOptions): UseAccountCommentsResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountComments options argument '${options}' not an object`,\n );\n const {\n accountName,\n filter,\n commentCid,\n commentIndices,\n communityAddress,\n parentCid,\n newerThan,\n page,\n pageSize,\n sortType,\n order,\n } = options || {};\n assert(\n !filter || typeof filter === \"function\",\n `useAccountComments options.filter argument '${filter}' not an function`,\n );\n const accountId = useAccountId(accountName);\n const accountCommentsIndexes = useAccountsStore(\n (state) => state.accountsCommentsIndexes[accountId || \"\"],\n );\n const commentCidToAccountComment = useAccountsStore(\n (state) => state.commentCidsToAccountsComments[commentCid || \"\"],\n );\n const accountComments = useAccountsStore((state) => state.accountsComments[accountId || \"\"]);\n const [accountCommentStates, setAccountCommentStates] = useState<string[]>([]);\n const accountHistorySortType = getAccountHistorySortType(sortType, order);\n\n const filteredAccountComments = useMemo(() => {\n if (!accountComments) {\n return [];\n }\n\n let scopedAccountComments = accountComments;\n if (Array.isArray(commentIndices) && commentIndices.length > 0) {\n const normalizedCommentIndices = commentIndices\n .map((commentIndex) => Number(commentIndex))\n .filter((commentIndex) => Number.isInteger(commentIndex) && commentIndex >= 0);\n scopedAccountComments = normalizedCommentIndices\n .map((commentIndex) => accountComments[commentIndex])\n .filter(Boolean);\n } else if (commentCid) {\n const mappedIndex =\n commentCidToAccountComment?.accountId === accountId\n ? commentCidToAccountComment.accountCommentIndex\n : undefined;\n scopedAccountComments =\n typeof mappedIndex === \"number\" ? [accountComments[mappedIndex]].filter(Boolean) : [];\n } else if (parentCid) {\n const parentIndexes = accountCommentsIndexes?.byParentCid?.[parentCid];\n scopedAccountComments = parentIndexes?.length\n ? parentIndexes.map((index) => accountComments[index]).filter(Boolean)\n : accountComments.filter((accountComment) => accountComment.parentCid === parentCid);\n } else if (communityAddress) {\n const communityIndexes = accountCommentsIndexes?.byCommunityAddress?.[communityAddress];\n scopedAccountComments = communityIndexes?.length\n ? communityIndexes.map((index) => accountComments[index]).filter(Boolean)\n : accountComments.filter(\n (accountComment) => accountComment.communityAddress === communityAddress,\n );\n }\n\n if (typeof newerThan === \"number\") {\n const newerThanTimestamp =\n newerThan === Infinity ? 0 : Math.floor(Date.now() / 1000) - newerThan;\n scopedAccountComments = scopedAccountComments.filter(\n (accountComment) => accountComment.timestamp > newerThanTimestamp,\n );\n }\n if (filter) {\n scopedAccountComments = scopedAccountComments.filter(filter);\n }\n if (accountHistorySortType === \"new\") {\n scopedAccountComments = [...scopedAccountComments].reverse();\n }\n if (typeof pageSize === \"number\" && pageSize > 0) {\n const pageNumber = Math.max(page || 0, 0);\n const startIndex = pageNumber * pageSize;\n return scopedAccountComments.slice(startIndex, startIndex + pageSize);\n }\n return scopedAccountComments;\n }, [\n accountComments,\n accountCommentsIndexes,\n accountId,\n commentCid,\n commentIndices,\n commentCidToAccountComment,\n communityAddress,\n filter,\n newerThan,\n accountHistorySortType,\n page,\n pageSize,\n parentCid,\n ]);\n\n // Recheck periodically so the 20-minute “stale pending → failed” transition updates without other store events\n const delay = 60_000;\n const immediate = false;\n useInterval(\n () => {\n const states = getAccountCommentsStates(filteredAccountComments);\n if (haveAccountCommentStatesChanged(states, accountCommentStates)) {\n setAccountCommentStates(states);\n }\n },\n delay,\n immediate,\n );\n\n const filteredAccountCommentsWithStates = useMemo(() => {\n const states = getAccountCommentsStates(filteredAccountComments);\n return filteredAccountComments.map((comment, i) => ({\n ...comment,\n state: states[i],\n }));\n }, [filteredAccountComments, accountCommentStates]);\n\n if (options) {\n log(\"useAccountComments\", {\n accountId,\n filteredAccountCommentsWithStates,\n accountComments,\n commentCid,\n commentIndices,\n communityAddress,\n filter,\n newerThan,\n sortType: accountHistorySortType,\n page,\n pageSize,\n parentCid,\n });\n }\n\n const state = accountId ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n accountComments: filteredAccountCommentsWithStates,\n state,\n error: undefined,\n errors: [],\n }),\n [filteredAccountCommentsWithStates, state],\n );\n}\n\n/**\n * Returns an account's single comment, e.g. a pending comment they published.\n */\nexport function useAccountComment(options?: UseAccountCommentOptions): UseAccountCommentResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountComment options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { commentIndex, commentCid, accountName } = opts;\n const accountId = useAccountId(accountName);\n const commentCidToAccountComment = useAccountsStore(\n (state) => state.commentCidsToAccountsComments[commentCid || \"\"],\n );\n const accountComments = useAccountsStore((state) => state.accountsComments[accountId || \"\"]);\n const normalizedCommentIndex = commentIndex === undefined ? undefined : Number(commentIndex);\n const resolvedCommentIndex =\n typeof normalizedCommentIndex === \"number\" && !Number.isNaN(normalizedCommentIndex)\n ? normalizedCommentIndex\n : commentCidToAccountComment?.accountId === accountId\n ? commentCidToAccountComment.accountCommentIndex\n : undefined;\n const storedAccountComment = useMemo(() => {\n if (typeof resolvedCommentIndex !== \"number\") {\n return undefined;\n }\n return accountComments?.[resolvedCommentIndex];\n }, [accountComments, resolvedCommentIndex]);\n const accountComment = (storedAccountComment || {}) as Partial<AccountComment> & {\n error?: Error;\n errors?: Error[];\n };\n const state = storedAccountComment\n ? getAccountCommentsStates([storedAccountComment])[0]\n : \"initializing\";\n\n return useMemo(\n () =>\n ({\n ...accountComment,\n state,\n error: accountComment.error,\n errors: accountComment.errors || [],\n }) as UseAccountCommentResult,\n [accountComment, state],\n );\n}\n\n/**\n * Returns the own user's votes stored locally, even those not yet published by the community owner.\n * Check UseAccountCommentsOptions type in types.tsx to filter them, e.g. filter = {communityAddresses: ['memes.eth']}.\n */\nexport function useAccountVotes(options?: UseAccountVotesOptions): UseAccountVotesResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountVotes options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const {\n accountName,\n filter,\n vote,\n commentCid,\n communityAddress,\n newerThan,\n page,\n pageSize,\n sortType,\n order,\n } = opts;\n assert(\n !filter || typeof filter === \"function\",\n `useAccountVotes options.filter argument '${filter}' not an function`,\n );\n const accountId = useAccountId(accountName);\n const accountVotes = useAccountsStore((state) => state.accountsVotes[accountId || \"\"]);\n const accountHistorySortType = getAccountHistorySortType(sortType, order);\n\n const filteredAccountVotesArray = useMemo(() => {\n let accountVotesArray: AccountVote[] = [];\n if (!accountVotes) {\n return accountVotesArray;\n }\n for (const i in accountVotes) {\n accountVotesArray.push(accountVotes[i]);\n }\n if (typeof vote === \"number\") {\n accountVotesArray = accountVotesArray.filter((accountVote) => accountVote.vote === vote);\n }\n if (commentCid) {\n accountVotesArray = accountVotesArray.filter(\n (accountVote) => accountVote.commentCid === commentCid,\n );\n }\n if (communityAddress) {\n accountVotesArray = accountVotesArray.filter(\n (accountVote) => accountVote.communityAddress === communityAddress,\n );\n }\n if (typeof newerThan === \"number\") {\n const newerThanTimestamp =\n newerThan === Infinity ? 0 : Math.floor(Date.now() / 1000) - newerThan;\n accountVotesArray = accountVotesArray.filter(\n (accountVote) => accountVote.timestamp > newerThanTimestamp,\n );\n }\n if (filter) {\n accountVotesArray = accountVotesArray.filter(filter);\n }\n accountVotesArray = [...accountVotesArray].sort(\n (firstVote, secondVote) => (firstVote.timestamp || 0) - (secondVote.timestamp || 0),\n );\n if (accountHistorySortType === \"new\") {\n accountVotesArray = [...accountVotesArray].reverse();\n }\n if (typeof pageSize === \"number\" && pageSize > 0) {\n const pageNumber = Math.max(page || 0, 0);\n const startIndex = pageNumber * pageSize;\n accountVotesArray = accountVotesArray.slice(startIndex, startIndex + pageSize);\n }\n return accountVotesArray;\n }, [\n accountVotes,\n accountHistorySortType,\n commentCid,\n communityAddress,\n filter,\n newerThan,\n page,\n pageSize,\n vote,\n ]);\n\n if (accountVotes && options) {\n log(\"useAccountVotes\", {\n accountId,\n filteredAccountVotesArray,\n accountVotes,\n commentCid,\n communityAddress,\n filter,\n newerThan,\n sortType: accountHistorySortType,\n page,\n pageSize,\n vote,\n });\n }\n\n // TODO: add failed / pending states\n\n const state = accountId ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n accountVotes: filteredAccountVotesArray,\n state,\n error: undefined,\n errors: [],\n }),\n [filteredAccountVotesArray, state],\n );\n}\n\n/**\n * Returns an account's single vote on a comment, e.g. to know if you already voted on a comment.\n */\nexport function useAccountVote(options?: UseAccountVoteOptions): UseAccountVoteResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountVote options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { commentCid, accountName } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const commentCidKey = commentCid || \"\";\n const accountVotes = useAccountsStore((state) => state.accountsVotes[accountIdKey]);\n const accountVote: any = accountVotes?.[commentCidKey];\n const state = accountId && commentCid ? \"succeeded\" : \"initializing\";\n\n // TODO: add failed / pending state\n\n return useMemo(\n () => ({\n ...accountVote,\n state,\n error: undefined,\n errors: [],\n }),\n [accountVote, state],\n );\n}\n\n/**\n * Returns all the comment and community edits published by an account.\n */\nexport function useAccountEdits(options?: UseAccountEditsOptions): UseAccountEditsResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountEdits options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { filter, accountName } = opts;\n assert(\n !filter || typeof filter === \"function\",\n `useAccountEdits options.filter argument '${filter}' not an function`,\n );\n const accountId = useAccountId(accountName);\n const ensureAccountEditsLoaded = useAccountsStore(\n (state) => state.accountsActionsInternal.ensureAccountEditsLoaded,\n );\n const accountEdits = useAccountsStore((state) => state.accountsEdits[accountId || \"\"]);\n const accountEditsLoaded = useAccountsStore(\n (state) => state.accountsEditsLoaded[accountId || \"\"],\n );\n\n useEffect(() => {\n if (!accountId || accountEditsLoaded) {\n return;\n }\n ensureAccountEditsLoaded(accountId).catch((error: unknown) =>\n log.error(\"useAccountEdits ensureAccountEditsLoaded error\", { accountId, error }),\n );\n }, [accountEditsLoaded, accountId, ensureAccountEditsLoaded]);\n\n const accountEditsArray = useMemo(() => {\n const accountEditsArray = [];\n for (const i in accountEdits || {}) {\n accountEditsArray.push(...accountEdits[i]);\n }\n // sort by oldest first\n return accountEditsArray.sort((a, b) => a.timestamp - b.timestamp);\n }, [accountEdits]);\n\n const filteredAccountEditsArray = useMemo(() => {\n if (!filter) {\n return accountEditsArray;\n }\n return accountEditsArray.filter(filter);\n }, [accountEditsArray, filter]);\n\n // TODO: add failed / pending states\n\n const state = accountId ? (accountEditsLoaded ? \"succeeded\" : \"initializing\") : \"initializing\";\n\n return useMemo(\n () => ({\n accountEdits: filteredAccountEditsArray,\n state,\n error: undefined,\n errors: [],\n }),\n [filteredAccountEditsArray, state],\n );\n}\n\n/**\n * Returns the comment edited (if has any edits), as well as the pending, succeeded or failed state of the edit.\n */\nexport function useEditedComment(options?: UseEditedCommentOptions): UseEditedCommentResult {\n assert(\n !options || typeof options === \"object\",\n `useEditedComment options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { comment, accountName } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const commentCidKey = (comment && comment.cid) || \"\";\n const commentEdits = useAccountsStore(\n (state) => state.accountsEdits[accountIdKey]?.[commentCidKey],\n );\n const commentEditSummary = useAccountsStore(\n (state) => state.accountsEditsSummaries[accountIdKey]?.[commentCidKey],\n );\n\n let initialState = \"initializing\";\n if (accountId && comment && comment.cid) {\n initialState = \"unedited\";\n }\n\n const editedResult = useMemo(() => {\n const editedResult: any = {\n editedComment: undefined,\n succeededEdits: {},\n pendingEdits: {},\n failedEdits: {},\n state: undefined,\n };\n\n // there are no edits\n const propertyNameEdits: any =\n commentEdits?.length > 0 ? getAccountEditPropertySummary(commentEdits) : commentEditSummary;\n\n if (!propertyNameEdits || Object.keys(propertyNameEdits).length === 0) {\n return editedResult;\n }\n\n const now = Math.round(Date.now() / 1000);\n // no longer consider an edit pending ater an expiry time of 20 minutes\n const expiryTime = 60 * 20;\n\n // iterate over propertyNameEdits and find if succeeded, pending or failed\n for (const propertyName in propertyNameEdits) {\n const propertyNameEdit = propertyNameEdits[propertyName];\n\n const setPropertyNameEditState = (state: \"succeeded\" | \"pending\" | \"failed\") => {\n // set propertyNameEdit e.g. editedResult.succeededEdits.removed = true\n editedResult[`${state}Edits`][propertyName] = propertyNameEdit.value;\n\n // if any propertyNameEdit failed, consider the commentEdit failed\n if (state === \"failed\") {\n editedResult.state = \"failed\";\n }\n // if all propertyNameEdit succeeded, consider the commentEdit succeeded\n if (state === \"succeeded\" && !editedResult.state) {\n editedResult.state = \"succeeded\";\n }\n // if any propertyNameEdit are pending, and none have failed, consider the commentEdit pending\n if (state === \"pending\" && editedResult.state !== \"failed\") {\n editedResult.state = \"pending\";\n }\n };\n\n // Without a newer update we can only treat recent edits as pending. Older edits that never\n // produced any update are effectively stale and should stop shadowing the live comment.\n if (!comment?.updatedAt) {\n if (isEqual(getCommentEditPropertyValue(comment, propertyName), propertyNameEdit.value)) {\n setPropertyNameEditState(\"succeeded\");\n } else if (propertyNameEdit.timestamp > now - expiryTime) {\n setPropertyNameEditState(\"pending\");\n } else {\n setPropertyNameEditState(\"failed\");\n }\n continue;\n }\n\n // comment.updatedAt is older than propertyNameEdit, propertyNameEdit is pending\n // because we haven't received the update yet and can't evaluate\n if (comment.updatedAt < propertyNameEdit.timestamp) {\n setPropertyNameEditState(\"pending\");\n continue;\n }\n\n // comment.updatedAt is newer than propertyNameEdit, a comment update\n // has been received after the edit was published so we can evaluate\n else {\n // comment has propertyNameEdit, propertyNameEdit succeeded\n if (isEqual(getCommentEditPropertyValue(comment, propertyName), propertyNameEdit.value)) {\n setPropertyNameEditState(\"succeeded\");\n continue;\n }\n\n // comment does not have propertyNameEdit\n else {\n // propertyNameEdit is newer than 20min, it is too recent to evaluate\n // so we should assume pending\n if (propertyNameEdit.timestamp > now - expiryTime) {\n setPropertyNameEditState(\"pending\");\n continue;\n }\n\n // propertyNameEdit is older than 20min, we can evaluate it\n else {\n // comment update was received too shortly after propertyNameEdit was\n // published, assume pending until a more recent comment update is received\n const timeSinceUpdate = comment.updatedAt - propertyNameEdit.timestamp;\n if (timeSinceUpdate < expiryTime) {\n setPropertyNameEditState(\"pending\");\n continue;\n }\n\n // comment update time is sufficiently distanced from propertyNameEdit\n // and comment doesn't have propertyNameEdit, assume failed\n else {\n setPropertyNameEditState(\"failed\");\n continue;\n }\n }\n }\n }\n }\n\n // define editedComment\n editedResult.editedComment = { ...comment };\n // add pending and succeeded props so the editor can see his changes right away\n // don't add failed edits to reflect the current state of the edited comment\n for (const propertyName in editedResult.pendingEdits) {\n applyEditedCommentProperty(\n editedResult.editedComment,\n propertyName,\n editedResult.pendingEdits[propertyName],\n );\n }\n for (const propertyName in editedResult.succeededEdits) {\n applyEditedCommentProperty(\n editedResult.editedComment,\n propertyName,\n editedResult.succeededEdits[propertyName],\n );\n }\n editedResult.editedComment = addCommentModeration(editedResult.editedComment);\n\n return editedResult;\n }, [comment, commentEditSummary, commentEdits]);\n\n return useMemo(\n () => ({\n ...editedResult,\n state: editedResult.state || initialState,\n error: undefined,\n errors: [],\n }),\n [editedResult, initialState],\n );\n}\n\n/**\n * This hook should be added to pages where the user is likely to publish something, i,e. the\n * submit page and the /c/<commentCid> page, it improves the speed of publishing to the pubsub\n * by subscribing to the pubsub right away.\n *\n * @param accountName - The nickname of the account, e.g. 'Account 1'.\n * @param communityAddress - The community address to subscribe to, e.g. 'news.eth'.\n */\nexport function usePubsubSubscribe(options?: UsePubsubSubscribeOptions): UsePubsubSubscribeResult {\n assert(\n !options || typeof options === \"object\",\n `usePubsubSubscribe options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { accountName, communityAddress } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const account = useAccountsStore((state) => state.accounts[accountIdKey]);\n const [state, setState] = useState(\"initializing\");\n const [errors, setErrors] = useState<Error[]>([]);\n\n useEffect(() => {\n if (!account?.pkc || !communityAddress) {\n return;\n }\n setState(\"subscribing\");\n account.pkc\n .pubsubSubscribe(communityAddress)\n .then(() => setState(\"succeeded\"))\n .catch((error: any) => {\n setErrors([...errors, error]);\n setState(\"failed\");\n log.error(\"usePubsubSubscribe pkc.pubsubSubscribe error\", { communityAddress, error });\n });\n\n // unsub on component unmount\n return function () {\n account.pkc.pubsubUnsubscribe(communityAddress).catch((error: any) => {\n setErrors([...errors, error]);\n log.error(\"usePubsubSubscribe pkc.pubsubUnsubscribe error\", {\n communityAddress,\n error,\n });\n });\n };\n }, [account?.pkc, communityAddress]);\n\n return useMemo(\n () => ({\n state,\n error: errors[errors.length - 1],\n errors,\n }),\n [state, errors],\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/hooks/accounts/accounts.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState, useEffect } from \"react\";\nimport isEqual from \"lodash.isequal\";\nimport useAccountsStore from \"../../stores/accounts\";\nimport useCommunitiesStore from \"../../stores/communities\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:accounts:hooks\");\nimport assert from \"assert\";\nimport { useListCommunities, useCommunities } from \"../communities\";\nimport type {\n AccountComment,\n AccountComments,\n Account,\n Accounts,\n AccountVote,\n AccountsComments,\n AccountsCommentsReplies,\n UseAccountCommunitiesOptions,\n UseAccountCommunitiesResult,\n UseAccountVoteOptions,\n UseAccountVoteResult,\n UseAccountVotesOptions,\n UseAccountVotesResult,\n UseAccountCommentsOptions,\n UseAccountCommentsResult,\n UseAccountCommentOptions,\n UseAccountCommentResult,\n UseNotificationsOptions,\n UseNotificationsResult,\n UseAccountEditsOptions,\n UseAccountEditsResult,\n UseEditedCommentOptions,\n UseEditedCommentResult,\n UseAccountOptions,\n UseAccountResult,\n UsePubsubSubscribeOptions,\n UsePubsubSubscribeResult,\n} from \"../../types\";\nimport {\n useAccountsWithCalculatedProperties,\n useAccountWithCalculatedProperties,\n useCalculatedNotifications,\n} from \"./utils\";\nimport {\n COMMENT_MODERATION_AUTHOR_SUMMARY_KEY,\n getAccountEditPropertySummary,\n} from \"../../stores/accounts/utils\";\nimport {\n getCanonicalCommunityAddress,\n getEquivalentCommunityAddressGroupKey,\n pickPreferredEquivalentCommunityAddress,\n} from \"../../lib/community-address\";\nimport { addCommentModeration } from \"../../lib/utils/comment-moderation\";\nimport useInterval from \"../utils/use-interval\";\nimport PkcJs from \"../../lib/pkc-js\";\n\nconst getCommentEditPropertyValue = (comment: any, propertyName: string) => {\n if (propertyName !== COMMENT_MODERATION_AUTHOR_SUMMARY_KEY) {\n return comment?.[propertyName];\n }\n\n const commentModeration = comment?.commentModeration;\n if (\n commentModeration &&\n typeof commentModeration === \"object\" &&\n Object.prototype.hasOwnProperty.call(commentModeration, \"author\")\n ) {\n return commentModeration.author;\n }\n\n return comment?.author?.community?.banExpiresAt !== undefined\n ? { banExpiresAt: comment.author.community.banExpiresAt }\n : undefined;\n};\n\nconst applyEditedCommentProperty = (comment: any, propertyName: string, value: any) => {\n if (propertyName !== COMMENT_MODERATION_AUTHOR_SUMMARY_KEY) {\n comment[propertyName] = value;\n return;\n }\n\n comment.commentModeration = comment.commentModeration ? { ...comment.commentModeration } : {};\n if (value === undefined) {\n delete comment.commentModeration.author;\n } else {\n comment.commentModeration.author = value;\n }\n\n comment.author = comment.author ? { ...comment.author } : {};\n comment.author.community = comment.author.community ? { ...comment.author.community } : {};\n if (value?.banExpiresAt === undefined) {\n delete comment.author.community.banExpiresAt;\n } else {\n comment.author.community.banExpiresAt = value.banExpiresAt;\n }\n};\n\n/**\n * @param accountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, return\n * the active account id.\n */\nexport function useAccountId(accountName?: string) {\n const accountId = useAccountsStore((state) => state.accountNamesToAccountIds[accountName || \"\"]);\n // don't consider active account if account name is defined\n const activeAccountId = useAccountsStore((state) => !accountName && state.activeAccountId);\n const accountIdToUse = accountName ? accountId : activeAccountId;\n return accountIdToUse;\n}\n\n/**\n * @param accountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, return\n * the active account.\n */\nexport function useAccount(options?: UseAccountOptions): UseAccountResult {\n assert(\n !options || typeof options === \"object\",\n `useAccount options argument '${options}' not an object`,\n );\n const { accountName } = options || {};\n // get state\n const accountId = useAccountId(accountName);\n const accountStore = useAccountsStore((state) => state.accounts[accountId || \"\"]);\n const accountComments = useAccountsStore((state) => state.accountsComments[accountId || \"\"]);\n const accountCommentsReplies = useAccountsStore(\n (state) => state.accountsCommentsReplies[accountId || \"\"],\n );\n const account = useAccountWithCalculatedProperties(\n accountStore,\n accountComments,\n accountCommentsReplies,\n );\n log(\"useAccount\", { accountId, account, accountName });\n return account;\n}\n\n/**\n * Return all accounts in the order of `accountsStore.accountIds`. To reorder, use `accountsActions.setAccountsOrder(accountNames)`.\n */\nexport function useAccounts() {\n const accountIds = useAccountsStore((state) => state.accountIds);\n const accountsStore = useAccountsStore((state) => state.accounts);\n const accountsComments = useAccountsStore((state) => state.accountsComments);\n const accountsCommentsReplies = useAccountsStore((state) => state.accountsCommentsReplies);\n const accounts = useAccountsWithCalculatedProperties(\n accountsStore,\n accountsComments,\n accountsCommentsReplies,\n );\n const accountsArray: Account[] = useMemo(() => {\n const accountsArray = [];\n if (accountIds?.length && accounts) {\n for (const accountId of accountIds) {\n accountsArray.push(accounts[accountId]);\n }\n }\n return accountsArray;\n }, [accounts, accountIds]);\n\n log(\"useAccounts\", { accounts, accountIds });\n\n const state = accountsArray?.length ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n accounts: accountsArray,\n state,\n error: undefined,\n errors: [],\n }),\n [accountsArray, state],\n );\n}\n\n/**\n * Returns all communities where the account is a creator or moderator\n */\nexport function useAccountCommunities(\n options?: UseAccountCommunitiesOptions,\n): UseAccountCommunitiesResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountCommunities options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { accountName, onlyIfCached } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const accountsStoreAccountCommunities = useAccountsStore(\n (state) => state.accounts[accountIdKey]?.communities,\n );\n\n // get all unique account community addresses\n const ownerCommunityAddresses = useListCommunities(accountName);\n const groupedCommunityAddresses = useMemo(() => {\n const accountCommunityAddresses = [];\n if (accountsStoreAccountCommunities) {\n for (const communityAddress in accountsStoreAccountCommunities) {\n accountCommunityAddresses.push(communityAddress);\n }\n }\n const allCommunityAddresses = [\n ...new Set([...ownerCommunityAddresses, ...accountCommunityAddresses]),\n ].sort();\n const groupedAddresses = new Map<string, string[]>();\n for (const communityAddress of allCommunityAddresses) {\n const groupKey = getEquivalentCommunityAddressGroupKey(communityAddress);\n const addresses = groupedAddresses.get(groupKey);\n if (addresses) {\n addresses.push(communityAddress);\n } else {\n groupedAddresses.set(groupKey, [communityAddress]);\n }\n }\n return [...groupedAddresses.entries()].map(([groupKey, addresses]) => ({\n groupKey,\n addresses,\n preferredAddress: pickPreferredEquivalentCommunityAddress(addresses),\n }));\n }, [accountsStoreAccountCommunities, ownerCommunityAddresses]);\n const uniqueCommunityAddresses = useMemo(\n () => groupedCommunityAddresses.map(({ preferredAddress }) => preferredAddress),\n [groupedCommunityAddresses],\n );\n\n // fetch all community data\n const {\n communities: communitiesArray,\n state: communitiesState,\n error: communitiesError,\n errors: communitiesErrors,\n } = useCommunities({\n communities: uniqueCommunityAddresses.map((communityAddress) => ({ name: communityAddress })),\n accountName,\n onlyIfCached,\n });\n const communityFetchErrors = useCommunitiesStore((state: any) =>\n uniqueCommunityAddresses.flatMap((communityAddress) => state.errors[communityAddress] || []),\n );\n const canonicalAddressByGroupKey = useMemo(() => {\n const canonicalAddresses: { [groupKey: string]: string } = {};\n for (const [i, { groupKey, preferredAddress }] of groupedCommunityAddresses.entries()) {\n const fetchedAddress = communitiesArray[i]?.address;\n canonicalAddresses[groupKey] = getCanonicalCommunityAddress(\n fetchedAddress || preferredAddress,\n );\n }\n return canonicalAddresses;\n }, [groupedCommunityAddresses, communitiesArray]);\n const communities: any = useMemo(() => {\n const communities: any = {};\n for (const [i, community] of communitiesArray.entries()) {\n const { groupKey, preferredAddress } = groupedCommunityAddresses[i];\n const canonicalAddress = canonicalAddressByGroupKey[groupKey];\n communities[canonicalAddress] = {\n ...communities[canonicalAddress],\n ...community,\n // make sure the canonical address is defined even if the community hasn't fetched yet\n address: canonicalAddress,\n };\n }\n return communities;\n }, [communitiesArray, groupedCommunityAddresses, canonicalAddressByGroupKey]);\n\n // merged community data with account.communities data\n const accountCommunities: any = useMemo(() => {\n const accountCommunities: any = { ...communities };\n if (accountsStoreAccountCommunities) {\n for (const communityAddress in accountsStoreAccountCommunities) {\n const groupKey = getEquivalentCommunityAddressGroupKey(communityAddress);\n const canonicalAddress = canonicalAddressByGroupKey[groupKey];\n accountCommunities[canonicalAddress] = {\n ...accountCommunities[canonicalAddress],\n ...accountsStoreAccountCommunities[communityAddress],\n address: canonicalAddress,\n };\n }\n }\n // add pkc.communities data\n for (const communityAddress of ownerCommunityAddresses) {\n const groupKey = getEquivalentCommunityAddressGroupKey(communityAddress);\n const canonicalAddress = canonicalAddressByGroupKey[groupKey];\n accountCommunities[canonicalAddress] = {\n ...accountCommunities[canonicalAddress],\n address: canonicalAddress,\n role: { role: \"owner\" },\n };\n }\n return accountCommunities;\n }, [\n accountsStoreAccountCommunities,\n ownerCommunityAddresses,\n communities,\n canonicalAddressByGroupKey,\n ]);\n\n if (accountId) {\n log(\"useAccountCommunities\", { accountCommunities });\n }\n\n const pendingAccountCommunities = Object.values(accountCommunities).some(\n (community: any) => community?.address && !community?.updatedAt,\n );\n const errors = communityFetchErrors.length ? communityFetchErrors : communitiesErrors;\n const error = communitiesError || errors[errors.length - 1];\n const state = !accountId\n ? \"initializing\"\n : error\n ? \"failed\"\n : pendingAccountCommunities\n ? \"fetching-ipns\"\n : communitiesState;\n\n return useMemo(\n () => ({\n accountCommunities,\n state,\n error,\n errors,\n }),\n [accountCommunities, state, error, errors],\n );\n}\n\n/**\n * Returns an account's notifications in an array. Unread notifications have a field markedAsRead: false.\n *\n * @param accountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, return\n * the active account's notifications.\n */\nexport function useNotifications(options?: UseNotificationsOptions): UseNotificationsResult {\n assert(\n !options || typeof options === \"object\",\n `useNotifications options argument '${options}' not an object`,\n );\n const { accountName } = options || {};\n // get state\n const accountId = useAccountId(accountName);\n const account = useAccountsStore((state) => state.accounts[accountId || \"\"]);\n const accountCommentsReplies = useAccountsStore(\n (state) => state.accountsCommentsReplies[accountId || \"\"],\n );\n const accountsActionsInternal = useAccountsStore((state) => state.accountsActionsInternal);\n const notifications = useCalculatedNotifications(account, accountCommentsReplies);\n const [errors, setErrors] = useState<Error[]>([]);\n\n const markAsRead = async () => {\n try {\n if (!account) {\n throw Error(\"useNotifications cannot mark as read accounts not initalized yet\");\n }\n accountsActionsInternal.markNotificationsAsRead(account);\n } catch (e: any) {\n setErrors([...errors, e]);\n }\n };\n\n if (account) {\n log(\"useNotifications\", { notifications });\n }\n\n const state = accountId ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n notifications,\n markAsRead,\n state,\n error: errors[errors.length - 1],\n errors,\n }),\n [notifications, errors],\n );\n}\n\nconst getAccountCommentsStates = (accountComments: AccountComment[]) => {\n // Without a cid, the account comment is still a local pending publish. pkc-js marks\n // terminal publish failures when `publishingState === \"failed\"` and publication `state`\n // is `\"stopped\"`, so we derive failed from that terminal pair or recorded publish errors.\n const now = Math.round(Date.now() / 1000);\n const expiryTime = now - 60 * 20;\n\n const states: string[] = [];\n for (const accountComment of accountComments) {\n let state = \"succeeded\";\n if (!accountComment.cid) {\n const ac = accountComment as AccountComment & {\n error?: Error;\n errors?: Error[];\n publishingState?: string;\n state?: string;\n };\n const resolvedPublishFailed =\n (ac.publishingState === \"failed\" && ac.state === \"stopped\") ||\n ac.error != null ||\n (Array.isArray(ac.errors) && ac.errors.length > 0);\n\n if (resolvedPublishFailed) {\n state = \"failed\";\n } else if (accountComment.timestamp > expiryTime) {\n state = \"pending\";\n } else {\n state = \"failed\";\n }\n }\n states.push(state);\n }\n\n return states;\n};\n\nexport const haveAccountCommentStatesChanged = (nextStates: string[], previousStates: string[]) =>\n nextStates.toString() !== previousStates.toString();\n\nconst getAccountHistorySortType = (\n sortType?: \"new\" | \"old\",\n order?: \"asc\" | \"desc\",\n): \"new\" | \"old\" => {\n if (sortType === \"new\" || sortType === \"old\") {\n return sortType;\n }\n return order === \"desc\" ? \"new\" : \"old\";\n};\n\nconst getAccountCommentWithAccountAuthor = (\n accountComment: AccountComment,\n account?: Account,\n accountId?: string,\n): AccountComment => {\n const accountAuthor = account?.author;\n if (\n !accountId ||\n accountComment.accountId !== accountId ||\n !accountAuthor?.address ||\n accountComment.author?.address\n ) {\n return accountComment;\n }\n\n const accountShortAddress =\n accountAuthor.shortAddress || PkcJs.PKC.getShortAddress({ address: accountAuthor.address });\n\n return {\n ...accountComment,\n author: {\n ...accountAuthor,\n ...accountComment.author,\n address: accountAuthor.address,\n ...(accountShortAddress ? { shortAddress: accountShortAddress } : {}),\n },\n };\n};\n\nexport function useAccountComments(options?: UseAccountCommentsOptions): UseAccountCommentsResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountComments options argument '${options}' not an object`,\n );\n const {\n accountName,\n filter,\n commentCid,\n commentIndices,\n communityAddress,\n parentCid,\n newerThan,\n page,\n pageSize,\n sortType,\n order,\n } = options || {};\n assert(\n !filter || typeof filter === \"function\",\n `useAccountComments options.filter argument '${filter}' not an function`,\n );\n const accountId = useAccountId(accountName);\n const accountCommentsIndexes = useAccountsStore(\n (state) => state.accountsCommentsIndexes[accountId || \"\"],\n );\n const commentCidToAccountComment = useAccountsStore(\n (state) => state.commentCidsToAccountsComments[commentCid || \"\"],\n );\n const account = useAccountsStore((state) => state.accounts[accountId || \"\"]);\n const accountComments = useAccountsStore((state) => state.accountsComments[accountId || \"\"]);\n const [accountCommentStates, setAccountCommentStates] = useState<string[]>([]);\n const accountHistorySortType = getAccountHistorySortType(sortType, order);\n\n const filteredAccountComments = useMemo(() => {\n if (!accountComments) {\n return [];\n }\n\n let scopedAccountComments = accountComments;\n if (Array.isArray(commentIndices) && commentIndices.length > 0) {\n const normalizedCommentIndices = commentIndices\n .map((commentIndex) => Number(commentIndex))\n .filter((commentIndex) => Number.isInteger(commentIndex) && commentIndex >= 0);\n scopedAccountComments = normalizedCommentIndices\n .map((commentIndex) => accountComments[commentIndex])\n .filter(Boolean);\n } else if (commentCid) {\n const mappedIndex =\n commentCidToAccountComment?.accountId === accountId\n ? commentCidToAccountComment.accountCommentIndex\n : undefined;\n scopedAccountComments =\n typeof mappedIndex === \"number\" ? [accountComments[mappedIndex]].filter(Boolean) : [];\n } else if (parentCid) {\n const parentIndexes = accountCommentsIndexes?.byParentCid?.[parentCid];\n scopedAccountComments = parentIndexes?.length\n ? parentIndexes.map((index) => accountComments[index]).filter(Boolean)\n : accountComments.filter((accountComment) => accountComment.parentCid === parentCid);\n } else if (communityAddress) {\n const communityIndexes = accountCommentsIndexes?.byCommunityAddress?.[communityAddress];\n scopedAccountComments = communityIndexes?.length\n ? communityIndexes.map((index) => accountComments[index]).filter(Boolean)\n : accountComments.filter(\n (accountComment) => accountComment.communityAddress === communityAddress,\n );\n }\n\n if (typeof newerThan === \"number\") {\n const newerThanTimestamp =\n newerThan === Infinity ? 0 : Math.floor(Date.now() / 1000) - newerThan;\n scopedAccountComments = scopedAccountComments.filter(\n (accountComment) => accountComment.timestamp > newerThanTimestamp,\n );\n }\n if (filter) {\n scopedAccountComments = scopedAccountComments.filter(filter);\n }\n if (accountHistorySortType === \"new\") {\n scopedAccountComments = [...scopedAccountComments].reverse();\n }\n if (typeof pageSize === \"number\" && pageSize > 0) {\n const pageNumber = Math.max(page || 0, 0);\n const startIndex = pageNumber * pageSize;\n return scopedAccountComments.slice(startIndex, startIndex + pageSize);\n }\n return scopedAccountComments;\n }, [\n accountComments,\n accountCommentsIndexes,\n accountId,\n commentCid,\n commentIndices,\n commentCidToAccountComment,\n communityAddress,\n filter,\n newerThan,\n accountHistorySortType,\n page,\n pageSize,\n parentCid,\n ]);\n\n // Recheck periodically so the 20-minute “stale pending → failed” transition updates without other store events\n const delay = 60_000;\n const immediate = false;\n useInterval(\n () => {\n const states = getAccountCommentsStates(filteredAccountComments);\n if (haveAccountCommentStatesChanged(states, accountCommentStates)) {\n setAccountCommentStates(states);\n }\n },\n delay,\n immediate,\n );\n\n const filteredAccountCommentsWithStates = useMemo(() => {\n const states = getAccountCommentsStates(filteredAccountComments);\n return filteredAccountComments.map((comment, i) => ({\n ...getAccountCommentWithAccountAuthor(comment, account, accountId || undefined),\n state: states[i],\n }));\n }, [filteredAccountComments, accountCommentStates, account, accountId]);\n\n if (options) {\n log(\"useAccountComments\", {\n accountId,\n filteredAccountCommentsWithStates,\n accountComments,\n commentCid,\n commentIndices,\n communityAddress,\n filter,\n newerThan,\n sortType: accountHistorySortType,\n page,\n pageSize,\n parentCid,\n });\n }\n\n const state = accountId ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n accountComments: filteredAccountCommentsWithStates,\n state,\n error: undefined,\n errors: [],\n }),\n [filteredAccountCommentsWithStates, state],\n );\n}\n\n/**\n * Returns an account's single comment, e.g. a pending comment they published.\n */\nexport function useAccountComment(options?: UseAccountCommentOptions): UseAccountCommentResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountComment options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { commentIndex, commentCid, accountName } = opts;\n const accountId = useAccountId(accountName);\n const commentCidToAccountComment = useAccountsStore(\n (state) => state.commentCidsToAccountsComments[commentCid || \"\"],\n );\n const account = useAccountsStore((state) => state.accounts[accountId || \"\"]);\n const accountComments = useAccountsStore((state) => state.accountsComments[accountId || \"\"]);\n const normalizedCommentIndex = commentIndex === undefined ? undefined : Number(commentIndex);\n const resolvedCommentIndex =\n typeof normalizedCommentIndex === \"number\" &&\n Number.isInteger(normalizedCommentIndex) &&\n normalizedCommentIndex >= 0\n ? normalizedCommentIndex\n : commentCidToAccountComment && commentCidToAccountComment.accountId === accountId\n ? commentCidToAccountComment.accountCommentIndex\n : undefined;\n const storedAccountComment = useMemo(() => {\n if (typeof resolvedCommentIndex !== \"number\") {\n return undefined;\n }\n return accountComments?.[resolvedCommentIndex];\n }, [accountComments, resolvedCommentIndex]);\n const state = storedAccountComment\n ? getAccountCommentsStates([storedAccountComment])[0]\n : \"initializing\";\n\n return useMemo(() => {\n const accountComment = (\n storedAccountComment\n ? getAccountCommentWithAccountAuthor(storedAccountComment, account, accountId || undefined)\n : {}\n ) as Partial<AccountComment> & {\n error?: Error;\n errors?: Error[];\n };\n return {\n ...accountComment,\n state,\n error: accountComment.error,\n errors: accountComment.errors || [],\n } as UseAccountCommentResult;\n }, [storedAccountComment, account, accountId, state]);\n}\n\n/**\n * Returns the own user's votes stored locally, even those not yet published by the community owner.\n * Check UseAccountCommentsOptions type in types.tsx to filter them, e.g. filter = {communityAddresses: ['memes.eth']}.\n */\nexport function useAccountVotes(options?: UseAccountVotesOptions): UseAccountVotesResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountVotes options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const {\n accountName,\n filter,\n vote,\n commentCid,\n communityAddress,\n newerThan,\n page,\n pageSize,\n sortType,\n order,\n } = opts;\n assert(\n !filter || typeof filter === \"function\",\n `useAccountVotes options.filter argument '${filter}' not an function`,\n );\n const accountId = useAccountId(accountName);\n const accountVotes = useAccountsStore((state) => state.accountsVotes[accountId || \"\"]);\n const accountHistorySortType = getAccountHistorySortType(sortType, order);\n\n const filteredAccountVotesArray = useMemo(() => {\n let accountVotesArray: AccountVote[] = [];\n if (!accountVotes) {\n return accountVotesArray;\n }\n for (const i in accountVotes) {\n accountVotesArray.push(accountVotes[i]);\n }\n if (typeof vote === \"number\") {\n accountVotesArray = accountVotesArray.filter((accountVote) => accountVote.vote === vote);\n }\n if (commentCid) {\n accountVotesArray = accountVotesArray.filter(\n (accountVote) => accountVote.commentCid === commentCid,\n );\n }\n if (communityAddress) {\n accountVotesArray = accountVotesArray.filter(\n (accountVote) => accountVote.communityAddress === communityAddress,\n );\n }\n if (typeof newerThan === \"number\") {\n const newerThanTimestamp =\n newerThan === Infinity ? 0 : Math.floor(Date.now() / 1000) - newerThan;\n accountVotesArray = accountVotesArray.filter(\n (accountVote) => accountVote.timestamp > newerThanTimestamp,\n );\n }\n if (filter) {\n accountVotesArray = accountVotesArray.filter(filter);\n }\n accountVotesArray = [...accountVotesArray].sort(\n (firstVote, secondVote) => (firstVote.timestamp || 0) - (secondVote.timestamp || 0),\n );\n if (accountHistorySortType === \"new\") {\n accountVotesArray = [...accountVotesArray].reverse();\n }\n if (typeof pageSize === \"number\" && pageSize > 0) {\n const pageNumber = Math.max(page || 0, 0);\n const startIndex = pageNumber * pageSize;\n accountVotesArray = accountVotesArray.slice(startIndex, startIndex + pageSize);\n }\n return accountVotesArray;\n }, [\n accountVotes,\n accountHistorySortType,\n commentCid,\n communityAddress,\n filter,\n newerThan,\n page,\n pageSize,\n vote,\n ]);\n\n if (accountVotes && options) {\n log(\"useAccountVotes\", {\n accountId,\n filteredAccountVotesArray,\n accountVotes,\n commentCid,\n communityAddress,\n filter,\n newerThan,\n sortType: accountHistorySortType,\n page,\n pageSize,\n vote,\n });\n }\n\n // TODO: add failed / pending states\n\n const state = accountId ? \"succeeded\" : \"initializing\";\n\n return useMemo(\n () => ({\n accountVotes: filteredAccountVotesArray,\n state,\n error: undefined,\n errors: [],\n }),\n [filteredAccountVotesArray, state],\n );\n}\n\n/**\n * Returns an account's single vote on a comment, e.g. to know if you already voted on a comment.\n */\nexport function useAccountVote(options?: UseAccountVoteOptions): UseAccountVoteResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountVote options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { commentCid, accountName } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const commentCidKey = commentCid || \"\";\n const accountVotes = useAccountsStore((state) => state.accountsVotes[accountIdKey]);\n const accountVote: any = accountVotes?.[commentCidKey];\n const state = accountId && commentCid ? \"succeeded\" : \"initializing\";\n\n // TODO: add failed / pending state\n\n return useMemo(\n () => ({\n ...accountVote,\n state,\n error: undefined,\n errors: [],\n }),\n [accountVote, state],\n );\n}\n\n/**\n * Returns all the comment and community edits published by an account.\n */\nexport function useAccountEdits(options?: UseAccountEditsOptions): UseAccountEditsResult {\n assert(\n !options || typeof options === \"object\",\n `useAccountEdits options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { filter, accountName } = opts;\n assert(\n !filter || typeof filter === \"function\",\n `useAccountEdits options.filter argument '${filter}' not an function`,\n );\n const accountId = useAccountId(accountName);\n const ensureAccountEditsLoaded = useAccountsStore(\n (state) => state.accountsActionsInternal.ensureAccountEditsLoaded,\n );\n const accountEdits = useAccountsStore((state) => state.accountsEdits[accountId || \"\"]);\n const accountEditsLoaded = useAccountsStore(\n (state) => state.accountsEditsLoaded[accountId || \"\"],\n );\n\n useEffect(() => {\n if (!accountId || accountEditsLoaded) {\n return;\n }\n ensureAccountEditsLoaded(accountId).catch((error: unknown) =>\n log.error(\"useAccountEdits ensureAccountEditsLoaded error\", { accountId, error }),\n );\n }, [accountEditsLoaded, accountId, ensureAccountEditsLoaded]);\n\n const accountEditsArray = useMemo(() => {\n const accountEditsArray = [];\n for (const i in accountEdits || {}) {\n accountEditsArray.push(...accountEdits[i]);\n }\n // sort by oldest first\n return accountEditsArray.sort((a, b) => a.timestamp - b.timestamp);\n }, [accountEdits]);\n\n const filteredAccountEditsArray = useMemo(() => {\n if (!filter) {\n return accountEditsArray;\n }\n return accountEditsArray.filter(filter);\n }, [accountEditsArray, filter]);\n\n // TODO: add failed / pending states\n\n const state = accountId ? (accountEditsLoaded ? \"succeeded\" : \"initializing\") : \"initializing\";\n\n return useMemo(\n () => ({\n accountEdits: filteredAccountEditsArray,\n state,\n error: undefined,\n errors: [],\n }),\n [filteredAccountEditsArray, state],\n );\n}\n\n/**\n * Returns the comment edited (if has any edits), as well as the pending, succeeded or failed state of the edit.\n */\nexport function useEditedComment(options?: UseEditedCommentOptions): UseEditedCommentResult {\n assert(\n !options || typeof options === \"object\",\n `useEditedComment options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { comment, accountName } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const commentCidKey = (comment && comment.cid) || \"\";\n const commentEdits = useAccountsStore(\n (state) => state.accountsEdits[accountIdKey]?.[commentCidKey],\n );\n const commentEditSummary = useAccountsStore(\n (state) => state.accountsEditsSummaries[accountIdKey]?.[commentCidKey],\n );\n\n let initialState = \"initializing\";\n if (accountId && comment && comment.cid) {\n initialState = \"unedited\";\n }\n\n const editedResult = useMemo(() => {\n const editedResult: any = {\n editedComment: undefined,\n succeededEdits: {},\n pendingEdits: {},\n failedEdits: {},\n state: undefined,\n };\n\n // there are no edits\n const propertyNameEdits: any =\n commentEdits?.length > 0 ? getAccountEditPropertySummary(commentEdits) : commentEditSummary;\n\n if (!propertyNameEdits || Object.keys(propertyNameEdits).length === 0) {\n return editedResult;\n }\n\n const now = Math.round(Date.now() / 1000);\n // no longer consider an edit pending ater an expiry time of 20 minutes\n const expiryTime = 60 * 20;\n\n // iterate over propertyNameEdits and find if succeeded, pending or failed\n for (const propertyName in propertyNameEdits) {\n const propertyNameEdit = propertyNameEdits[propertyName];\n\n const setPropertyNameEditState = (state: \"succeeded\" | \"pending\" | \"failed\") => {\n // set propertyNameEdit e.g. editedResult.succeededEdits.removed = true\n editedResult[`${state}Edits`][propertyName] = propertyNameEdit.value;\n\n // if any propertyNameEdit failed, consider the commentEdit failed\n if (state === \"failed\") {\n editedResult.state = \"failed\";\n }\n // if all propertyNameEdit succeeded, consider the commentEdit succeeded\n if (state === \"succeeded\" && !editedResult.state) {\n editedResult.state = \"succeeded\";\n }\n // if any propertyNameEdit are pending, and none have failed, consider the commentEdit pending\n if (state === \"pending\" && editedResult.state !== \"failed\") {\n editedResult.state = \"pending\";\n }\n };\n\n // Without a newer update we can only treat recent edits as pending. Older edits that never\n // produced any update are effectively stale and should stop shadowing the live comment.\n if (!comment?.updatedAt) {\n if (isEqual(getCommentEditPropertyValue(comment, propertyName), propertyNameEdit.value)) {\n setPropertyNameEditState(\"succeeded\");\n } else if (propertyNameEdit.timestamp > now - expiryTime) {\n setPropertyNameEditState(\"pending\");\n } else {\n setPropertyNameEditState(\"failed\");\n }\n continue;\n }\n\n // comment.updatedAt is older than propertyNameEdit, propertyNameEdit is pending\n // because we haven't received the update yet and can't evaluate\n if (comment.updatedAt < propertyNameEdit.timestamp) {\n setPropertyNameEditState(\"pending\");\n continue;\n }\n\n // comment.updatedAt is newer than propertyNameEdit, a comment update\n // has been received after the edit was published so we can evaluate\n else {\n // comment has propertyNameEdit, propertyNameEdit succeeded\n if (isEqual(getCommentEditPropertyValue(comment, propertyName), propertyNameEdit.value)) {\n setPropertyNameEditState(\"succeeded\");\n continue;\n }\n\n // comment does not have propertyNameEdit\n else {\n // propertyNameEdit is newer than 20min, it is too recent to evaluate\n // so we should assume pending\n if (propertyNameEdit.timestamp > now - expiryTime) {\n setPropertyNameEditState(\"pending\");\n continue;\n }\n\n // propertyNameEdit is older than 20min, we can evaluate it\n else {\n // comment update was received too shortly after propertyNameEdit was\n // published, assume pending until a more recent comment update is received\n const timeSinceUpdate = comment.updatedAt - propertyNameEdit.timestamp;\n if (timeSinceUpdate < expiryTime) {\n setPropertyNameEditState(\"pending\");\n continue;\n }\n\n // comment update time is sufficiently distanced from propertyNameEdit\n // and comment doesn't have propertyNameEdit, assume failed\n else {\n setPropertyNameEditState(\"failed\");\n continue;\n }\n }\n }\n }\n }\n\n // define editedComment\n editedResult.editedComment = { ...comment };\n // add pending and succeeded props so the editor can see his changes right away\n // don't add failed edits to reflect the current state of the edited comment\n for (const propertyName in editedResult.pendingEdits) {\n applyEditedCommentProperty(\n editedResult.editedComment,\n propertyName,\n editedResult.pendingEdits[propertyName],\n );\n }\n for (const propertyName in editedResult.succeededEdits) {\n applyEditedCommentProperty(\n editedResult.editedComment,\n propertyName,\n editedResult.succeededEdits[propertyName],\n );\n }\n editedResult.editedComment = addCommentModeration(editedResult.editedComment);\n\n return editedResult;\n }, [comment, commentEditSummary, commentEdits]);\n\n return useMemo(\n () => ({\n ...editedResult,\n state: editedResult.state || initialState,\n error: undefined,\n errors: [],\n }),\n [editedResult, initialState],\n );\n}\n\n/**\n * This hook should be added to pages where the user is likely to publish something, i,e. the\n * submit page and the /c/<commentCid> page, it improves the speed of publishing to the pubsub\n * by subscribing to the pubsub right away.\n *\n * @param accountName - The nickname of the account, e.g. 'Account 1'.\n * @param communityAddress - The community address to subscribe to, e.g. 'news.eth'.\n */\nexport function usePubsubSubscribe(options?: UsePubsubSubscribeOptions): UsePubsubSubscribeResult {\n assert(\n !options || typeof options === \"object\",\n `usePubsubSubscribe options argument '${options}' not an object`,\n );\n const opts = options ?? {};\n const { accountName, communityAddress } = opts;\n const accountId = useAccountId(accountName);\n const accountIdKey = accountId || \"\";\n const account = useAccountsStore((state) => state.accounts[accountIdKey]);\n const [state, setState] = useState(\"initializing\");\n const [errors, setErrors] = useState<Error[]>([]);\n\n useEffect(() => {\n if (!account?.pkc || !communityAddress) {\n return;\n }\n setState(\"subscribing\");\n account.pkc\n .pubsubSubscribe(communityAddress)\n .then(() => setState(\"succeeded\"))\n .catch((error: any) => {\n setErrors([...errors, error]);\n setState(\"failed\");\n log.error(\"usePubsubSubscribe pkc.pubsubSubscribe error\", { communityAddress, error });\n });\n\n // unsub on component unmount\n return function () {\n account.pkc.pubsubUnsubscribe(communityAddress).catch((error: any) => {\n setErrors([...errors, error]);\n log.error(\"usePubsubSubscribe pkc.pubsubUnsubscribe error\", {\n communityAddress,\n error,\n });\n });\n };\n }, [account?.pkc, communityAddress]);\n\n return useMemo(\n () => ({\n state,\n error: errors[errors.length - 1],\n errors,\n }),\n [state, errors],\n );\n}\n"]}
|