Add diploma/certificate upload to professional request form (required field)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-29 10:50:42 -05:00
co-authored by Claude Sonnet 4.6
parent 3e59a1cb4f
commit 9f2612ec70
+41 -4
View File
@@ -72,6 +72,7 @@ class _FormBodyState extends State<_FormBody> {
bool _loading = false;
bool _cedulaError = false;
bool _cedulaNumError = false;
bool _certError = false;
bool _profError = false;
@override
@@ -92,22 +93,25 @@ class _FormBodyState extends State<_FormBody> {
}
}
bool _validate(String cedulaUrl) {
bool _validate(String cedulaUrl, String certUrl) {
final cErr = cedulaUrl.isEmpty;
final nErr = _cedulaNumCtrl.text.trim().isEmpty;
final dErr = certUrl.isEmpty;
final pErr = _selectedProfession == null || _selectedProfession!.isEmpty;
setState(() {
_cedulaError = cErr;
_cedulaNumError = nErr;
_certError = dErr;
_profError = pErr;
});
return !cErr && !nErr && !pErr;
return !cErr && !nErr && !dErr && !pErr;
}
Future<void> _submit() async {
final fp = context.read<ProfessionalFormProvider>();
final cedulaUrl = fp.profesional?.identificationPicture ?? '';
if (!_validate(cedulaUrl)) return;
final certUrl = fp.profesional?.certificatePicture ?? '';
if (!_validate(cedulaUrl, certUrl)) return;
setState(() => _loading = true);
try {
@@ -199,6 +203,8 @@ class _FormBodyState extends State<_FormBody> {
final cedulaUploaded =
(fp.profesional?.identificationPicture ?? '').isNotEmpty;
final certUploaded =
(fp.profesional?.certificatePicture ?? '').isNotEmpty;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
@@ -293,7 +299,38 @@ class _FormBodyState extends State<_FormBody> {
const SizedBox(height: 10),
// ── 2. Profesión (obligatorio) ──────────────────────────────────────
// ── 2. Diploma / Certificado (obligatorio) ─────────────────────────
_SectionCard(
cardBg: cardBg,
border: border,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_Label('Diploma o certificado profesional', Icons.school_outlined, required: true),
const SizedBox(height: 4),
Text(
'Sube el diploma, acta de grado o tarjeta profesional',
style: TextStyle(fontSize: 11, color: textSec),
),
const SizedBox(height: 10),
_UploadTile(
label: certUploaded ? 'Documento subido ✓' : 'Subir diploma / certificado (PDF o imagen)',
uploaded: certUploaded,
onTap: () => _pickAndUpload((b) => fp.uploadPdfCertificate(b, user.id)),
),
if (_certError)
const Padding(
padding: EdgeInsets.only(top: 8),
child: Text('Debes subir el diploma o certificado',
style: TextStyle(color: Colors.redAccent, fontSize: 12)),
),
],
),
),
const SizedBox(height: 10),
// ── 4. Profesión (obligatorio) ──────────────────────────────────────
_SectionCard(
cardBg: cardBg,
border: border,