Skip to content

Owner feedback follow-ups: platform symbols, Library sort in the bar, one sign-out - #208

Merged
arun279 merged 1 commit into
feat/expo-nativefrom
fix/owner-feedback-batch
Oct 23, 2026
Merged

arun279 merged 1 commit into
feat/expo-nativefrom
fix/owner-feedback-batch

Conversation

@arun279

@arun279 arun279 commented Oct 23, 2026

Copy link
Copy Markdown
Owner

Follow-ups from the owner's feedback (app-feedback 2026-10-18) that were still open on feat/expo-native at cc7c8f5.

Changes

Item What changed
Search's typed "Added ✓" The flash pill draws the platform's check symbol beside "Added". The add pill's typed "+" became the platform's plus symbol.
Sign out on Profile and Settings Sign out is on Profile only. The sign-out steps in .maestro/flows/account.yaml now run from Profile, and the Jest sign-out cases moved from settings.test.tsx to profile.test.tsx. PRIVACY.md points at Profile.
Profile has no username Profile's caption shows the Trakt username.
Library sort in the list header BarItems takes an optional menu and puts it beside the avatar. iOS gets a native bar menu with the arrow.up.arrow.down symbol. Android gets a sort icon button whose dropdown mounts only while open, the same way the header More button works. The bar is declared again only when the menu's look changes, not on every Library render. LibraryToolbar and Glyph are deleted.
Long row titles (F12) Titles in Up Next, History, Calendar and Search rows stop at two lines (TITLE_LINES, shared with Library tiles). The row's spoken label still has the full title, and detail screens show it whole.
Filter finds nothing in the chip (F14) When the filter matches nothing in the current chip but does match in other chips, the empty state names those chips as buttons. A button switches to that chip and keeps the filter.
Hand-drawn chevrons Chevron now draws SF Symbols on iOS and Material icons on Android through PlatformIcon. The Settings picker uses the menu-picker symbols (chevron.up.chevron.down, arrow_drop_down). The other hand-drawn icons went the same way: the sort, the Calendar alerts bell, the swipe check and stop, and the avatar placeholder.
Toggle's iOS role="none" (#170) Registered in platform-owned.test.ts as rule H, "platform control's own role overridden", judged against react-native 0.86.3. A React Native upgrade fails the version check and forces a re-check (react/react-native#59333, #59334).

Not changed: the chip rail's duplicate draw (baseline item 32). It happened once on the real account after a sideways swipe and did not happen again on a second try. No code path in ChipRail or the Library list explains it: the chip keys are unique and the header element does not remount. It needs a reproduction on a device.

Gates added

  • platform-owned.test.ts:
    • rule H, plus the Toggle exception;
    • a test that rejects typed check and cross glyphs (U+2611, U+2612, U+2705, U+2713 to U+2718, U+274C, U+274E) in shipped source.
  • biome.jsonc: react-native-svg is a restricted import everywhere. The only exception is the Cue mark, which has a biome-ignore that gives the reason. Shipped icons have to come from PlatformIcon.
  • .native-assets.json lists the 11 new Android vector drawables.

Tests

Each new test fails on cc7c8f5 on both Jest platforms:

  • Profile shows @jo on Trakt.
  • Settings has no Sign out.
  • The Search pills read exactly "Watchlist" and "Added".
  • Each row type caps a long title at two lines and still speaks it whole.
  • Library:
    • the sort is in the bar, not the grid;
    • the bar is declared again only when the sort menu changes;
    • a sort picked in a chip whose options look the same as another chip's is applied to the chip on screen;
    • the filter empty state names Stopped and switches to it.
  • The glyph scan.

Mutations, each caught:

  • removing the bar's look comparison;
  • swapping the latest-items select for a plain closure;
  • dropping the Toggle exception, changing its version, or removing the role override;
  • importing react-native-svg in Chevron, Avatar, Rows or SwipeRow.

Existing tests updated for the new structure:

  • library-window: no menu host now mounts in the grid;
  • swipe-row: counts reveal icons as images;
  • maestro-ids: the Library flow's one input is now "coastal";
  • the toolbar test double gives menu actions their label and selected state.

.maestro/flows/library.yaml types "coastal" on Watching. That captures the new empty state as library-no-match, taps "Show N in Not started", and then clears the filter.

Copy for your decision

  1. Search pills: "Added" with a check symbol, and "Watchlist" with a plus symbol. These were "Added ✓" and "+ Watchlist".
  2. Profile caption: @{username} on Trakt. It was "Trakt account".
  3. Filter empty state:
    • when other chips match, the headline is No shows in Watching match "dune". with one button per chip, for example Show 2 in Finished;
    • when nothing matches, it stays No shows match "dune".
  4. PRIVACY.md: "open Profile → Sign out (Profile is your avatar at the top of the screen)".
  5. Sort bar item: the label and menu title stay "Sort".

Footprint

Product-Growth: 64 lines net (304 added, 240 deleted) in packages/native/src and packages/native/app. 44 of those lines are the 11 Android vector drawables. BarItems grows by the menu slot, and LibraryToolbar (82 lines) and Glyph (26 lines) are deleted.
Binary-Size: the Hermes bundles grow 747 B on iOS (5,447,980 to 5,448,727) and 4,298 B on Android (5,482,577 to 5,486,875). That was measured with expo export and scripts/measure-sizes.sh on cc7c8f5 and on this branch. The 11 Android vector drawables add 3,305 B of assets.
Comment-Load: one product comment line, the biome-ignore reason in CueMark.tsx.

pnpm check passes on Node 22.23.4.

… one sign-out

- Search's "Added ✓" and "+ Watchlist" pills draw the platform's check and plus symbols.
- Sign out lives on Profile only; Settings no longer repeats it. Profile shows the Trakt username.
- Library's sort is a bar item beside the avatar: a native bar menu on iOS, a sort icon
  button with a dropdown on Android. BarItems takes the menu and redeclares the bar only
  when the menu's look changes.
- Row titles in Up Next, History, Calendar and Search stop at two lines; detail shows them
  whole and the row's spoken label keeps the full title.
- A filter with no match in the current chip names the other chips it matches in, as
  buttons that switch to them.
- Chevrons and the remaining hand-drawn icons (sort, bell, swipe check and stop, avatar
  placeholder) come from SF Symbols and Material icons through PlatformIcon. A lint rule
  keeps react-native-svg to the Cue mark, and a test rejects typed check and cross glyphs.
- The iOS role override on Toggle's Switch is a registered platform-owned exception judged
  against react-native 0.86.3, so a React Native upgrade reopens it
  (react/react-native#59333, #59334).
@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 +64
Test lines in test, packages/*/{test,__tests__,e2e}, and .maestro +168
CI and tooling lines in .github and scripts +0
Product comment lines identified by a comment prefix +1

User-delivered artifact sizes

measurement base head delta
Expo iOS JavaScript bundle, raw file 5.45 MB 5.45 MB +0.7 kB
Expo Android JavaScript bundle, raw file 5.48 MB 5.49 MB +4.3 kB
Firebase tester APK, arm64-v8a and all densities 41.16 MB 41.13 MB -27.9 kB
Play download estimate, XXXHDPI arm64-v8a English Android 15 19.83 MB 19.84 MB +5.1 kB

Most complex product function

measurement base head
Cyclomatic complexity, oxlint complexity 10 10
Cognitive complexity, Biome noExcessiveCognitiveComplexity 15 15

@arun279 arun279 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Media review at 0419129: checked iOS and Android light and dark for Library (sort in the header bar: SF Symbol menu on iOS, Material sort icon and dropdown on Android), the filter no-match state (offers the chip that has the match, keeps Clear filter), Profile (Trakt username in the caption, sign out only here), Settings (native picker chevrons, no sign out). No regressions seen in the other changed screens' panels.

@arun279
arun279 merged commit 8b1270a into feat/expo-native Oct 23, 2026
24 checks passed
@arun279
arun279 deleted the fix/owner-feedback-batch branch October 23, 2026 13:38
@arun279

arun279 commented Oct 23, 2026

Copy link
Copy Markdown
Owner Author

Correction to the media review above: I opened five panels (iOS and Android Library header, Android sort menu, iOS filter no-match, Android Profile, iOS Settings). I did not open the other changed screens' panels, so the line saying no regressions were seen there overstated what was checked.

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