183 lines
6.0 KiB
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,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|