Commit Graph
319 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Sonnet 4.6 aa2fde187a feat: rediseño UI/UX de vista de profesionales
- Grid responsivo (1-4 columnas según ancho)
- Tarjeta con header gradiente, avatar centrado superpuesto y badge de score
- Modo compacto (lista horizontal) en pantallas pequeñas
- Buscador en tiempo real por nombre, profesión o ciudad
- Chips de métodos de pago (Datáfono, Nequi, Transferencia)
- Dark mode completo, avatar con inicial como fallback
- Estado vacío con ícono y mensaje contextual

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:51:03 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7de1bed254 feat: UI/UX mejorado en servicios, historial, solicitar profesional y logo
- logo.dart: path correcto assets/prosapp-logo.png + errorBuilder
- services_view.dart: rediseño con tarjetas, dark mode, avatar con inicial, badges de estado
- services_history_view.dart: mismo rediseño + badges completado/cancelado/rechazado
- request_professional_view.dart: secciones con cards, botones de upload con estado visual,
  estados pending/rejected mejorados, dark mode completo

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:40:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 97d8535d54 fix: navbar hover gris (overlayColor) + soporte UI/UX mejorado + políticas en dialog
- Navbar: reemplaza hoverColor deprecated por IconButton.styleFrom(overlayColor)
- Support: rediseño completo con tarjetas, secciones y manejo correcto de URLs vacías
- Políticas/Términos: carga desde GET /settings/policies y muestra en dialog in-app

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:32:11 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d359974de5 fix: usar prosapp-logo.png local en sidebar en vez de Image.network
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:28:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b8b56c4aaa feat: filtrar profesionales por ciudad del usuario al cargar lista
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:26:47 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a2bcc8d86d feat: sugerencias como diálogo in-app con JWT en lugar de abrir browser
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:24:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4951f82621 fix: errores de compilación - rethusValidated requerido y refreshUser void
- professional_form_provider: agregar rethusValidated al constructor Profesional
- professional_provider: agregar rethusCode y rethusValidated al fallback del constructor
- profile_view: quitar await de refreshUser() que retorna void

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 18:40:28 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 dd3053d3b3 fix: formularios de auth con card blanca y colores con contraste correcto
- PhoneLoginView y LoginView: form envuelto en Card con sombra (blanca en claro, oscura en noche)
- Títulos: Color(0xFF0F172A) en claro, blanco en noche - siempre visible
- Subtítulos: Color(0xFF64748B) en claro (contraste 4.5:1+) vs Colors.grey anterior
- Inputs: fillColor, textColor y borderColor explícitos por tema
- AuthLayout desktop: fondo usa scaffoldBackgroundColor del tema

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 18:37:14 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 35599276ed fix: auth pages visibles en modo oscuro y claro
- AuthLayout desktop: fondo usa scaffoldBackgroundColor en vez de Colors.white fijo
- PhoneLoginView y LoginView: todos los textos, inputs y bordes usan colores tema-aware
  (titulos, subtítulos, fillColor, borderColor se adaptan a modo día/noche)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 18:33:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7434bc8644 fix: hover navbar, soporte sin spinner, RETHUS en formulario profesional
- Navbar: hoverColor tenue por tema (azul/blanco) en vez del gris por defecto de Flutter web
- SettingsProvider: lazy:false + timeout 10s para evitar spinner gris permanente en soporte
- SupportView: muestra contenido con defaults inmediatamente sin bloquear en isLoading
- Modelo Profesional: campos rethus_code y rethus_validated
- ProfessionalFormProvider: soporte para rethus_code en copyProfesionalWith
- RequestProfessionalView: campo RETHUS opcional en formulario + fix color dropdown profesión

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 18:23:30 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 efbdaf2dbe fix: perfil - inicializacion correcta, ciudad con key, correo siempre visible
- ProfileView vuelve a StatefulWidget para inicializar ProfileFormProvider
- Quitar import custom_inputs.dart sin usar
- DropdownButtonFormField con ValueKey para forzar rebuild cuando cargan ciudades
- Normalizacion de acentos en ciudad (cucuta == cucuta con/sin tilde)
- _EmailCard siempre muestra el formulario (no requiere expandir)
- Eliminado campo email read-only del formulario principal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 10:10:38 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 aeeeeb47fb fix: soporte siempre visible + perfil mejorado
- Setting: lee support_title/description/days/hours/email/phone
- SettingsProvider: fallback a Setting vacio si no hay datos en DB
- SupportView: guard para settings null
- Avatar: ui-avatars.com como imagen por defecto (con nombre)
- Perfil: seccion correo como ExpansionTile (acordeon)
  paso 1: email+contrasena+confirmar → Enviar codigo
  paso 2: ingresar codigo de 6 digitos → Verificar (verde)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 09:53:38 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8372e19d9f fix: soporte visible + perfil con vinculacion de correo
- Setting.fromDocument con valores por defecto (null-safe)
- SettingsProvider crea Setting vacio si el backend falla
- support_view: guard para settings null
- profile_view: seccion 'Acceso con correo' con toggle,
  campos email/password/confirmar, envia OTP, verifica codigo

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 09:34:39 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 bfa494b7fe feat: pedir nombre al primer login + avatar con iniciales
- Detectar usuario nuevo (nombre == telefono) y redirigir
  a pantalla setup-name antes del dashboard
- SetupNameView: bienvenida con campo de nombre obligatorio
- AuthProvider.updateName() para guardar via PATCH /users/me
- NavbarAvatar: iniciales con color por inicial del nombre
  en lugar de no-image.jpg cuando no hay foto
- Perfil: mismo avatar de iniciales en la pantalla de perfil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 09:29:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7349d4e3fd fix: perfil - dropdown ciudad con todas las opciones
- WhiteCard usa Theme.cardColor en lugar de Colors.white fijo
- Dropdown ciudad: normaliza valor guardado vs lista (evita mismatch)
- Muestra spinner mientras cargan las ciudades
- Texto de items adapta color segun el tema (isDark)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 09:22:10 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 fac4135835 fix: navbar StatefulWidget + dashboard colores dinamicos
- Navbar: convertir a StatefulWidget, un solo nivel de build,
  usa context.watch en lugar de Consumer anidados
- Iconos sol/luna y campana siempre visibles con color explicito
- Dashboard: barra busqueda, sugerencias y tarjeta inferior
  ahora respetan isDark (cardBg, textColor, etc.)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 09:16:31 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8aa03f437c fix: simplificar navbar, iconos siempre visibles
- Quitar AnimatedSwitcher/RotationTransition que ocultaba los iconos
- Icono sol/luna y campana con InkWell simple y colores explicitos
- Fondo navbar animado segun tema (isDark)
- DashboardLayout usa scaffoldBackgroundColor del tema

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 08:48:55 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6f39bbf9e2 fix: mover toggle dia/noche al navbar como icono
- Icono sol/luna con animacion de rotacion en navbar
- Navbar cambia color segun el tema (animado)
- Quitar toggle del sidebar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 08:41:27 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9c61a35747 feat: validacion ciudad disponible en dashboard
- 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>
2026-06-27 08:38:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 842a67cdea feat: modo dia/noche y campana de notificaciones
- 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>
2026-06-27 08:36:53 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 76c05a5820 fix: logo prosapp mas grande y visible en sidebar con loadingBuilder
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 08:34:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d5be8d6f6b fix: autocompletado de direcciones
- 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>
2026-06-27 08:33:19 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1fd29bbfdd fix: getFormatTime retorna String? — agregar fallback vacio
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 08:25:29 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9cde46b88a fix: resolver conflicto ServiceStatus y tipo nullable en dashboard
- 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>
2026-06-27 08:23:36 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e56807b75e feat: rediseño dashboard estilo InDrive con mapa completo
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>
2026-06-27 08:18:02 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4a2588f6f2 feat: load Google Maps key dynamically from backend
- 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>
2026-06-27 07:59:40 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 863546f0fc feat: Google Maps location picker in dashboard
- 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>
2026-06-27 07:52:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 77f44ac43a feat: redesign sidebar with corporate branding and ProsApp logo
- 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>
2026-06-27 07:40:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c8e5d481ed fix: handle null city for phone-registered users in dashboard
user.city is null for users registered via OTP — null assertion caused
crash showing grey DashboardLayout background.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 07:37:48 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f60e268375 fix: remove duplicate AuthLayout wrapping in admin_handlers
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>
2026-06-25 18:54:43 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 014d20604f fix: remove tagline from splash to avoid duplicate text during fade
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 17:31:11 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c52745107e feat: add splash screen and remove unused scripts from index.html
- Add full-screen gradient splash (blue #42A4EF → #1565C0) with logo
  and spinner shown while Flutter engine loads
- Fade out splash on flutter-first-frame event (smooth 300ms transition)
- Remove unused Firebase and reCAPTCHA scripts that slowed initial load
- Set body background-color to match splash so no white flash at any point
- Update title/description to ProsApp branding

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 17:19:52 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2688aa94c9 fix: logo not showing and duplicate ProsApp text in auth layout
- 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>
2026-06-25 17:17:49 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1ae5b72ed7 fix: wrap auth views in AuthLayout and remove duplicate logo from PhoneLoginView
- admin_handlers: wrap PhoneLoginView, LoginView, RegisterView in AuthLayout
  so the gradient split panel / header renders correctly
- phone_login_view: remove standalone logo block (AuthLayout provides it)
  and remove unused phone_form_provider import

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 17:09:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 bf3c380e8e feat: redesign auth layout and login view with ProsApp logo
- auth_layout: gradient header (mobile) / split panel (desktop)
- background_auth: gradient blue with network logo, tagline and feature list
- custom_title: network logo replacing local asset
- login_view: consistent UI matching phone_login_view (inputs, buttons,
  links to register/phone login, brand colors)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 17:02:03 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 cc18246e1f feat: SMS OTP auth + phone verification gate + improved login UI
- Usuario model: add isPhoneVerified field from is_phone_verified
- auth_provider.dart: fix access_token key, add _navigateAfterAuth gate
  (redirects to phoneLoginRoute if phone not verified), add verifyPhoneNumber,
  signInWithOTP, verifyPhoneNumberForLink, linkPhoneWithOTP methods
- phone_login_view.dart: full rewrite with logo, +57 prefix, two-step OTP flow
  (phone input → code input), 60s resend timer, email login fallback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 15:54:15 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f941270bd9 feat: implement SMS OTP auth and fix access_token key
- verifyPhoneNumber / verifyPhoneNumberForLink: call POST /auth/send-otp
- signInWithOTP: pass code to POST /auth/phone, use access_token key
- linkPhoneWithOTP: pass code to POST /auth/verify-phone
- login / register: fix token key data['token'] → data['access_token']

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 15:26:47 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a4a6099722 fix: runtime fixes for service model and paginated responses
- 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>
2026-06-18 16:20:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 0ecca498ad fix: align Flutter endpoints and model parsing with actual NestJS backend
- Auth: phone login → POST /auth/phone (direct, no OTP); link phone → POST /auth/verify-phone; add email → POST /auth/link-email
- Services: replace query-param paths with dedicated role endpoints (/services/me, /services/professional/requests, /services/professional, etc.)
- Services: PATCH /services/:id → PATCH /services/:id/status
- Calendar: → GET /services/professional/calendar
- Professionals: /users/professionals → /professionals (handles {data:[...]} response)
- Professional info: /professional-info/:id → /professionals/:id; PATCH → /professionals/me
- Comments: /comments?... → /comments/user/:id and /comments/professional/:id
- Chat: /chats → /chat; start chat → POST /chat/start/:professionalId; poll GET /chat/:chatId/messages; send → POST /chat/:chatId/message
- Cities: /cities → GET /locations/countries (parse nested countries→regions→cities)
- Profesional.fromDocument: null-safe fields; convert schedules array→Schedules, specializations array→name/picture lists, payment_methods object/array
- Usuario.fromDocument: null-safe professional_state and id
- UsuarioProfesional.fromDocument: handle backend format (users nested, professional at top level)
- ScheduleEntity.parseTime: handle ISO8601 time strings from backend
- MessageEntity.fromDocument: accept sender_id (backend) or owner_id (legacy)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 16:07:44 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 60216fd0e3 feat: migrate Firebase → NestJS REST API backend
Replace all Firebase SDK (Auth, Firestore, Storage) with HTTP calls
to backend.prosapp.co/api/v1:

- New ApiService singleton (JWT token, GET/POST/PATCH/DELETE/upload)
- auth_provider: Firebase Auth → /auth/login, /auth/register, /auth/phone/*
- services_provider + calendar_services_provider → /services endpoints
- professional_provider + professionals_provider → /professional-info, /users/professionals
- profile_form_provider + professional_form_provider → /users/me, /storage/upload
- cities/professions/settings providers → /cities, /professions, /settings
- firebase_chat_repository → polling via /chats endpoints (3s interval)
- firebase_score_repository → polling via /comments endpoints (10s interval)
- professional_detail_provider → /users/:id + /professional-info/:id
- dashboard_view: Firestore.add → POST /services
- chat_view + rating_view: FirebaseAuth.uid → AuthProvider.user.id
- Models: Timestamp → String for createdAt fields
- google_fonts upgraded to ^8.1.0 (Dart 3.12 compat)
- Remove firebase_core, firebase_auth, cloud_firestore, firebase_storage from pubspec

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 15:53:39 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 15175c1b91 replace: swap prosappweb content for prosapp_web_app (more complete version)
prosapp_web_app has chat, dashboard, calendar, support, 13 providers and
Fluro URL routing. Keep Dockerfile + nginx.conf from previous prosappweb.
Upgrade google_fonts 6.2.1 → 8.1.0 (Dart 3.12 compat fix).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 15:26:32 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 74a4f41902 fix: redirect favicon.ico to favicon.png in nginx
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 14:52:57 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 309f250d47 fix: remove font_awesome_flutter (incompatible with Dart 3.12)
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>
2026-06-18 14:44:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 eb01e96e5d fix: remove get package, upgrade Flutter 3.44 compat deps
- Remove `get` package (incompatible with Flutter 3.44/Dart 3.12 due to
  removed ThemeData.backgroundColor and final IconData class)
- Replace GetMaterialApp → MaterialApp with GlobalKey navigatorKey
- Convert AuthenticationRepository and all 7 controllers from
  GetxController to plain singletons
- Replace Get.snackbar/offAll/to/back/defaultDialog with app_navigator
  helpers and native Flutter APIs
- Add ApiService.baseUrl static + parseJson method
- Add UserModel.getUser static method
- Add UserProvider.score via ScoresModel API
- Fix user?.photo → user?.picture in drawer_menu, service_after
- Fix logout(uid!) → logout() in drawer_menu
- Fix photo_view_web.dart missing dart:typed_data import
- Remove getCoordsOfCity call from ubicacion.dart
- Fix UserModel.getUser?.name null-safety in map/service.dart
- Upgrade: google_maps_flutter ^2.9.0, url_launcher ^6.3.0,
  font_awesome_flutter ^10.8.0, image_picker ^1.1.2

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 14:33:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 33ee7ea2f4 fix: resolve web build failures
- 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>
2026-06-18 13:30:37 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 5f9da1eefe feat: add Dockerfile + nginx config for Coolify deployment
Multi-stage build: Flutter stable builds web release, nginx:alpine serves it.
nginx.conf handles SPA routing (all paths → index.html) and caches assets.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 12:58:53 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b9a034f37f fix: replace user.state string checks with user.proState int in drawer_menu
user.state (Spanish string) no longer exists — UserModel uses proState (int)
from backend pro_state field: 0=inactive, 1=pending, 2=active, 3=denied.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 12:22:27 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9be1c3b678 fix: update status string comparisons in service list screens to English
_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>
2026-06-18 12:20:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 dc99169ef1 fix: correct remaining route mismatches and Spanish status strings in prosappweb
- 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>
2026-06-18 12:16:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ce11aa813e fix: align route DTOs and field names with NestJS backend
- event_model: snake_case fields, status translation map (es→en), public-calendar route
- chat_model: both roles use GET /chat/my (JWT identifies user)
- score: correct POST /comments DTO (destination_id, service_id, content, score, is_from_user)
- horario: PATCH /professionals/me/schedules with array format instead of /users/me

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 12:09:42 -05:00