diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 9d274fbcc..6e52a93c7 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -65,16 +65,11 @@ class AddressResolver { if (addressFromBio != null) { return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text); } - final tweets = twitterUser.tweets; - if (tweets != null) { - var subString = StringBuffer(); - tweets.forEach((item) { - subString.writeln(item.text); - }); - final userTweetsText = subString.toString(); - final addressFromPinnedTweet = - extractAddressByType(raw: userTweetsText, type: CryptoCurrency.fromString(ticker)); + final pinnedTweet = twitterUser.pinnedTweet?.text; + if (pinnedTweet != null) { + final addressFromPinnedTweet = + extractAddressByType(raw: pinnedTweet, type: CryptoCurrency.fromString(ticker)); if (addressFromPinnedTweet != null) { return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text); } diff --git a/lib/twitter/twitter_api.dart b/lib/twitter/twitter_api.dart index 41f5df61d..24121c9c0 100644 --- a/lib/twitter/twitter_api.dart +++ b/lib/twitter/twitter_api.dart @@ -1,7 +1,8 @@ import 'dart:convert'; + +import 'package:cake_wallet/.secrets.g.dart' as secrets; import 'package:cake_wallet/twitter/twitter_user.dart'; import 'package:http/http.dart' as http; -import 'package:cake_wallet/.secrets.g.dart' as secrets; class TwitterApi { static const twitterBearerToken = secrets.twitterBearerToken; @@ -10,28 +11,49 @@ class TwitterApi { static const userPath = '/2/users/by/username/'; static Future lookupUserByName({required String userName}) async { - final queryParams = {'user.fields': 'description', 'expansions': 'pinned_tweet_id'}; - + final queryParams = { + 'user.fields': 'description', + 'expansions': 'pinned_tweet_id', + 'tweet.fields': 'note_tweet' + }; final headers = {'authorization': 'Bearer $twitterBearerToken'}; - final uri = Uri( - scheme: httpsScheme, - host: apiHost, - path: userPath + userName, - queryParameters: queryParams, - ); + scheme: httpsScheme, + host: apiHost, + path: userPath + userName, + queryParameters: queryParams); - var response = await http.get(uri, headers: headers); + final response = await http.get(uri, headers: headers).catchError((error) { + throw Exception('HTTP request failed: $error'); + }); if (response.statusCode != 200) { throw Exception('Unexpected http status: ${response.statusCode}'); } - final responseJSON = json.decode(response.body) as Map; + final Map responseJSON = jsonDecode(response.body) as Map; if (responseJSON['errors'] != null) { throw Exception(responseJSON['errors'][0]['detail']); } - return TwitterUser.fromJson(responseJSON); + return TwitterUser.fromJson(responseJSON, _getPinnedTweet(responseJSON)); + } + + static Tweet? _getPinnedTweet(Map responseJSON) { + final tweetId = responseJSON['data']['pinned_tweet_id'] as String?; + if (tweetId == null || responseJSON['includes'] == null) return null; + + final tweetIncludes = List.from(responseJSON['includes']['tweets'] as List); + final pinnedTweetData = tweetIncludes.firstWhere( + (tweet) => tweet['id'] == tweetId, + orElse: () => null, + ) as Map?; + + if (pinnedTweetData == null) return null; + + final pinnedTweetText = + (pinnedTweetData['note_tweet']?['text'] ?? pinnedTweetData['text']) as String; + + return Tweet(id: tweetId, text: pinnedTweetText); } } diff --git a/lib/twitter/twitter_user.dart b/lib/twitter/twitter_user.dart index ac373fd62..c0eb5431c 100644 --- a/lib/twitter/twitter_user.dart +++ b/lib/twitter/twitter_user.dart @@ -4,25 +4,21 @@ class TwitterUser { required this.username, required this.name, required this.description, - this.tweets}); + this.pinnedTweet}); final String id; final String username; final String name; final String description; - final List? tweets; + final Tweet? pinnedTweet; - factory TwitterUser.fromJson(Map json) { + factory TwitterUser.fromJson(Map json, [Tweet? pinnedTweet]) { return TwitterUser( id: json['data']['id'] as String, username: json['data']['username'] as String, name: json['data']['name'] as String, description: json['data']['description'] as String? ?? '', - tweets: json['includes'] != null - ? List.from(json['includes']['tweets'] as List) - .map((e) => Tweet.fromJson(e as Map)) - .toList() - : null, + pinnedTweet: pinnedTweet, ); } }