@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.
Files changed (269) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +1365 -0
  3. package/dist/hooks/accounts/accounts.d.ts +64 -0
  4. package/dist/hooks/accounts/accounts.d.ts.map +1 -0
  5. package/dist/hooks/accounts/accounts.js +706 -0
  6. package/dist/hooks/accounts/accounts.js.map +1 -0
  7. package/dist/hooks/accounts/index.d.ts +2 -0
  8. package/dist/hooks/accounts/index.d.ts.map +1 -0
  9. package/dist/hooks/accounts/index.js +2 -0
  10. package/dist/hooks/accounts/index.js.map +1 -0
  11. package/dist/hooks/accounts/utils.d.ts +6 -0
  12. package/dist/hooks/accounts/utils.d.ts.map +1 -0
  13. package/dist/hooks/accounts/utils.js +226 -0
  14. package/dist/hooks/accounts/utils.js.map +1 -0
  15. package/dist/hooks/actions/actions.d.ts +19 -0
  16. package/dist/hooks/actions/actions.d.ts.map +1 -0
  17. package/dist/hooks/actions/actions.js +552 -0
  18. package/dist/hooks/actions/actions.js.map +1 -0
  19. package/dist/hooks/actions/index.d.ts +2 -0
  20. package/dist/hooks/actions/index.d.ts.map +1 -0
  21. package/dist/hooks/actions/index.js +2 -0
  22. package/dist/hooks/actions/index.js.map +1 -0
  23. package/dist/hooks/authors/author-avatars.d.ts +28 -0
  24. package/dist/hooks/authors/author-avatars.d.ts.map +1 -0
  25. package/dist/hooks/authors/author-avatars.js +191 -0
  26. package/dist/hooks/authors/author-avatars.js.map +1 -0
  27. package/dist/hooks/authors/authors.d.ts +37 -0
  28. package/dist/hooks/authors/authors.d.ts.map +1 -0
  29. package/dist/hooks/authors/authors.js +509 -0
  30. package/dist/hooks/authors/authors.js.map +1 -0
  31. package/dist/hooks/authors/index.d.ts +2 -0
  32. package/dist/hooks/authors/index.d.ts.map +1 -0
  33. package/dist/hooks/authors/index.js +2 -0
  34. package/dist/hooks/authors/index.js.map +1 -0
  35. package/dist/hooks/authors/utils.d.ts +4 -0
  36. package/dist/hooks/authors/utils.d.ts.map +1 -0
  37. package/dist/hooks/authors/utils.js +21 -0
  38. package/dist/hooks/authors/utils.js.map +1 -0
  39. package/dist/hooks/comments.d.ts +17 -0
  40. package/dist/hooks/comments.d.ts.map +1 -0
  41. package/dist/hooks/comments.js +351 -0
  42. package/dist/hooks/comments.js.map +1 -0
  43. package/dist/hooks/communities.d.ts +31 -0
  44. package/dist/hooks/communities.d.ts.map +1 -0
  45. package/dist/hooks/communities.js +389 -0
  46. package/dist/hooks/communities.js.map +1 -0
  47. package/dist/hooks/feeds/feeds.d.ts +18 -0
  48. package/dist/hooks/feeds/feeds.d.ts.map +1 -0
  49. package/dist/hooks/feeds/feeds.js +315 -0
  50. package/dist/hooks/feeds/feeds.js.map +1 -0
  51. package/dist/hooks/feeds/index.d.ts +2 -0
  52. package/dist/hooks/feeds/index.d.ts.map +1 -0
  53. package/dist/hooks/feeds/index.js +2 -0
  54. package/dist/hooks/feeds/index.js.map +1 -0
  55. package/dist/hooks/pkc-rpc.d.ts +7 -0
  56. package/dist/hooks/pkc-rpc.d.ts.map +1 -0
  57. package/dist/hooks/pkc-rpc.js +88 -0
  58. package/dist/hooks/pkc-rpc.js.map +1 -0
  59. package/dist/hooks/replies.d.ts +5 -0
  60. package/dist/hooks/replies.d.ts.map +1 -0
  61. package/dist/hooks/replies.js +155 -0
  62. package/dist/hooks/replies.js.map +1 -0
  63. package/dist/hooks/states.d.ts +15 -0
  64. package/dist/hooks/states.d.ts.map +1 -0
  65. package/dist/hooks/states.js +213 -0
  66. package/dist/hooks/states.js.map +1 -0
  67. package/dist/hooks/utils/use-interval.d.ts +3 -0
  68. package/dist/hooks/utils/use-interval.d.ts.map +1 -0
  69. package/dist/hooks/utils/use-interval.js +36 -0
  70. package/dist/hooks/utils/use-interval.js.map +1 -0
  71. package/dist/hooks/utils/use-previous.d.ts +1 -0
  72. package/dist/hooks/utils/use-previous.js +10 -0
  73. package/dist/index.d.ts +82 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +128 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/lib/chain/chain.d.ts +36 -0
  78. package/dist/lib/chain/chain.d.ts.map +1 -0
  79. package/dist/lib/chain/chain.js +195 -0
  80. package/dist/lib/chain/chain.js.map +1 -0
  81. package/dist/lib/chain/index.d.ts +4 -0
  82. package/dist/lib/chain/index.d.ts.map +1 -0
  83. package/dist/lib/chain/index.js +4 -0
  84. package/dist/lib/chain/index.js.map +1 -0
  85. package/dist/lib/community-address.d.ts +6 -0
  86. package/dist/lib/community-address.d.ts.map +1 -0
  87. package/dist/lib/community-address.js +26 -0
  88. package/dist/lib/community-address.js.map +1 -0
  89. package/dist/lib/community-ref.d.ts +23 -0
  90. package/dist/lib/community-ref.d.ts.map +1 -0
  91. package/dist/lib/community-ref.js +113 -0
  92. package/dist/lib/community-ref.js.map +1 -0
  93. package/dist/lib/debug-utils.d.ts +9 -0
  94. package/dist/lib/debug-utils.d.ts.map +1 -0
  95. package/dist/lib/debug-utils.js +21 -0
  96. package/dist/lib/debug-utils.js.map +1 -0
  97. package/dist/lib/feed-sort-type.d.ts +2 -0
  98. package/dist/lib/feed-sort-type.d.ts.map +1 -0
  99. package/dist/lib/feed-sort-type.js +22 -0
  100. package/dist/lib/feed-sort-type.js.map +1 -0
  101. package/dist/lib/localforage-lru/index.d.ts +3 -0
  102. package/dist/lib/localforage-lru/index.d.ts.map +1 -0
  103. package/dist/lib/localforage-lru/index.js +46 -0
  104. package/dist/lib/localforage-lru/index.js.map +1 -0
  105. package/dist/lib/localforage-lru/localforage-lru.d.ts +6 -0
  106. package/dist/lib/localforage-lru/localforage-lru.d.ts.map +1 -0
  107. package/dist/lib/localforage-lru/localforage-lru.js +182 -0
  108. package/dist/lib/localforage-lru/localforage-lru.js.map +1 -0
  109. package/dist/lib/pkc-compat.d.ts +25 -0
  110. package/dist/lib/pkc-compat.d.ts.map +1 -0
  111. package/dist/lib/pkc-compat.js +131 -0
  112. package/dist/lib/pkc-compat.js.map +1 -0
  113. package/dist/lib/pkc-js/fixtures/markdown-example.d.ts +3 -0
  114. package/dist/lib/pkc-js/fixtures/markdown-example.d.ts.map +1 -0
  115. package/dist/lib/pkc-js/fixtures/markdown-example.js +280 -0
  116. package/dist/lib/pkc-js/fixtures/markdown-example.js.map +1 -0
  117. package/dist/lib/pkc-js/index.d.ts +11 -0
  118. package/dist/lib/pkc-js/index.d.ts.map +1 -0
  119. package/dist/lib/pkc-js/index.js +85 -0
  120. package/dist/lib/pkc-js/index.js.map +1 -0
  121. package/dist/lib/pkc-js/pkc-js-mock-content.d.ts +3 -0
  122. package/dist/lib/pkc-js/pkc-js-mock-content.d.ts.map +1 -0
  123. package/dist/lib/pkc-js/pkc-js-mock-content.js +1235 -0
  124. package/dist/lib/pkc-js/pkc-js-mock-content.js.map +1 -0
  125. package/dist/lib/pkc-js/pkc-js-mock.d.ts +137 -0
  126. package/dist/lib/pkc-js/pkc-js-mock.d.ts.map +1 -0
  127. package/dist/lib/pkc-js/pkc-js-mock.js +644 -0
  128. package/dist/lib/pkc-js/pkc-js-mock.js.map +1 -0
  129. package/dist/lib/polyfill.d.ts +3 -0
  130. package/dist/lib/polyfill.d.ts.map +1 -0
  131. package/dist/lib/polyfill.js +14 -0
  132. package/dist/lib/polyfill.js.map +1 -0
  133. package/dist/lib/protocol-compat.d.ts +14 -0
  134. package/dist/lib/protocol-compat.d.ts.map +1 -0
  135. package/dist/lib/protocol-compat.js +67 -0
  136. package/dist/lib/protocol-compat.js.map +1 -0
  137. package/dist/lib/test-utils.d.ts +29 -0
  138. package/dist/lib/test-utils.d.ts.map +1 -0
  139. package/dist/lib/test-utils.js +184 -0
  140. package/dist/lib/test-utils.js.map +1 -0
  141. package/dist/lib/utils/comment-moderation.d.ts +4 -0
  142. package/dist/lib/utils/comment-moderation.d.ts.map +1 -0
  143. package/dist/lib/utils/comment-moderation.js +56 -0
  144. package/dist/lib/utils/comment-moderation.js.map +1 -0
  145. package/dist/lib/utils/index.d.ts +4 -0
  146. package/dist/lib/utils/index.d.ts.map +1 -0
  147. package/dist/lib/utils/index.js +4 -0
  148. package/dist/lib/utils/index.js.map +1 -0
  149. package/dist/lib/utils/utils.d.ts +23 -0
  150. package/dist/lib/utils/utils.d.ts.map +1 -0
  151. package/dist/lib/utils/utils.js +375 -0
  152. package/dist/lib/utils/utils.js.map +1 -0
  153. package/dist/lib/validator.d.ts +30 -0
  154. package/dist/lib/validator.d.ts.map +1 -0
  155. package/dist/lib/validator.js +307 -0
  156. package/dist/lib/validator.js.map +1 -0
  157. package/dist/stores/accounts/account-generator.d.ts +51 -0
  158. package/dist/stores/accounts/account-generator.d.ts.map +1 -0
  159. package/dist/stores/accounts/account-generator.js +160 -0
  160. package/dist/stores/accounts/account-generator.js.map +1 -0
  161. package/dist/stores/accounts/accounts-actions-internal.d.ts +8 -0
  162. package/dist/stores/accounts/accounts-actions-internal.d.ts.map +1 -0
  163. package/dist/stores/accounts/accounts-actions-internal.js +403 -0
  164. package/dist/stores/accounts/accounts-actions-internal.js.map +1 -0
  165. package/dist/stores/accounts/accounts-actions.d.ts +46 -0
  166. package/dist/stores/accounts/accounts-actions.d.ts.map +1 -0
  167. package/dist/stores/accounts/accounts-actions.js +1341 -0
  168. package/dist/stores/accounts/accounts-actions.js.map +1 -0
  169. package/dist/stores/accounts/accounts-database.d.ts +34 -0
  170. package/dist/stores/accounts/accounts-database.d.ts.map +1 -0
  171. package/dist/stores/accounts/accounts-database.js +685 -0
  172. package/dist/stores/accounts/accounts-database.js.map +1 -0
  173. package/dist/stores/accounts/accounts-store.d.ts +32 -0
  174. package/dist/stores/accounts/accounts-store.d.ts.map +1 -0
  175. package/dist/stores/accounts/accounts-store.js +169 -0
  176. package/dist/stores/accounts/accounts-store.js.map +1 -0
  177. package/dist/stores/accounts/index.d.ts +4 -0
  178. package/dist/stores/accounts/index.d.ts.map +1 -0
  179. package/dist/stores/accounts/index.js +4 -0
  180. package/dist/stores/accounts/index.js.map +1 -0
  181. package/dist/stores/accounts/utils.d.ts +49 -0
  182. package/dist/stores/accounts/utils.d.ts.map +1 -0
  183. package/dist/stores/accounts/utils.js +419 -0
  184. package/dist/stores/accounts/utils.js.map +1 -0
  185. package/dist/stores/authors-comments/authors-comments-store.d.ts +37 -0
  186. package/dist/stores/authors-comments/authors-comments-store.d.ts.map +1 -0
  187. package/dist/stores/authors-comments/authors-comments-store.js +338 -0
  188. package/dist/stores/authors-comments/authors-comments-store.js.map +1 -0
  189. package/dist/stores/authors-comments/index.d.ts +4 -0
  190. package/dist/stores/authors-comments/index.d.ts.map +1 -0
  191. package/dist/stores/authors-comments/index.js +4 -0
  192. package/dist/stores/authors-comments/index.js.map +1 -0
  193. package/dist/stores/authors-comments/utils.d.ts +14 -0
  194. package/dist/stores/authors-comments/utils.d.ts.map +1 -0
  195. package/dist/stores/authors-comments/utils.js +81 -0
  196. package/dist/stores/authors-comments/utils.js.map +1 -0
  197. package/dist/stores/comments/comments-store.d.ts +19 -0
  198. package/dist/stores/comments/comments-store.d.ts.map +1 -0
  199. package/dist/stores/comments/comments-store.js +385 -0
  200. package/dist/stores/comments/comments-store.js.map +1 -0
  201. package/dist/stores/comments/index.d.ts +4 -0
  202. package/dist/stores/comments/index.d.ts.map +1 -0
  203. package/dist/stores/comments/index.js +4 -0
  204. package/dist/stores/comments/index.js.map +1 -0
  205. package/dist/stores/communities/communities-store.d.ts +17 -0
  206. package/dist/stores/communities/communities-store.d.ts.map +1 -0
  207. package/dist/stores/communities/communities-store.js +304 -0
  208. package/dist/stores/communities/communities-store.js.map +1 -0
  209. package/dist/stores/communities/index.d.ts +4 -0
  210. package/dist/stores/communities/index.d.ts.map +1 -0
  211. package/dist/stores/communities/index.js +4 -0
  212. package/dist/stores/communities/index.js.map +1 -0
  213. package/dist/stores/communities-pages/communities-pages-store.d.ts +23 -0
  214. package/dist/stores/communities-pages/communities-pages-store.d.ts.map +1 -0
  215. package/dist/stores/communities-pages/communities-pages-store.js +316 -0
  216. package/dist/stores/communities-pages/communities-pages-store.js.map +1 -0
  217. package/dist/stores/communities-pages/index.d.ts +4 -0
  218. package/dist/stores/communities-pages/index.d.ts.map +1 -0
  219. package/dist/stores/communities-pages/index.js +4 -0
  220. package/dist/stores/communities-pages/index.js.map +1 -0
  221. package/dist/stores/feeds/feed-sorter.d.ts +5 -0
  222. package/dist/stores/feeds/feed-sorter.d.ts.map +1 -0
  223. package/dist/stores/feeds/feed-sorter.js +135 -0
  224. package/dist/stores/feeds/feed-sorter.js.map +1 -0
  225. package/dist/stores/feeds/feeds-store.d.ts +25 -0
  226. package/dist/stores/feeds/feeds-store.d.ts.map +1 -0
  227. package/dist/stores/feeds/feeds-store.js +459 -0
  228. package/dist/stores/feeds/feeds-store.js.map +1 -0
  229. package/dist/stores/feeds/index.d.ts +4 -0
  230. package/dist/stores/feeds/index.d.ts.map +1 -0
  231. package/dist/stores/feeds/index.js +4 -0
  232. package/dist/stores/feeds/index.js.map +1 -0
  233. package/dist/stores/feeds/utils.d.ts +43 -0
  234. package/dist/stores/feeds/utils.d.ts.map +1 -0
  235. package/dist/stores/feeds/utils.js +736 -0
  236. package/dist/stores/feeds/utils.js.map +1 -0
  237. package/dist/stores/replies/index.d.ts +4 -0
  238. package/dist/stores/replies/index.d.ts.map +1 -0
  239. package/dist/stores/replies/index.js +4 -0
  240. package/dist/stores/replies/index.js.map +1 -0
  241. package/dist/stores/replies/replies-comments-store.d.ts +8 -0
  242. package/dist/stores/replies/replies-comments-store.d.ts.map +1 -0
  243. package/dist/stores/replies/replies-comments-store.js +23 -0
  244. package/dist/stores/replies/replies-comments-store.js.map +1 -0
  245. package/dist/stores/replies/replies-store.d.ts +29 -0
  246. package/dist/stores/replies/replies-store.d.ts.map +1 -0
  247. package/dist/stores/replies/replies-store.js +413 -0
  248. package/dist/stores/replies/replies-store.js.map +1 -0
  249. package/dist/stores/replies/utils.d.ts +25 -0
  250. package/dist/stores/replies/utils.d.ts.map +1 -0
  251. package/dist/stores/replies/utils.js +549 -0
  252. package/dist/stores/replies/utils.js.map +1 -0
  253. package/dist/stores/replies-pages/index.d.ts +4 -0
  254. package/dist/stores/replies-pages/index.d.ts.map +1 -0
  255. package/dist/stores/replies-pages/index.js +4 -0
  256. package/dist/stores/replies-pages/index.js.map +1 -0
  257. package/dist/stores/replies-pages/replies-pages-store.d.ts +20 -0
  258. package/dist/stores/replies-pages/replies-pages-store.d.ts.map +1 -0
  259. package/dist/stores/replies-pages/replies-pages-store.js +270 -0
  260. package/dist/stores/replies-pages/replies-pages-store.js.map +1 -0
  261. package/dist/stores/replies-pages/utils.d.ts +3 -0
  262. package/dist/stores/replies-pages/utils.d.ts.map +1 -0
  263. package/dist/stores/replies-pages/utils.js +43 -0
  264. package/dist/stores/replies-pages/utils.js.map +1 -0
  265. package/dist/types.d.ts +638 -0
  266. package/dist/types.d.ts.map +1 -0
  267. package/dist/types.js +3 -0
  268. package/dist/types.js.map +1 -0
  269. package/package.json +160 -0
@@ -0,0 +1,509 @@
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, useState, useMemo } from "react";
11
+ import useInterval from "../utils/use-interval.js";
12
+ import { useAccount } from "../accounts/index.js";
13
+ import Logger from "@pkcprotocol/pkc-logger";
14
+ const log = Logger("bitsocial-react-hooks:authors:hooks");
15
+ import assert from "assert";
16
+ import { useNftMetadataUrl, useNftImageUrl, useVerifiedAuthorAvatarSignature, useAuthorAvatarIsWhitelisted, } from "./author-avatars.js";
17
+ import { useComment } from "../comments.js";
18
+ import { useAuthorCommentsName, usePkcAddress } from "./utils.js";
19
+ import useAuthorsCommentsStore from "../../stores/authors-comments/index.js";
20
+ import PkcJs from "../../lib/pkc-js/index.js";
21
+ import { getConfiguredNameResolverInfoByKey, getChainProviders, getMatchingNameResolvers, getProtocolClient, getProtocolNameResolverClients, resolveAuthorNameWithProtocol, } from "../../lib/pkc-compat.js";
22
+ import QuickLRU from "quick-lru";
23
+ export { setAuthorAvatarsWhitelistedTokenAddresses } from "./author-avatars.js";
24
+ const cacheResolveAuthorAddressPromise = (address, promise) => {
25
+ resolveAuthorAddressPromises[address] = promise;
26
+ const clearCachedPromise = () => {
27
+ if (resolveAuthorAddressPromises[address] === promise) {
28
+ delete resolveAuthorAddressPromises[address];
29
+ }
30
+ };
31
+ void promise.then(clearCachedPromise, clearCachedPromise);
32
+ return promise;
33
+ };
34
+ const removeStateChangeListener = (client, listener) => {
35
+ var _a;
36
+ if (typeof (client === null || client === void 0 ? void 0 : client.off) === "function") {
37
+ client.off("statechange", listener);
38
+ return;
39
+ }
40
+ (_a = client === null || client === void 0 ? void 0 : client.removeListener) === null || _a === void 0 ? void 0 : _a.call(client, "statechange", listener);
41
+ };
42
+ /**
43
+ * @param authorAddress - The address of the author
44
+ * @param commentCid - The last known comment cid of the author (not possible to get an author without providing at least 1 comment cid)
45
+ * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
46
+ * the active account.
47
+ */
48
+ export function useAuthorComments(options) {
49
+ assert(!options || typeof options === "object", `useAuthorComments options argument '${options}' not an object`);
50
+ const { authorAddress, commentCid, accountName, filter } = options || {};
51
+ const account = useAccount({ accountName });
52
+ const authorCommentsName = useAuthorCommentsName(account === null || account === void 0 ? void 0 : account.id, authorAddress, filter);
53
+ const incrementPageNumber = useAuthorsCommentsStore((state) => state.incrementPageNumber);
54
+ const addAuthorCommentsToStore = useAuthorsCommentsStore((state) => state.addAuthorCommentsToStore);
55
+ const hasMoreBufferedComments = useAuthorsCommentsStore((state) => state.hasMoreBufferedComments[authorCommentsName || ""]);
56
+ const hasNextCommentCidToFetch = useAuthorsCommentsStore((state) => Boolean(state.nextCommentCidsToFetch[authorAddress || ""]));
57
+ const authorComments = useAuthorsCommentsStore((state) => state.loadedComments[authorCommentsName || ""]);
58
+ const lastCommentCid = useAuthorsCommentsStore((state) => state.lastCommentCids[authorAddress || ""]);
59
+ // add authors comments to store
60
+ useEffect(() => {
61
+ if (!authorAddress || !commentCid || !account) {
62
+ return;
63
+ }
64
+ try {
65
+ addAuthorCommentsToStore(authorCommentsName, authorAddress, commentCid, filter, account);
66
+ }
67
+ catch (error) {
68
+ log.error("useAuthorComments addAuthorCommentsToStore error", { authorCommentsName, error });
69
+ }
70
+ }, [authorCommentsName, commentCid]);
71
+ const loadMore = () => __awaiter(this, void 0, void 0, function* () {
72
+ try {
73
+ if (!authorAddress || !account) {
74
+ throw Error("useAuthorComments cannot load more authorComments not initalized yet");
75
+ }
76
+ incrementPageNumber(authorCommentsName);
77
+ }
78
+ catch (e) {
79
+ // wait 100 ms so infinite scroll doesn't spam this function
80
+ yield new Promise((r) => setTimeout(r, 50));
81
+ // TODO: maybe add these errors to errors array
82
+ }
83
+ });
84
+ const hasMore = hasMoreBufferedComments || hasNextCommentCidToFetch;
85
+ const authorResult = useAuthor({ commentCid, authorAddress, accountName });
86
+ const state = authorResult.state;
87
+ const errors = authorResult.errors;
88
+ if (authorResult.author) {
89
+ log("useAuthorComments", {
90
+ authorAddress,
91
+ commentCid,
92
+ // authorComments,
93
+ authorCommentsSize: (authorComments === null || authorComments === void 0 ? void 0 : authorComments.length) || 0,
94
+ lastCommentCid,
95
+ hasMoreBufferedComments,
96
+ hasNextCommentCidToFetch,
97
+ hasMore,
98
+ state,
99
+ errors,
100
+ authorResult,
101
+ accountName,
102
+ });
103
+ }
104
+ return useMemo(() => ({
105
+ authorComments: authorComments || [],
106
+ lastCommentCid,
107
+ hasMore,
108
+ loadMore,
109
+ state,
110
+ error: errors[errors.length - 1],
111
+ errors,
112
+ }), [authorComments, lastCommentCid, hasMore, errors, state]);
113
+ }
114
+ /**
115
+ * @param authorAddress - The address of the author
116
+ * @param commentCid - The last known comment cid of the author (not possible to get an author without providing at least 1 comment cid)
117
+ * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
118
+ * the active account.
119
+ */
120
+ export function useAuthor(options) {
121
+ var _a;
122
+ assert(!options || typeof options === "object", `useAuthor options argument '${options}' not an object`);
123
+ const { authorAddress, commentCid, accountName } = options || {};
124
+ const comment = useComment({ commentCid, accountName });
125
+ // the commentCid doesnt have the same author address as authorAddress
126
+ const useAuthorError = useMemo(() => {
127
+ var _a;
128
+ // if comment is loaded and author address is different from authorAddress
129
+ if ((comment === null || comment === void 0 ? void 0 : comment.timestamp) && authorAddress && ((_a = comment === null || comment === void 0 ? void 0 : comment.author) === null || _a === void 0 ? void 0 : _a.address) !== authorAddress) {
130
+ return Error("commentCid author.address is different from authorAddress");
131
+ }
132
+ if (commentCid && !authorAddress) {
133
+ return Error("missing UseAuthorOptions.authorAddress");
134
+ }
135
+ if (!commentCid && authorAddress) {
136
+ return Error("missing UseAuthorOptions.commentCid");
137
+ }
138
+ }, [commentCid, comment === null || comment === void 0 ? void 0 : comment.timestamp, (_a = comment === null || comment === void 0 ? void 0 : comment.author) === null || _a === void 0 ? void 0 : _a.address, authorAddress]);
139
+ // if has author error, don't return the autor
140
+ let author;
141
+ if (!useAuthorError) {
142
+ author = comment === null || comment === void 0 ? void 0 : comment.author;
143
+ }
144
+ // merge comment.errors with useAuthorError
145
+ const errors = useMemo(() => {
146
+ if (useAuthorError) {
147
+ return [...comment.errors, useAuthorError];
148
+ }
149
+ return comment.errors;
150
+ }, [comment.errors, useAuthorError]);
151
+ // if has author error, state failed
152
+ let state = author ? "succeeded" : (comment === null || comment === void 0 ? void 0 : comment.state) || "initializing";
153
+ if (useAuthorError) {
154
+ state = "failed";
155
+ }
156
+ if (comment === null || comment === void 0 ? void 0 : comment.timestamp) {
157
+ log("useAuthor", {
158
+ authorAddress,
159
+ commentCid,
160
+ author,
161
+ comment,
162
+ useAuthorError,
163
+ state,
164
+ accountName,
165
+ });
166
+ }
167
+ return useMemo(() => ({
168
+ author,
169
+ state,
170
+ error: errors[errors.length - 1],
171
+ errors,
172
+ }), [author, errors, state]);
173
+ }
174
+ /**
175
+ * @param author - The Author object to resolve the avatar image URL of.
176
+ * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
177
+ * the active account.
178
+ */
179
+ // NOTE: useAuthorAvatar tests are skipped, if changes are made they must be tested manually
180
+ export function useAuthorAvatar(options) {
181
+ var _a, _b;
182
+ assert(!options || typeof options === "object", `useAuthorAvatar options argument '${options}' not an object`);
183
+ const { author, accountName } = options || {};
184
+ const account = useAccount({ accountName });
185
+ // TODO: resolve crypto domain and check if one of the record is a profile pic
186
+ const { verified, error: signatureError } = useVerifiedAuthorAvatarSignature(author, accountName);
187
+ const verifiedError = verified === false && Error(`nft ownership signature proof invalid`);
188
+ const isWhitelisted = useAuthorAvatarIsWhitelisted(author === null || author === void 0 ? void 0 : author.avatar);
189
+ const whitelistedError = isWhitelisted === false && Error(`nft collection '${(_a = author === null || author === void 0 ? void 0 : author.avatar) === null || _a === void 0 ? void 0 : _a.address}' not whitelisted`);
190
+ // don't try to get avatar image url at all if signature isn't verified and whitelisted
191
+ const avatar = verified && isWhitelisted ? author === null || author === void 0 ? void 0 : author.avatar : undefined;
192
+ const { metadataUrl, error: nftMetadataError } = useNftMetadataUrl(avatar, accountName);
193
+ const { imageUrl, error: nftImageUrlError } = useNftImageUrl(metadataUrl, accountName);
194
+ const chainProvider = (_b = getChainProviders(account)) === null || _b === void 0 ? void 0 : _b[avatar === null || avatar === void 0 ? void 0 : avatar.chainTicker];
195
+ const error = whitelistedError ||
196
+ verifiedError ||
197
+ signatureError ||
198
+ nftMetadataError ||
199
+ nftImageUrlError ||
200
+ undefined;
201
+ const errors = useMemo(() => (error ? [error] : []), [error]);
202
+ let state = "initializing";
203
+ if (!(author === null || author === void 0 ? void 0 : author.avatar)) {
204
+ // do nothing, is initializing
205
+ }
206
+ else if (error) {
207
+ state = "failed";
208
+ }
209
+ else if (imageUrl !== undefined) {
210
+ state = "succeeded";
211
+ }
212
+ else if (metadataUrl !== undefined) {
213
+ state = "fetching-metadata";
214
+ }
215
+ else if (verified !== undefined) {
216
+ state = "fetching-uri";
217
+ }
218
+ else if (author === null || author === void 0 ? void 0 : author.avatar) {
219
+ state = "fetching-owner";
220
+ }
221
+ if (author === null || author === void 0 ? void 0 : author.avatar) {
222
+ log("useAuthorAvatar", { author, state, verified, isWhitelisted, metadataUrl, imageUrl });
223
+ }
224
+ return useMemo(() => ({
225
+ imageUrl,
226
+ metadataUrl,
227
+ chainProvider,
228
+ state,
229
+ error,
230
+ errors,
231
+ }), [imageUrl, metadataUrl, chainProvider, state, error]);
232
+ }
233
+ /**
234
+ * @param author - The Author object to resolve the address of.
235
+ * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
236
+ * the active account.
237
+ */
238
+ export function useAuthorAddress(options) {
239
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
240
+ assert(!options || typeof options === "object", `useAuthorAddress options argument '${options}' not an object`);
241
+ const { comment, accountName } = options || {};
242
+ const account = useAccount({ accountName });
243
+ const protocolClient = getProtocolClient(account);
244
+ const isCryptoName = !!((_c = (_b = (_a = comment === null || comment === void 0 ? void 0 : comment.author) === null || _a === void 0 ? void 0 : _a.address) === null || _b === void 0 ? void 0 : _b.includes) === null || _c === void 0 ? void 0 : _c.call(_b, "."));
245
+ const [resolvedAddress, setResolvedAddress] = useState(isCryptoName ? resolvedAuthorAddressCache.get((_d = comment === null || comment === void 0 ? void 0 : comment.author) === null || _d === void 0 ? void 0 : _d.address) : undefined);
246
+ const signerAddress = usePkcAddress(isCryptoName ? (_e = comment === null || comment === void 0 ? void 0 : comment.signature) === null || _e === void 0 ? void 0 : _e.publicKey : undefined);
247
+ // useful for triggering css animation when the address changes from unverified to verified
248
+ const [authorAddressChanged, setAuthorAddressChanged] = useState(false);
249
+ useEffect(() => {
250
+ var _a, _b;
251
+ if (!protocolClient || !((_a = comment === null || comment === void 0 ? void 0 : comment.author) === null || _a === void 0 ? void 0 : _a.address) || !isCryptoName) {
252
+ return;
253
+ }
254
+ const addr = (_b = comment === null || comment === void 0 ? void 0 : comment.author) === null || _b === void 0 ? void 0 : _b.address;
255
+ const resolveAuthorAddressNoCache = () => {
256
+ const existing = resolveAuthorAddressPromises[addr];
257
+ if (existing)
258
+ return existing;
259
+ log("useAuthorAddress protocol.resolveAuthorName", { address: addr });
260
+ return cacheResolveAuthorAddressPromise(addr, resolveAuthorNameWithProtocol(protocolClient, { address: addr }));
261
+ };
262
+ const resolveAuthorAddress = () => __awaiter(this, void 0, void 0, function* () {
263
+ const cached = resolvedAuthorAddressCache.get(addr);
264
+ if (cached)
265
+ return cached;
266
+ const res = yield resolveAuthorAddressNoCache();
267
+ resolvedAuthorAddressCache.set(addr, res);
268
+ return res;
269
+ });
270
+ resolveAuthorAddress()
271
+ .then((_resolvedAddress) => {
272
+ if (_resolvedAddress !== resolvedAddress) {
273
+ setResolvedAddress(_resolvedAddress);
274
+ setAuthorAddressChanged(true);
275
+ }
276
+ })
277
+ .catch((error) => log.error("useAuthorAddress error", { error, comment }));
278
+ }, [protocolClient, (_f = comment === null || comment === void 0 ? void 0 : comment.author) === null || _f === void 0 ? void 0 : _f.address, isCryptoName]);
279
+ // use signer address by default
280
+ let authorAddress = signerAddress;
281
+ // if author address was resolved successfully, use author address
282
+ if (resolvedAddress && signerAddress === resolvedAddress) {
283
+ authorAddress = (_g = comment === null || comment === void 0 ? void 0 : comment.author) === null || _g === void 0 ? void 0 : _g.address;
284
+ }
285
+ // if isn't crypto name, always use author address
286
+ if (!isCryptoName) {
287
+ authorAddress = (_h = comment === null || comment === void 0 ? void 0 : comment.author) === null || _h === void 0 ? void 0 : _h.address;
288
+ }
289
+ // if comment has no signature, it's a pending account comment, no need to verify it
290
+ // TODO: eventually account comments will have a signature immediately
291
+ if (comment && !(comment === null || comment === void 0 ? void 0 : comment.signature)) {
292
+ authorAddress = (_j = comment === null || comment === void 0 ? void 0 : comment.author) === null || _j === void 0 ? void 0 : _j.address;
293
+ }
294
+ let shortAuthorAddress = authorAddress && PkcJs.PKC.getShortAddress({ address: authorAddress });
295
+ // if shortAddress is smaller than crypto name, give a longer
296
+ // shortAddress to cause the least UI displacement as possible
297
+ // -4 chars because most fonts will make the address larger
298
+ if (isCryptoName &&
299
+ authorAddress &&
300
+ shortAuthorAddress.length < ((_l = (_k = comment === null || comment === void 0 ? void 0 : comment.author) === null || _k === void 0 ? void 0 : _k.address) === null || _l === void 0 ? void 0 : _l.length) - 4) {
301
+ const restOfAuthorAddress = authorAddress.split(shortAuthorAddress).pop();
302
+ shortAuthorAddress = (shortAuthorAddress + restOfAuthorAddress).substring(0, ((_o = (_m = comment === null || comment === void 0 ? void 0 : comment.author) === null || _m === void 0 ? void 0 : _m.address) === null || _o === void 0 ? void 0 : _o.length) - 4);
303
+ }
304
+ return useMemo(() => ({
305
+ authorAddress,
306
+ shortAuthorAddress,
307
+ authorAddressChanged,
308
+ state: "initializing",
309
+ error: undefined,
310
+ errors: [],
311
+ }), [authorAddress, shortAuthorAddress]);
312
+ }
313
+ // TODO: figure out how to upgrade to quick-lru 6+ to use maxAge
314
+ const resolvedAuthorAddressCache = new QuickLRU({ maxSize: 1000 });
315
+ const resolveAuthorAddressPromises = {};
316
+ /** For tests: reset caches to make resolution paths deterministic. */
317
+ export function resetAuthorAddressCacheForTesting() {
318
+ resolvedAuthorAddressCache.clear();
319
+ for (const k of Object.keys(resolveAuthorAddressPromises)) {
320
+ delete resolveAuthorAddressPromises[k];
321
+ }
322
+ }
323
+ /**
324
+ * @param author - The author with author.address to resolve to a public key, e.g. 'john.eth' resolves to '12D3KooW...'.
325
+ * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
326
+ * the active account.
327
+ */
328
+ // NOTE: useResolvedAuthorAddress tests are skipped, if changes are made they must be tested manually
329
+ export function useResolvedAuthorAddress(options) {
330
+ var _a, _b;
331
+ assert(!options || typeof options === "object", `useResolvedAuthorAddress options argument '${options}' not an object`);
332
+ let { author, accountName, cache } = options || {};
333
+ // cache by default
334
+ if (typeof cache !== "boolean") {
335
+ cache = true;
336
+ }
337
+ // poll every 15 seconds, about the duration of an eth block
338
+ let interval = 15000;
339
+ // no point in polling often if caching is on
340
+ if (cache) {
341
+ interval = 1000 * 60 * 60 * 25;
342
+ }
343
+ const account = useAccount({ accountName });
344
+ const protocolClient = getProtocolClient(account);
345
+ const chainProviders = getChainProviders(account);
346
+ const configuredNameResolvers = useMemo(() => getMatchingNameResolvers(account, author === null || author === void 0 ? void 0 : author.address), [account, author === null || author === void 0 ? void 0 : author.address]);
347
+ const configuredNameResolversByKey = useMemo(() => getConfiguredNameResolverInfoByKey(account), [account]);
348
+ const [resolvedAddress, setResolvedAddress] = useState();
349
+ const [errors, setErrors] = useState([]);
350
+ const [state, setState] = useState();
351
+ const [activeNameResolverKey, setActiveNameResolverKey] = useState();
352
+ let initialState = "initializing";
353
+ // before those defined, nothing can happen
354
+ if (options && account && (author === null || author === void 0 ? void 0 : author.address)) {
355
+ initialState = "ready";
356
+ }
357
+ const isCryptoName = (_b = (_a = author === null || author === void 0 ? void 0 : author.address) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, ".");
358
+ const resolveAuthorAddressNoCache = () => {
359
+ if (Boolean(resolveAuthorAddressPromises[author === null || author === void 0 ? void 0 : author.address])) {
360
+ return resolveAuthorAddressPromises[author === null || author === void 0 ? void 0 : author.address];
361
+ }
362
+ log("useResolvedAuthorAddress protocol.resolveAuthorName", { address: author === null || author === void 0 ? void 0 : author.address });
363
+ return cacheResolveAuthorAddressPromise(author === null || author === void 0 ? void 0 : author.address, resolveAuthorNameWithProtocol(protocolClient, {
364
+ address: author === null || author === void 0 ? void 0 : author.address,
365
+ }));
366
+ };
367
+ const resolveAuthorAddress = () => __awaiter(this, void 0, void 0, function* () {
368
+ const cached = resolvedAuthorAddressCache.get(author === null || author === void 0 ? void 0 : author.address);
369
+ if (cached) {
370
+ return cached;
371
+ }
372
+ const res = yield resolveAuthorAddressNoCache();
373
+ resolvedAuthorAddressCache.set(author === null || author === void 0 ? void 0 : author.address, res);
374
+ return res;
375
+ });
376
+ useEffect(() => {
377
+ if (!protocolClient || !(author === null || author === void 0 ? void 0 : author.address)) {
378
+ setActiveNameResolverKey(undefined);
379
+ return;
380
+ }
381
+ const nameResolverClients = getProtocolNameResolverClients(protocolClient);
382
+ const entries = Object.entries(nameResolverClients);
383
+ if (!entries.length) {
384
+ setActiveNameResolverKey(undefined);
385
+ return;
386
+ }
387
+ const syncFromCurrentClients = () => {
388
+ var _a;
389
+ const nextActiveKey = (_a = entries.find(([, client]) => (client === null || client === void 0 ? void 0 : client.state) && client.state !== "stopped")) === null || _a === void 0 ? void 0 : _a[0];
390
+ if (nextActiveKey) {
391
+ setActiveNameResolverKey(nextActiveKey);
392
+ }
393
+ };
394
+ syncFromCurrentClients();
395
+ const disposers = entries.map(([resolverKey, client]) => {
396
+ if (typeof (client === null || client === void 0 ? void 0 : client.on) !== "function") {
397
+ return undefined;
398
+ }
399
+ const onStateChange = (resolverState) => {
400
+ setActiveNameResolverKey((previousResolverKey) => {
401
+ var _a;
402
+ if (resolverState !== "stopped") {
403
+ return resolverKey;
404
+ }
405
+ if (previousResolverKey !== resolverKey) {
406
+ return previousResolverKey;
407
+ }
408
+ return (((_a = entries.find(([candidateResolverKey, candidateClient]) => candidateResolverKey !== resolverKey &&
409
+ (candidateClient === null || candidateClient === void 0 ? void 0 : candidateClient.state) &&
410
+ candidateClient.state !== "stopped")) === null || _a === void 0 ? void 0 : _a[0]) || previousResolverKey);
411
+ });
412
+ };
413
+ client.on("statechange", onStateChange);
414
+ return () => removeStateChangeListener(client, onStateChange);
415
+ });
416
+ return () => {
417
+ for (const dispose of disposers) {
418
+ dispose === null || dispose === void 0 ? void 0 : dispose();
419
+ }
420
+ };
421
+ }, [author === null || author === void 0 ? void 0 : author.address, protocolClient]);
422
+ useInterval(() => {
423
+ // no options, do nothing or reset
424
+ if (!account || !(author === null || author === void 0 ? void 0 : author.address)) {
425
+ if (resolvedAddress !== undefined) {
426
+ setResolvedAddress(undefined);
427
+ }
428
+ if (state !== undefined) {
429
+ setState(undefined);
430
+ }
431
+ if (errors.length) {
432
+ setErrors([]);
433
+ }
434
+ if (activeNameResolverKey !== undefined) {
435
+ setActiveNameResolverKey(undefined);
436
+ }
437
+ return;
438
+ }
439
+ // address isn't a crypto domain, can't be resolved
440
+ if (!isCryptoName) {
441
+ if (state !== "failed") {
442
+ setErrors([Error("not a crypto domain")]);
443
+ setState("failed");
444
+ setResolvedAddress(undefined);
445
+ setActiveNameResolverKey(undefined);
446
+ }
447
+ return;
448
+ }
449
+ if (!configuredNameResolvers.length) {
450
+ if (state !== "failed") {
451
+ setErrors([Error("crypto domain type unsupported")]);
452
+ setState("failed");
453
+ setResolvedAddress(undefined);
454
+ setActiveNameResolverKey(undefined);
455
+ }
456
+ return;
457
+ }
458
+ (() => __awaiter(this, void 0, void 0, function* () {
459
+ try {
460
+ setActiveNameResolverKey((previousResolverKey) => { var _a; return previousResolverKey || ((_a = configuredNameResolvers[0]) === null || _a === void 0 ? void 0 : _a.key); });
461
+ setState("resolving");
462
+ let res;
463
+ if (cache) {
464
+ res = yield resolveAuthorAddress();
465
+ }
466
+ else {
467
+ res = yield resolveAuthorAddressNoCache();
468
+ }
469
+ setState("succeeded");
470
+ // TODO: check if resolved address is the same as author.signer.publicKey
471
+ if (res !== resolvedAddress) {
472
+ setResolvedAddress(res);
473
+ }
474
+ }
475
+ catch (error) {
476
+ setErrors((previousErrors) => [...previousErrors, error]);
477
+ setState("failed");
478
+ setResolvedAddress(undefined);
479
+ log.error("useResolvedAuthorAddress resolveAuthorAddress error", {
480
+ author,
481
+ chainProviders,
482
+ error,
483
+ });
484
+ }
485
+ }))();
486
+ }, interval, true, [author === null || author === void 0 ? void 0 : author.address, configuredNameResolvers, protocolClient]);
487
+ const nameResolver = (activeNameResolverKey && configuredNameResolversByKey[activeNameResolverKey]) ||
488
+ configuredNameResolvers[0];
489
+ const chainProvider = (nameResolver === null || nameResolver === void 0 ? void 0 : nameResolver.chainTicker)
490
+ ? chainProviders === null || chainProviders === void 0 ? void 0 : chainProviders[nameResolver.chainTicker]
491
+ : undefined;
492
+ log("useResolvedAuthorAddress", {
493
+ author,
494
+ state,
495
+ errors,
496
+ resolvedAddress,
497
+ chainProviders,
498
+ nameResolver,
499
+ });
500
+ return useMemo(() => ({
501
+ resolvedAddress,
502
+ chainProvider,
503
+ nameResolver,
504
+ state: state || initialState,
505
+ error: errors[errors.length - 1],
506
+ errors,
507
+ }), [resolvedAddress, chainProvider, nameResolver, state, errors]);
508
+ }
509
+ //# sourceMappingURL=authors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authors.js","sourceRoot":"","sources":["../../../src/hooks/authors/authors.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,qCAAqC,CAAC,CAAC;AAC1D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAe5B,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,gCAAgC,EAChC,4BAA4B,GAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,uBAAuB,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,MAAM,kBAAkB,CAAC;AACrC,OAAO,EACL,kCAAkC,EAClC,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EACjB,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,yCAAyC,EAAE,MAAM,kBAAkB,CAAC;AAE7E,MAAM,gCAAgC,GAAG,CACvC,OAAe,EACf,OAAwB,EACP,EAAE;IACnB,4BAA4B,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAChD,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,IAAI,4BAA4B,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;YACtD,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;IACF,KAAK,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,MAAW,EAAE,QAAiC,EAAE,EAAE;;IACnF,IAAI,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,CAAA,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IACD,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,uDAAG,aAAa,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAkC;IAClE,MAAM,CACJ,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EACvC,uCAAuC,OAAO,iBAAiB,CAChE,CAAC;IACF,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACrF,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC1F,MAAM,wBAAwB,GAAG,uBAAuB,CACtD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAC1C,CAAC;IACF,MAAM,uBAAuB,GAAG,uBAAuB,CACrD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC,kBAAkB,IAAI,EAAE,CAAC,CACnE,CAAC;IACF,MAAM,wBAAwB,GAAG,uBAAuB,CAAC,CAAC,KAAK,EAAE,EAAE,CACjE,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAC3D,CAAC;IACF,MAAM,cAAc,GAAG,uBAAuB,CAC5C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAC1D,CAAC;IACF,MAAM,cAAc,GAAG,uBAAuB,CAC5C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,IAAI,EAAE,CAAC,CACtD,CAAC;IAEF,gCAAgC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,wBAAwB,CAAC,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,GAAG,CAAC,KAAK,CAAC,kDAAkD,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC;IAErC,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,KAAK,CAAC,sEAAsE,CAAC,CAAC;YACtF,CAAC;YACD,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,4DAA4D;YAC5D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5C,+CAA+C;QACjD,CAAC;IACH,CAAC,CAAA,CAAC;IAEF,MAAM,OAAO,GAAG,uBAAuB,IAAI,wBAAwB,CAAC;IAEpE,MAAM,YAAY,GAAG,SAAS,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IACjC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IAEnC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,mBAAmB,EAAE;YACvB,aAAa;YACb,UAAU;YACV,kBAAkB;YAClB,kBAAkB,EAAE,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,KAAI,CAAC;YAC/C,cAAc;YACd,uBAAuB;YACvB,wBAAwB;YACxB,OAAO;YACP,KAAK;YACL,MAAM;YACN,YAAY;YACZ,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,cAAc;QACd,OAAO;QACP,QAAQ;QACR,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,MAAM;KACP,CAAC,EACF,CAAC,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CACzD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAA0B;;IAClD,MAAM,CACJ,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EACvC,+BAA+B,OAAO,iBAAiB,CACxD,CAAC;IACF,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAExD,sEAAsE;IACtE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;;QAClC,0EAA0E;QAC1E,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,KAAI,aAAa,IAAI,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,MAAK,aAAa,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,aAAa,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAE9E,8CAA8C;IAC9C,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAErC,oCAAoC;IACpC,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,KAAI,cAAc,CAAC;IACpE,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,GAAG,QAAQ,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,CAAC;QACvB,GAAG,CAAC,WAAW,EAAE;YACf,aAAa;YACb,UAAU;YACV,MAAM;YACN,OAAO;YACP,cAAc;YACd,KAAK;YACL,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,MAAM;QACN,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,MAAM;KACP,CAAC,EACF,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CACxB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAAC,OAAgC;;IAC9D,MAAM,CACJ,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EACvC,qCAAqC,OAAO,iBAAiB,CAC9D,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAE5C,8EAA8E;IAE9E,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,gCAAgC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClG,MAAM,aAAa,GAAG,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,4BAA4B,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,CAAC;IACnE,MAAM,gBAAgB,GACpB,aAAa,KAAK,KAAK,IAAI,KAAK,CAAC,mBAAmB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,0CAAE,OAAO,mBAAmB,CAAC,CAAC;IAClG,uFAAuF;IACvF,MAAM,MAAM,GAAG,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACxF,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,MAAA,iBAAiB,CAAC,OAAO,CAAC,0CAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,CAAC,CAAC;IAExE,MAAM,KAAK,GACT,gBAAgB;QAChB,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,gBAAgB;QAChB,SAAS,CAAC;IACZ,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE9D,IAAI,KAAK,GAAG,cAAc,CAAC;IAC3B,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,EAAE,CAAC;QACpB,8BAA8B;IAChC,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,KAAK,GAAG,QAAQ,CAAC;IACnB,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,GAAG,WAAW,CAAC;IACtB,CAAC;SAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,GAAG,mBAAmB,CAAC;IAC9B,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,GAAG,cAAc,CAAC;IACzB,CAAC;SAAM,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,GAAG,gBAAgB,CAAC;IAC3B,CAAC;IAED,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,EAAE,CAAC;QACnB,GAAG,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ;QACR,WAAW;QACX,aAAa;QACb,KAAK;QACL,KAAK;QACL,MAAM;KACP,CAAC,EACF,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,CACrD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAiC;;IAChE,MAAM,CACJ,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EACvC,sCAAsC,OAAO,iBAAiB,CAC/D,CAAC;IACF,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,CAAC,CAAC,CAAA,MAAA,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,0CAAE,QAAQ,mDAAG,GAAG,CAAC,CAAA,CAAC;IACjE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,GAAG,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CACpF,CAAC;IACF,MAAM,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE9F,2FAA2F;IAC3F,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExE,SAAS,CAAC,GAAG,EAAE;;QACb,IAAI,CAAC,cAAc,IAAI,CAAC,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,CAAA,IAAI,CAAC,YAAY,EAAE,CAAC;YAClE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,CAAC;QACtC,MAAM,2BAA2B,GAAG,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC9B,GAAG,CAAC,6CAA6C,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,OAAO,gCAAgC,CACrC,IAAI,EACJ,6BAA6B,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACjE,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,oBAAoB,GAAG,GAAS,EAAE;YACtC,MAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,2BAA2B,EAAE,CAAC;YAChD,0BAA0B,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC1C,OAAO,GAAG,CAAC;QACb,CAAC,CAAA,CAAC;QACF,oBAAoB,EAAE;aACnB,IAAI,CAAC,CAAC,gBAAwB,EAAE,EAAE;YACjC,IAAI,gBAAgB,KAAK,eAAe,EAAE,CAAC;gBACzC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;gBACrC,uBAAuB,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC,EAAE,CAAC,cAAc,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAE7D,gCAAgC;IAChC,IAAI,aAAa,GAAG,aAAa,CAAC;IAClC,kEAAkE;IAClE,IAAI,eAAe,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;QACzD,aAAa,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,CAAC;IAC3C,CAAC;IACD,kDAAkD;IAClD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,aAAa,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,CAAC;IAC3C,CAAC;IACD,oFAAoF;IACpF,sEAAsE;IACtE,IAAI,OAAO,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,CAAA,EAAE,CAAC;QACnC,aAAa,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,CAAC;IAC3C,CAAC;IAED,IAAI,kBAAkB,GAAG,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAEhG,6DAA6D;IAC7D,8DAA8D;IAC9D,2DAA2D;IAC3D,IACE,YAAY;QACZ,aAAa;QACb,kBAAkB,CAAC,MAAM,GAAG,CAAA,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,0CAAE,MAAM,IAAG,CAAC,EAChE,CAAC;QACD,MAAM,mBAAmB,GAAG,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1E,kBAAkB,GAAG,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,CAAC,SAAS,CACvE,CAAC,EACD,CAAA,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,0CAAE,MAAM,IAAG,CAAC,CACrC,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,aAAa;QACb,kBAAkB;QAClB,oBAAoB;QACpB,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,EAAE;KACX,CAAC,EACF,CAAC,aAAa,EAAE,kBAAkB,CAAC,CACpC,CAAC;AACJ,CAAC;AACD,gEAAgE;AAChE,MAAM,0BAA0B,GAAG,IAAI,QAAQ,CAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACnF,MAAM,4BAA4B,GAA2C,EAAE,CAAC;AAEhF,sEAAsE;AACtE,MAAM,UAAU,iCAAiC;IAC/C,0BAA0B,CAAC,KAAK,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC;QAC1D,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,qGAAqG;AACrG,MAAM,UAAU,wBAAwB,CACtC,OAAyC;;IAEzC,MAAM,CACJ,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EACvC,8CAA8C,OAAO,iBAAiB,CACvE,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAEnD,mBAAmB;IACnB,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IAED,4DAA4D;IAC5D,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,6CAA6C;IAC7C,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,uBAAuB,GAAG,OAAO,CACrC,GAAG,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,EACxD,CAAC,OAAO,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAC3B,CAAC;IACF,MAAM,4BAA4B,GAAG,OAAO,CAC1C,GAAG,EAAE,CAAC,kCAAkC,CAAC,OAAO,CAAC,EACjD,CAAC,OAAO,CAAC,CACV,CAAC;IACF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,EAAU,CAAC;IACjE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAU,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC7C,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,EAAU,CAAC;IAE7E,IAAI,YAAY,GAAG,cAAc,CAAC;IAClC,2CAA2C;IAC3C,IAAI,OAAO,IAAI,OAAO,KAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,EAAE,CAAC;QAC1C,YAAY,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,YAAY,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,QAAQ,mDAAG,GAAG,CAAC,CAAC;IAEtD,MAAM,2BAA2B,GAAG,GAAG,EAAE;QACvC,IAAI,OAAO,CAAC,4BAA4B,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,4BAA4B,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QACD,GAAG,CAAC,qDAAqD,EAAE,EAAE,OAAO,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,gCAAgC,CACrC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EACf,6BAA6B,CAAC,cAAc,EAAE;YAC5C,OAAO,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO;SACzB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,oBAAoB,GAAG,GAAS,EAAE;QACtC,MAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,2BAA2B,EAAE,CAAC;QAChD,0BAA0B,CAAC,GAAG,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC;IACb,CAAC,CAAA,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,cAAc,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,EAAE,CAAC;YACxC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,mBAAmB,GAAG,8BAA8B,CAAC,cAAc,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,sBAAsB,GAAG,GAAG,EAAE;;YAClC,MAAM,aAAa,GAAG,MAAA,OAAO,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,MAAM,CAAgB,EAAE,EAAE,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,KAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAC3E,0CAAG,CAAC,CAAC,CAAC;YACP,IAAI,aAAa,EAAE,CAAC;gBAClB,wBAAwB,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC;QAEF,sBAAsB,EAAE,CAAC;QAEzB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAgB,EAAE,EAAE;YACrE,IAAI,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,EAAE,CAAA,KAAK,UAAU,EAAE,CAAC;gBACrC,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,aAAa,GAAG,CAAC,aAAqB,EAAE,EAAE;gBAC9C,wBAAwB,CAAC,CAAC,mBAAmB,EAAE,EAAE;;oBAC/C,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;wBAChC,OAAO,WAAW,CAAC;oBACrB,CAAC;oBACD,IAAI,mBAAmB,KAAK,WAAW,EAAE,CAAC;wBACxC,OAAO,mBAAmB,CAAC;oBAC7B,CAAC;oBACD,OAAO,CACL,CAAA,MAAA,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,oBAAoB,EAAE,eAAe,CAAgB,EAAE,EAAE,CACzD,oBAAoB,KAAK,WAAW;yBACpC,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAA;wBACtB,eAAe,CAAC,KAAK,KAAK,SAAS,CACtC,0CAAG,CAAC,CAAC,KAAI,mBAAmB,CAC9B,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YACxC,OAAO,GAAG,EAAE,CAAC,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;gBAChC,OAAO,aAAP,OAAO,uBAAP,OAAO,EAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAEtC,WAAW,CACT,GAAG,EAAE;QACH,kCAAkC;QAClC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAA,EAAE,CAAC;YACjC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;gBAClC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,SAAS,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YACD,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBACxC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,OAAO;QACT,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,SAAS,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBAC1C,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnB,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC9B,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,SAAS,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC;gBACrD,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnB,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC9B,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,OAAO;QACT,CAAC;QAED,CAAC,GAAS,EAAE;YACV,IAAI,CAAC;gBACH,wBAAwB,CACtB,CAAC,mBAAmB,EAAE,EAAE,WAAC,OAAA,mBAAmB,KAAI,MAAA,uBAAuB,CAAC,CAAC,CAAC,0CAAE,GAAG,CAAA,CAAA,EAAA,CAChF,CAAC;gBACF,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACtB,IAAI,GAAG,CAAC;gBACR,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,GAAG,MAAM,oBAAoB,EAAE,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,GAAG,GAAG,MAAM,2BAA2B,EAAE,CAAC;gBAC5C,CAAC;gBACD,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAEtB,yEAAyE;gBAEzE,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;oBAC5B,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,GAAG,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC1D,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnB,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC9B,GAAG,CAAC,KAAK,CAAC,qDAAqD,EAAE;oBAC/D,MAAM;oBACN,cAAc;oBACd,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAA,CAAC,EAAE,CAAC;IACP,CAAC,EACD,QAAQ,EACR,IAAI,EACJ,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,CAAC,CAC3D,CAAC;IAEF,MAAM,YAAY,GAChB,CAAC,qBAAqB,IAAI,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;QAC9E,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,aAAa,GAAG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,WAAW;QAC7C,CAAC,CAAC,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,YAAY,CAAC,WAAW,CAAC;QAC5C,CAAC,CAAC,SAAS,CAAC;IAEd,GAAG,CAAC,0BAA0B,EAAE;QAC9B,MAAM;QACN,KAAK;QACL,MAAM;QACN,eAAe;QACf,cAAc;QACd,YAAY;KACb,CAAC,CAAC;IAEH,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,eAAe;QACf,aAAa;QACb,YAAY;QACZ,KAAK,EAAE,KAAK,IAAI,YAAY;QAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,MAAM;KACP,CAAC,EACF,CAAC,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAC9D,CAAC;AACJ,CAAC","sourcesContent":["import { useEffect, useState, useMemo } from \"react\";\nimport useInterval from \"../utils/use-interval\";\nimport { useAccount } from \"../accounts\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:authors:hooks\");\nimport assert from \"assert\";\nimport {\n ChainProviders,\n Author,\n UseAuthorOptions,\n UseAuthorResult,\n UseAuthorCommentsOptions,\n UseAuthorCommentsResult,\n UseAuthorAvatarOptions,\n UseAuthorAvatarResult,\n UseResolvedAuthorAddressOptions,\n UseResolvedAuthorAddressResult,\n UseAuthorAddressOptions,\n UseAuthorAddressResult,\n} from \"../../types\";\nimport {\n useNftMetadataUrl,\n useNftImageUrl,\n useVerifiedAuthorAvatarSignature,\n useAuthorAvatarIsWhitelisted,\n} from \"./author-avatars\";\nimport { useComment, useComments } from \"../comments\";\nimport { useAuthorCommentsName, usePkcAddress } from \"./utils\";\nimport useAuthorsCommentsStore from \"../../stores/authors-comments\";\nimport PkcJs from \"../../lib/pkc-js\";\nimport {\n getConfiguredNameResolverInfoByKey,\n getChainProviders,\n getMatchingNameResolvers,\n getProtocolClient,\n getProtocolNameResolverClients,\n resolveAuthorNameWithProtocol,\n} from \"../../lib/pkc-compat\";\nimport QuickLRU from \"quick-lru\";\nexport { setAuthorAvatarsWhitelistedTokenAddresses } from \"./author-avatars\";\n\nconst cacheResolveAuthorAddressPromise = (\n address: string,\n promise: Promise<string>,\n): Promise<string> => {\n resolveAuthorAddressPromises[address] = promise;\n const clearCachedPromise = () => {\n if (resolveAuthorAddressPromises[address] === promise) {\n delete resolveAuthorAddressPromises[address];\n }\n };\n void promise.then(clearCachedPromise, clearCachedPromise);\n return promise;\n};\n\nconst removeStateChangeListener = (client: any, listener: (state: string) => void) => {\n if (typeof client?.off === \"function\") {\n client.off(\"statechange\", listener);\n return;\n }\n client?.removeListener?.(\"statechange\", listener);\n};\n\n/**\n * @param authorAddress - The address of the author\n * @param commentCid - The last known comment cid of the author (not possible to get an author without providing at least 1 comment cid)\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 useAuthorComments(options?: UseAuthorCommentsOptions): UseAuthorCommentsResult {\n assert(\n !options || typeof options === \"object\",\n `useAuthorComments options argument '${options}' not an object`,\n );\n const { authorAddress, commentCid, accountName, filter } = options || {};\n const account = useAccount({ accountName });\n const authorCommentsName = useAuthorCommentsName(account?.id, authorAddress, filter);\n const incrementPageNumber = useAuthorsCommentsStore((state) => state.incrementPageNumber);\n const addAuthorCommentsToStore = useAuthorsCommentsStore(\n (state) => state.addAuthorCommentsToStore,\n );\n const hasMoreBufferedComments = useAuthorsCommentsStore(\n (state) => state.hasMoreBufferedComments[authorCommentsName || \"\"],\n );\n const hasNextCommentCidToFetch = useAuthorsCommentsStore((state) =>\n Boolean(state.nextCommentCidsToFetch[authorAddress || \"\"]),\n );\n const authorComments = useAuthorsCommentsStore(\n (state) => state.loadedComments[authorCommentsName || \"\"],\n );\n const lastCommentCid = useAuthorsCommentsStore(\n (state) => state.lastCommentCids[authorAddress || \"\"],\n );\n\n // add authors comments to store\n useEffect(() => {\n if (!authorAddress || !commentCid || !account) {\n return;\n }\n try {\n addAuthorCommentsToStore(authorCommentsName, authorAddress, commentCid, filter, account);\n } catch (error: any) {\n log.error(\"useAuthorComments addAuthorCommentsToStore error\", { authorCommentsName, error });\n }\n }, [authorCommentsName, commentCid]);\n\n const loadMore = async () => {\n try {\n if (!authorAddress || !account) {\n throw Error(\"useAuthorComments cannot load more authorComments not initalized yet\");\n }\n incrementPageNumber(authorCommentsName);\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 // TODO: maybe add these errors to errors array\n }\n };\n\n const hasMore = hasMoreBufferedComments || hasNextCommentCidToFetch;\n\n const authorResult = useAuthor({ commentCid, authorAddress, accountName });\n const state = authorResult.state;\n const errors = authorResult.errors;\n\n if (authorResult.author) {\n log(\"useAuthorComments\", {\n authorAddress,\n commentCid,\n // authorComments,\n authorCommentsSize: authorComments?.length || 0,\n lastCommentCid,\n hasMoreBufferedComments,\n hasNextCommentCidToFetch,\n hasMore,\n state,\n errors,\n authorResult,\n accountName,\n });\n }\n\n return useMemo(\n () => ({\n authorComments: authorComments || [],\n lastCommentCid,\n hasMore,\n loadMore,\n state,\n error: errors[errors.length - 1],\n errors,\n }),\n [authorComments, lastCommentCid, hasMore, errors, state],\n );\n}\n\n/**\n * @param authorAddress - The address of the author\n * @param commentCid - The last known comment cid of the author (not possible to get an author without providing at least 1 comment cid)\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 useAuthor(options?: UseAuthorOptions): UseAuthorResult {\n assert(\n !options || typeof options === \"object\",\n `useAuthor options argument '${options}' not an object`,\n );\n const { authorAddress, commentCid, accountName } = options || {};\n const comment = useComment({ commentCid, accountName });\n\n // the commentCid doesnt have the same author address as authorAddress\n const useAuthorError = useMemo(() => {\n // if comment is loaded and author address is different from authorAddress\n if (comment?.timestamp && authorAddress && comment?.author?.address !== authorAddress) {\n return Error(\"commentCid author.address is different from authorAddress\");\n }\n if (commentCid && !authorAddress) {\n return Error(\"missing UseAuthorOptions.authorAddress\");\n }\n if (!commentCid && authorAddress) {\n return Error(\"missing UseAuthorOptions.commentCid\");\n }\n }, [commentCid, comment?.timestamp, comment?.author?.address, authorAddress]);\n\n // if has author error, don't return the autor\n let author: Author | undefined;\n if (!useAuthorError) {\n author = comment?.author;\n }\n\n // merge comment.errors with useAuthorError\n const errors = useMemo(() => {\n if (useAuthorError) {\n return [...comment.errors, useAuthorError];\n }\n return comment.errors;\n }, [comment.errors, useAuthorError]);\n\n // if has author error, state failed\n let state = author ? \"succeeded\" : comment?.state || \"initializing\";\n if (useAuthorError) {\n state = \"failed\";\n }\n\n if (comment?.timestamp) {\n log(\"useAuthor\", {\n authorAddress,\n commentCid,\n author,\n comment,\n useAuthorError,\n state,\n accountName,\n });\n }\n\n return useMemo(\n () => ({\n author,\n state,\n error: errors[errors.length - 1],\n errors,\n }),\n [author, errors, state],\n );\n}\n\n/**\n * @param author - The Author object to resolve the avatar image URL of.\n * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use\n * the active account.\n */\n// NOTE: useAuthorAvatar tests are skipped, if changes are made they must be tested manually\nexport function useAuthorAvatar(options?: UseAuthorAvatarOptions): UseAuthorAvatarResult {\n assert(\n !options || typeof options === \"object\",\n `useAuthorAvatar options argument '${options}' not an object`,\n );\n const { author, accountName } = options || {};\n const account = useAccount({ accountName });\n\n // TODO: resolve crypto domain and check if one of the record is a profile pic\n\n const { verified, error: signatureError } = useVerifiedAuthorAvatarSignature(author, accountName);\n const verifiedError = verified === false && Error(`nft ownership signature proof invalid`);\n const isWhitelisted = useAuthorAvatarIsWhitelisted(author?.avatar);\n const whitelistedError =\n isWhitelisted === false && Error(`nft collection '${author?.avatar?.address}' not whitelisted`);\n // don't try to get avatar image url at all if signature isn't verified and whitelisted\n const avatar = verified && isWhitelisted ? author?.avatar : undefined;\n const { metadataUrl, error: nftMetadataError } = useNftMetadataUrl(avatar, accountName);\n const { imageUrl, error: nftImageUrlError } = useNftImageUrl(metadataUrl, accountName);\n const chainProvider = getChainProviders(account)?.[avatar?.chainTicker];\n\n const error =\n whitelistedError ||\n verifiedError ||\n signatureError ||\n nftMetadataError ||\n nftImageUrlError ||\n undefined;\n const errors = useMemo(() => (error ? [error] : []), [error]);\n\n let state = \"initializing\";\n if (!author?.avatar) {\n // do nothing, is initializing\n } else if (error) {\n state = \"failed\";\n } else if (imageUrl !== undefined) {\n state = \"succeeded\";\n } else if (metadataUrl !== undefined) {\n state = \"fetching-metadata\";\n } else if (verified !== undefined) {\n state = \"fetching-uri\";\n } else if (author?.avatar) {\n state = \"fetching-owner\";\n }\n\n if (author?.avatar) {\n log(\"useAuthorAvatar\", { author, state, verified, isWhitelisted, metadataUrl, imageUrl });\n }\n\n return useMemo(\n () => ({\n imageUrl,\n metadataUrl,\n chainProvider,\n state,\n error,\n errors,\n }),\n [imageUrl, metadataUrl, chainProvider, state, error],\n );\n}\n\n/**\n * @param author - The Author object to resolve the address of.\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 useAuthorAddress(options?: UseAuthorAddressOptions): UseAuthorAddressResult {\n assert(\n !options || typeof options === \"object\",\n `useAuthorAddress options argument '${options}' not an object`,\n );\n const { comment, accountName } = options || {};\n const account = useAccount({ accountName });\n const protocolClient = getProtocolClient(account);\n const isCryptoName = !!comment?.author?.address?.includes?.(\".\");\n const [resolvedAddress, setResolvedAddress] = useState<string | undefined>(\n isCryptoName ? resolvedAuthorAddressCache.get(comment?.author?.address) : undefined,\n );\n const signerAddress = usePkcAddress(isCryptoName ? comment?.signature?.publicKey : undefined);\n\n // useful for triggering css animation when the address changes from unverified to verified\n const [authorAddressChanged, setAuthorAddressChanged] = useState(false);\n\n useEffect(() => {\n if (!protocolClient || !comment?.author?.address || !isCryptoName) {\n return;\n }\n const addr = comment?.author?.address;\n const resolveAuthorAddressNoCache = () => {\n const existing = resolveAuthorAddressPromises[addr];\n if (existing) return existing;\n log(\"useAuthorAddress protocol.resolveAuthorName\", { address: addr });\n return cacheResolveAuthorAddressPromise(\n addr,\n resolveAuthorNameWithProtocol(protocolClient, { address: addr }),\n );\n };\n const resolveAuthorAddress = async () => {\n const cached = resolvedAuthorAddressCache.get(addr);\n if (cached) return cached;\n const res = await resolveAuthorAddressNoCache();\n resolvedAuthorAddressCache.set(addr, res);\n return res;\n };\n resolveAuthorAddress()\n .then((_resolvedAddress: string) => {\n if (_resolvedAddress !== resolvedAddress) {\n setResolvedAddress(_resolvedAddress);\n setAuthorAddressChanged(true);\n }\n })\n .catch((error: any) => log.error(\"useAuthorAddress error\", { error, comment }));\n }, [protocolClient, comment?.author?.address, isCryptoName]);\n\n // use signer address by default\n let authorAddress = signerAddress;\n // if author address was resolved successfully, use author address\n if (resolvedAddress && signerAddress === resolvedAddress) {\n authorAddress = comment?.author?.address;\n }\n // if isn't crypto name, always use author address\n if (!isCryptoName) {\n authorAddress = comment?.author?.address;\n }\n // if comment has no signature, it's a pending account comment, no need to verify it\n // TODO: eventually account comments will have a signature immediately\n if (comment && !comment?.signature) {\n authorAddress = comment?.author?.address;\n }\n\n let shortAuthorAddress = authorAddress && PkcJs.PKC.getShortAddress({ address: authorAddress });\n\n // if shortAddress is smaller than crypto name, give a longer\n // shortAddress to cause the least UI displacement as possible\n // -4 chars because most fonts will make the address larger\n if (\n isCryptoName &&\n authorAddress &&\n shortAuthorAddress.length < comment?.author?.address?.length - 4\n ) {\n const restOfAuthorAddress = authorAddress.split(shortAuthorAddress).pop();\n shortAuthorAddress = (shortAuthorAddress + restOfAuthorAddress).substring(\n 0,\n comment?.author?.address?.length - 4,\n );\n }\n\n return useMemo(\n () => ({\n authorAddress,\n shortAuthorAddress,\n authorAddressChanged,\n state: \"initializing\",\n error: undefined,\n errors: [],\n }),\n [authorAddress, shortAuthorAddress],\n );\n}\n// TODO: figure out how to upgrade to quick-lru 6+ to use maxAge\nconst resolvedAuthorAddressCache = new QuickLRU<string, string>({ maxSize: 1000 });\nconst resolveAuthorAddressPromises: { [address: string]: Promise<string> } = {};\n\n/** For tests: reset caches to make resolution paths deterministic. */\nexport function resetAuthorAddressCacheForTesting() {\n resolvedAuthorAddressCache.clear();\n for (const k of Object.keys(resolveAuthorAddressPromises)) {\n delete resolveAuthorAddressPromises[k];\n }\n}\n\n/**\n * @param author - The author with author.address to resolve to a public key, e.g. 'john.eth' resolves to '12D3KooW...'.\n * @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use\n * the active account.\n */\n// NOTE: useResolvedAuthorAddress tests are skipped, if changes are made they must be tested manually\nexport function useResolvedAuthorAddress(\n options?: UseResolvedAuthorAddressOptions,\n): UseResolvedAuthorAddressResult {\n assert(\n !options || typeof options === \"object\",\n `useResolvedAuthorAddress options argument '${options}' not an object`,\n );\n let { author, accountName, cache } = options || {};\n\n // cache by default\n if (typeof cache !== \"boolean\") {\n cache = true;\n }\n\n // poll every 15 seconds, about the duration of an eth block\n let interval = 15000;\n // no point in polling often if caching is on\n if (cache) {\n interval = 1000 * 60 * 60 * 25;\n }\n\n const account = useAccount({ accountName });\n const protocolClient = getProtocolClient(account);\n const chainProviders = getChainProviders(account);\n const configuredNameResolvers = useMemo(\n () => getMatchingNameResolvers(account, author?.address),\n [account, author?.address],\n );\n const configuredNameResolversByKey = useMemo(\n () => getConfiguredNameResolverInfoByKey(account),\n [account],\n );\n const [resolvedAddress, setResolvedAddress] = useState<string>();\n const [errors, setErrors] = useState<Error[]>([]);\n const [state, setState] = useState<string>();\n const [activeNameResolverKey, setActiveNameResolverKey] = useState<string>();\n\n let initialState = \"initializing\";\n // before those defined, nothing can happen\n if (options && account && author?.address) {\n initialState = \"ready\";\n }\n\n const isCryptoName = author?.address?.includes?.(\".\");\n\n const resolveAuthorAddressNoCache = () => {\n if (Boolean(resolveAuthorAddressPromises[author?.address])) {\n return resolveAuthorAddressPromises[author?.address];\n }\n log(\"useResolvedAuthorAddress protocol.resolveAuthorName\", { address: author?.address });\n return cacheResolveAuthorAddressPromise(\n author?.address,\n resolveAuthorNameWithProtocol(protocolClient, {\n address: author?.address,\n }),\n );\n };\n const resolveAuthorAddress = async () => {\n const cached = resolvedAuthorAddressCache.get(author?.address);\n if (cached) {\n return cached;\n }\n const res = await resolveAuthorAddressNoCache();\n resolvedAuthorAddressCache.set(author?.address, res);\n return res;\n };\n\n useEffect(() => {\n if (!protocolClient || !author?.address) {\n setActiveNameResolverKey(undefined);\n return;\n }\n\n const nameResolverClients = getProtocolNameResolverClients(protocolClient);\n const entries = Object.entries(nameResolverClients);\n if (!entries.length) {\n setActiveNameResolverKey(undefined);\n return;\n }\n\n const syncFromCurrentClients = () => {\n const nextActiveKey = entries.find(\n ([, client]: [string, any]) => client?.state && client.state !== \"stopped\",\n )?.[0];\n if (nextActiveKey) {\n setActiveNameResolverKey(nextActiveKey);\n }\n };\n\n syncFromCurrentClients();\n\n const disposers = entries.map(([resolverKey, client]: [string, any]) => {\n if (typeof client?.on !== \"function\") {\n return undefined;\n }\n\n const onStateChange = (resolverState: string) => {\n setActiveNameResolverKey((previousResolverKey) => {\n if (resolverState !== \"stopped\") {\n return resolverKey;\n }\n if (previousResolverKey !== resolverKey) {\n return previousResolverKey;\n }\n return (\n entries.find(\n ([candidateResolverKey, candidateClient]: [string, any]) =>\n candidateResolverKey !== resolverKey &&\n candidateClient?.state &&\n candidateClient.state !== \"stopped\",\n )?.[0] || previousResolverKey\n );\n });\n };\n\n client.on(\"statechange\", onStateChange);\n return () => removeStateChangeListener(client, onStateChange);\n });\n\n return () => {\n for (const dispose of disposers) {\n dispose?.();\n }\n };\n }, [author?.address, protocolClient]);\n\n useInterval(\n () => {\n // no options, do nothing or reset\n if (!account || !author?.address) {\n if (resolvedAddress !== undefined) {\n setResolvedAddress(undefined);\n }\n if (state !== undefined) {\n setState(undefined);\n }\n if (errors.length) {\n setErrors([]);\n }\n if (activeNameResolverKey !== undefined) {\n setActiveNameResolverKey(undefined);\n }\n return;\n }\n\n // address isn't a crypto domain, can't be resolved\n if (!isCryptoName) {\n if (state !== \"failed\") {\n setErrors([Error(\"not a crypto domain\")]);\n setState(\"failed\");\n setResolvedAddress(undefined);\n setActiveNameResolverKey(undefined);\n }\n return;\n }\n\n if (!configuredNameResolvers.length) {\n if (state !== \"failed\") {\n setErrors([Error(\"crypto domain type unsupported\")]);\n setState(\"failed\");\n setResolvedAddress(undefined);\n setActiveNameResolverKey(undefined);\n }\n return;\n }\n\n (async () => {\n try {\n setActiveNameResolverKey(\n (previousResolverKey) => previousResolverKey || configuredNameResolvers[0]?.key,\n );\n setState(\"resolving\");\n let res;\n if (cache) {\n res = await resolveAuthorAddress();\n } else {\n res = await resolveAuthorAddressNoCache();\n }\n setState(\"succeeded\");\n\n // TODO: check if resolved address is the same as author.signer.publicKey\n\n if (res !== resolvedAddress) {\n setResolvedAddress(res);\n }\n } catch (error: any) {\n setErrors((previousErrors) => [...previousErrors, error]);\n setState(\"failed\");\n setResolvedAddress(undefined);\n log.error(\"useResolvedAuthorAddress resolveAuthorAddress error\", {\n author,\n chainProviders,\n error,\n });\n }\n })();\n },\n interval,\n true,\n [author?.address, configuredNameResolvers, protocolClient],\n );\n\n const nameResolver =\n (activeNameResolverKey && configuredNameResolversByKey[activeNameResolverKey]) ||\n configuredNameResolvers[0];\n const chainProvider = nameResolver?.chainTicker\n ? chainProviders?.[nameResolver.chainTicker]\n : undefined;\n\n log(\"useResolvedAuthorAddress\", {\n author,\n state,\n errors,\n resolvedAddress,\n chainProviders,\n nameResolver,\n });\n\n return useMemo(\n () => ({\n resolvedAddress,\n chainProvider,\n nameResolver,\n state: state || initialState,\n error: errors[errors.length - 1],\n errors,\n }),\n [resolvedAddress, chainProvider, nameResolver, state, errors],\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export * from "./authors.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/authors/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./authors.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/authors/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC","sourcesContent":["export * from \"./authors\";\n"]}
@@ -0,0 +1,4 @@
1
+ import { CommentsFilter } from "../../types.js";
2
+ export declare const useAuthorCommentsName: (accountId?: string, authorAddress?: string, filter?: CommentsFilter | undefined) => string;
3
+ export declare const usePkcAddress: (publicKeyBase64?: string) => string | undefined;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/hooks/authors/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,cAAc,EAAE,MAAM,aAAa,CAAC;AAStD,eAAO,MAAM,qBAAqB,GAChC,YAAY,MAAM,EAClB,gBAAgB,MAAM,EACtB,SAAS,cAAc,GAAG,SAAS,WAMpC,CAAC;AAeF,eAAO,MAAM,aAAa,GAAI,kBAAkB,MAAM,uBAKrD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { useMemo } from "react";
2
+ import { fromString as uint8ArrayFromString } from "uint8arrays/from-string";
3
+ import { toString as uint8ArrayToString } from "uint8arrays/to-string";
4
+ import { create as createMultihash } from "multiformats/hashes/digest";
5
+ export const useAuthorCommentsName = (accountId, authorAddress, filter) => {
6
+ return useMemo(() => accountId + "-" + authorAddress + "-" + (filter === null || filter === void 0 ? void 0 : filter.key), [accountId, authorAddress, filter === null || filter === void 0 ? void 0 : filter.key]);
7
+ };
8
+ const protobufPublicKeyPrefix = new Uint8Array([8, 1, 18, 32]);
9
+ const multihashIdentityCode = 0;
10
+ const getPkcAddressFromPublicKey = (publicKeyBase64) => {
11
+ const publicKeyBuffer = uint8ArrayFromString(publicKeyBase64, "base64");
12
+ const publicKeyBufferWithPrefix = new Uint8Array(protobufPublicKeyPrefix.length + publicKeyBuffer.length);
13
+ publicKeyBufferWithPrefix.set(protobufPublicKeyPrefix, 0);
14
+ publicKeyBufferWithPrefix.set(publicKeyBuffer, protobufPublicKeyPrefix.length);
15
+ const multihash = createMultihash(multihashIdentityCode, publicKeyBufferWithPrefix).bytes;
16
+ return uint8ArrayToString(multihash, "base58btc");
17
+ };
18
+ export const usePkcAddress = (publicKeyBase64) => {
19
+ return useMemo(() => (publicKeyBase64 ? getPkcAddressFromPublicKey(publicKeyBase64) : undefined), [publicKeyBase64]);
20
+ };
21
+ //# sourceMappingURL=utils.js.map