Polish mobile UX downloads and comments

This commit is contained in:
2026-05-23 12:15:20 +03:00
parent 63da741295
commit f9938e393d
24 changed files with 571 additions and 61 deletions
+50 -1
View File
@@ -4,11 +4,12 @@ import '../../core/errors/app_exception.dart';
import '../../core/http/dio_client.dart';
import '../mappers/gelbooru_mapper.dart';
import '../models/post.dart';
import '../models/post_comment.dart';
import '../models/provider_health.dart';
import '../models/top_period_filter.dart';
import 'content_provider.dart';
class GelbooruProvider implements ContentProvider {
class GelbooruProvider implements ContentProvider, CommentProvider {
GelbooruProvider({
required this.id,
required this.name,
@@ -117,6 +118,22 @@ class GelbooruProvider implements ContentProvider {
}
}
@override
Future<List<PostComment>> getComments(String postId) async {
final response = await _dio.get<dynamic>(
'/index.php',
queryParameters: {
'page': 'dapi',
's': 'comment',
'q': 'index',
'json': '1',
'post_id': postId,
..._queryParameters,
},
);
return _commentsFromResponse(response.data, postId);
}
Never unavailable(String message) =>
throw ProviderUnavailableException(message);
@@ -129,4 +146,36 @@ class GelbooruProvider implements ContentProvider {
const ['sort:score:desc'],
};
}
List<PostComment> _commentsFromResponse(dynamic data, String postId) {
final raw = switch (data) {
List() => data,
{'comments': final List comments} => comments,
{'@attributes': _, 'comment': final List comments} => comments,
{'comment': final List comments} => comments,
_ => const [],
};
return raw
.whereType<Map>()
.map((item) {
final json = Map<String, dynamic>.from(item);
return PostComment(
id: (json['id'] ?? json['comment_id'] ?? '').toString(),
postId: (json['post_id'] ?? postId).toString(),
providerId: id,
authorName: (json['creator'] ??
json['creator_name'] ??
json['author'] ??
'')
.toString(),
body: (json['body'] ?? json['comment'] ?? '').toString(),
createdAt: DateTime.tryParse(
(json['created_at'] ?? json['created'] ?? '').toString(),
) ??
DateTime.fromMillisecondsSinceEpoch(0),
);
})
.where((comment) => comment.body.trim().isNotEmpty)
.toList();
}
}