creator_card.dart 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:cached_network_image/cached_network_image.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_riverpod/flutter_riverpod.dart';
  4. import 'package:veloe_kemono_party_flutter/main.dart';
  5. import 'package:veloe_kemono_party_flutter/models/creator.dart';
  6. import 'package:veloe_kemono_party_flutter/pages/posts_screen.dart';
  7. class ResizedImage extends StatelessWidget {
  8. final String imageUrl;
  9. final BoxFit fit;
  10. const ResizedImage({super.key, required this.imageUrl, this.fit = BoxFit.cover});
  11. @override
  12. Widget build(BuildContext context) {
  13. final screenSize = MediaQuery.of(context).size;
  14. return CachedNetworkImage(
  15. cacheManager: imageCacheManager,
  16. imageUrl: imageUrl,
  17. imageBuilder: (context, imageProvider) => Image(
  18. image: ResizeImage(
  19. imageProvider,
  20. width: screenSize.width.toInt(),
  21. ),
  22. fit: fit,
  23. ),
  24. placeholder: (context, url) => const CircularProgressIndicator(),
  25. errorWidget: (context, url, error) => const Icon(Icons.error),
  26. );
  27. }
  28. }
  29. class CreatorCard extends ConsumerWidget {
  30. final Creator creator;
  31. const CreatorCard({super.key, required this.creator});
  32. @override
  33. Widget build(BuildContext context, WidgetRef ref) {
  34. return Card(
  35. child: ListTile(
  36. leading: Hero(
  37. tag: 'creator-${creator.id}',
  38. child: CircleAvatar(
  39. backgroundColor: Colors.grey[200],
  40. child: ResizedImage(
  41. imageUrl: creator.iconUrl,
  42. fit: BoxFit.contain,
  43. ),
  44. ),
  45. ),
  46. title: Text(creator.name),
  47. subtitle: Column(
  48. crossAxisAlignment: CrossAxisAlignment.start,
  49. children: [
  50. Text(creator.service.toUpperCase()),
  51. Text('Last updated: ${_formatDate(creator.updated)}'),
  52. ],
  53. ),
  54. onTap: () => _showCreatorPosts(context, ref),
  55. ),
  56. );
  57. }
  58. String _formatDate(int timestamp) {
  59. return
  60. DateTime.fromMillisecondsSinceEpoch((timestamp * 1000).toInt()).toString();
  61. }
  62. void _showCreatorPosts(BuildContext context, WidgetRef ref) {
  63. ref.read(selectedCreatorProvider.notifier).state = creator;
  64. Navigator.push(
  65. context,
  66. MaterialPageRoute(
  67. builder: (context) => PostsScreen(
  68. creatorId: creator.id,
  69. service: creator.service,
  70. ),
  71. ),
  72. );
  73. }
  74. }