@bitsocial/bitsocial-react-hooks 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +1365 -0
- package/dist/hooks/accounts/accounts.d.ts +64 -0
- package/dist/hooks/accounts/accounts.d.ts.map +1 -0
- package/dist/hooks/accounts/accounts.js +706 -0
- package/dist/hooks/accounts/accounts.js.map +1 -0
- package/dist/hooks/accounts/index.d.ts +2 -0
- package/dist/hooks/accounts/index.d.ts.map +1 -0
- package/dist/hooks/accounts/index.js +2 -0
- package/dist/hooks/accounts/index.js.map +1 -0
- package/dist/hooks/accounts/utils.d.ts +6 -0
- package/dist/hooks/accounts/utils.d.ts.map +1 -0
- package/dist/hooks/accounts/utils.js +226 -0
- package/dist/hooks/accounts/utils.js.map +1 -0
- package/dist/hooks/actions/actions.d.ts +19 -0
- package/dist/hooks/actions/actions.d.ts.map +1 -0
- package/dist/hooks/actions/actions.js +552 -0
- package/dist/hooks/actions/actions.js.map +1 -0
- package/dist/hooks/actions/index.d.ts +2 -0
- package/dist/hooks/actions/index.d.ts.map +1 -0
- package/dist/hooks/actions/index.js +2 -0
- package/dist/hooks/actions/index.js.map +1 -0
- package/dist/hooks/authors/author-avatars.d.ts +28 -0
- package/dist/hooks/authors/author-avatars.d.ts.map +1 -0
- package/dist/hooks/authors/author-avatars.js +191 -0
- package/dist/hooks/authors/author-avatars.js.map +1 -0
- package/dist/hooks/authors/authors.d.ts +37 -0
- package/dist/hooks/authors/authors.d.ts.map +1 -0
- package/dist/hooks/authors/authors.js +509 -0
- package/dist/hooks/authors/authors.js.map +1 -0
- package/dist/hooks/authors/index.d.ts +2 -0
- package/dist/hooks/authors/index.d.ts.map +1 -0
- package/dist/hooks/authors/index.js +2 -0
- package/dist/hooks/authors/index.js.map +1 -0
- package/dist/hooks/authors/utils.d.ts +4 -0
- package/dist/hooks/authors/utils.d.ts.map +1 -0
- package/dist/hooks/authors/utils.js +21 -0
- package/dist/hooks/authors/utils.js.map +1 -0
- package/dist/hooks/comments.d.ts +17 -0
- package/dist/hooks/comments.d.ts.map +1 -0
- package/dist/hooks/comments.js +351 -0
- package/dist/hooks/comments.js.map +1 -0
- package/dist/hooks/communities.d.ts +31 -0
- package/dist/hooks/communities.d.ts.map +1 -0
- package/dist/hooks/communities.js +389 -0
- package/dist/hooks/communities.js.map +1 -0
- package/dist/hooks/feeds/feeds.d.ts +18 -0
- package/dist/hooks/feeds/feeds.d.ts.map +1 -0
- package/dist/hooks/feeds/feeds.js +315 -0
- package/dist/hooks/feeds/feeds.js.map +1 -0
- package/dist/hooks/feeds/index.d.ts +2 -0
- package/dist/hooks/feeds/index.d.ts.map +1 -0
- package/dist/hooks/feeds/index.js +2 -0
- package/dist/hooks/feeds/index.js.map +1 -0
- package/dist/hooks/pkc-rpc.d.ts +7 -0
- package/dist/hooks/pkc-rpc.d.ts.map +1 -0
- package/dist/hooks/pkc-rpc.js +88 -0
- package/dist/hooks/pkc-rpc.js.map +1 -0
- package/dist/hooks/replies.d.ts +5 -0
- package/dist/hooks/replies.d.ts.map +1 -0
- package/dist/hooks/replies.js +155 -0
- package/dist/hooks/replies.js.map +1 -0
- package/dist/hooks/states.d.ts +15 -0
- package/dist/hooks/states.d.ts.map +1 -0
- package/dist/hooks/states.js +213 -0
- package/dist/hooks/states.js.map +1 -0
- package/dist/hooks/utils/use-interval.d.ts +3 -0
- package/dist/hooks/utils/use-interval.d.ts.map +1 -0
- package/dist/hooks/utils/use-interval.js +36 -0
- package/dist/hooks/utils/use-interval.js.map +1 -0
- package/dist/hooks/utils/use-previous.d.ts +1 -0
- package/dist/hooks/utils/use-previous.js +10 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/chain/chain.d.ts +36 -0
- package/dist/lib/chain/chain.d.ts.map +1 -0
- package/dist/lib/chain/chain.js +195 -0
- package/dist/lib/chain/chain.js.map +1 -0
- package/dist/lib/chain/index.d.ts +4 -0
- package/dist/lib/chain/index.d.ts.map +1 -0
- package/dist/lib/chain/index.js +4 -0
- package/dist/lib/chain/index.js.map +1 -0
- package/dist/lib/community-address.d.ts +6 -0
- package/dist/lib/community-address.d.ts.map +1 -0
- package/dist/lib/community-address.js +26 -0
- package/dist/lib/community-address.js.map +1 -0
- package/dist/lib/community-ref.d.ts +23 -0
- package/dist/lib/community-ref.d.ts.map +1 -0
- package/dist/lib/community-ref.js +113 -0
- package/dist/lib/community-ref.js.map +1 -0
- package/dist/lib/debug-utils.d.ts +9 -0
- package/dist/lib/debug-utils.d.ts.map +1 -0
- package/dist/lib/debug-utils.js +21 -0
- package/dist/lib/debug-utils.js.map +1 -0
- package/dist/lib/feed-sort-type.d.ts +2 -0
- package/dist/lib/feed-sort-type.d.ts.map +1 -0
- package/dist/lib/feed-sort-type.js +22 -0
- package/dist/lib/feed-sort-type.js.map +1 -0
- package/dist/lib/localforage-lru/index.d.ts +3 -0
- package/dist/lib/localforage-lru/index.d.ts.map +1 -0
- package/dist/lib/localforage-lru/index.js +46 -0
- package/dist/lib/localforage-lru/index.js.map +1 -0
- package/dist/lib/localforage-lru/localforage-lru.d.ts +6 -0
- package/dist/lib/localforage-lru/localforage-lru.d.ts.map +1 -0
- package/dist/lib/localforage-lru/localforage-lru.js +182 -0
- package/dist/lib/localforage-lru/localforage-lru.js.map +1 -0
- package/dist/lib/pkc-compat.d.ts +25 -0
- package/dist/lib/pkc-compat.d.ts.map +1 -0
- package/dist/lib/pkc-compat.js +131 -0
- package/dist/lib/pkc-compat.js.map +1 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.d.ts +3 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.d.ts.map +1 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.js +280 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.js.map +1 -0
- package/dist/lib/pkc-js/index.d.ts +11 -0
- package/dist/lib/pkc-js/index.d.ts.map +1 -0
- package/dist/lib/pkc-js/index.js +85 -0
- package/dist/lib/pkc-js/index.js.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.d.ts +3 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.d.ts.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.js +1235 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.js.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock.d.ts +137 -0
- package/dist/lib/pkc-js/pkc-js-mock.d.ts.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock.js +644 -0
- package/dist/lib/pkc-js/pkc-js-mock.js.map +1 -0
- package/dist/lib/polyfill.d.ts +3 -0
- package/dist/lib/polyfill.d.ts.map +1 -0
- package/dist/lib/polyfill.js +14 -0
- package/dist/lib/polyfill.js.map +1 -0
- package/dist/lib/protocol-compat.d.ts +14 -0
- package/dist/lib/protocol-compat.d.ts.map +1 -0
- package/dist/lib/protocol-compat.js +67 -0
- package/dist/lib/protocol-compat.js.map +1 -0
- package/dist/lib/test-utils.d.ts +29 -0
- package/dist/lib/test-utils.d.ts.map +1 -0
- package/dist/lib/test-utils.js +184 -0
- package/dist/lib/test-utils.js.map +1 -0
- package/dist/lib/utils/comment-moderation.d.ts +4 -0
- package/dist/lib/utils/comment-moderation.d.ts.map +1 -0
- package/dist/lib/utils/comment-moderation.js +56 -0
- package/dist/lib/utils/comment-moderation.js.map +1 -0
- package/dist/lib/utils/index.d.ts +4 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +4 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/utils.d.ts +23 -0
- package/dist/lib/utils/utils.d.ts.map +1 -0
- package/dist/lib/utils/utils.js +375 -0
- package/dist/lib/utils/utils.js.map +1 -0
- package/dist/lib/validator.d.ts +30 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +307 -0
- package/dist/lib/validator.js.map +1 -0
- package/dist/stores/accounts/account-generator.d.ts +51 -0
- package/dist/stores/accounts/account-generator.d.ts.map +1 -0
- package/dist/stores/accounts/account-generator.js +160 -0
- package/dist/stores/accounts/account-generator.js.map +1 -0
- package/dist/stores/accounts/accounts-actions-internal.d.ts +8 -0
- package/dist/stores/accounts/accounts-actions-internal.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-actions-internal.js +403 -0
- package/dist/stores/accounts/accounts-actions-internal.js.map +1 -0
- package/dist/stores/accounts/accounts-actions.d.ts +46 -0
- package/dist/stores/accounts/accounts-actions.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-actions.js +1341 -0
- package/dist/stores/accounts/accounts-actions.js.map +1 -0
- package/dist/stores/accounts/accounts-database.d.ts +34 -0
- package/dist/stores/accounts/accounts-database.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-database.js +685 -0
- package/dist/stores/accounts/accounts-database.js.map +1 -0
- package/dist/stores/accounts/accounts-store.d.ts +32 -0
- package/dist/stores/accounts/accounts-store.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-store.js +169 -0
- package/dist/stores/accounts/accounts-store.js.map +1 -0
- package/dist/stores/accounts/index.d.ts +4 -0
- package/dist/stores/accounts/index.d.ts.map +1 -0
- package/dist/stores/accounts/index.js +4 -0
- package/dist/stores/accounts/index.js.map +1 -0
- package/dist/stores/accounts/utils.d.ts +49 -0
- package/dist/stores/accounts/utils.d.ts.map +1 -0
- package/dist/stores/accounts/utils.js +419 -0
- package/dist/stores/accounts/utils.js.map +1 -0
- package/dist/stores/authors-comments/authors-comments-store.d.ts +37 -0
- package/dist/stores/authors-comments/authors-comments-store.d.ts.map +1 -0
- package/dist/stores/authors-comments/authors-comments-store.js +338 -0
- package/dist/stores/authors-comments/authors-comments-store.js.map +1 -0
- package/dist/stores/authors-comments/index.d.ts +4 -0
- package/dist/stores/authors-comments/index.d.ts.map +1 -0
- package/dist/stores/authors-comments/index.js +4 -0
- package/dist/stores/authors-comments/index.js.map +1 -0
- package/dist/stores/authors-comments/utils.d.ts +14 -0
- package/dist/stores/authors-comments/utils.d.ts.map +1 -0
- package/dist/stores/authors-comments/utils.js +81 -0
- package/dist/stores/authors-comments/utils.js.map +1 -0
- package/dist/stores/comments/comments-store.d.ts +19 -0
- package/dist/stores/comments/comments-store.d.ts.map +1 -0
- package/dist/stores/comments/comments-store.js +385 -0
- package/dist/stores/comments/comments-store.js.map +1 -0
- package/dist/stores/comments/index.d.ts +4 -0
- package/dist/stores/comments/index.d.ts.map +1 -0
- package/dist/stores/comments/index.js +4 -0
- package/dist/stores/comments/index.js.map +1 -0
- package/dist/stores/communities/communities-store.d.ts +17 -0
- package/dist/stores/communities/communities-store.d.ts.map +1 -0
- package/dist/stores/communities/communities-store.js +304 -0
- package/dist/stores/communities/communities-store.js.map +1 -0
- package/dist/stores/communities/index.d.ts +4 -0
- package/dist/stores/communities/index.d.ts.map +1 -0
- package/dist/stores/communities/index.js +4 -0
- package/dist/stores/communities/index.js.map +1 -0
- package/dist/stores/communities-pages/communities-pages-store.d.ts +23 -0
- package/dist/stores/communities-pages/communities-pages-store.d.ts.map +1 -0
- package/dist/stores/communities-pages/communities-pages-store.js +316 -0
- package/dist/stores/communities-pages/communities-pages-store.js.map +1 -0
- package/dist/stores/communities-pages/index.d.ts +4 -0
- package/dist/stores/communities-pages/index.d.ts.map +1 -0
- package/dist/stores/communities-pages/index.js +4 -0
- package/dist/stores/communities-pages/index.js.map +1 -0
- package/dist/stores/feeds/feed-sorter.d.ts +5 -0
- package/dist/stores/feeds/feed-sorter.d.ts.map +1 -0
- package/dist/stores/feeds/feed-sorter.js +135 -0
- package/dist/stores/feeds/feed-sorter.js.map +1 -0
- package/dist/stores/feeds/feeds-store.d.ts +25 -0
- package/dist/stores/feeds/feeds-store.d.ts.map +1 -0
- package/dist/stores/feeds/feeds-store.js +459 -0
- package/dist/stores/feeds/feeds-store.js.map +1 -0
- package/dist/stores/feeds/index.d.ts +4 -0
- package/dist/stores/feeds/index.d.ts.map +1 -0
- package/dist/stores/feeds/index.js +4 -0
- package/dist/stores/feeds/index.js.map +1 -0
- package/dist/stores/feeds/utils.d.ts +43 -0
- package/dist/stores/feeds/utils.d.ts.map +1 -0
- package/dist/stores/feeds/utils.js +736 -0
- package/dist/stores/feeds/utils.js.map +1 -0
- package/dist/stores/replies/index.d.ts +4 -0
- package/dist/stores/replies/index.d.ts.map +1 -0
- package/dist/stores/replies/index.js +4 -0
- package/dist/stores/replies/index.js.map +1 -0
- package/dist/stores/replies/replies-comments-store.d.ts +8 -0
- package/dist/stores/replies/replies-comments-store.d.ts.map +1 -0
- package/dist/stores/replies/replies-comments-store.js +23 -0
- package/dist/stores/replies/replies-comments-store.js.map +1 -0
- package/dist/stores/replies/replies-store.d.ts +29 -0
- package/dist/stores/replies/replies-store.d.ts.map +1 -0
- package/dist/stores/replies/replies-store.js +413 -0
- package/dist/stores/replies/replies-store.js.map +1 -0
- package/dist/stores/replies/utils.d.ts +25 -0
- package/dist/stores/replies/utils.d.ts.map +1 -0
- package/dist/stores/replies/utils.js +549 -0
- package/dist/stores/replies/utils.js.map +1 -0
- package/dist/stores/replies-pages/index.d.ts +4 -0
- package/dist/stores/replies-pages/index.d.ts.map +1 -0
- package/dist/stores/replies-pages/index.js +4 -0
- package/dist/stores/replies-pages/index.js.map +1 -0
- package/dist/stores/replies-pages/replies-pages-store.d.ts +20 -0
- package/dist/stores/replies-pages/replies-pages-store.d.ts.map +1 -0
- package/dist/stores/replies-pages/replies-pages-store.js +270 -0
- package/dist/stores/replies-pages/replies-pages-store.js.map +1 -0
- package/dist/stores/replies-pages/utils.d.ts +3 -0
- package/dist/stores/replies-pages/utils.d.ts.map +1 -0
- package/dist/stores/replies-pages/utils.js +43 -0
- package/dist/stores/replies-pages/utils.js.map +1 -0
- package/dist/types.d.ts +638 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +160 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/actions/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC","sourcesContent":["export * from \"./actions\";\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Nft, ChainProviders, Author } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @param nft - The NFT object to resolve the URL of.
|
|
4
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
5
|
+
* the active account.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useNftMetadataUrl(nft?: Nft, accountName?: string): {
|
|
8
|
+
metadataUrl: undefined;
|
|
9
|
+
error: Error | undefined;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @param nftMetadataUrl - The NFT URL to resolve the image URL of.
|
|
13
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
14
|
+
* the active account.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useNftImageUrl(nftMetadataUrl?: string, accountName?: string): {
|
|
17
|
+
imageUrl: undefined;
|
|
18
|
+
error: Error | undefined;
|
|
19
|
+
};
|
|
20
|
+
export declare function useVerifiedAuthorAvatarSignature(author?: Author, accountName?: string): {
|
|
21
|
+
verified: boolean | undefined;
|
|
22
|
+
error: Error | undefined;
|
|
23
|
+
};
|
|
24
|
+
export declare const setAuthorAvatarsWhitelistedTokenAddresses: (tokenAddresses: string[]) => void;
|
|
25
|
+
export declare function useAuthorAvatarIsWhitelisted(nft?: Nft): any;
|
|
26
|
+
export declare const getNftMessageToSign: (authorAddress: string, timestamp: number, tokenAddress: string, tokenId: string) => string;
|
|
27
|
+
export declare const verifyAuthorAvatarSignature: (nft: Nft, authorAddress: string, chainProviders: ChainProviders) => Promise<boolean>;
|
|
28
|
+
//# sourceMappingURL=author-avatars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"author-avatars.d.ts","sourceRoot":"","sources":["../../../src/hooks/authors/author-avatars.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQ1D;;;;GAIG;AAEH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM;;;EA2ChE;AAED;;;;GAIG;AAEH,wBAAgB,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;EAgC3E;AAGD,wBAAgB,gCAAgC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;EAyCrF;AA6BD,eAAO,MAAM,yCAAyC,mBAlBQ,MAAM,EAAE,KAAK,IAoB7B,CAAC;AAG/C,wBAAgB,4BAA4B,CAAC,GAAG,CAAC,EAAE,GAAG,OAcrD;AAED,eAAO,MAAM,mBAAmB,GAC9B,eAAe,MAAM,EACrB,WAAW,MAAM,EACjB,cAAc,MAAM,EACpB,SAAS,MAAM,WAKhB,CAAC;AAGF,eAAO,MAAM,2BAA2B,GACtC,KAAK,GAAG,EACR,eAAe,MAAM,EACrB,gBAAgB,cAAc,qBA+C/B,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
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 } from "react";
|
|
11
|
+
import { useAccount } from "../accounts/index.js";
|
|
12
|
+
import Logger from "@pkcprotocol/pkc-logger";
|
|
13
|
+
const log = Logger("bitsocial-react-hooks:authors:hooks");
|
|
14
|
+
import assert from "assert";
|
|
15
|
+
import { ethers } from "ethers";
|
|
16
|
+
import { getNftMetadataUrl, getNftImageUrl, getNftOwner } from "../../lib/chain/index.js";
|
|
17
|
+
import { getChainProviders } from "../../lib/pkc-compat.js";
|
|
18
|
+
import createStore from "zustand";
|
|
19
|
+
const noMediaIpfsGatewayUrl = "http://no-media-ipfs-gateway-url";
|
|
20
|
+
/**
|
|
21
|
+
* @param nft - The NFT object to resolve the URL of.
|
|
22
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
23
|
+
* the active account.
|
|
24
|
+
*/
|
|
25
|
+
// NOTE: useNftMetadataUrl tests are skipped, if changes are made they must be tested manually
|
|
26
|
+
export function useNftMetadataUrl(nft, accountName) {
|
|
27
|
+
var _a, _b, _c;
|
|
28
|
+
const account = useAccount({ accountName });
|
|
29
|
+
const ipfsGatewayUrl = (account === null || account === void 0 ? void 0 : account.mediaIpfsGatewayUrl) || noMediaIpfsGatewayUrl;
|
|
30
|
+
const chainProviders = getChainProviders(account);
|
|
31
|
+
const [nftMetadataUrl, setNftMetadataUrl] = useState();
|
|
32
|
+
const [error, setError] = useState();
|
|
33
|
+
const getNftMetadataUrlArgs = [
|
|
34
|
+
nft === null || nft === void 0 ? void 0 : nft.address,
|
|
35
|
+
nft === null || nft === void 0 ? void 0 : nft.id,
|
|
36
|
+
nft === null || nft === void 0 ? void 0 : nft.chainTicker,
|
|
37
|
+
(_b = (_a = chainProviders === null || chainProviders === void 0 ? void 0 : chainProviders[nft === null || nft === void 0 ? void 0 : nft.chainTicker]) === null || _a === void 0 ? void 0 : _a.urls) === null || _b === void 0 ? void 0 : _b[0],
|
|
38
|
+
(_c = chainProviders === null || chainProviders === void 0 ? void 0 : chainProviders[nft === null || nft === void 0 ? void 0 : nft.chainTicker]) === null || _c === void 0 ? void 0 : _c.chainId,
|
|
39
|
+
ipfsGatewayUrl,
|
|
40
|
+
];
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
// reset
|
|
43
|
+
setError(undefined);
|
|
44
|
+
setNftMetadataUrl(undefined);
|
|
45
|
+
if (!account || !nft) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
try {
|
|
50
|
+
const url = yield getNftMetadataUrl(...getNftMetadataUrlArgs);
|
|
51
|
+
setNftMetadataUrl(url);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
setError(error);
|
|
55
|
+
log.error("useNftMetadataUrl getNftMetadataUrl error", {
|
|
56
|
+
nft,
|
|
57
|
+
ipfsGatewayUrl,
|
|
58
|
+
chainProviders,
|
|
59
|
+
error,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}))();
|
|
63
|
+
}, getNftMetadataUrlArgs);
|
|
64
|
+
// log('useNftMetadataUrl', {nft, ipfsGatewayUrl, nftMetadataUrl, chainProviders})
|
|
65
|
+
return { metadataUrl: nftMetadataUrl, error };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @param nftMetadataUrl - The NFT URL to resolve the image URL of.
|
|
69
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
70
|
+
* the active account.
|
|
71
|
+
*/
|
|
72
|
+
// NOTE: useNftImageUrl tests are skipped, if changes are made they must be tested manually
|
|
73
|
+
export function useNftImageUrl(nftMetadataUrl, accountName) {
|
|
74
|
+
assert(!nftMetadataUrl || typeof nftMetadataUrl === "string", `useNftImageUrl invalid argument nftMetadataUrl '${nftMetadataUrl}' not a string`);
|
|
75
|
+
const account = useAccount({ accountName });
|
|
76
|
+
const ipfsGatewayUrl = (account === null || account === void 0 ? void 0 : account.mediaIpfsGatewayUrl) || noMediaIpfsGatewayUrl;
|
|
77
|
+
const [imageUrl, setImageUrl] = useState();
|
|
78
|
+
const [error, setError] = useState();
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
// reset
|
|
81
|
+
setError(undefined);
|
|
82
|
+
setImageUrl(undefined);
|
|
83
|
+
if (!account || !nftMetadataUrl) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
try {
|
|
88
|
+
const url = yield getNftImageUrl(nftMetadataUrl, ipfsGatewayUrl);
|
|
89
|
+
setImageUrl(url);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
setError(error);
|
|
93
|
+
log.error("useNftImageUrl getNftImageUrl error", { nftMetadataUrl, ipfsGatewayUrl, error });
|
|
94
|
+
}
|
|
95
|
+
}))();
|
|
96
|
+
}, [nftMetadataUrl, ipfsGatewayUrl]);
|
|
97
|
+
// log('useNftImageUrl', {nftMetadataUrl, ipfsGatewayUrl, imageUrl})
|
|
98
|
+
return { imageUrl, error };
|
|
99
|
+
}
|
|
100
|
+
// NOTE: useVerifiedAuthorAvatarSignature tests are skipped, if changes are made they must be tested manually
|
|
101
|
+
export function useVerifiedAuthorAvatarSignature(author, accountName) {
|
|
102
|
+
const account = useAccount({ accountName });
|
|
103
|
+
const chainProviders = getChainProviders(account);
|
|
104
|
+
const [verified, setVerified] = useState();
|
|
105
|
+
const [error, setError] = useState();
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
// reset
|
|
108
|
+
setError(undefined);
|
|
109
|
+
setVerified(undefined);
|
|
110
|
+
if (!account || !(author === null || author === void 0 ? void 0 : author.avatar)) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
try {
|
|
115
|
+
const res = yield verifyAuthorAvatarSignature(author.avatar, author.address, chainProviders);
|
|
116
|
+
setVerified(res);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
setError(error);
|
|
120
|
+
log.error("useVerifiedAuthorAvatarSignature verifyAuthorAvatarSignature error", {
|
|
121
|
+
author,
|
|
122
|
+
chainProviders,
|
|
123
|
+
error,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}))();
|
|
127
|
+
}, [author === null || author === void 0 ? void 0 : author.avatar, author === null || author === void 0 ? void 0 : author.address, chainProviders]);
|
|
128
|
+
// don't verify nft signature when using mock content during development
|
|
129
|
+
if (process.env.REACT_APP_BITSOCIAL_REACT_HOOKS_MOCK_CONTENT) {
|
|
130
|
+
return { verified: true, error: undefined };
|
|
131
|
+
}
|
|
132
|
+
// log('useVerifiedAuthorAvatarSignature', {author, verified, chainProviders})
|
|
133
|
+
return { verified, error };
|
|
134
|
+
}
|
|
135
|
+
const defaultWhitelistedTokenAddresses = [
|
|
136
|
+
// xpleb nfts
|
|
137
|
+
"0x890a2e81836e0e76e0f49995e6b51ca6ce6f39ed",
|
|
138
|
+
// plebsquat
|
|
139
|
+
"0x52e6cd20f5fca56da5a0e489574c92af118b8188",
|
|
140
|
+
];
|
|
141
|
+
const useAuthorAvatarsWhitelistedTokenAddressesStore = createStore((setState, getState) => ({
|
|
142
|
+
authorAvatarsWhitelistedTokenAddresses: {},
|
|
143
|
+
setAuthorAvatarsWhitelistedTokenAddresses: (tokenAddresses) => {
|
|
144
|
+
const authorAvatarsWhitelistedTokenAddresses = {};
|
|
145
|
+
for (const tokenAddress of tokenAddresses) {
|
|
146
|
+
authorAvatarsWhitelistedTokenAddresses[tokenAddress] = true;
|
|
147
|
+
// make sure lower case version exists
|
|
148
|
+
authorAvatarsWhitelistedTokenAddresses[tokenAddress.toLowerCase()] = true;
|
|
149
|
+
}
|
|
150
|
+
setState({ authorAvatarsWhitelistedTokenAddresses });
|
|
151
|
+
},
|
|
152
|
+
}));
|
|
153
|
+
export const setAuthorAvatarsWhitelistedTokenAddresses = useAuthorAvatarsWhitelistedTokenAddressesStore.getState()
|
|
154
|
+
.setAuthorAvatarsWhitelistedTokenAddresses;
|
|
155
|
+
setAuthorAvatarsWhitelistedTokenAddresses(defaultWhitelistedTokenAddresses); // init default
|
|
156
|
+
export function useAuthorAvatarIsWhitelisted(nft) {
|
|
157
|
+
// TODO: make a list that a dao can vote it, get the list from pkc.getDefaults()
|
|
158
|
+
// TODO: make community owners able to whitelist their own nfts in their communities
|
|
159
|
+
// TODO: make each user able to whitelist/blacklist any nft they want for their own client
|
|
160
|
+
// TODO: make hook to list which default nfts are whitelisted to display to the user
|
|
161
|
+
var _a;
|
|
162
|
+
const authorAvatarsWhitelistedTokenAddresses = useAuthorAvatarsWhitelistedTokenAddressesStore((state) => state.authorAvatarsWhitelistedTokenAddresses);
|
|
163
|
+
const isWhitelisted = (nft === null || nft === void 0 ? void 0 : nft.address) && Boolean(authorAvatarsWhitelistedTokenAddresses[(_a = nft === null || nft === void 0 ? void 0 : nft.address) === null || _a === void 0 ? void 0 : _a.toLowerCase()]);
|
|
164
|
+
return isWhitelisted;
|
|
165
|
+
}
|
|
166
|
+
export const getNftMessageToSign = (authorAddress, timestamp, tokenAddress, tokenId) => {
|
|
167
|
+
// use plain JSON so the user can read what he's signing
|
|
168
|
+
// property names must always be in this order for signature to match so don't use JSON.stringify
|
|
169
|
+
return `{"domainSeparator":"pkc-author-avatar","authorAddress":"${authorAddress}","timestamp":${timestamp},"tokenAddress":"${tokenAddress}","tokenId":"${tokenId}"}`;
|
|
170
|
+
};
|
|
171
|
+
// NOTE: verifyAuthorAvatarSignature tests are skipped, if changes are made they must be tested manually
|
|
172
|
+
export const verifyAuthorAvatarSignature = (nft, authorAddress, chainProviders) => __awaiter(void 0, void 0, void 0, function* () {
|
|
173
|
+
var _a, _b, _c, _d, _e;
|
|
174
|
+
assert(nft && typeof nft === "object", `verifyAuthorAvatarSignature invalid nft argument '${nft}'`);
|
|
175
|
+
assert(nft === null || nft === void 0 ? void 0 : nft.address, `verifyAuthorAvatarSignature invalid nft.address '${nft === null || nft === void 0 ? void 0 : nft.address}'`);
|
|
176
|
+
assert((nft === null || nft === void 0 ? void 0 : nft.id) && typeof (nft === null || nft === void 0 ? void 0 : nft.id) === "string", `verifyAuthorAvatarSignature invalid nft.tokenAddress '${nft === null || nft === void 0 ? void 0 : nft.id}' not a string`);
|
|
177
|
+
assert(typeof (nft === null || nft === void 0 ? void 0 : nft.timestamp) === "number", `verifyAuthorAvatarSignature invalid nft.timestamp '${nft === null || nft === void 0 ? void 0 : nft.timestamp}' not a number`);
|
|
178
|
+
assert(nft === null || nft === void 0 ? void 0 : nft.signature, `verifyAuthorAvatarSignature invalid nft.signature '${nft === null || nft === void 0 ? void 0 : nft.signature}'`);
|
|
179
|
+
assert((_a = nft === null || nft === void 0 ? void 0 : nft.signature) === null || _a === void 0 ? void 0 : _a.signature, `verifyAuthorAvatarSignature invalid nft.signature.signature '${(_b = nft === null || nft === void 0 ? void 0 : nft.signature) === null || _b === void 0 ? void 0 : _b.signature}'`);
|
|
180
|
+
assert(authorAddress, `verifyAuthorAvatarSignature invalid authorAddress '${authorAddress}'`);
|
|
181
|
+
// get the owner of the nft at nft.id
|
|
182
|
+
const currentNftOwnerAddress = yield getNftOwner(nft === null || nft === void 0 ? void 0 : nft.address, nft === null || nft === void 0 ? void 0 : nft.id, nft === null || nft === void 0 ? void 0 : nft.chainTicker, (_d = (_c = chainProviders === null || chainProviders === void 0 ? void 0 : chainProviders[nft === null || nft === void 0 ? void 0 : nft.chainTicker]) === null || _c === void 0 ? void 0 : _c.urls) === null || _d === void 0 ? void 0 : _d[0], (_e = chainProviders === null || chainProviders === void 0 ? void 0 : chainProviders[nft === null || nft === void 0 ? void 0 : nft.chainTicker]) === null || _e === void 0 ? void 0 : _e.chainId);
|
|
183
|
+
const messageThatShouldBeSigned = getNftMessageToSign(authorAddress, nft.timestamp, nft.address, nft.id);
|
|
184
|
+
const signatureAddress = ethers.utils.verifyMessage(messageThatShouldBeSigned, nft.signature.signature);
|
|
185
|
+
let verified = true;
|
|
186
|
+
if (currentNftOwnerAddress !== signatureAddress) {
|
|
187
|
+
verified = false;
|
|
188
|
+
}
|
|
189
|
+
return verified;
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=author-avatars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"author-avatars.js","sourceRoot":"","sources":["../../../src/hooks/authors/author-avatars.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState, useMemo } from \"react\";\nimport { useAccount } from \"../accounts\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nconst log = Logger(\"bitsocial-react-hooks:authors:hooks\");\nimport assert from \"assert\";\nimport { Nft, ChainProviders, Author } from \"../../types\";\nimport { ethers } from \"ethers\";\nimport { getNftMetadataUrl, getNftImageUrl, getNftOwner } from \"../../lib/chain\";\nimport { getChainProviders } from \"../../lib/pkc-compat\";\nimport createStore from \"zustand\";\n\nconst noMediaIpfsGatewayUrl = \"http://no-media-ipfs-gateway-url\";\n\n/**\n * @param nft - The NFT object to resolve the 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: useNftMetadataUrl tests are skipped, if changes are made they must be tested manually\nexport function useNftMetadataUrl(nft?: Nft, accountName?: string) {\n const account = useAccount({ accountName });\n const ipfsGatewayUrl = account?.mediaIpfsGatewayUrl || noMediaIpfsGatewayUrl;\n const chainProviders = getChainProviders(account);\n const [nftMetadataUrl, setNftMetadataUrl] = useState();\n const [error, setError] = useState<Error | undefined>();\n\n const getNftMetadataUrlArgs = [\n nft?.address,\n nft?.id,\n nft?.chainTicker,\n chainProviders?.[nft?.chainTicker]?.urls?.[0],\n chainProviders?.[nft?.chainTicker]?.chainId,\n ipfsGatewayUrl,\n ];\n\n useEffect(() => {\n // reset\n setError(undefined);\n setNftMetadataUrl(undefined);\n\n if (!account || !nft) {\n return;\n }\n\n (async () => {\n try {\n const url = await getNftMetadataUrl(...getNftMetadataUrlArgs);\n setNftMetadataUrl(url);\n } catch (error: any) {\n setError(error);\n log.error(\"useNftMetadataUrl getNftMetadataUrl error\", {\n nft,\n ipfsGatewayUrl,\n chainProviders,\n error,\n });\n }\n })();\n }, getNftMetadataUrlArgs);\n\n // log('useNftMetadataUrl', {nft, ipfsGatewayUrl, nftMetadataUrl, chainProviders})\n return { metadataUrl: nftMetadataUrl, error };\n}\n\n/**\n * @param nftMetadataUrl - The NFT URL to resolve the 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: useNftImageUrl tests are skipped, if changes are made they must be tested manually\nexport function useNftImageUrl(nftMetadataUrl?: string, accountName?: string) {\n assert(\n !nftMetadataUrl || typeof nftMetadataUrl === \"string\",\n `useNftImageUrl invalid argument nftMetadataUrl '${nftMetadataUrl}' not a string`,\n );\n const account = useAccount({ accountName });\n const ipfsGatewayUrl = account?.mediaIpfsGatewayUrl || noMediaIpfsGatewayUrl;\n const [imageUrl, setImageUrl] = useState();\n const [error, setError] = useState<Error | undefined>();\n\n useEffect(() => {\n // reset\n setError(undefined);\n setImageUrl(undefined);\n\n if (!account || !nftMetadataUrl) {\n return;\n }\n\n (async () => {\n try {\n const url = await getNftImageUrl(nftMetadataUrl, ipfsGatewayUrl);\n setImageUrl(url);\n } catch (error: any) {\n setError(error);\n log.error(\"useNftImageUrl getNftImageUrl error\", { nftMetadataUrl, ipfsGatewayUrl, error });\n }\n })();\n }, [nftMetadataUrl, ipfsGatewayUrl]);\n\n // log('useNftImageUrl', {nftMetadataUrl, ipfsGatewayUrl, imageUrl})\n return { imageUrl, error };\n}\n\n// NOTE: useVerifiedAuthorAvatarSignature tests are skipped, if changes are made they must be tested manually\nexport function useVerifiedAuthorAvatarSignature(author?: Author, accountName?: string) {\n const account = useAccount({ accountName });\n const chainProviders = getChainProviders(account);\n const [verified, setVerified] = useState<boolean>();\n const [error, setError] = useState<Error | undefined>();\n\n useEffect(() => {\n // reset\n setError(undefined);\n setVerified(undefined);\n\n if (!account || !author?.avatar) {\n return;\n }\n\n (async () => {\n try {\n const res = await verifyAuthorAvatarSignature(\n author.avatar,\n author.address,\n chainProviders,\n );\n setVerified(res);\n } catch (error: any) {\n setError(error);\n log.error(\"useVerifiedAuthorAvatarSignature verifyAuthorAvatarSignature error\", {\n author,\n chainProviders,\n error,\n });\n }\n })();\n }, [author?.avatar, author?.address, chainProviders]);\n\n // don't verify nft signature when using mock content during development\n if (process.env.REACT_APP_BITSOCIAL_REACT_HOOKS_MOCK_CONTENT) {\n return { verified: true, error: undefined };\n }\n\n // log('useVerifiedAuthorAvatarSignature', {author, verified, chainProviders})\n return { verified, error };\n}\n\nconst defaultWhitelistedTokenAddresses = [\n // xpleb nfts\n \"0x890a2e81836e0e76e0f49995e6b51ca6ce6f39ed\",\n // plebsquat\n \"0x52e6cd20f5fca56da5a0e489574c92af118b8188\",\n];\n\ntype AuthorAvatarsWhitelistedTokenAddressesState = {\n authorAvatarsWhitelistedTokenAddresses: { [tokenAddress: string]: boolean };\n setAuthorAvatarsWhitelistedTokenAddresses: (tokenAddresses: string[]) => void;\n};\n\nconst useAuthorAvatarsWhitelistedTokenAddressesStore =\n createStore<AuthorAvatarsWhitelistedTokenAddressesState>(\n (setState: Function, getState: Function) => ({\n authorAvatarsWhitelistedTokenAddresses: {},\n setAuthorAvatarsWhitelistedTokenAddresses: (tokenAddresses: string[]) => {\n const authorAvatarsWhitelistedTokenAddresses: { [tokenAddress: string]: boolean } = {};\n for (const tokenAddress of tokenAddresses) {\n authorAvatarsWhitelistedTokenAddresses[tokenAddress] = true;\n // make sure lower case version exists\n authorAvatarsWhitelistedTokenAddresses[tokenAddress.toLowerCase()] = true;\n }\n setState({ authorAvatarsWhitelistedTokenAddresses });\n },\n }),\n );\nexport const setAuthorAvatarsWhitelistedTokenAddresses =\n useAuthorAvatarsWhitelistedTokenAddressesStore.getState()\n .setAuthorAvatarsWhitelistedTokenAddresses;\nsetAuthorAvatarsWhitelistedTokenAddresses(defaultWhitelistedTokenAddresses); // init default\n\nexport function useAuthorAvatarIsWhitelisted(nft?: Nft) {\n // TODO: make a list that a dao can vote it, get the list from pkc.getDefaults()\n // TODO: make community owners able to whitelist their own nfts in their communities\n // TODO: make each user able to whitelist/blacklist any nft they want for their own client\n // TODO: make hook to list which default nfts are whitelisted to display to the user\n\n const authorAvatarsWhitelistedTokenAddresses = useAuthorAvatarsWhitelistedTokenAddressesStore(\n (state: AuthorAvatarsWhitelistedTokenAddressesState) =>\n state.authorAvatarsWhitelistedTokenAddresses,\n );\n\n const isWhitelisted =\n nft?.address && Boolean(authorAvatarsWhitelistedTokenAddresses[nft?.address?.toLowerCase()]);\n return isWhitelisted;\n}\n\nexport const getNftMessageToSign = (\n authorAddress: string,\n timestamp: number,\n tokenAddress: string,\n tokenId: string,\n) => {\n // use plain JSON so the user can read what he's signing\n // property names must always be in this order for signature to match so don't use JSON.stringify\n return `{\"domainSeparator\":\"pkc-author-avatar\",\"authorAddress\":\"${authorAddress}\",\"timestamp\":${timestamp},\"tokenAddress\":\"${tokenAddress}\",\"tokenId\":\"${tokenId}\"}`;\n};\n\n// NOTE: verifyAuthorAvatarSignature tests are skipped, if changes are made they must be tested manually\nexport const verifyAuthorAvatarSignature = async (\n nft: Nft,\n authorAddress: string,\n chainProviders: ChainProviders,\n) => {\n assert(\n nft && typeof nft === \"object\",\n `verifyAuthorAvatarSignature invalid nft argument '${nft}'`,\n );\n assert(nft?.address, `verifyAuthorAvatarSignature invalid nft.address '${nft?.address}'`);\n assert(\n nft?.id && typeof nft?.id === \"string\",\n `verifyAuthorAvatarSignature invalid nft.tokenAddress '${nft?.id}' not a string`,\n );\n assert(\n typeof nft?.timestamp === \"number\",\n `verifyAuthorAvatarSignature invalid nft.timestamp '${nft?.timestamp}' not a number`,\n );\n assert(nft?.signature, `verifyAuthorAvatarSignature invalid nft.signature '${nft?.signature}'`);\n assert(\n nft?.signature?.signature,\n `verifyAuthorAvatarSignature invalid nft.signature.signature '${nft?.signature?.signature}'`,\n );\n assert(authorAddress, `verifyAuthorAvatarSignature invalid authorAddress '${authorAddress}'`);\n\n // get the owner of the nft at nft.id\n const currentNftOwnerAddress = await getNftOwner(\n nft?.address,\n nft?.id,\n nft?.chainTicker,\n chainProviders?.[nft?.chainTicker]?.urls?.[0],\n chainProviders?.[nft?.chainTicker]?.chainId,\n );\n\n const messageThatShouldBeSigned = getNftMessageToSign(\n authorAddress,\n nft.timestamp,\n nft.address,\n nft.id,\n );\n const signatureAddress = ethers.utils.verifyMessage(\n messageThatShouldBeSigned,\n nft.signature.signature,\n );\n\n let verified = true;\n if (currentNftOwnerAddress !== signatureAddress) {\n verified = false;\n }\n return verified;\n};\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { UseAuthorOptions, UseAuthorResult, UseAuthorCommentsOptions, UseAuthorCommentsResult, UseAuthorAvatarOptions, UseAuthorAvatarResult, UseResolvedAuthorAddressOptions, UseResolvedAuthorAddressResult, UseAuthorAddressOptions, UseAuthorAddressResult } from "../../types.js";
|
|
2
|
+
export { setAuthorAvatarsWhitelistedTokenAddresses } from "./author-avatars.js";
|
|
3
|
+
/**
|
|
4
|
+
* @param authorAddress - The address of the author
|
|
5
|
+
* @param commentCid - The last known comment cid of the author (not possible to get an author without providing at least 1 comment cid)
|
|
6
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
7
|
+
* the active account.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useAuthorComments(options?: UseAuthorCommentsOptions): UseAuthorCommentsResult;
|
|
10
|
+
/**
|
|
11
|
+
* @param authorAddress - The address of the author
|
|
12
|
+
* @param commentCid - The last known comment cid of the author (not possible to get an author without providing at least 1 comment cid)
|
|
13
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
14
|
+
* the active account.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useAuthor(options?: UseAuthorOptions): UseAuthorResult;
|
|
17
|
+
/**
|
|
18
|
+
* @param author - The Author object to resolve the avatar image URL of.
|
|
19
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
20
|
+
* the active account.
|
|
21
|
+
*/
|
|
22
|
+
export declare function useAuthorAvatar(options?: UseAuthorAvatarOptions): UseAuthorAvatarResult;
|
|
23
|
+
/**
|
|
24
|
+
* @param author - The Author object to resolve the address of.
|
|
25
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
26
|
+
* the active account.
|
|
27
|
+
*/
|
|
28
|
+
export declare function useAuthorAddress(options?: UseAuthorAddressOptions): UseAuthorAddressResult;
|
|
29
|
+
/** For tests: reset caches to make resolution paths deterministic. */
|
|
30
|
+
export declare function resetAuthorAddressCacheForTesting(): void;
|
|
31
|
+
/**
|
|
32
|
+
* @param author - The author with author.address to resolve to a public key, e.g. 'john.eth' resolves to '12D3KooW...'.
|
|
33
|
+
* @param acountName - The nickname of the account, e.g. 'Account 1'. If no accountName is provided, use
|
|
34
|
+
* the active account.
|
|
35
|
+
*/
|
|
36
|
+
export declare function useResolvedAuthorAddress(options?: UseResolvedAuthorAddressOptions): UseResolvedAuthorAddressResult;
|
|
37
|
+
//# sourceMappingURL=authors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authors.d.ts","sourceRoot":"","sources":["../../../src/hooks/authors/authors.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,+BAA+B,EAC/B,8BAA8B,EAC9B,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAoBrB,OAAO,EAAE,yCAAyC,EAAE,MAAM,kBAAkB,CAAC;AAwB7E;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,uBAAuB,CAqF7F;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,eAAe,CA+DrE;AAED;;;;GAIG;AAEH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,qBAAqB,CA4DvF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CA4F1F;AAKD,sEAAsE;AACtE,wBAAgB,iCAAiC,SAKhD;AAED;;;;GAIG;AAEH,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,+BAA+B,GACxC,8BAA8B,CAmOhC"}
|