Summary
When an account has no active medications, the iOS app exposes two different medication-logging entry points that both lead to dead ends, use inconsistent terminology, and do not offer the only useful next action: adding a medication.
Affected client
- HealthLog iOS/TestFlight
- Observed with HealthLog-iOS
0.17.0
- Self-hosted server connected and otherwise healthy
Reproduction
Use an account with no active medications.
Path 1: Log a dose
- Open the general Log flow.
- Choose the medication/dose option.
- The app opens a sheet titled
Log a dose.
Actual result:
- The screen says
No active medications to log against.
- The sheet is mostly empty.
- Both a back button and a
Cancel button are shown.
- The primary
Log button is disabled.
- There is no
Add medication action.
Path 2: Log an intake
- Open the medication intake flow from the medication-related surface.
- The app opens a sheet titled
Log an intake.
Actual result:
- The screen says
No pending intake.
- It adds
Nothing scheduled is due right now. Head back and check in later.
Log manually appears disabled.
- There is no
Add medication action.
Why this is inconsistent
The server model legitimately distinguishes:
- an active medication that can receive a manual intake; and
- a scheduled intake that is currently due.
However, when the account has no active medications at all, the second screen's message is misleading: nothing will become due by checking again later. Both screens become dead ends, while using dose and intake for nearly identical user intent.
Expected behavior
The empty state should depend on account state:
-
No active medications
- Show one clear empty state:
No active medications.
- Offer
Add medication as the primary action.
- Use one close/cancel affordance, not both back and cancel.
-
Active medications exist, but none is due
- Show
No dose due right now.
- Keep
Log manually enabled so the user can select an active medication.
-
A scheduled intake is due
- Show the due-intake action flow.
-
Manual logging opened directly
- Show the active-medication selector immediately.
Terminology should be consistent across both paths, or the distinction between a scheduled intake and a manually logged dose should be made explicit.
Suggested implementation
- Resolve active-medication count before choosing the empty state.
- Route the no-active-medication state to a shared component with an
Add medication deep link.
- Reserve
No pending intake for accounts that actually have active scheduled medications but no currently due slot.
- Keep manual logging available whenever at least one active medication exists, regardless of whether a slot is due.
- Remove duplicate dismissal controls from the empty form.
Regression tests
- No active medications →
Add medication is shown; no misleading check in later copy.
- Active as-needed medication, nothing scheduled → manual logging is available.
- Active scheduled medication, none due → manual logging remains available.
- Scheduled medication due → pending-intake flow is shown.
- Empty manual form uses a single dismissal affordance.
Evidence
Screenshots from the same account state show the two inconsistent empty flows:
Log a dose → No active medications to log against.
Log an intake → No pending intake / check in later, with disabled Log manually.
Summary
When an account has no active medications, the iOS app exposes two different medication-logging entry points that both lead to dead ends, use inconsistent terminology, and do not offer the only useful next action: adding a medication.
Affected client
0.17.0Reproduction
Use an account with no active medications.
Path 1: Log a dose
Log a dose.Actual result:
No active medications to log against.Cancelbutton are shown.Logbutton is disabled.Add medicationaction.Path 2: Log an intake
Log an intake.Actual result:
No pending intake.Nothing scheduled is due right now. Head back and check in later.Log manuallyappears disabled.Add medicationaction.Why this is inconsistent
The server model legitimately distinguishes:
However, when the account has no active medications at all, the second screen's message is misleading: nothing will become due by checking again later. Both screens become dead ends, while using
doseandintakefor nearly identical user intent.Expected behavior
The empty state should depend on account state:
No active medications
No active medications.Add medicationas the primary action.Active medications exist, but none is due
No dose due right now.Log manuallyenabled so the user can select an active medication.A scheduled intake is due
Manual logging opened directly
Terminology should be consistent across both paths, or the distinction between a scheduled intake and a manually logged dose should be made explicit.
Suggested implementation
Add medicationdeep link.No pending intakefor accounts that actually have active scheduled medications but no currently due slot.Regression tests
Add medicationis shown; no misleadingcheck in latercopy.Evidence
Screenshots from the same account state show the two inconsistent empty flows:
Log a dose→No active medications to log against.Log an intake→No pending intake/check in later, with disabledLog manually.