diff --git a/packages/injected-script/main/sceneChange/twitter.ts b/packages/injected-script/main/sceneChange/twitter.ts index b8497f2ab688..5ff16de8d4c8 100644 --- a/packages/injected-script/main/sceneChange/twitter.ts +++ b/packages/injected-script/main/sceneChange/twitter.ts @@ -15,7 +15,7 @@ export function setupWatcherForTwitter() { const update = () => { const newFirstSlug = getFirstSlug() // reset to void wrong value - if (!firstSlug || apply(includes, TWITTER_RESERVED_SLUGS, [firstSlug])) { + if (!newFirstSlug || apply(includes, TWITTER_RESERVED_SLUGS, [newFirstSlug])) { const event = new no_xray_CustomEvent('scenechange', { detail: { scene: 'unknown' }, }) as WindowEventMap['scenechange'] diff --git a/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts b/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts index d394351bf86b..b0fabd0fb176 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/collecting/identity.ts @@ -124,6 +124,7 @@ function resolveCurrentVisitingIdentityInner( ) { const update = async (twitterId: string) => { const user = await Twitter.getUserByScreenName(twitterId) + if (!user) return const bio = user.legacy.description const nickname = user.legacy.name diff --git a/packages/mask/src/utils/hooks/useSceneChange.ts b/packages/mask/src/utils/hooks/useSceneChange.ts new file mode 100644 index 000000000000..fd912c98c6ac --- /dev/null +++ b/packages/mask/src/utils/hooks/useSceneChange.ts @@ -0,0 +1,8 @@ +import { useEffect } from 'react' + +export function useSceneChange(handler: (event: WindowEventMap['scenechange']) => void) { + useEffect(() => { + window.addEventListener('scenechange', handler) + return () => window.removeEventListener('scenechange', handler) + }, [handler]) +} diff --git a/packages/web3-providers/src/twitter/index.ts b/packages/web3-providers/src/twitter/index.ts index f589576f5a7a..c0b8e02ec7c5 100644 --- a/packages/web3-providers/src/twitter/index.ts +++ b/packages/web3-providers/src/twitter/index.ts @@ -1,5 +1,6 @@ import { escapeRegExp } from 'lodash-unified' import urlcat from 'urlcat' +import LRUCache from 'lru-cache' import type { TwitterBaseAPI } from '../types' const UPLOAD_AVATAR_URL = 'https://upload.twitter.com/i/media/upload.json' @@ -117,6 +118,11 @@ async function getSettings(bearerToken: string, csrfToken: string): Promise({ + max: 20, + ttl: 300_000, +}) + export class TwitterAPI implements TwitterBaseAPI.Provider { async getSettings() { const { bearerToken, queryToken, csrfToken } = await getTokens() @@ -197,7 +203,7 @@ export class TwitterAPI implements TwitterBaseAPI.Provider { } } - async getUserByScreenName(screenName: string): Promise { + async getUserByScreenName(screenName: string): Promise { const { bearerToken, csrfToken, queryId } = await getTokens('UserByScreenName') const url = urlcat('https://twitter.com/i/api/graphql/:queryId/UserByScreenName', { queryId, @@ -207,17 +213,26 @@ export class TwitterAPI implements TwitterBaseAPI.Provider { withSuperFollowsUserFields: true, }), }) + const cacheKey = `${bearerToken}/${csrfToken}/${url}` + const fetchingTask: Promise = + cache.get(cacheKey) ?? + fetch(url, { + headers: { + authorization: `Bearer ${bearerToken}`, + 'x-csrf-token': csrfToken, + 'content-type': 'application/json', + 'x-twitter-auth-type': 'OAuth2Session', + 'x-twitter-active-user': 'yes', + referer: `https://twitter.com/${screenName}`, + }, + }) - const response = await fetch(url, { - headers: { - authorization: `Bearer ${bearerToken}`, - 'x-csrf-token': csrfToken, - 'content-type': 'application/json', - 'x-twitter-auth-type': 'OAuth2Session', - 'x-twitter-active-user': 'yes', - referer: `https://twitter.com/${screenName}`, - }, - }) + cache.set(cacheKey, fetchingTask) + const response = (await fetchingTask).clone() + if (!response.ok) { + cache.delete(cacheKey) + return null + } const userResponse: TwitterBaseAPI.UserByScreenNameResponse = await response.json() return userResponse.data.user.result } diff --git a/packages/web3-providers/src/types.ts b/packages/web3-providers/src/types.ts index a8150e067e8b..e6cbfc9ef785 100644 --- a/packages/web3-providers/src/types.ts +++ b/packages/web3-providers/src/types.ts @@ -531,7 +531,7 @@ export namespace TwitterBaseAPI { > uploadUserAvatar: (screenName: string, image: Blob | File) => Promise updateProfileImage: (screenName: string, media_id_str: string) => Promise - getUserByScreenName: (screenName: string) => Promise + getUserByScreenName: (screenName: string) => Promise } }