uttrflow / uttrflow/uttrflow-swift
History rows have no copy, insert again, flag or delete, though Settings says history is kept so you can copy or re-insert
- Dominant language
- Swift
- Stars
- 4
- Forks
- 17
- Avg merge
- 3h 32m
- Merged PRs (30d)
- 277
Description
## What happens
The Dictation page covers today only, and says so: "Point at a row for copy, insert again, flag and more. Today stays here; everything older moves to History." (`Sources/UttrflowUX/MainDictationPresentation.swift:203-204`). Each of today's rows carries Copy, Insert Again, Flag and a Delete in its overflow menu (`:237-248`).
On History, where everything older goes, a row has no actions at all. `HistoryRow` is an id, an application, a relative time and the text (`Sources/UttrflowUX/HistoryPresentation.swift:27-44`), and `HistoryPageView.entry(_:)` draws those four things and nothing else (`Sources/Uttrflow/Main/HistoryPageView.swift:30-53`). The text is selectable, which is the only way to get it out.
So once a dictation is a day old:
- it cannot be copied with one click or inserted again;
- it cannot be flagged or unflagged;
- it cannot be deleted on its own. The only way to remove one is "Reset personalisation", which removes everything;
- Home's "See all" (`HomePresentation.swift:307`) leads to this page, and Home's own rows offer Copy, "everything else is on the page this row leads to" (`:466`), which is not true.
Privacy settings describe the retention period as "How long the finished text stays in your history, so you can copy or re-insert it" (`Sources/UttrflowUX/SettingsPresenter.swift:606-607`).
Two smaller things on the same page: each row shows only a relative time ("3 days ago") under a date heading, never the clock time the Dictation page shows, and a very long dictation is drawn in full with no line limit or expand control (`HistoryPageView.swift:44-47`), so one five-minute dictation fills the window.
## Why it matters
The main reason to keep dictations for 7 to 90 days is to get words back later: yesterday's email draft, last week's meeting notes. The page that holds them offers no way to act on them, and a dictation the user regrets (something private said by mistake) cannot be removed without wiping the whole history, dictionary and preferences.
## How to reproduce
Dictate something, change the Mac's clock forward a day (or wait), open History, and point at the row.
## Acceptance criteria
- History rows offer the same actions as Dictation rows: Copy, Insert Again, Flag, and Delete in the overflow menu, built by the same function so the two cannot drift (`DictationPresenter.row(for:in:locale:)` already builds them from a `HistoryEntry`).
- Delete from History removes the record and the clipboard copy, as `.forgetDictation` already does.
- Each row shows the clock time alongside or instead of the relative time.
- A long dictation is clamped to a few lines with a way to show all of it.
- `Tests/UttrflowUXTests/HistoryPresentationTests.swift` covers the actions on a row.
- Keyboard reachability follows whatever #554 settles for hover-revealed row actions.
Contributor guide
Research direction
Start with Sources/Uttrflow/Main/HistoryPageView.swift and Sources/UttrflowUX/HistoryPresentation.swift, then compare their row construction with DictationPresenter.row(for:in:locale:). Run Tests/UttrflowUXTests/HistoryPresentationTests.swift and use the reproduction steps to verify history actions, deletion, timestamps, long-text display, and keyboard reachability are covered.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- desktop
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100