MIF_E31222656/lib/screens/community/components/simple_news_card.dart

183 lines
6.0 KiB
Dart

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,
),
),
),
),
],
),
),
],
),
),
);
}
}