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>
This commit is contained in:
Lizandro Guarnizo
2026-06-27 09:34:39 -05:00
co-authored by Claude Sonnet 4.6
parent bfa494b7fe
commit 8372e19d9f
4 changed files with 341 additions and 55 deletions
+28 -43
View File
@@ -39,50 +39,35 @@ class Setting {
required this.terminosCondicionesBody,
});
static Setting fromDocument(Map<String, dynamic> doc) {
return Setting(
tarifas: doc['tarifas'] as bool,
domicilios: doc['domicilios'] as bool,
google: doc['google'] as bool,
versionIos: doc['version_ios'] as String,
versionAndroid: doc['version_android'] as String,
horaNotificacion: doc['hora_notificacion'] as String,
tituloSoporte: doc['titulo_soporte'] as String,
parrafoSoporte: doc['parrafo_soporte'] as String,
numeroSoporte: doc['numero_soporte'] as String,
emailSoporte: doc['email_soporte'] as String,
diasSoporte: doc['dias_soporte'] as String,
horasSoporte: doc['horas_soporte'] as String,
politicasPrivacidad: doc['politicas_privacidad'] as String,
politicasPrivacidadTitle: doc['politicas_privacidad_title'] as String,
politicasPrivacidadBody: doc['politicas_privacidad_body'] as String,
terminosCondiciones: doc['terminos_condiciones'] as String,
terminosCondicionesTitle: doc['terminos_condiciones_title'] as String,
terminosCondicionesBody: doc['terminos_condiciones_body'] as String,
);
static bool _b(dynamic v, [bool d = false]) {
if (v == null) return d;
if (v is bool) return v;
return v.toString() == 'true';
}
@override
String toString() {
return '''Setting {
tarifas: $tarifas
domicilios: $domicilios
google: $google
versionIos: $versionIos
versionAndroid: $versionAndroid
horaNotificacion: $horaNotificacion
tituloSoporte: $tituloSoporte
parrafoSoporte: $parrafoSoporte
numeroSoporte: $numeroSoporte
emailSoporte: $emailSoporte
diasSoporte: $diasSoporte
horasSoporte: $horasSoporte
politicasPrivacidad: $politicasPrivacidad
politicasPrivacidadTitle: $politicasPrivacidadTitle
politicasPrivacidadBody: $politicasPrivacidadBody
terminosCondiciones: $terminosCondiciones
terminosCondicionesTitle: $terminosCondicionesTitle
terminosCondicionesBody: $terminosCondicionesBody
}''';
static String _s(dynamic v, [String d = '']) => v?.toString() ?? d;
static Setting fromDocument(Map<String, dynamic> doc) {
return Setting(
tarifas: _b(doc['tarifas']),
domicilios: _b(doc['domicilios']),
google: _b(doc['google']),
versionIos: _s(doc['version_ios']),
versionAndroid: _s(doc['version_android']),
horaNotificacion: _s(doc['hora_notificacion']),
tituloSoporte: _s(doc['titulo_soporte'], 'Soporte ProsApp'),
parrafoSoporte: _s(doc['parrafo_soporte'],
'Estamos aquí para ayudarte. Contáctanos por cualquiera de estos canales.'),
numeroSoporte: _s(doc['numero_soporte'] ?? doc['support_phone']),
emailSoporte: _s(doc['email_soporte'] ?? doc['support_email']),
diasSoporte: _s(doc['dias_soporte'] ?? doc['support_days'], 'Lunes a Viernes'),
horasSoporte: _s(doc['horas_soporte'] ?? doc['support_hours'], '8:00 am - 6:00 pm'),
politicasPrivacidad: _s(doc['politicas_privacidad']),
politicasPrivacidadTitle: _s(doc['politicas_privacidad_title']),
politicasPrivacidadBody: _s(doc['politicas_privacidad_body']),
terminosCondiciones: _s(doc['terminos_condiciones']),
terminosCondicionesTitle: _s(doc['terminos_condiciones_title']),
terminosCondicionesBody: _s(doc['terminos_condiciones_body']),
);
}
}