Skip to content

Hold one loading surface when opening an integration - #2085

Draft
RhysSullivan wants to merge 1 commit into
mainfrom
fix/app-detail-loading
Draft

RhysSullivan wants to merge 1 commit into
mainfrom
fix/app-detail-loading

Conversation

@RhysSullivan

@RhysSullivan RhysSullivan commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Opening an integration walked the detail page through several placeholders in a
row. On a cold open the header printed the raw URL slug (postman-echo-9f2a)
before swapping it for the real name, and the Accounts pane showed a pulsing dot
and the words "Loading accounts…" — a loading vocabulary used nowhere else on
the page — before the real content arrived in a different box.

Each of those is one of our own internal boundaries: the catalog row request,
the plugin lookup that depends on it, the connections request. None is a fact
the person clicking an integration has any use for, and several short loading
states are worse than one longer one, because every transition is a fresh demand
on the eye.

What changed

  • The detail page holds one skeleton until it knows what it is. Everything
    it renders — the name, whether the integration is built-in, which plugin owns
    the Accounts pane, the declared auth methods — comes from the catalog row, so
    rendering before that lands does not show less, it shows a different page.
  • The skeleton is built from the same boxes the settled page uses (the tab
    strip's border and padding, then the pane that tab will fill), so content
    lands where the skeleton already was.
  • The header holds a placeholder instead of printing the slug.
  • The Accounts pane's "Loading accounts…" line is now a skeleton in the shape of
    the row it holds space for.
  • asyncResultValue reads a result's retained value, so a background refresh
    cannot blank data the client already has.

Before

before

After

after

Verification

New scenario e2e/scenarios/integration-detail-loading-surface.test.ts, modelled
on the artifact loading-surface scenario. These states were only ever on screen
for a few hundred milliseconds, so a screenshot at one moment would miss them and
pass against the old code too. The page is sampled continuously on an animation
frame, from before the click until the detail page is live, and the assertion is
over everything that was ever on screen: no placeholder words, no raw slug in the
title, and a detail body whose box never changed size. Warm (a click from the
list) and cold (a direct URL in a fresh context) are both covered.

Against the pre-fix code the cold open fails on both counts — "Loading accounts" was on screen at sample 24 of 85 and the header printed the raw slug "postman-echo-9b15aea9" at sample 24 of 85. With the change the scenario passes.

bun run typecheck (packages/react), oxlint, and bun run format are clean.
Not checked: the other hosts' surfaces, and the wider e2e suite.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 21, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
executor-cloud 28e964f Sep 21 2026, 03:47 AM

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 21, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
executor-marketing 28e964f Commit Preview URL

Branch Preview URL
Sep 21 2026, 03:45 AM

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare preview

Console https://executor-preview-pr-2085.executor-e2e.workers.dev
MCP https://executor-preview-pr-2085.executor-e2e.workers.dev/mcp
Deployed commit 28e964f

Sign-in is Cloudflare Access (one-time PIN to an allowed email). The preview has its own database and encryption key; it is destroyed when this PR closes.

@pkg-pr-new

pkg-pr-new Bot commented Sep 21, 2026

Copy link
Copy Markdown

Open in StackBlitz

@executor-js/cli

npm i https://pkg.pr.new/@executor-js/cli@2085

@executor-js/config

npm i https://pkg.pr.new/@executor-js/config@2085

@executor-js/execution

npm i https://pkg.pr.new/@executor-js/execution@2085

@executor-js/sdk

npm i https://pkg.pr.new/@executor-js/sdk@2085

@executor-js/codemode-core

npm i https://pkg.pr.new/@executor-js/codemode-core@2085

@executor-js/runtime-quickjs

npm i https://pkg.pr.new/@executor-js/runtime-quickjs@2085

@executor-js/plugin-file-secrets

npm i https://pkg.pr.new/@executor-js/plugin-file-secrets@2085

@executor-js/plugin-graphql

npm i https://pkg.pr.new/@executor-js/plugin-graphql@2085

@executor-js/plugin-keychain

npm i https://pkg.pr.new/@executor-js/plugin-keychain@2085

@executor-js/plugin-mcp

npm i https://pkg.pr.new/@executor-js/plugin-mcp@2085

@executor-js/plugin-onepassword

npm i https://pkg.pr.new/@executor-js/plugin-onepassword@2085

@executor-js/plugin-openapi

npm i https://pkg.pr.new/@executor-js/plugin-openapi@2085

executor

npm i https://pkg.pr.new/executor@2085

commit: 28e964f

This branch has not been deployed

No deployments
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