Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Done

- **What was built**: The watchOS "No Reminders" empty state no longer shows the
default "No reminders yet" caption. The caption now renders only when
`hasHidden` is true, keeping the "Nothing due right now" hidden-reminders
variant, and preserving the title and Refresh button. `SharedStrings.noRemindersYet`
and `Localizable.xcstrings` are untouched; the widget's usage still compiles.
- **Commit SHA(s)**: `7c2dae19c13641152876f73d45b549be5b5cc420` (watch empty-state
change), `2b3386f7` (chore: remove DELETEME bootstrap marker). Both pushed.
- **Verification**: `make format`, `make lint` (0 violations), `make watch-build`
(`** BUILD SUCCEEDED **`), `make watch-test` (`** TEST SUCCEEDED **`, watch
unit tests on Apple Watch Series 11 (46mm)). No new unit test required: recon
found no test anywhere references `noRemindersYet`, `nothingDueRightNow`,
"No reminders yet", `emptyStateTitle`, or `noRemindersState`.
- **Reviewer findings**: The `reviewer` child timed out after 30 min in a
degenerate repetition loop; its partial output had no blockers ("The change is
correct. … default 'No reminders yet' caption is removed. Title and Refresh
button preserved."). The parent then completed the review pass itself:
verified `noRemindersState(hasHidden:)` (WatchReminderView.swift:227-238), the
`.empty(hasHidden)` call site (:104), that the watch view no longer references
`noRemindersYet`, and that `SingleThreadWidget/NextThingWidget.swift:126` still
uses both shared strings. No blockers; no nits requiring action. No files were
changed by the reviewer.
- **Remaining manual items**: Visual check of the two watch previews
(`#Preview("No Reminders")`, `#Preview("Nothing Due")`) on-device/simulator;
`VStack(spacing: 6)` was left unchanged since the remaining title + Refresh
stack shows no obvious gap. Full `./scripts/test.sh` gate was intentionally not
run (SMALL task: targeted verify only).
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Task

Improve the watchOS "No Reminders" empty state (VAR-1133). Today the watch empty
state renders three things stacked vertically:

- the title "No Reminders"
- a caption line that reads either "No reminders yet" (default) or
"Nothing due right now" (when reminders are hidden/skipped)
- a "Refresh" button

Remove the "No reminders yet" caption text from the watch screen. Keep the title
and the Refresh button. Preserve the hidden-reminders variant ("Nothing due
right now") unless removing the whole caption line is the cleaner, obviously
intended reading — the ticket only names "No reminders yet", so the safest
minimal change is to drop the default caption while keeping the "nothing due"
message when reminders are hidden. Note that `SharedStrings.noRemindersYet` is
also used by `SingleThreadWidget/NextThingWidget.swift`, so do not delete or
change the shared string itself; only the watch view's usage of it.

Verify the resulting watch empty-state layout still looks correct (spacing in
the `VStack`), adjust spacing only if the removal leaves an obvious gap, and run
the project gate (format, lint, relevant watch build/tests). Since this is a
pure view-copy change, a new unit test is not required unless existing copy
tests assert on the removed string.

## Why SMALL

A. Single view file (`SingleThreadWatch/WatchReminderView.swift`, one `VStack`
in `noRemindersState`), no new pattern.
B. No unknowns; the exact line and shared string usage are already located.
C. No schema/migration.
D. No new subsystem/shared-convention change; the shared localization resource
is intentionally left untouched because the widget still uses it.
E. No design decision or human sign-off.
F. No new test surface — existing empty-state tests do not reference this string.

## Key files

- `SingleThreadWatch/WatchReminderView.swift` — `noRemindersState(hasHidden:)`
(~line 228) renders the title, the caption, and `refreshButton`.
- `SingleThreadCore/Sources/SingleThreadCore/LocalizedString+Shared.swift` —
`SharedStrings.noRemindersYet` (~line 101) is shared with the widget; leave it.
- `SingleThreadWidget/NextThingWidget.swift:~126` — other consumer of
`noRemindersYet`; must keep working.
- `SingleThreadCore/Sources/SingleThreadCore/Resources/Localizable.xcstrings` —
"No reminders yet" entry stays because the widget still uses it.
- `SingleThreadWatch/WatchReminderView.swift:436` — `#Preview("No Reminders")`
for manual visual check.
10 changes: 6 additions & 4 deletions SingleThreadWatch/WatchReminderView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -229,10 +229,12 @@ struct WatchReminderView: View {
Text(SharedStrings.noReminders)
.foregroundStyle(.secondary)
.accessibilityIdentifier("emptyStateTitle")
Text(hasHidden ? SharedStrings.nothingDueRightNow : SharedStrings.noRemindersYet)
.font(.caption2)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
if hasHidden {
Text(SharedStrings.nothingDueRightNow)
.font(.caption2)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
}
refreshButton
}
}
Expand Down