Skip to content

feat(mobile): native iOS nav bar for the Chat tab#4282

Open
voska wants to merge 2 commits into
multica-ai:mainfrom
voska:feat/native-chat-header
Open

feat(mobile): native iOS nav bar for the Chat tab#4282
voska wants to merge 2 commits into
multica-ai:mainfrom
voska:feat/native-chat-header

Conversation

@voska

@voska voska commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

Gives the Chat tab a real iOS nav bar. Like inbox/ and my-issues/, the screen is wrapped in a native Stack so it gets the native nav bar (blur material, native title treatment) instead of the JS <Header> bar.

Chat is a conversation view, not a list, so it uses an inline title — NOT headerLargeTitle. The session-switcher title button and the new-chat / delete actions move into the native headerTitle / headerRight, configured from the screen via <Stack.Screen options> so they read live state (active session, current agent, handlers). The keyboard avoider is offset by the native header height (useHeaderHeight) since the nav bar now lives outside the screen's view tree.

⚠️ Stacked on #4269 (native large-title headers) — it introduces the native-stack header pattern this builds on. Please merge #4269 first; until then this PR's diff includes that branch's commits. Review the last commit here.

Type of Change

  • New feature / native-feel improvement (non-breaking)

Changes Made

  • (tabs)/chat.tsx(tabs)/chat/_layout.tsx (native Stack) + (tabs)/chat/index.tsx (header moved into native slots; keyboard offset).

How to Test

  1. Open the Chat tab on iOS — it has a native nav bar; the centered title shows the session switcher (tap → session sheet), the + opens a new chat.
  2. With an agent present, the composer sits correctly above the keyboard.

Checklist

  • After screenshot included (the JS-header "before" is the current Chat tab)
  • pnpm typecheck passes; verified rendering in the iOS Simulator
  • Live keyboard-avoidance with an agent present is worth a manual pass

AI Disclosure

AI tool used: Claude Code. Applied the existing native-stack header pattern to the Chat tab; verified the header + content render in the Simulator.

Screenshots

Native nav bar (session switcher title + new-chat action):
Chat native header

voska added 2 commits June 17, 2026 11:49
Wrap the Inbox and My Issues tab roots in native Stacks so they render the
iOS large-title nav bar (a UINavigationController feature exposed only by
react-native-screens' native stack — the JS bottom-tabs header can't do it).

- Inbox / My Issues each become a folder: _layout.tsx (native Stack) + index.tsx
- Drop the custom flat <Header>; move its actions into the native headerRight
- My Issues' scope toolbar rides as the SectionList ListHeaderComponent so the
  list sits flush under the bar and the title collapses on scroll
- Lists opt in via contentInsetAdjustmentBehavior="automatic"
Wrap the Chat tab in a native Stack (like inbox/ and my-issues/) so it gets a
real iOS nav bar — blur material, native title treatment — instead of the JS
<Header> bar. Chat is a conversation view, not a list, so it uses an inline
title (NOT headerLargeTitle); the session-switcher title button and the
new-chat / delete actions move into the native headerTitle / headerRight,
configured from the screen via <Stack.Screen options> so they read live state.

Offsets the keyboard avoider by the native header height (useHeaderHeight),
since the nav bar now lives outside the screen's view tree.

Stacked on the large-title-headers PR (same native-header pattern).
@vercel

vercel Bot commented Jun 18, 2026

Copy link
Copy Markdown

@voska is attempting to deploy a commit to the IndexLabs Team on Vercel.

A member of the Team first needs to authorize it.

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