saveChanges function

Future<void> saveChanges(
  1. BuildContext context,
  2. Map<String, dynamic> individuo,
  3. Map<String, TextEditingController> controllers,
  4. GlobalKey<FormState> formKey
)

Implementation

Future<void> saveChanges(
    BuildContext context,
    Map<String, dynamic> individuo,
    Map<String, TextEditingController> controllers,
    GlobalKey<FormState> formKey) async {
  if (formKey.currentState!.validate()) {
    final updatedIndividuo = Map<String, dynamic>.from(individuo);
    final changedFields = <String, dynamic>{};

    // 1) Identificar los campos que han cambiado en el formulario
    controllers.forEach((key, controller) {
      if (controller.text != individuo[key]?.toString()) {
        updatedIndividuo[key] = controller.text;
        changedFields[key] = controller.text;
      }
    });

    // 2) Si no hay cambios, no hacer nada
    if (changedFields.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('No se han realizado cambios.')),
      );
      return;
    }

    print('Campos modificados: $changedFields');

    try {
      final dbHelper = DatabaseHelper();
      // 3) Guardar el individuo actualizado en la base de datos local
      await dbHelper.updateIndividuo(updatedIndividuo);
      print('Individuo actualizado en la base de datos local');

      // 4) Revisar la conexión a Internet
      var connectivityResult = await Connectivity().checkConnectivity();

      if (connectivityResult == ConnectivityResult.none) {
        // 5a) Sin conexión: guardar en pendientes
        await _handleOfflineUpdate(context, dbHelper, updatedIndividuo);
      } else {
        // 5b) Con conexión: enviar a la API
        await _handleOnlineUpdate(
            context, dbHelper, updatedIndividuo, changedFields);
      }

      // 6) Regresar a la pantalla anterior después de guardar
      Navigator.pop(context, true);
    } catch (error) {
      print('Error al actualizar el individuo: $error');
      await notificationHelper.sendNotification(
          'Error', 'Error al actualizar el individuo: $error');
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error al actualizar el individuo: $error')),
      );
    }
  }
}