creator_card.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. // UI Components
  30. class CreatorCard extends ConsumerWidget {
  31. final Creator creator;
  32. const CreatorCard({super.key, required this.creator});
  33. @override
  34. Widget build(BuildContext context, WidgetRef ref) {
  35. return Card(
  36. child: ListTile(
  37. leading: Hero(
  38. tag: 'creator-${creator.id}',
  39. child: CircleAvatar(
  40. backgroundColor: Colors.grey[200],
  41. child: ResizedImage(
  42. imageUrl: creator.iconUrl,
  43. fit: BoxFit.contain,
  44. ),
  45. ),
  46. ),
  47. title: Text(creator.name),
  48. subtitle: Column(
  49. crossAxisAlignment: CrossAxisAlignment.start,
  50. children: [
  51. Text(creator.service.toUpperCase()),
  52. Text('Last updated: ${_formatDate(creator.updated)}'),
  53. ],
  54. ),
  55. onTap: () => _showCreatorPosts(context, ref),
  56. ),
  57. );
  58. }
  59. String _formatDate(int timestamp) {
  60. return
  61. DateTime.fromMillisecondsSinceEpoch((timestamp * 1000).toInt()).toString();
  62. }
  63. void _showCreatorPosts(BuildContext context, WidgetRef ref) {
  64. ref.read(selectedCreatorProvider.notifier).state = creator;
  65. Navigator.push(
  66. context,
  67. MaterialPageRoute(
  68. builder: (context) => PostsScreen(
  69. creatorId: creator.id,
  70. service: creator.service,
  71. ),
  72. ),
  73. );
  74. }
  75. }