Files
hackathon-innovaflow5.0-cdf…/recolecta_app/lib/features/alerts/alerts_screen.dart

146 lines
4.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/theme/app_theme.dart';
import 'alerts_provider.dart';
class AlertsScreen extends ConsumerWidget {
const AlertsScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final alerts = ref.watch(alertsProvider);
return Scaffold(
backgroundColor: AppTheme.background,
appBar: AppBar(
title: const Text('Mis Alertas'),
actions: [
if (alerts.isNotEmpty)
IconButton(
icon: const Icon(Icons.delete_sweep_outlined),
tooltip: 'Limpiar historial',
onPressed: () => ref.read(alertsProvider.notifier).clearAll(),
),
],
),
body: alerts.isEmpty
? _buildEmptyState()
: ListView.separated(
padding: const EdgeInsets.all(16),
itemCount: alerts.length,
separatorBuilder: (_, __) => const SizedBox(height: 12),
itemBuilder: (context, index) {
return _AlertCard(alert: alerts[index]);
},
),
);
}
Widget _buildEmptyState() {
return const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.notifications_off_outlined,
size: 64,
color: AppTheme.textSecondary,
),
SizedBox(height: 16),
Text(
'No tienes notificaciones nuevas',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppTheme.textPrimary,
),
),
SizedBox(height: 8),
Text(
'Aquí aparecerán los avisos del camión.',
style: TextStyle(fontSize: 14, color: AppTheme.textSecondary),
),
],
),
);
}
}
class _AlertCard extends StatelessWidget {
final AppAlert alert;
const _AlertCard({required this.alert});
String _timeAgo(DateTime date) {
final diff = DateTime.now().difference(date);
if (diff.inMinutes < 1) return 'Justo ahora';
if (diff.inHours < 1) return 'Hace ${diff.inMinutes} min';
if (diff.inDays < 1) return 'Hace ${diff.inHours} h';
return 'Hace ${diff.inDays} d';
}
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: AppTheme.surface,
borderRadius: BorderRadius.circular(AppTheme.radiusLg),
border: Border.all(color: AppTheme.border, width: 0.5),
boxShadow: AppTheme.softShadow,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: const BoxDecoration(
color: AppTheme.primaryLight,
shape: BoxShape.circle,
),
child: const Icon(
Icons.notifications_active_outlined,
color: AppTheme.primary,
size: 24,
),
),
const SizedBox(width: 14),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
alert.title,
style: const TextStyle(
fontSize: 15,
fontWeight: FontWeight.w700,
color: AppTheme.primaryDark,
),
),
const SizedBox(height: 4),
Text(
alert.body,
style: const TextStyle(
fontSize: 14,
color: AppTheme.textPrimary,
height: 1.4,
),
),
const SizedBox(height: 8),
Text(
_timeAgo(alert.timestamp),
style: const TextStyle(
fontSize: 12,
color: AppTheme.textHint,
),
),
],
),
),
],
),
);
}
}