import 'package:flutter/material.dart'; import 'package:tugas_akhir_supabase/core/theme/app_colors.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:intl/intl.dart'; class SimpleNewsCard extends StatelessWidget { final String title; final String content; final String source; final String? imageUrl; final VoidCallback onTap; final DateTime? publishDate; const SimpleNewsCard({ super.key, required this.title, required this.content, required this.source, this.imageUrl, required this.onTap, this.publishDate, }); String _formatDate(DateTime? date) { if (date == null) return ''; final now = DateTime.now(); final difference = now.difference(date); if (difference.inDays == 0) { if (difference.inHours == 0) { return '${difference.inMinutes} menit yang lalu'; } return '${difference.inHours} jam yang lalu'; } else if (difference.inDays <= 7) { return '${difference.inDays} hari yang lalu'; } else { return DateFormat('dd MMM yyyy', 'id_ID').format(date); } } @override Widget build(BuildContext context) { return Card( margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), elevation: 3, child: InkWell( onTap: onTap, borderRadius: BorderRadius.circular(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Image if available if (imageUrl != null) ClipRRect( borderRadius: BorderRadius.vertical(top: Radius.circular(12)), child: CachedNetworkImage( imageUrl: imageUrl!, height: 180, width: double.infinity, fit: BoxFit.cover, placeholder: (context, url) => Container( height: 180, color: Colors.grey[200], child: Center( child: CircularProgressIndicator( color: AppColors.primary, ), ), ), errorWidget: (context, url, error) => Container( height: 180, color: Colors.grey[200], child: Icon( Icons.image_not_supported, size: 50, color: Colors.grey[400], ), ), ), ), // Content Padding( padding: EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Title Text( title, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), maxLines: 2, overflow: TextOverflow.ellipsis, ), SizedBox(height: 8), // Content preview Text( content, style: TextStyle(fontSize: 14, color: Colors.grey[800]), maxLines: 3, overflow: TextOverflow.ellipsis, ), SizedBox(height: 12), // Source and date Row( children: [ Icon(Icons.public, size: 14, color: Colors.grey[600]), SizedBox(width: 4), Expanded( child: Text( source, style: TextStyle( fontSize: 12, color: Colors.grey[600], fontWeight: FontWeight.w500, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ), if (publishDate != null) ...[ SizedBox(width: 8), Icon( Icons.access_time, size: 14, color: Colors.grey[600], ), SizedBox(width: 4), Text( _formatDate(publishDate), style: TextStyle( fontSize: 12, color: Colors.grey[600], ), ), ], ], ), SizedBox(height: 8), // Read more button Align( alignment: Alignment.centerRight, child: TextButton( onPressed: onTap, style: TextButton.styleFrom( padding: EdgeInsets.symmetric( horizontal: 16, vertical: 8, ), minimumSize: Size(0, 0), tapTargetSize: MaterialTapTargetSize.shrinkWrap, backgroundColor: AppColors.primary.withOpacity(0.1), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), ), child: Text( 'Baca Selengkapnya', style: TextStyle( color: AppColors.primary, fontWeight: FontWeight.bold, ), ), ), ), ], ), ), ], ), ), ); } }