Skip to content

History - #60

Merged
arun279 merged 9 commits into
feat/expo-nativefrom
feat/screens-history
Sep 19, 2026
Merged

arun279 merged 9 commits into
feat/expo-nativefrom
feat/screens-history

Conversation

@arun279

@arun279 arun279 commented Sep 19, 2026

Copy link
Copy Markdown
Owner

+1127 / -71, net 1056
Product-Growth: Product +626 / -57, net +569; reuses core reads, grouping, removal/Undo and native UI; adds History composition, item collapse, the month panel and account detail routes.
Binary-Size: JavaScript only; no native change

Replaces the account History stub with day-grouped watch history, play totals, title and medium filters, paging with explicit error recovery, and a one-step month panel. Same-item plays collapse per day; removal takes the newest play and states the loaded remainder. Undo waits for that removal and is silent on success.

Reuses the paged core query, local-day grouping, outcome-aware removal hook, account snackbar host, Calendar skeleton, pull-to-refresh, SyncStrip, tokens and native row/menu controls. The item-collapse model adapts the previous web implementation. Existing episode and movie routes are re-exported inside the account stack. The fake history endpoint now applies month bounds before paging; its seed is unchanged.

The History Maestro flow opens the account area from Up Next, checks the first day and row, removes a play, uses Undo above the account modal, checks the restored day total, filters to no match and clears, then chooses a month. It is included in the iOS suite and waits for animation completion before capturing its screenshot.

Validation: root pnpm check passed, including 811 core tests, 422 native tests and both platform exports. Reassure passed all 6 measurements; the History row rendered exactly twice in each of 10 runs. An explicit baseline admits this new scenario while preserving exact base-branch count comparisons; gate tests cover accepted, regressed, missing and unknown scenarios. No simulator or emulator was available locally. Product growth is above the approximate 450-line target. The Calendar skeleton retains its existing poster dimensions, and the visible row overflow needs a narrow-screen visual check.

CI status: all executed checks except native-ios passed. The final iOS attempt passed search dismissal, then failed to find history-jump-sheet. Its screenshot shows the fully rendered sheet, while the captured accessibility hierarchy has no sheet controls. This accessibility/visibility issue and month selection remain unresolved. Three CI cycles were used, including one failed-job rerun after a shared sign-in assertion.

Screenshots follow from a simulator and emulator pass

@arun279

arun279 commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

Local verification passed: pnpm check, 811 core tests, 422 native tests, both platform exports, and all 6 Reassure measurements. History measured exactly 2 renders across 10 runs. The iOS History flow now covers the account-modal snackbar and Undo. Device results and screenshots are pending CI. Product growth is net +545 lines; no native dependency changes.

@arun279

arun279 commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

CI cycle 1 passed every check except the iOS flow. History removal, the account-modal snackbar, Undo restoring the day total, and the no-match filter all passed. The flow then failed at Maestro hideKeyboard against native search. The captured accessibility hierarchy exposes a close control; the follow-up uses it, sets native search to stacked placement, and restores compact chip styling with full touch targets. Targeted tests pass; cycle 2 follows after the full pre-push check.

@arun279

arun279 commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

Cycle 2 passed all non-iOS checks. iOS stopped in the shared sign-in wait before History opened: screen-up-next was reported missing, while the captured screenshot shows the populated Up Next screen. This is a different assertion from the reported up-next-skeleton failure, so the same root cause is not established. Rerunning failed jobs once, without changing shared sign-in code, as the third and final CI cycle.

@arun279

arun279 commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

Final status after three CI cycles: native-ios remains red at the history-jump-sheet visibility assertion. The corrected native search-close step passed. The screenshot shows the month sheet fully rendered with both grids fitting, but the accessibility hierarchy has no sheet controls, so selecting a month was not reached. Cause is not established; no speculative fix or additional rerun was made. Evidence: https://github.com/arun279/cue/actions/runs/35465427814/artifacts/10591272538. All other executed checks passed, including root checks, changed-core coverage, render counts, Android emulator checks, footprint and CodeQL. The PR remains draft.

A form sheet presented while the account full screen modal is already up
never registers in the iOS accessibility tree: the sheet draws, but its
container holds no elements, so VoiceOver and the Maestro flow cannot
reach a month. The same happens to the episode sheet opened from a
History row, so this is the nesting rather than the sheet's contents.

The jump now draws inside the History screen as a modal panel over a
dimmed backdrop, with an explicit Close where the sheet had a grabber.
Picking sets the search params in place, which retires the route, its
parameter round trip and the medium it had to carry back.
At the largest accessibility text the six column grids broke year labels
across lines ("202" over "6") and the panel grew past the top of the
screen, taking its Close control with it. The grids now fall to three
columns above a 1.3 text scale, and the panel caps at four fifths of the
window with its heading pinned and its body scrolling.

The leading time column was fixed at 62 pt, which broke "4:14 PM" inside
the meridiem; it now scales with the text. The panel draws on the
overlay token so it reads as raised against the dimmed page on dark.
@arun279

arun279 commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

iPhone 17 Pro simulator, iOS 27, signed Release build carrying this branch's JavaScript, against the fake Trakt. Each pair is the same step of the same flow, captured after the animation settled.

  1. list-sticky-light.png: feed scrolled one page, light, default text size.
  2. list-sticky-dark.png: same step, dark, default text size.
  3. row-menu-light.png: row overflow menu open on the newest row, light, default text size. The menu is the platform material and does not dim the feed; this is its settled frame, unchanged after four further hierarchy reads.
  4. row-menu-dark.png: same step, dark, default text size.
  5. snackbar-light.png: removal snackbar over the account modal after removing the only play, light, default text size.
  6. snackbar-dark.png: same step, dark, default text size.
  7. filter-no-match-light.png: title filter with no match, keyboard up, load-more still offered, light, default text size.
  8. filter-no-match-dark.png: same step, dark, default text size.
  9. month-jump-light.png: month panel open over the dimmed feed, light, default text size.
  10. month-jump-dark.png: same step, dark, default text size.
  11. empty-scoped-light.png: history scoped to Jan 2026 with no plays, light, default text size.
  12. empty-scoped-dark.png: same step, dark, default text size.
  13. list-xxxl-light.png: feed at the largest text size, light.
  14. month-jump-xxxl-light.png: month panel at the largest text size, light, three columns with the heading pinned and the grids scrolling.

list-sticky-light

list-sticky-dark

row-menu-light

row-menu-dark

snackbar-light

snackbar-dark

filter-no-match-light

filter-no-match-dark

month-jump-light

month-jump-dark

empty-scoped-light

empty-scoped-dark

list-xxxl-light

month-jump-xxxl-light

Account navigation needs an opaque surface so sticky day labels remain visible while scrolling. A default same-day repeat makes the collapse badge testable in the device flow.
The preceding episode flow mutates the fake account even after Undo, which can move a single play ahead of the seeded repeat. Resetting before authentication makes the History assertion independent of suite order.
iOS exposes the repeated-play count in the row label while correctly omitting the decorative badge as a separate accessibility node. The device flow now checks the user-facing count on that row.
@github-actions

Copy link
Copy Markdown

Pull request footprint

measurement base to head
Product code lines in core/src, native/src, native/app, and native/modules +575
Test lines in test, tests, and e2e paths +405
Product comment lines identified by a comment prefix -5

User-delivered artifact sizes

measurement base head delta
Expo iOS JavaScript bundle, raw file 5.19 MB 5.23 MB +33.7 kB
Expo Android JavaScript bundle, raw file 5.23 MB 5.26 MB +33.6 kB
Firebase tester APK, arm64-v8a and all densities 39.62 MB 39.65 MB +32.8 kB
Play download estimate, XXXHDPI arm64-v8a English Android 15 18.15 MB 18.17 MB +17.4 kB

@arun279
arun279 merged commit 7869cbd into feat/expo-native Sep 19, 2026
14 checks passed
@arun279
arun279 deleted the feat/screens-history branch September 19, 2026 23:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant