Skip to content

Commit 8f1c395

Browse files
Implement UserService.profileBanner request
1 parent 4d9bf27 commit 8f1c395

File tree

6 files changed

+179
-10
lines changed

6 files changed

+179
-10
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# 0.5.8
2+
- Implemented `UserService.profileBanner` request
3+
14
# 0.5.7+1
25

36
- Fixed `InitialInfo` and `EditedInfo` models were missing the `explicitToJson: true` flag (Thanks @ryzizub!)

lib/api/users/data/banner.dart

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import 'package:json_annotation/json_annotation.dart';
2+
3+
part 'banner.g.dart';
4+
5+
@JsonSerializable(
6+
explicitToJson: true,
7+
fieldRename: FieldRename.snake,
8+
)
9+
class Banner {
10+
Banner();
11+
12+
factory Banner.fromJson(Map<String, dynamic> json) => _$BannerFromJson(json);
13+
14+
BannerSizes? sizes;
15+
16+
Map<String, dynamic> toJson() => _$BannerToJson(this);
17+
}
18+
19+
@JsonSerializable(
20+
explicitToJson: true,
21+
fieldRename: FieldRename.snake,
22+
)
23+
class BannerSizes {
24+
BannerSizes();
25+
26+
factory BannerSizes.fromJson(Map<String, dynamic> json) =>
27+
_$BannerSizesFromJson(json);
28+
29+
BannerSize? ipad;
30+
BannerSize? ipadRetina;
31+
BannerSize? web;
32+
BannerSize? webRetina;
33+
BannerSize? mobile;
34+
BannerSize? mobileRetina;
35+
36+
@JsonKey(name: '300x100')
37+
BannerSize? size300x100;
38+
39+
@JsonKey(name: '600x200')
40+
BannerSize? size600x200;
41+
42+
@JsonKey(name: '1500x500')
43+
BannerSize? size1500x500;
44+
45+
Map<String, dynamic> toJson() => _$BannerSizesToJson(this);
46+
}
47+
48+
@JsonSerializable(
49+
explicitToJson: true,
50+
fieldRename: FieldRename.snake,
51+
)
52+
class BannerSize {
53+
BannerSize();
54+
55+
factory BannerSize.fromJson(Map<String, dynamic> json) =>
56+
_$BannerSizeFromJson(json);
57+
58+
int? h;
59+
int? w;
60+
String? url;
61+
62+
Map<String, dynamic> toJson() => _$BannerSizeToJson(this);
63+
}

lib/api/users/data/banner.g.dart

Lines changed: 76 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/api/users/user_service.dart

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
1-
import 'package:dart_twitter_api/api/abstract_twitter_client.dart';
2-
import 'package:dart_twitter_api/api/twitter_client.dart';
3-
import 'package:dart_twitter_api/api/users/data/friendship.dart';
4-
import 'package:dart_twitter_api/api/users/data/paginated_ids.dart';
5-
import 'package:dart_twitter_api/api/users/data/paginated_users.dart';
6-
import 'package:dart_twitter_api/api/users/data/relationship.dart';
7-
import 'package:dart_twitter_api/api/users/data/user.dart';
81
import 'package:dart_twitter_api/src/utils/map_utils.dart';
9-
import 'package:dart_twitter_api/src/utils/transforms.dart';
2+
import 'package:dart_twitter_api/twitter_api.dart';
103

114
class UserService {
125
const UserService({
@@ -635,4 +628,29 @@ class UserService {
635628
)
636629
.then(transform);
637630
}
631+
632+
/// Returns available size variations of the specified user's profile banner.
633+
///
634+
/// The profile banner data available at each size variant's URL is in PNG
635+
/// format.
636+
///
637+
/// If the user has not uploaded a profile banner, a `Future.error` is
638+
/// returned instead with the 404 response.
639+
///
640+
/// See https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/manage-account-settings/api-reference/get-users-profile_banner.
641+
Future<Banner> profileBanner({
642+
String? screenName,
643+
String? userId,
644+
TransformResponse<Banner> transform = defaultBannerTransform,
645+
}) {
646+
final params = <String, String>{}
647+
..addParameter('screen_name', screenName)
648+
..addParameter('user_id', userId);
649+
650+
return client
651+
.get(
652+
Uri.https('api.twitter.com', '1.1/users/profile_banner.json', params),
653+
)
654+
.then(transform);
655+
}
638656
}

lib/src/utils/transforms.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import 'dart:convert';
22

3-
import 'package:dart_twitter_api/api/users/data/paginated_ids.dart';
4-
import 'package:dart_twitter_api/api/users/data/relationship.dart';
53
import 'package:dart_twitter_api/twitter_api.dart';
64
import 'package:http/http.dart';
75

@@ -249,3 +247,11 @@ Future<List<int>> defaultIntListTransform(Response response) async {
249247
List<int> _isolateIntListTransform(String body) {
250248
return (json.decode(body) as List<dynamic>).map((e) => e as int).toList();
251249
}
250+
251+
Future<Banner> defaultBannerTransform(Response response) async {
252+
return await compute<String, Banner>(_isolateBannerTransform, response.body);
253+
}
254+
255+
Banner _isolateBannerTransform(String body) {
256+
return Banner.fromJson(json.decode(body));
257+
}

lib/twitter_api.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@ export 'api/tweets/timeline_service.dart';
3737
export 'api/tweets/tweet_search_service.dart';
3838
export 'api/tweets/tweet_service.dart';
3939
export 'api/twitter_client.dart';
40+
export 'api/users/data/banner.dart';
4041
export 'api/users/data/derived.dart';
4142
export 'api/users/data/friendship.dart';
4243
export 'api/users/data/location.dart';
44+
export 'api/users/data/paginated_ids.dart';
4345
export 'api/users/data/paginated_users.dart';
46+
export 'api/users/data/relationship.dart';
4447
export 'api/users/data/user.dart';
4548
export 'api/users/data/user_entities.dart';
4649
export 'api/users/user_service.dart';

0 commit comments

Comments
 (0)