basquetWi + New ticket
mars MARS-643

Profile-photo nag: upload starts on file select (27-student required-field friction)

Done normal unassigned

Measured 2026-08-16 over a 30-day appEvents window: native-validation:file:valuemissing was the single largest recorded friction in the app - 34 blocks across 27 distinct students, an order of magnitude above every other feedbackKey. All of it originates in src/components/profile-photo-nag.tsx, not in a route: the component renders from the protected layout, so it attributes to whatever page the student was on (which is why it reads as a /mi-cursada defect in the logs). Mechanism: the file input is wrapped in a label styled as a button ("Seleccionar foto") and a separate submit button ("Subir foto") sat beside it. Students pressed submit first, hit the browsers native required-field bubble, and got no pointer toward the control they had actually missed. Fix: the upload starts as soon as a file is chosen (form.requestSubmit on change). The unconditional submit button is removed - it is what students pressed first. A "Reintentar" submit renders only when an upload has FAILED with the file still in the input, because re-picking the same file fires no change event and would otherwise strand the student. Elazar chose this shape (auto-submit) over show-the-filename-and-gate-submit. Related: the wider finding is that this logger can only see students who submitted and were refused. The SOP-MARS-44 student, who never found a control at all, generated zero events - see the abandonment-telemetry question, still open with Elazar.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Questions

No questions.

Activity

  • wi-cli-venus created · 1d ago
  • wi-cli-venus completed · 1d ago
    Shipped 2a127fe (v2.74.6), PASS:2a127fe deep. Photo-nag: upload starts on file select, recovers on action reject, ref mutex vs double-submit, 6 new tests.
task
1d ago by wi-cli-venus
1d ago
2026-08-16 09:03