Skip to content

feat(mobile): show project favicons in the thread filter menu - #11370

Draft
SunkenInTime wants to merge 2 commits into
pingdotgg:mainfrom
SunkenInTime:t3code/mobile-filter-project-favicons
Draft

SunkenInTime wants to merge 2 commits into
pingdotgg:mainfrom
SunkenInTime:t3code/mobile-filter-project-favicons

Conversation

@SunkenInTime

@SunkenInTime SunkenInTime commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

What Changed

The Project submenu of the Android thread filter listed projects by name only, while the thread list, the new-task picker, and the web project picker (#10790) all show project favicons.

The Android menu (AndroidAnchoredMenu) now accepts an optional leading node per action and renders it before the title. The filter menu passes the existing ProjectFavicon component there, so loading, caching, and the folder fallback match the thread list. Each project scope option now carries its representative project, which is what the favicon lookup needs and the same representative the new-task picker already uses for grouped projects. Both builders of this menu get the icons: the phone home header and the tablet sidebar.

iOS keeps its native menus and gets the icons too. All three iOS filter surfaces are built from react-native-screens header items, whose menu actions already accept an imageSource icon loaded through React Native's image loader. The filter model now carries a resolved favicon URL per project (useProjectScopeFaviconUrls, reading the same atom ProjectFavicon uses), and each builder maps it to an icon: the iOS 26 mail search toolbar (toNativeMailSearchToolbarMenu, since that raw RNS item bypasses React Navigation's icon conversion), the pre-26 NativeHeaderToolbar.MenuAction via a new imageUri prop, and the iPad sidebar header items. menuIconImageSource pins width, height, and scale so the loader decodes to the row's 20pt size instead of handing UIMenu a full favicon. Projects without a favicon keep no icon on iOS, which is how mixed UIMenu rows normally look. The leading node stays Android-only and is stripped before the @react-native-menu/menu bridge.

Why

A list of ten project names is slower to scan than the same list with the icons users already recognize from the thread list. Reusing ProjectFavicon on Android and the platform's own imageSource support on iOS keeps this a rendering change with no native patches, new state, or contract changes.

Verification

  • Mobile typecheck and lint on the changed files: clean
  • Android verified on a Pixel 8 API 36 emulator paired to a live server; see screenshots
  • iOS not yet run from the authoring machine (Windows); the change uses the existing imageSource path that header button icons already go through. Simulator screenshots to follow.
  • The mobile unit test runner in this worktree fails to load any test file, including untouched ones (TypeError: Cannot read properties of undefined (reading 'config') at describe), so home-list-filter-menu.test.ts could not be run locally. The change to that module only adds an optional field.

UI Changes

Same server and projects on a Pixel 8 API 36 emulator. Projects without a favicon keep the folder glyph.

Android before Android after
Android before: project names only Android after: favicon next to each project, folder fallback

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes. Not applicable; static menu rows.

Model: Claude Fable 5.1. Harness: Claude Code in T3 Code.

🤖 Generated with Claude Code

The Project submenu of the Android thread filter listed projects by name
only. Give the Android menu an optional leading node per action and pass
the existing ProjectFavicon there, carrying a representative project on
each scope so the favicon lookup has what it needs. The node is stripped
before the iOS native menu bridge, which only takes symbol names.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 12, 2026
@macroscopeapp

macroscopeapp Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 7500e28

Macroscope's review found this PR approvable — This is a small, localized Android UI enhancement that reuses the existing favicon loader and fallback while preserving menu selection behavior and iOS native-menu handling. It introduces no schema, deployment, security, billing, default, or static-analysis changes.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Sep 12, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: d659bd81-2821-41d4-ac1d-a98acd2516ad

📥 Commits

Reviewing files that changed from the base of the PR and between e816064 and 7500e28.

📒 Files selected for processing (6)
  • apps/mobile/src/components/AndroidAnchoredMenu.tsx
  • apps/mobile/src/components/ControlPill.tsx
  • apps/mobile/src/features/home/HomeHeader.tsx
  • apps/mobile/src/features/home/HomeRouteScreen.tsx
  • apps/mobile/src/features/home/home-list-filter-menu.ts
  • apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

Mobile project filter menus now support representative project favicons. Android menu actions accept leading React nodes, while native menu actions strip them during conversion.

Changes

Project menu icons

Layer / File(s) Summary
Android menu action contract and rendering
apps/mobile/src/components/AndroidAnchoredMenu.tsx
Adds recursive AndroidMenuAction typing and native conversion. Android menu rows render optional leading nodes.
Native menu action conversion
apps/mobile/src/components/ControlPill.tsx, apps/mobile/src/components/AndroidAnchoredMenu.tsx
ControlPillMenu accepts Android actions, converts them to native actions, and passes them to ThemedMenuView.
Project representative data and menu integration
apps/mobile/src/features/home/*, apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx
Project filter options carry representative data. Home and thread menus render representative ProjectFavicon nodes.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Feature

Suggested reviewers: juliusmarminge

Sequence Diagram(s)

sequenceDiagram
  participant HomeRouteScreen
  participant HomeHeader
  participant AndroidAnchoredMenu
  participant ProjectFavicon
  HomeRouteScreen->>HomeHeader: provide projectFilterOptions with representative
  HomeHeader->>AndroidAnchoredMenu: provide project menu actions
  AndroidAnchoredMenu->>ProjectFavicon: render leading favicon
  AndroidAnchoredMenu-->>HomeHeader: handle selected action
Loading
sequenceDiagram
  participant ControlPillMenu
  participant toNativeMenuActions
  participant ThemedMenuView
  ControlPillMenu->>toNativeMenuActions: convert AndroidMenuAction[]
  toNativeMenuActions-->>ControlPillMenu: return native MenuAction[]
  ControlPillMenu->>ThemedMenuView: provide converted actions
Loading

Merge Risk: ⚪ Minimal · up to 7500e

Project icons are added to Android project menus while iOS continues receiving native-compatible menu actions. No merge-blocking risk was identified.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 6 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly describes the primary change: adding project favicons to the mobile thread filter menu.
Description check ✅ Passed The description includes the required What Changed, Why, UI Changes, and Checklist sections. It explains the implementation, verification status, and provides before/after screenshots for the UI chang…
  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@SunkenInTime
SunkenInTime marked this pull request as draft September 12, 2026 17:05
Sowyu pushed a commit to Sowyu/t3pretzel that referenced this pull request Sep 15, 2026
Fixes reproduced on an Android emulator and from upstream reports.

Feed: Android stops drawing a text view past the GPU's maximum texture
height, so a long list rendered as one selectable Text lost its tail and
took seconds per frame to draw. Long lists now split into 40-item chunks.
Wide assistant markdown blocks keep a pinned width; the feed reserves
bottom padding.

Keyboard: the feed re-pins after keyboard transitions settle and when the
composer collapses; the back gesture collapses the composer; sticky
composers only follow the keyboard after a fresh show or real focus
(upstream pingdotgg#8212).

Terminal: hardware Enter no longer moves focus off the terminal; keyboards
that use deleteSurroundingText (FUTO) send Backspace; forward delete works.

Also: stream haptics no longer buzz every 320ms on Android and all haptics
use the system engine; thread settings apply on tap without Save; typed
pairing codes are normalized to the server format; non-git projects fall
back to the current checkout instead of a dead worktree default; user CA
certificates are trusted; Ctrl/Cmd+Enter sends from a hardware keyboard;
thread rename, project favicons in the filter, tablet sidebar toggle,
desktop-window density, route titles, Material You review colors, bottom
gesture-bar insets, and the composer placeholder clipping (upstream PRs
pingdotgg#11503, pingdotgg#11370, pingdotgg#11339, pingdotgg#8200, pingdotgg#8717, pingdotgg#11445, pingdotgg#6003, pingdotgg#5052, pingdotgg#8362, pingdotgg#10709,
pingdotgg#11611, pingdotgg#8800, adapted).
The native iOS menus take image sources through react-native-screens'
header items, so the filter model now carries a favicon URL per project
and each of the three iOS menu builders turns it into an imageSource
icon: the iOS 26 mail search toolbar, the pre-26 header toolbar, and
the iPad sidebar header. A shared image source pins the icon to the
row's point size so UIMenu never receives a full-size favicon.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions github-actions Bot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Sep 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant