- Collapse the channel-list fetch state into one discriminated union
- Collapse the test-message flag and outcome into one status union
- Group the saved-channel mirror and sync marker into channel refs
- Stop the destination label pointing at an element the error and empty
states never render
- Match the Slack copy in tests as the sentences it is, so rewording it
cannot turn an assertion into an invalid pattern
- Remove the Slack entry from the shared test-connection copy map and
the Slack branch of the generic update, both unreachable: the Slack
page runs its connection test and channel save through its own actions
- Read as still loading on the server-rendered first paint, instead of
telling a healthy workspace to go create or invite in Slack
- Say a saved channel is recorded even when its name is not on hand
- Wrap a reason code this UI has no copy for instead of showing the
raw protocol token as the whole message
- Share the reason-shape gate with the OAuth callback instead of
keeping a private copy of it
- Keep the picker usable when a later page is refused, with the refusal
as the explanation instead of a blocking error
- Say when the workspace has more channels than one read covers, so a
missing channel is not misread as a missing @Prowler invite
- Give the channel listing, the channel save and the test message the
same upstream-fault reporting the OAuth actions already have
- Keep every user-facing message exactly as it was
- Read the save result like the install result: an empty or non-JSON
answer is an unknown outcome, not a parser message shown verbatim
- Refresh the cached pages before judging the answer, since the API
records the channel before answering
- Stop a resource without a configuration from reaching the card
- Gate the connection check and its next-step hint on the same
acknowledged save that reveals the test message
- Follow a destination recorded elsewhere when the page data refreshes,
without clobbering a pick the user has not saved yet
- Refuse an id that is not API-shaped before it reaches a request URL,
answering the open request-forgery alerts on these actions
- Align the Slack fixtures with the ids the API actually issues
- Resolve a relative `links.next` against the page it arrived on, not
the API root, so a cursor-only link keeps the listing's path
- End pagination instead of following a link that leaves the API origin
carrying the tenant's token
Read the refusal's `code` on every Slack-backed flow, not only on the
OAuth ones: the channel listing kept the wait Slack asked for nowhere,
the channel save reported the two channel refusals as one sentence, and
the test message showed Slack's raw reason as if it were copy.
- Keep `Retry-After` on a rate-limited channel listing, so the user is
told when to come back instead of only that it failed
- Record the destination through a Slack action, so "the channel is
gone" and "invite @Prowler to it" stop collapsing into one message
- Map the reason the test-message task settles with, falling back to the
API's own wording when it is not one Prowler has copy for
- Give the MSW refusals the API's real body shape, code and all
Offer the connected workspace's channels — public, plus the private ones
@Prowler has been invited to — through a props-driven picker the alerts
form can import unchanged, record the choice as the integration's default
(only channel_id travels; the API derives the name), and prove delivery
with a test message that polls the task the API hands back.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.