Files
prosappweb/lib/providers/professionals_provider.dart
T
Lizandro GuarnizoandClaude Sonnet 4.6 387b647abc feat: mostrar dirección y distancia en cards de profesionales
- Agrega getters patientLat/patientLng al ProfessionalsProvider
- Calcula distancia Haversine entre la ubicación del paciente y el consultorio
  del profesional, mostrándola en azul (ej: "1.3 km" o "800 m") en la card
- Muestra la dirección del consultorio (icono de tienda) en ambos layouts:
  horizontal (compact) y vertical (grid)
- Distancia solo visible cuando el paciente tiene coordenadas registradas

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-22 08:32:49 -05:00

71 lines
2.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:prosapp_web_app/models/usuario_profesional.dart';
import 'package:prosapp_web_app/services/api_service.dart';
class ProfessionalsProvider extends ChangeNotifier {
List<UsuarioProfesional> professionals = [];
bool isLoading = true;
bool _initialized = false;
String? _currentUserId;
String? _locationCity;
double? _locationLat;
double? _locationLng;
String? _lastSearch;
final _api = ApiService.instance;
void updateCity(String? city, {String? userId}) {
// Reset state when a different user logs in (prevents cross-user data leak)
if (_currentUserId != userId) {
_currentUserId = userId;
_initialized = false;
_locationCity = null;
_locationLat = null;
_locationLng = null;
_lastSearch = null;
professionals = [];
}
if (!_initialized) {
_initialized = true;
_locationCity = city;
getProfessionals();
}
}
double? get patientLat => _locationLat;
double? get patientLng => _locationLng;
void setLocationContext({required String? city, required double lat, required double lng}) {
if (city != null && city.isNotEmpty) _locationCity = city;
_locationLat = lat;
_locationLng = lng;
getProfessionals(search: _lastSearch);
}
Future<void> getProfessionals({String? search}) async {
if (search != null) _lastSearch = search.trim().isEmpty ? null : search.trim();
isLoading = true;
notifyListeners();
try {
final params = <String, String>{};
if (_lastSearch != null && _lastSearch!.isNotEmpty) params['search'] = _lastSearch!;
if (_locationCity != null && _locationCity!.isNotEmpty) params['city'] = _locationCity!.trim();
if (_locationLat != null) params['lat'] = _locationLat.toString();
if (_locationLng != null) params['lng'] = _locationLng.toString();
final query = params.isEmpty
? ''
: '?${params.entries.map((e) => '${e.key}=${Uri.encodeComponent(e.value)}').join('&')}';
final res = await _api.get('/professionals$query');
final list = (res is Map ? res['data'] : res) as List;
professionals = list
.map((e) => UsuarioProfesional.fromDocument(e as Map<String, dynamic>))
.toList();
} catch (e) {
print('Error obteniendo profesionales: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
}