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
}