Skip to content

feat(webapp): combine integrations list with provider catalog#5713

Open
rubychilds wants to merge 3 commits intoNangoHQ:masterfrom
rubychilds:feat/integrations-combined-view
Open

feat(webapp): combine integrations list with provider catalog#5713
rubychilds wants to merge 3 commits intoNangoHQ:masterfrom
rubychilds:feat/integrations-combined-view

Conversation

@rubychilds
Copy link
Copy Markdown

@rubychilds rubychilds commented Mar 26, 2026

Summary

  • Merged the separate "connected integrations" page and "set up new integration" page into a single unified view
  • Added All, Connected, and Not Connected filter tabs so users can browse all available providers and see connection status without navigating away
  • Connected providers show a "Connected" badge and clicking them goes to their integration detail page; unconnected ones go to the setup flow
  • The Connected tab preserves the existing table layout with ID, connection count, and auth type columns

Why?

  • It felt like an unnecessary button to click onto 'Set up a new integration' when picking from a catalogue of available integrations. I think maybe 'Set up a new integration' could be a button to setup a purely new integration, where it needs a greater degree of config than something has some level of default available.

Test plan

  • Navigate to /integrations and verify all three filter tabs (All, Connected, Not Connected) are visible
  • Verify the "All" tab shows every available provider with virtualized scrolling
  • Verify the "Connected" tab shows the table view with only connected integrations
  • Verify the "Not Connected" tab filters to only unconnected providers
  • Verify search works across all tabs
  • Click a connected provider and verify it navigates to the integration detail page
  • Click an unconnected provider and verify it navigates to the create/setup page
  • Verify connected providers show a "Connected" badge in the All and Not Connected views
Screenshot 2026-03-25 at 11 54 22 pm

It also consolidates providers and integrations into a merged dataset for the unified view, with virtualized rendering to handle larger provider lists efficiently.


This summary was automatically generated by @propel-code-bot

Replace the separate "connected integrations" and "set up new
integration" pages with a single unified view. The integrations page
now shows All, Connected, and Not Connected filter tabs so users can
browse all available providers and see which ones are already set up
without navigating to a separate page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
propel-code-bot[bot]

This comment was marked as outdated.

Copy link
Copy Markdown
Contributor

@propel-code-bot propel-code-bot bot left a comment

Choose a reason for hiding this comment

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

Two important issues found around search coverage and provider error handling that may regress UX.

Status: Changes Suggested | Risk: Medium

Issues Identified & Suggestions
  • Expand search keys to include integration identifiers and names: packages/webapp/src/pages/Integrations/Show.tsx
  • Surface provider loading errors alongside integrations errors: packages/webapp/src/pages/Integrations/Show.tsx
Review Details

📁 1 files reviewed | 💬 2 comments

Instruction Files
└── .claude/
    ├── agents/
    │   └── nango-docs-migrator.md
    └── skills

👍 / 👎 individual comments to help improve reviews for you

{ name: 'provider.displayName', weight: 0.3 },
{ name: 'provider.name', weight: 0.3 },
{ name: 'provider.authMode', weight: 0.2 },
{ name: 'provider.categories', weight: 0.2 }
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.

Important

[Logic] Search regression in the unified list: the Fuse.js keys only include provider fields, so searching by integration ID (integration.unique_key) or a custom integration display name won't match in the Connected tab. That breaks the prior behavior where users could search by integration ID.

Fix: include integration fields in the Fuse.js keys array (at least integration.unique_key and integration.display_name/integration.meta.displayName, plus integration.meta.authMode if needed). Fuse.js supports nested field searching via dot notation.

Context for Agents
Search regression in the unified list: the Fuse.js keys only include provider fields, so searching by integration ID (`integration.unique_key`) or a custom integration display name won't match in the Connected tab. That breaks the prior behavior where users could search by integration ID.

Fix: include integration fields in the Fuse.js keys array (at least `integration.unique_key` and `integration.display_name`/`integration.meta.displayName`, plus `integration.meta.authMode` if needed). Fuse.js supports nested field searching via dot notation.

File: packages/webapp/src/pages/Integrations/Show.tsx
Line: 76

return data?.data ?? null;
}, [data?.data]);
const { data: integrationsData, isPending: integrationsPending, error } = useListIntegrations(env);
const { data: providersData, isLoading: providersPending } = useProviders(env);
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.

Important

[Reliability] The providers request error is not handled. If useProviders fails while integrations load succeeds, the UI falls back to an empty list and shows “No integrations available,” masking the actual error.

Fix: destructure error from useProviders and surface it the same way as the integrations error (e.g., render ErrorPageComponent when either request fails).

Context for Agents
The providers request error is not handled. If `useProviders` fails while integrations load succeeds, the UI falls back to an empty list and shows “No integrations available,” masking the actual error.

Fix: destructure `error` from `useProviders` and surface it the same way as the integrations error (e.g., render `ErrorPageComponent` when either request fails).

File: packages/webapp/src/pages/Integrations/Show.tsx
Line: 34

Copy link
Copy Markdown
Contributor

@propel-code-bot propel-code-bot bot left a comment

Choose a reason for hiding this comment

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

One important correctness issue was found in integration mapping that may omit items.

Status: Changes Suggested | Risk: Medium

Issues Identified & Suggestions
  • Connected tab may drop multiple integrations; include all entries: packages/webapp/src/pages/Integrations/Show.tsx
Review Details

📁 1 files reviewed | 💬 1 comments

Instruction Files
└── .claude/
    ├── agents/
    │   └── nango-docs-migrator.md
    └── skills

👍 / 👎 individual comments to help improve reviews for you

const allItems = useMemo(() => {
return providers.map((provider) => ({
provider,
integration: integrations.find((i) => i.provider === provider.name) ?? null,
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.

Important

[Logic] Correctness: integrations.find(...) only selects a single integration per provider. If there are multiple integrations for the same provider (e.g., multiple configs), the Connected tab will drop all but the first and the table will be incomplete. Consider building allItems from the integrations list (or using flatMap to include all integrations for a provider) so each integration is represented.

Context for Agents
Correctness: `integrations.find(...)` only selects a single integration per provider. If there are multiple integrations for the same provider (e.g., multiple configs), the Connected tab will drop all but the first and the table will be incomplete. Consider building `allItems` from the integrations list (or using `flatMap` to include all integrations for a provider) so each integration is represented.

File: packages/webapp/src/pages/Integrations/Show.tsx
Line: 50

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant