Skip to content

feat(scm-first-messaging-integration): Rendering provider rows - #121768

Open
Abdkhan14 wants to merge 12 commits into
abdk/scm-messaging-channel-pickerfrom
abdk/scm-rendering
Open

feat(scm-first-messaging-integration): Rendering provider rows#121768
Abdkhan14 wants to merge 12 commits into
abdk/scm-messaging-channel-pickerfrom
abdk/scm-rendering

Conversation

@Abdkhan14

@Abdkhan14 Abdkhan14 commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Problem

The earlier PRs in this stack built the pieces of the inline messaging step in isolation — the provider data hook, the destination-validation hook, the provider row, and the channel picker — but nothing actually assembled them into the ScmMessaging onboarding step. The step didn't render the provider rows, had no loading/error handling while integrations were fetching, and no submit gating tied to whether a chosen destination was actually valid. The row and picker also still carried interim UX (a manual "Add destination" click to reveal the picker, a reachable but redundant connected state) and placeholder copy/layout that didn't match the approved design.

Change

Composes the full step in scmMessaging.tsx: it renders one ScmMessagingProviderRow per curated provider with loading skeletons and an error/retry state, shows the validation banner for a restored destination, and wires the footer (Back, Set up later, Continue). Continue is gated on canContinue — a destination must be saved and revalidation must have settled clean (no stale reason, not erroring, not pending) — so a stale or unverified destination can never look submittable, which matters because Continue is the project/alert-rule creation boundary. The row now auto-expands the channel picker as soon as an integration connects (removing the extra click and the now-unreachable connected state), and only offers Cancel in edit mode. The picker moves to a two-column Workspace/Channel layout,

@github-actions github-actions Bot added the Scope: Frontend Automatically applied to PRs that change frontend components label Aug 11, 2026
@Abdkhan14
Abdkhan14 changed the base branch from master to abdk/scm-messaging-channel-picker August 11, 2026 18:45
@Abdkhan14 Abdkhan14 changed the title Abdk/scm rendering feat(scm-first-messaging-integration): Rendering provider rows Aug 11, 2026
@Abdkhan14
Abdkhan14 marked this pull request as ready for review August 13, 2026 17:36
@Abdkhan14
Abdkhan14 requested a review from a team as a code owner August 13, 2026 17:36
Comment thread static/app/views/onboarding/scmMessaging.tsx
Comment thread static/app/views/onboarding/scmMessaging.tsx Outdated
</Flex>

{isPending && (
<Stack gap="md">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

medium: These placeholders don't match the height of the real rows, produces a bit of a jarring change when loading is complete.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Resorted to just a spinner like the other pages for now

<Stack gap="xl" maxWidth={`min(${SCM_STEP_CONTENT_WIDTH}, 100%)`} width="100%">
<Stack gap="md">
<Heading as="h2" size="4xl">
<Stack gap="2xl" maxWidth={`min(${SCM_STEP_CONTENT_WIDTH}, 100%)`} width="100%">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

medium: Not sure that the text sizes / spacings are consistent with the other steps, if it were me I think I would copy the Header / subheader and info copy sizes and spacings used on the "Connect your code" step, or ask Dan G if things are intentionally divergent from the other steps.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Synced with Dan, agreed to iterate on this once we have it live behind the flag


{!isPending && !isError && providers.length > 0 && (
<Stack gap="md">
{providers.map(viewModel => (

@jaydgoss jaydgoss Aug 14, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

medium: I'm a little bit confused by how this operates relative to the designs, i.e. in the design:

  • when no providers are connected all provider rows are shown
  • when slack is connected, but alerts aren't configured for it only slack is shown
  • when slack is connected and alerts are configured for it, all provider rows are shown

In your version though, all provider rows are always shown.

might be worth confirming with dan / aligning this to the designs.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Started a thread for this with Dan, agreed to iterate on this once we have it live behind the flag

Comment thread static/app/views/onboarding/scmMessaging.tsx Outdated
<Alert
variant="warning"
trailingItems={
<Alert.Button onClick={refetchIntegrations}>{t('Retry')}</Alert.Button>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

medium: isError includes provider-query failures, but Retry only refetches the integrations query. a failed /config/integrations/ request therefore leaves this alert stuck. could the hook expose a retry that refetches both query sets?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Pushed a change for this. The hook now exposes a retry() that refetches both query sets (the integrations query and all three /config/integrations/ provider queries via a refetch surfaced from the useQueries combine), and the load-error Alert calls that instead of refetchIntegrations. So a config-query failure can now recover. Kept refetchIntegrations for the post-install path since installing doesn't change provider config. Added a spec where a provider config query 500s and retry() clears the error

@cursor cursor Bot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a28c4ba. Configure here.

Comment thread static/app/views/onboarding/scmMessaging.tsx
Comment thread static/app/views/onboarding/scmMessaging.tsx Outdated
@Abdkhan14
Abdkhan14 requested a review from jaydgoss August 14, 2026 19:58
@@ -90,7 +105,7 @@ function deriveVisualState({
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

medium: awaitingInstall only gets cleared if the integration surfaces. if the post-install refetch succeeds but still returns no integration, installState stays complete and this row will keep loading with no way to retry. could the parent pass isRefetching so we show loading only while the refetch is active, then fall back to Connect once it settles?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed — the row now uses the parent’s isRefetchingIntegrations state instead of the awaitingInstall latch. It shows loading only during the refetch and returns to Connect if no integration surfaces. Added regression coverage for this case

Comment thread static/app/components/onboarding/scm/scmMessagingChannelPicker.tsx
@Abdkhan14
Abdkhan14 requested a review from jaydgoss August 14, 2026 21:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Scope: Frontend Automatically applied to PRs that change frontend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants