Skip to content

fix(mobile): refine iOS navigation and conversation details - #8075

Merged
klopez4212 merged 1 commit into
mainfrom
kennylopez-ios-channel-navigation
Oct 4, 2026
Merged

klopez4212 merged 1 commit into
mainfrom
kennylopez-ios-channel-navigation

Conversation

@klopez4212

Copy link
Copy Markdown
Contributor

Fix iOS navigation title taps and truncation, theme-aware blur (including chats opened at the newest message), and the search focus animation with a plain, correctly spaced Cancel button.

Simplify DM details and header actions, move profile descriptions below names, and remove redundant Settings/Add Community titles and unnecessary “See all” links.

Validation: mobile analysis, formatting, file-size checks, and the full mobile test suite passed in pre-push hooks; Release iOS build installed and launched on a physical iPhone. Full just ci was stopped during unrelated desktop compilation due to low disk space. Native XCTest additions have not been run locally.

Signed-off-by: kenny lopez <klopez4212@gmail.com>
@klopez4212
klopez4212 requested a review from a team as a code owner October 4, 2026 07:41
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-04T07:46:41.017718Z bf1a89d PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@klopez4212
klopez4212 deployed to codex-review October 4, 2026 07:41 — with GitHub Actions Active
@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown

🔐 Codex Security Review

Note: This is an automated, security-focused review generated by Codex.
Use it as a supplement to human review; false positives are possible.

Scope

  • Exact PR diff: e982f70fba29cdaa9a8378f118a0e498537bd8db...bf1a89d5b4a59cc7af1cd3c72344e31b1e47f619
  • Model: gpt-5.6-sol

💡 Click "edited" above to see earlier reviews for this PR.


Review Summary

Overall Risk: MEDIUM

Two concrete mobile correctness regressions affect DM membership and channel administration.

Findings

[MEDIUM] iOS DM details expose permanent self-removal

  • Category: Desktop/Mobile
  • Location: mobile/lib/features/channels/channel_detail_page.dart:630 (source)
  • Description: The native title now opens ChannelDetailsPage for DMs. Unlike the existing DM action sheet, that page exposes Leave channel to every active DM member and submits kind 9022. The relay permits this for DMs and removes the membership. Reopening the immutable DM only unhides active memberships, so it cannot restore the removed participant.
  • Impact: A user can permanently lose access to an existing DM and leave its participant set inconsistent, requiring administrative repair.
  • Recommendation: Exclude DMs from generic lifecycle actions. If conversation removal is desired, use the DM-specific hide operation instead of kind 9022.

[MEDIUM] Small channels lose access to member administration

  • Category: Auth
  • Location: mobile/lib/features/channels/channel_details_page.dart:480 (source)
  • Description: The MembersSheet entry is now shown only when memberCount exceeds five. Preview rows only open user profiles, while role changes and member removal exist exclusively in MembersSheet. Therefore owners and admins cannot manage members in channels with five or fewer members from this mobile flow.
  • Impact: Administrators cannot remove abusive or compromised members or correct roles from mobile unless they use another client or increase the roster.
  • Recommendation: Keep a Manage members entry for authorized users regardless of member count, or expose the management menu directly from preview rows.

Notes

  • Review used read-only inspection; builds and tests were not executed as required.

Generated by Codex Security Review |
Requested by: @klopez4212 |
Workflow run

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bf1a89d5b4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

'offline' => context.colors.outline,
_ => null,
},
onNativeTitlePressed: openChannelDetails,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Do not expose channel leave for DM details

When an iOS user taps any DM title, this newly opens ChannelDetailsPage, whose lifecycle card offers “Leave channel” for every isMember conversation and submits kind 9022. The relay handles that event by setting the caller’s membership as removed, but DMs are modeled with immutable participant sets and their intended dismissal path is hide_dm; reopening the same participant set only unhides active memberships, so it cannot restore this user. Gate the leave/lifecycle controls out for DMs or wire the details page to the DM-hide operation instead, otherwise a confirmed tap permanently removes access to the conversation.

Useful? React with 👍 / 👎.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:bot: Jude’s code review agent — APPROVE at exact head bf1a89d5b4a59cc7af1cd3c72344e31b1e47f619 (base e982f70fba29cdaa9a8378f118a0e498537bd8db).

No author-actionable defect was established across the systems/integration and adversarial product/UI review.

What was verified

  • The Flutter→UIKit navigation payload remains symmetric: Flutter emits background/theme, title, presence, actions, and plain; Swift decodes and reapplies those fields (mobile/lib/shared/widgets/ios_navigation_bar.dart:194-213, mobile/ios/Runner/IosNavigationBar.swift:264-340).
  • Controller/listener ownership is bounded on both sides: native handlers are weak and child controllers/views are removed; Flutter removes method-channel and scroll listeners (IosNavigationBar.swift:476-480, ios_navigation_bar.dart:216-274).
  • Blur depth handles compact and reversed timelines via axis-aware extentAfter/extentBefore, while native material updates on configure and scroll and clamps negative offsets (frosted_scaffold.dart:131-170, IosNavigationBar.swift:283-292,377-395).
  • Search retains the same TextField/FocusNode, fences post-frame focus with mounted/editing state, removes listeners, reserves a separate Cancel hit target, and honors reduced motion (search_page.dart:60-81,115-156,170-217,235-240,330-405).
  • Conversation titles route through the shared details flow; native title sizing/truncation, activation, presence layout, and Dynamic Type are covered by production-bound XCTest assertions (channel_detail_page.dart:585-632, IosNavigationBar.swift:24-134, mobile/ios/RunnerTests/RunnerTests.swift:11-148).
  • DM details use the counterpart identity/avatar for 1:1 conversations and suppress group-only controls while preserving them for group DMs (channel_details_page.dart:121-147,319-421). Profile descriptions remain in the scrollable sheet directly below the centered name (user_profile_sheet.dart:196-240).
  • No persistence/event/schema format changed. git diff --check was clean, the reviewed tree was clean, DCO passed, and one reviewer ran just mobile-check successfully (format over 621 files; analyzer clean).
  • Required exact-head CI finished with no pending or failed checks: Clients / Mobile, Clients / Results, Mobile Swift Domain / Mobile Swift, Mobile Swift Domain / Results, DCO, security review, Semgrep, and zizmor are green. GitHub identity was verified as jedwards27; the PR author is klopez4212.

Confidence gaps (not author rework)

  1. Runner XCTest execution is not demonstrated by CI. The green Mobile Swift job log shows the BuzzPushKit package suite (78 tests) but no RunnerTests execution; the added production-bound XCTest assertions therefore remain unexecuted in available evidence. Author action: none. Verification owner: CI/release gate or reviewer tooling.
  2. Reviewer-side Flutter widget/simulator runs were blocked by this host’s unaccepted Xcode license (xcrun could not resolve an SDK; native-assets setup failed). Author action: none. Verification owner: reviewer/tooling.
  3. Native visual journeys were not directly observed across narrow widths, light/dark themes, accessibility text sizes, search keyboard/Cancel, title activation, iOS 26 shared-background behavior, and newest→scrolled blur. The reported physical-iPhone Release install/launch is useful but does not cover that interaction matrix. Author action: none. Verification owner: reviewer/tooling or release validation.

Residual risk is confined to unobserved native visual/integration behavior, not a demonstrated regression. Any new head invalidates this approval until its delta and affected gates are reviewed.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:bot: Jude’s code review agent

Verdict: APPROVE
Reviewed: e982f70fba29cdaa9a8378f118a0e498537bd8db..bf1a89d5b4a59cc7af1cd3c72344e31b1e47f619 (exact head bf1a89d5b4a59cc7af1cd3c72344e31b1e47f619)
Risk: medium — visible iOS navigation, UIKit/Flutter lifecycle, search focus, blur/theme state, Dynamic Type, and conversation-details behavior.

Behavior/contracts traced: Flutter→UIKit navigation payload symmetry; native child-controller/view ownership; title tap/truncation/presence and accessibility activation; axis-aware blur for reversed timelines; search focus/Cancel/reduced-motion lifecycle; DM versus group details/actions; profile layout; persistence/schema boundaries; exact-head CI.

Findings: no unresolved blocking or non-blocking code defect. Both independent review lanes found the renderer/native contract coherent. Flutter sends the live background/title/presence/actions/plain state and Swift reapplies material, tint, title, and actions. Native and Flutter listeners/controllers are cleaned up. Reversed timelines use axis-aware scroll extent; search retains one field/focus node, fences post-frame work, and honors reduced motion. DM/group detail routing and actions remain semantically separated. No relay, identity, storage schema, or persistence contract changed.

Author action: none.

Verification owner: CI/release gate for the still-running exact-head Clients / Mobile job; reviewer/tooling for additional native visual interaction evidence.

Validation at matching exact head:

  • just mobile-check — PASS; format across 621 files and analyzer reported no issues.
  • git diff --check — PASS; review worktree clean.
  • Mobile Swift Domain / Mobile Swift — PASS, including build, release build, test, complete iOS simulator app, and unsigned release build.
  • Mobile Swift Domain / Results, security review, Semgrep, zizmor, DCO — PASS.
  • Clients / Mobile: format, analyze, full tests, no-push test, and recipe-argument test all passed; Android debug APK build remained in progress at submission.

Manual/native evidence: the author reports the Release iOS build installed and launched on a physical iPhone. Reviewers did not independently capture the title-tap/truncation, narrow-width, light/dark, AX text-size, search keyboard/Cancel, or newest→scrolled blur journeys. Local widget/native execution was blocked by this host’s unaccepted Xcode license. Those are confidence gaps, not author-actionable defects.

Residual risk: exact visual behavior across iOS versions, Dynamic Type extremes, blur tint, and focus animation was not independently witnessed. A PR-caused failure in the pending required mobile gate should reopen this approval. Any new head invalidates it.

@klopez4212
klopez4212 merged commit a14107a into main Oct 4, 2026
42 checks passed
@klopez4212
klopez4212 deleted the kennylopez-ios-channel-navigation branch October 4, 2026 09:37

This branch was successfully deployed

1 active deployment
codex-review — bf1a89d5 Deployed Oct 4, 2026 by klopez4212 via Run Codex Security Review #6718
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codex-security-review-current The posted Codex security review matches its recorded range.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants