fix Twiter APiI (#1132)

Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

Serhii committed Oct 17, 2023 at 21:55 UTC 29bc234dab9986852c20336c81919bafec248a06
3 files changed +42 -29
lib/entities/parse_address_from_domain.dart
+4 -9
@@ -65,16 +65,11 @@ class AddressResolver {
65 if (addressFromBio != null) {
66 return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text);
67 }
68 - final tweets = twitterUser.tweets;
69 - if (tweets != null) {
70 - var subString = StringBuffer();
71 - tweets.forEach((item) {
72 - subString.writeln(item.text);
73 - });
74 - final userTweetsText = subString.toString();
75 - final addressFromPinnedTweet =
76 - extractAddressByType(raw: userTweetsText, type: CryptoCurrency.fromString(ticker));
68
69 + final pinnedTweet = twitterUser.pinnedTweet?.text;
70 + if (pinnedTweet != null) {
71 + final addressFromPinnedTweet =
72 + extractAddressByType(raw: pinnedTweet, type: CryptoCurrency.fromString(ticker));
73 if (addressFromPinnedTweet != null) {
74 return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text);
75 }
lib/twitter/twitter_api.dart
+34 -12
@@ -1,7 +1,8 @@
1 import 'dart:convert';
2 +
3 +import 'package:cake_wallet/.secrets.g.dart' as secrets;
4 import 'package:cake_wallet/twitter/twitter_user.dart';
5 import 'package:http/http.dart' as http;
4 -import 'package:cake_wallet/.secrets.g.dart' as secrets;
6
7 class TwitterApi {
8 static const twitterBearerToken = secrets.twitterBearerToken;
@@ -10,28 +11,49 @@ class TwitterApi {
11 static const userPath = '/2/users/by/username/';
12
13 static Future<TwitterUser> lookupUserByName({required String userName}) async {
13 - final queryParams = {'user.fields': 'description', 'expansions': 'pinned_tweet_id'};
14 -
14 + final queryParams = {
15 + 'user.fields': 'description',
16 + 'expansions': 'pinned_tweet_id',
17 + 'tweet.fields': 'note_tweet'
18 + };
19 final headers = {'authorization': 'Bearer $twitterBearerToken'};
16 -
20 final uri = Uri(
18 - scheme: httpsScheme,
19 - host: apiHost,
20 - path: userPath + userName,
21 - queryParameters: queryParams,
22 - );
21 + scheme: httpsScheme,
22 + host: apiHost,
23 + path: userPath + userName,
24 + queryParameters: queryParams);
25
24 - var response = await http.get(uri, headers: headers);
26 + final response = await http.get(uri, headers: headers).catchError((error) {
27 + throw Exception('HTTP request failed: $error');
28 + });
29
30 if (response.statusCode != 200) {
31 throw Exception('Unexpected http status: ${response.statusCode}');
32 }
29 - final responseJSON = json.decode(response.body) as Map<String, dynamic>;
33
34 + final Map<String, dynamic> responseJSON = jsonDecode(response.body) as Map<String, dynamic>;
35 if (responseJSON['errors'] != null) {
36 throw Exception(responseJSON['errors'][0]['detail']);
37 }
38
35 - return TwitterUser.fromJson(responseJSON);
39 + return TwitterUser.fromJson(responseJSON, _getPinnedTweet(responseJSON));
40 + }
41 +
42 + static Tweet? _getPinnedTweet(Map<String, dynamic> responseJSON) {
43 + final tweetId = responseJSON['data']['pinned_tweet_id'] as String?;
44 + if (tweetId == null || responseJSON['includes'] == null) return null;
45 +
46 + final tweetIncludes = List.from(responseJSON['includes']['tweets'] as List);
47 + final pinnedTweetData = tweetIncludes.firstWhere(
48 + (tweet) => tweet['id'] == tweetId,
49 + orElse: () => null,
50 + ) as Map<String, dynamic>?;
51 +
52 + if (pinnedTweetData == null) return null;
53 +
54 + final pinnedTweetText =
55 + (pinnedTweetData['note_tweet']?['text'] ?? pinnedTweetData['text']) as String;
56 +
57 + return Tweet(id: tweetId, text: pinnedTweetText);
58 }
59 }
lib/twitter/twitter_user.dart
+4 -8
@@ -4,25 +4,21 @@ class TwitterUser {
4 required this.username,
5 required this.name,
6 required this.description,
7 - this.tweets});
7 + this.pinnedTweet});
8
9 final String id;
10 final String username;
11 final String name;
12 final String description;
13 - final List<Tweet>? tweets;
13 + final Tweet? pinnedTweet;
14
15 - factory TwitterUser.fromJson(Map<String, dynamic> json) {
15 + factory TwitterUser.fromJson(Map<String, dynamic> json, [Tweet? pinnedTweet]) {
16 return TwitterUser(
17 id: json['data']['id'] as String,
18 username: json['data']['username'] as String,
19 name: json['data']['name'] as String,
20 description: json['data']['description'] as String? ?? '',
21 - tweets: json['includes'] != null
22 - ? List.from(json['includes']['tweets'] as List)
23 - .map((e) => Tweet.fromJson(e as Map<String, dynamic>))
24 - .toList()
25 - : null,
21 + pinnedTweet: pinnedTweet,
22 );
23 }
24 }