Skip to content

Commit 5384745

Browse files
committed
Show tester connect pack in launch UI
1 parent b20dc75 commit 5384745

3 files changed

Lines changed: 153 additions & 3 deletions

File tree

apps/dashboard/src/styles.css

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3080,6 +3080,7 @@ dd {
30803080
.tester-launch-main,
30813081
.tester-launch-side,
30823082
.tester-launch-workflow,
3083+
.tester-launch-connect-pack,
30833084
.tester-launch-checklist,
30843085
.tester-launch-routes,
30853086
.tester-launch-owner-inputs,
@@ -3099,6 +3100,48 @@ dd {
30993100
gap: 10px;
31003101
}
31013102

3103+
.tester-launch-profile-grid {
3104+
display: grid;
3105+
grid-template-columns: repeat(4, minmax(0, 1fr));
3106+
gap: 10px;
3107+
}
3108+
3109+
.tester-launch-profile-grid div {
3110+
display: grid;
3111+
align-content: start;
3112+
gap: 7px;
3113+
min-width: 0;
3114+
min-height: 92px;
3115+
padding: 12px;
3116+
border: 1px solid #d4ddd6;
3117+
border-radius: 8px;
3118+
background: #f8faf6;
3119+
}
3120+
3121+
.tester-launch-profile-grid span {
3122+
color: var(--muted);
3123+
font-size: 0.7rem;
3124+
font-weight: 800;
3125+
text-transform: uppercase;
3126+
}
3127+
3128+
.tester-launch-profile-grid strong,
3129+
.tester-launch-profile-grid code {
3130+
min-width: 0;
3131+
overflow-wrap: anywhere;
3132+
}
3133+
3134+
.tester-launch-profile-grid strong {
3135+
color: var(--ink);
3136+
font-size: 0.92rem;
3137+
}
3138+
3139+
.tester-launch-profile-grid code {
3140+
align-self: end;
3141+
width: 100%;
3142+
margin: 0;
3143+
}
3144+
31023145
.tester-launch-card {
31033146
display: grid;
31043147
grid-template-rows: auto auto minmax(38px, auto) auto auto;
@@ -3175,26 +3218,53 @@ dd {
31753218
}
31763219

31773220
.tester-launch-route-grid,
3178-
.tester-launch-gateway-routes div {
3221+
.tester-launch-gateway-routes div,
3222+
.tester-launch-route-pair {
3223+
display: grid;
3224+
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
3225+
gap: 8px;
3226+
}
3227+
3228+
.tester-launch-route-pair > div {
3229+
display: grid;
3230+
align-content: start;
3231+
gap: 8px;
3232+
min-width: 0;
3233+
padding: 10px;
3234+
border: 1px solid var(--line);
3235+
border-radius: 8px;
3236+
background: #f9faf6;
3237+
}
3238+
3239+
.tester-launch-route-pair > div > div {
31793240
display: grid;
31803241
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
31813242
gap: 8px;
31823243
}
31833244

31843245
.tester-launch-route-grid code,
31853246
.tester-launch-gateway-routes code,
3247+
.tester-launch-route-pair code,
31863248
.tester-launch-owner-inputs code,
31873249
.tester-launch-commands code {
31883250
min-width: 0;
31893251
overflow-wrap: anywhere;
31903252
}
31913253

3192-
.tester-launch-gateway-routes {
3254+
.tester-launch-gateway-routes,
3255+
.tester-launch-route-pair {
31933256
display: grid;
31943257
gap: 8px;
31953258
padding-top: 2px;
31963259
}
31973260

3261+
.tester-launch-route-pair strong {
3262+
color: var(--muted);
3263+
font-size: 0.7rem;
3264+
font-weight: 800;
3265+
text-transform: uppercase;
3266+
}
3267+
31983268
.tester-launch-owner-inputs details,
31993269
.tester-launch-commands details {
32003270
display: grid;
@@ -4447,6 +4517,7 @@ code {
44474517
.tester-launch-command-panel,
44484518
.tester-launch-layout,
44494519
.tester-launch-card-grid,
4520+
.tester-launch-profile-grid,
44504521
.product-surface-grid,
44514522
.pilot-status-body,
44524523
.local-action-grid,
@@ -4555,7 +4626,8 @@ code {
45554626

45564627
.explorer-category-strip,
45574628
.explorer-facts,
4558-
.tester-launch-card-grid {
4629+
.tester-launch-card-grid,
4630+
.tester-launch-profile-grid {
45594631
grid-template-columns: repeat(2, minmax(0, 1fr));
45604632
}
45614633
}
@@ -4571,8 +4643,11 @@ code {
45714643
.live-readiness-gates,
45724644
.tester-launch-command-panel,
45734645
.tester-launch-card-grid,
4646+
.tester-launch-profile-grid,
45744647
.tester-launch-route-grid,
45754648
.tester-launch-gateway-routes div,
4649+
.tester-launch-route-pair,
4650+
.tester-launch-route-pair > div > div,
45764651
.workbench-switcher,
45774652
.explorer-category-strip,
45784653
.explorer-facts,

apps/dashboard/src/test/dashboardData.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,12 @@ describe("dashboard fixture", () => {
449449
expect(html).toContain("Packet smoke");
450450
expect(html).toContain("Gateway proof");
451451
expect(html).toContain("Tester workflow");
452+
expect(html).toContain("Connection profile");
453+
expect(html).toContain("Connect pack");
454+
expect(html).toContain("FlowChain friends-and-family pilot");
455+
expect(html).toContain("flowmemory-local-devnet-v0");
456+
expect(html).toContain("<OWNER_PUBLIC_ENDPOINT>/rpc");
457+
expect(html).toContain("<OWNER_PUBLIC_ENDPOINT>/explorer/summary");
452458
expect(html).toContain("Create tester wallet");
453459
expect(html).toContain("Faucet fund");
454460
expect(html).toContain("Send capped transfer");
@@ -459,6 +465,7 @@ describe("dashboard fixture", () => {
459465
expect(html).toContain("/tester/wallets/create");
460466
expect(html).toContain("/tester/faucet");
461467
expect(html).toContain("/tester/wallets/send");
468+
expect(html).toContain("/explorer/summary");
462469
expect(html).toContain("npm run flowchain:external-tester:packet");
463470
expect(html).not.toContain("local-tester-write-token");
464471
});

apps/dashboard/src/views/ExternalTesterLaunchView.tsx

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Compass,
77
KeyRound,
88
ListChecks,
9+
Network,
910
Route,
1011
Search,
1112
Server,
@@ -75,6 +76,7 @@ export function ExternalTesterLaunchView({ workbench }: { workbench: WorkbenchSn
7576
const report = isRecord(workbench.raw.liveReadinessReport) ? workbench.raw.liveReadinessReport : null;
7677
const metrics = isRecord(report?.metrics) ? report.metrics : {};
7778
const testerLaunch = isRecord(report?.testerLaunch) ? report.testerLaunch : {};
79+
const connectPackNetwork = isRecord(testerLaunch.connectPackNetwork) ? testerLaunch.connectPackNetwork : {};
7880
const reportCommands = isRecord(report?.commands) ? report.commands : {};
7981
const testerCommands = isRecord(testerLaunch.commands) ? testerLaunch.commands : {};
8082
const liveReadinessRecords = workbench.sections.liveReadiness;
@@ -91,6 +93,8 @@ export function ExternalTesterLaunchView({ workbench }: { workbench: WorkbenchSn
9193
workbench.sections.blocks.length + workbench.sections.transactions.length + workbench.sections.explorerRecords.length;
9294
const packetRoutes = stringList(testerLaunch.packetSmokeRoutes);
9395
const gatewayRoutes = stringList(testerLaunch.gatewayRoutes);
96+
const connectPackReadOnlyRoutes = stringList(testerLaunch.connectPackReadOnlyRoutes);
97+
const connectPackTesterWriteRoutes = stringList(testerLaunch.connectPackTesterWriteRoutes);
9498
const hasTesterRoute = (route: string) => packetRoutes.includes(route) || gatewayRoutes.includes(route);
9599
const ownerInputs = asArray(report?.ownerInputs).filter(isRecord).map((input) => ({
96100
name: text(input.name),
@@ -156,6 +160,19 @@ export function ExternalTesterLaunchView({ workbench }: { workbench: WorkbenchSn
156160
to: "/raw",
157161
Icon: Route,
158162
},
163+
{
164+
id: "connect-pack",
165+
label: "Connect pack",
166+
status: statusFromText(testerLaunch.connectPackReady),
167+
value: boolText(testerLaunch.connectPackReady),
168+
detail: text(connectPackNetwork.chainId, "network profile"),
169+
command: commandGroup(testerCommands.readiness, [
170+
"npm run flowchain:tester:readiness -- -AllowBlocked",
171+
"npm run flowchain:external-tester:packet -- -AllowBlocked",
172+
])[1],
173+
to: "/raw",
174+
Icon: Network,
175+
},
159176
{
160177
id: "bridge",
161178
label: "Bridge",
@@ -302,6 +319,11 @@ export function ExternalTesterLaunchView({ workbench }: { workbench: WorkbenchSn
302319
<strong>{boolText(testerLaunch.packetExecutableSmokeValidated)}</strong>
303320
<small>{packetRoutes.length} routes</small>
304321
</div>
322+
<div>
323+
<span>Connect pack</span>
324+
<strong>{boolText(testerLaunch.connectPackReady)}</strong>
325+
<small>{text(connectPackNetwork.chainId, "chain not recorded")}</small>
326+
</div>
305327
<div>
306328
<span>Gateway proof</span>
307329
<strong>{text(testerLaunch.gatewayStatus, "not recorded")}</strong>
@@ -348,6 +370,52 @@ export function ExternalTesterLaunchView({ workbench }: { workbench: WorkbenchSn
348370
</div>
349371
</article>
350372

373+
<article className="panel tester-launch-connect-pack">
374+
<div className="panel-heading">
375+
<div>
376+
<Network size={18} aria-hidden="true" />
377+
<h2>Connection profile</h2>
378+
</div>
379+
<StatusBadge status={statusFromText(testerLaunch.connectPackReady)} compact />
380+
</div>
381+
<div className="tester-launch-profile-grid">
382+
<div>
383+
<span>network</span>
384+
<strong>{text(connectPackNetwork.name, "not recorded")}</strong>
385+
</div>
386+
<div>
387+
<span>chain</span>
388+
<strong>{text(connectPackNetwork.chainId, "not recorded")}</strong>
389+
</div>
390+
<div>
391+
<span>RPC</span>
392+
<code>{text(connectPackNetwork.rpcEndpointPlaceholder, "<OWNER_PUBLIC_ENDPOINT>/rpc")}</code>
393+
</div>
394+
<div>
395+
<span>explorer</span>
396+
<code>{text(connectPackNetwork.explorerSummaryUrlPlaceholder, "<OWNER_PUBLIC_ENDPOINT>/explorer/summary")}</code>
397+
</div>
398+
</div>
399+
<div className="tester-launch-route-pair">
400+
<div>
401+
<strong>Read routes</strong>
402+
<div>
403+
{connectPackReadOnlyRoutes.map((route) => (
404+
<code key={`read:${route}`}>{route}</code>
405+
))}
406+
</div>
407+
</div>
408+
<div>
409+
<strong>Write routes</strong>
410+
<div>
411+
{connectPackTesterWriteRoutes.map((route) => (
412+
<code key={`write:${route}`}>{route}</code>
413+
))}
414+
</div>
415+
</div>
416+
</div>
417+
</article>
418+
351419
<article className="panel tester-launch-checklist">
352420
<div className="panel-heading">
353421
<div>

0 commit comments

Comments
 (0)