Skip to content

fix(mobile): join an open channel from the chat footer - #9253

Open
brow wants to merge 4 commits into
mainfrom
mobile-join-footer
Open

brow wants to merge 4 commits into
mainfrom
mobile-join-footer

Conversation

@brow

@brow brow commented Nov 8, 2026 •

Copy link
Copy Markdown
Collaborator

A nonmember viewing an open channel on mobile saw "Join this channel from Manage to participate." in the footer, with nothing to tap and no obvious "Manage". The footer now matches desktop's join notice: Join channel to send messages with a primary-styled Join button (the same primary colors as the composer's send button). A private channel preview says "You're previewing this channel" with no Join, and the archived notice is unchanged.

Joining also needed to take effect on screen. The relay acknowledges the join (kind 9021) before its read replicas see the new roster, so the channel refresh that followed still listed the user as a nonmember and the page stayed on Join; on the Builderlab relay the lag ran to tens of seconds. This affected the existing Channel details "Join channel" row too. Like desktop's channel lifecycle (channel-lifecycle.ts), joinChannel now confirms the roster with consistency: "strong" (writer-pool) reads at 0/250/750/1500 ms, then refreshes memberships with a strong read. If the roster never confirms, the join reports an error instead of silently doing nothing.

Before / after

Before (main) After

Demo video (search for an open channel, open it, tap Join; the footer becomes the composer, the member count goes from 28 to 29, and the channel appears in the sidebar): shared in Buzz rather than here, since it shows real member names from the test community.

Validation

  • Added tests: the footer Join joins and swaps to the composer, a failed join keeps Join available with an error toast, a private preview shows no Join, and joinChannel issues strong roster reads and fails when membership never confirms.
  • Full mobile suite on the rebased head: 4550 pass. The one failure, a message_skeleton_geometry_test case, passed when rerun alone and doesn't touch this change (the suite shared the machine with a simulator build).
  • Automated sim run (iPhone 17 Pro, Builderlab test account): left an open channel, opened it from a channel link, tapped the footer Join. The composer appeared in about a second, the member count went up by one, and the channel stayed in the sidebar afterward. Before the strong-read change, the same run left the page on Join. The recording shows real channel content, so it's shared in Buzz rather than here.

buzz-review-completed

🤖 Generated with Claude Code

@brow

brow commented Nov 8, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 8, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

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

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-08T22:53:02.011459Z 1b61947 Draft marked ready
ℹ️ 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.

@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: a503618e7f

ℹ️ 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".

@brow

brow commented Nov 8, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@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: fae660296e

ℹ️ 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".

@brow
brow marked this pull request as ready for review November 8, 2026 21:47
@brow
brow requested a review from a team as a code owner November 8, 2026 21:47
@brow
brow marked this pull request as draft November 8, 2026 21:47
@brow
brow deployed to codex-review November 8, 2026 21:47 — 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 Nov 8, 2026
@github-actions

github-actions Bot commented Nov 8, 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: 8cce12f591988f29cc2beab5ff0c89d51862f31b...1b619472cda1182296c897a33e07c6facd4b9b15
  • Model: gpt-6.1-sol

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


Review Summary

Overall Risk: NONE

No concrete security, correctness, or reliability regressions found in the authorized PR range.

Findings

No concrete security, correctness, or reliability findings were identified.

Notes

  • Review used read-only source and history inspection. Builds and tests were not executed, as instructed.

Generated by Codex Security Review |
Requested by: @brow |
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: 5b6064229d

ℹ️ 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".

Comment on lines +510 to +512
await expectLater(
container.read(actionsProvider).joinChannel(_channelId),
throwsA(

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Exercise the successful strong-refresh path

Make this test return a matching roster and assert that the subsequent channel-list membership query also carries consistency: strong. It currently forces _confirmJoined to exhaust its retries and throw, so it never exercises _refreshChannelState; removing the strong: strongMemberships propagation would leave the suite green while a lagging replica could keep the footer on Join after confirmation succeeds.

AGENTS.md reference: AGENTS.md:L243-L247

Useful? React with 👍 / 👎.

brow pushed a commit that referenced this pull request Nov 8, 2026
@brow

brow commented Nov 8, 2026

Copy link
Copy Markdown
Collaborator Author

Footer before and after captures for the PR description.

footer-after

footer-before

square-tomb and others added 4 commits November 8, 2026 14:44
A nonmember viewing an open channel saw "Join this channel from Manage to
participate." with no way to act on it there. The footer now matches
desktop: "Join channel to send messages" with a Join button. A private
channel preview says it is a preview and offers no Join.

Joining also has to show up right away. The relay acknowledges the join
before its replicas see the new roster, so the refresh that followed still
listed the user as a nonmember and the page stayed on Join. Like desktop's
channel lifecycle, joinChannel now confirms the roster with strong
(writer-pool) reads, then refreshes memberships with a strong read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tom Brow <tomb@squareup.com>
Only the relay's /query bridge honors consistency: strong. A WebSocket REQ
reads replicas, so the confirmation could miss a just-accepted join.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tom Brow <tomb@squareup.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tom Brow <tomb@squareup.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tom Brow <tomb@squareup.com>
@brow
brow force-pushed the mobile-join-footer branch from 5b60642 to 1b61947 Compare November 8, 2026 22:49
brow pushed a commit that referenced this pull request Nov 8, 2026
@brow

brow commented Nov 8, 2026

Copy link
Copy Markdown
Collaborator Author

Updated after shot: primary-styled Join.

footer-after-primary

@github-actions github-actions Bot removed the codex-security-review-current The posted Codex security review matches its recorded range. label Nov 8, 2026
@brow
brow marked this pull request as ready for review November 8, 2026 22:50
@brow
brow deployed to codex-review November 8, 2026 22:50 — 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 Nov 8, 2026

@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: 1b619472cd

ℹ️ 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".

Comment on lines +397 to +399
await _ref
.read(channelsProvider.notifier)
.refresh(strong: strongMemberships);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Propagate the post-join refresh failure

If roster confirmation succeeds but the subsequent channel-list refresh is disconnected, retired by a concurrent refresh, or fails, ChannelsNotifier.refresh intentionally returns normally while retaining the cached isMember: false list. Consequently joinChannel reports success, the footer resets to Join rather than showing the composer, and the user receives no failure feedback. Use the error-propagating fetchFresh(strong: true) path here, or otherwise verify that the joined membership was installed before returning.

AGENTS.md reference: AGENTS.md:L222-L229

Useful? React with 👍 / 👎.

This branch was successfully deployed

1 active deployment
codex-review — 1b619472 Deployed Nov 8, 2026 by brow via Run Codex Security Review #13904
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