82 lines
2.3 KiB
Dart
82 lines
2.3 KiB
Dart
// lib/features/routes/presentation/widgets/routes_list.dart
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import '../providers/routes_provider.dart';
|
|
import '../../domain/entities/route_entities.dart';
|
|
|
|
class RoutesList extends ConsumerWidget {
|
|
const RoutesList({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final rutasAsync = ref.watch(allRoutesProvider);
|
|
|
|
return rutasAsync.when(
|
|
loading: () => const Center(child: CircularProgressIndicator()),
|
|
error: (e, _) => Center(child: Text('Error: $e')),
|
|
data: (rutas) => ListView.separated(
|
|
padding: const EdgeInsets.all(16),
|
|
itemCount: rutas.length,
|
|
separatorBuilder: (_, __) => const SizedBox(height: 8),
|
|
itemBuilder: (context, i) => _RouteTile(ruta: rutas[i]),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _RouteTile extends StatelessWidget {
|
|
final TruckRoute ruta;
|
|
|
|
const _RouteTile({required this.ruta});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Card(
|
|
child: ListTile(
|
|
leading: CircleAvatar(
|
|
backgroundColor: const Color(0xFF1B5E20).withOpacity(0.1),
|
|
child: Text(
|
|
ruta.routeId.replaceAll('RUTA-', ''),
|
|
style: const TextStyle(
|
|
color: Color(0xFF1B5E20),
|
|
fontWeight: FontWeight.w700,
|
|
fontSize: 12,
|
|
),
|
|
),
|
|
),
|
|
title: Text(
|
|
ruta.name,
|
|
style: const TextStyle(
|
|
fontWeight: FontWeight.w600,
|
|
fontSize: 14,
|
|
),
|
|
),
|
|
subtitle: Text(
|
|
'${ruta.positions.length - 1} paradas · Camión ${ruta.truckId}',
|
|
style: TextStyle(fontSize: 12, color: Colors.grey[600]),
|
|
),
|
|
trailing: _StatusBadge(status: ruta.status),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _StatusBadge extends StatelessWidget {
|
|
final String status;
|
|
|
|
const _StatusBadge({required this.status});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final (color, icon) = switch (status) {
|
|
'EN_RUTA' => (Colors.green, Icons.check_circle),
|
|
'AVERIADA' => (Colors.red, Icons.error),
|
|
'RETRASADA' => (Colors.orange, Icons.schedule),
|
|
_ => (Colors.grey, Icons.help_outline),
|
|
};
|
|
|
|
return Icon(icon, color: color, size: 20);
|
|
}
|
|
}
|