Files
hackathon-innovaflow5.0-cdf…/recolecta_app/lib/features/addresses/colonias_selector.dart

121 lines
3.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/models/colonia.dart';
import 'colonias_provider.dart';
class ColoniasSelector extends ConsumerWidget {
const ColoniasSelector({
super.key,
required this.onChanged,
this.initialValue,
this.labelText = 'Colonia',
});
final ValueChanged<Colonia> onChanged;
final Colonia? initialValue;
final String labelText;
@override
Widget build(BuildContext context, WidgetRef ref) {
final coloniasAsync = ref.watch(coloniasProvider);
return coloniasAsync.when(
loading: () => const Card(
child: Padding(
padding: EdgeInsets.all(16),
child: Row(
children: [
SizedBox(
width: 18,
height: 18,
child: CircularProgressIndicator(strokeWidth: 2),
),
SizedBox(width: 12),
Text('Cargando colonias...'),
],
),
),
),
error: (error, stackTrace) => _StateCard(
icon: Icons.error_outline,
title: 'No se pudieron cargar las colonias',
message: error.toString(),
actionLabel: 'Reintentar',
onAction: () => ref.invalidate(coloniasProvider),
),
data: (colonias) {
if (colonias.isEmpty) {
return const _StateCard(
icon: Icons.inbox_outlined,
title: 'Sin colonias disponibles',
message: 'El backend no devolvió colonias todavía.',
);
}
return DropdownButtonFormField<Colonia>(
value: initialValue,
decoration: InputDecoration(labelText: labelText),
items: colonias
.map(
(colonia) => DropdownMenuItem<Colonia>(
value: colonia,
child: Text(
colonia.horarioEstimado == null ||
colonia.horarioEstimado!.isEmpty
? colonia.nombre
: '${colonia.nombre} · ${colonia.horarioEstimado}',
),
),
)
.toList(growable: false),
onChanged: (value) {
if (value != null) {
onChanged(value);
}
},
);
},
);
}
}
class _StateCard extends StatelessWidget {
const _StateCard({
required this.icon,
required this.title,
required this.message,
this.actionLabel,
this.onAction,
});
final IconData icon;
final String title;
final String message;
final String? actionLabel;
final VoidCallback? onAction;
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(icon),
const SizedBox(height: 12),
Text(title, style: Theme.of(context).textTheme.titleMedium),
const SizedBox(height: 6),
Text(message),
if (actionLabel != null && onAction != null) ...[
const SizedBox(height: 12),
TextButton(onPressed: onAction, child: Text(actionLabel!)),
],
],
),
),
);
}
}