Let somebody ask to join, and let a moderator answer (GRYT-193) - #126
Merged
Conversation
The client half of the approval queue. Without it the server half is a backend nobody can reach: no way to set the policy, no way to see who is waiting, and a refusal that reads like a failure. Who can join stops being a switch. It had two values and now has three, so it is a select — with a line under it, when the middle one is picked, saying where the people who ask turn up. normalizeJoinPolicy mirrors the server's: anything unrecognised reads as invite, so a value from a newer server leaves a server harder to get into on both sides of the wire. Requests is a new tab beside Invites, because both are about how somebody gets in. A row is a nickname, whatever they wrote, and when they asked — which is all there is to go on, and the row does not dress it up. The note is the only part they control, so it is rendered as text and never as markup. Approving asks for the list again rather than dropping the row locally: two moderators can be looking at the same queue. On the other side, approval_pending is not an error toast. Nothing went wrong and there is nothing to retry — the answer comes from a person. The add-server dialog offers a line to send with the request before anybody tries, since /info publishes the policy, and stops offering the join button once the request is in. A denial reads the same as a pending one, because the server refuses to say which. Verified against a running server with the queue: two strangers held, both listed with the notes they sent, Let in decides and the list drops to one, and the approved row stays approved without making them a member — they get in on the next attempt, which is what they were told. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The client half of GRYT-193. Goes with Gryt-chat/server#46 — that one is a backend nobody
can reach without this: no way to set the policy, no way to see who is waiting, and a refusal
that reads like a failure. Merge them together.
What changed
With an invite · After you let them in · Anyone, no invite. A line appears under it
when the middle one is picked, saying where the people who ask turn up.
normalizeJoinPolicymirrors the server's — anything unrecognised reads asinvite, so avalue from a newer server leaves a server harder to get into on both sides of the wire.
nickname, whatever they wrote, and when they asked. That is all there is to go on and the
row does not dress it up.
approval_pendingis not an error toast. Nothing went wrong and there is nothing toretry — the answer comes from a person, so it is a plain message that says so.
/infopublishes the policy, sothe note is offered before somebody is turned away rather than after. Once the request is
in, the dialog says so and stops offering the button that would only ask again.
Verified against a running server
Not just compiled — driven against the server from server#46 with the queue live:
requestfrom the client's own settings eventjoinPolicy: "request"approval_pendingapproved, Karipending, members still justOwnerThat last row is the point: approving does not admit anybody. They get in on their next
attempt, which is exactly what the refusal told them would happen.
Worth your attention
in the join path. It is rendered as text, never as markup, capped at 300 both here and on
the server, and trimmed server-side (the harness sent one padded with spaces and the queue
shows it clean).
can be looking at the same queue, and the server broadcasts a UI update on a decision.
server:verify, not the challenge — same reasoning as the server PR:the challenge binds what must not change between the two steps, and a note is a message to a
person that nothing downstream trusts.
waiting callout are rendered UI I mounted rather than clicked through — this app's modals
cannot be driven from the preview pane. The tab itself was exercised for real, including
the decision round-trip. The dialog is worth one manual pass.
🤖 Generated with Claude Code