- CitiesProvider.isCityAvailable() y findMatchingCity() con comparacion flexible
- Al mover el mapa extrae la ciudad del geocodificado inverso
- Si la ciudad no esta en la lista muestra aviso amarillo y bloquea solicitud
- Boton de solicitar deshabilitado cuando ciudad no esta disponible
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ThemeProvider con persistencia en SharedPreferences
- Toggle animado en sidebar (sol/luna con switch visual)
- Temas light y dark completos en MaterialApp
- Campana en navbar con badge rojo y panel inferior de notificaciones
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Quitar replaceAll(' ', '_') que rompia la query
- Pasar coordenadas actuales del mapa como location bias
- Soportar formatted_address y description en respuesta
- Manejar results o predictions como clave raiz
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- hide ServiceStatus de geolocator para evitar conflicto con modelo propio
- usar _selectedHour! en getFormatTime (ya esta guardado por null-check previo)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mapa ocupa toda la pantalla, pin central fijo, barra de busqueda
flotante con autocomplete, tarjeta inferior para profesional/fecha.
Al mover el mapa hace geocodificacion inversa y actualiza la direccion.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- MapsService: obtiene la key via API e inyecta el script Maps JS en runtime
- LocationPickerDialog: muestra error descriptivo si la key no esta configurada
- index.html: eliminado script estatico de Maps
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- LocationPickerDialog: detecta ubicación del dispositivo, pin draggable,
reverse geocoding para obtener dirección y ciudad
- Dashboard: campo de dirección abre el mapa al tocar
- index.html: carga Maps JS API (key pendiente de configurar)
- pubspec: google_maps_flutter + geolocator
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Logo: network image in white card + tagline
- Sidebar: deep navy gradient (#0D1B3E) with blue accent active states
- MenuItem: left accent bar indicator, cleaner hover, better contrast
- Mode toggle: gradient button matching brand colors
- TextSeparator: uppercase label with divider line
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main.dart builder already wraps unauthenticated routes in AuthLayout.
Wrapping again in handlers caused double login screen on all viewports.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Put logo inside white container on gradient so colors are correct
- Remove BlendMode.srcATop which was making logo invisible on gradient
- Simplify auth_layout mobile/desktop branches
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Service.fromJson: string status/location enums, ISO8601 time parsing, additional_address field name
- _loadServices: unwrap {data:[...]} paginated response; extract embedded user from response instead of extra API calls
- calendar_services_provider: same response unwrap; fallback user when not embedded
- Add ProState import where needed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace FaIcon(FontAwesomeIcons.google) with plain Text widget.
Remove font_awesome_flutter from pubspec — package extends final
class IconData which is forbidden in Dart 3.12/Flutter 3.44.
Fix currentUser.value → currentUser (was Rx<UserModel?>, now UserModel?).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Update SDK constraint to >=3.0.0 <4.0.0 (Flutter stable uses Dart 3.x)
- Remove flutter_email_sender (no web support) — replace with mailto: via url_launcher
- support.dart: unified _sendEmail works on both web and mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_statusIcon switch cases and tileColor checks were comparing against Spanish
status strings (aprobado/iniciado/terminado/denegado); backend returns English
(accepted/active/completed/cancelled/denied) so they always fell to default.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- solicitudes: GET /services/professional/requests (not query params)
- my_services: GET /services/me with paginated response handling
- my_services_pro: GET /services/professional with paginated response handling
- professional: handle paginated GET /professionals response
- cita: PATCH /services/:id/status (not /services/:id); translate all Spanish
status comparisons (pendiente/aprobado/iniciado/terminado) to backend English
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace Firebase Auth with JWT stored in SharedPreferences
- Replace Firestore with REST API calls via new ApiService
- Replace Firebase Storage with POST /storage/upload
- Remove firebase_auth, firebase_core, cloud_firestore,
firebase_storage, firebase_messaging, google_sign_in deps
- Add api_service.dart as central HTTP client
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>