Skip to content

Commit ce70c40

Browse files
committed
fix(webapp): show a per-row spinner while a webhook sample or replay payload loads
Clicking a sample event or a past delivery in the webhook console now shows a spinner on that row while its payload loads. The pickers derived the in-flight row from a form action that a fetcher load never sets, so the spinner never appeared; they now track the clicked id in local state.
1 parent 656541f commit ce70c40

2 files changed

Lines changed: 7 additions & 13 deletions

File tree

apps/webapp/app/components/webhookConsole/ReplaySourcePicker.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { type WebhookDeliveryStatus } from "@trigger.dev/database";
2-
import { useEffect } from "react";
2+
import { useEffect, useState } from "react";
33
import { useTypedFetcher } from "remix-typedjson";
44
import { DateTime } from "~/components/primitives/DateTime";
55
import { Spinner } from "~/components/primitives/Spinner";
@@ -33,13 +33,10 @@ export function ReplaySourcePicker({
3333
listFetcher.state === "loading" ||
3434
(listFetcher.data === undefined && listFetcher.state !== "idle");
3535
const list = listFetcher.data?.kind === "list" ? listFetcher.data.deliveries : [];
36-
const loadingDeliveryId =
37-
payloadFetcher.state !== "idle"
38-
? (new URLSearchParams(payloadFetcher.formAction?.split("?")[1] ?? "").get("deliveryId") ??
39-
undefined)
40-
: undefined;
36+
const [loadingDeliveryId, setLoadingDeliveryId] = useState<string | undefined>(undefined);
4137

4238
function selectDelivery(friendlyId: string) {
39+
setLoadingDeliveryId(friendlyId);
4340
payloadFetcher.load(`${replaySourcePath}?deliveryId=${encodeURIComponent(friendlyId)}`);
4441
}
4542

@@ -79,7 +76,7 @@ export function ReplaySourcePicker({
7976
<span className="text-xxs text-text-dimmed">
8077
<DateTime date={new Date(delivery.createdAt)} />
8178
</span>
82-
{loadingDeliveryId === delivery.friendlyId ? (
79+
{payloadFetcher.state !== "idle" && loadingDeliveryId === delivery.friendlyId ? (
8380
<Spinner className="size-3.5" />
8481
) : (
8582
<DeliveryStatusBadge status={delivery.status as WebhookDeliveryStatus} />

apps/webapp/app/components/webhookConsole/SampleSourcePicker.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,10 @@ export function SampleSourcePicker({
7979
return !query || item.eventType.toLowerCase().includes(query);
8080
});
8181

82-
const loadingEventType =
83-
bodyFetcher.state !== "idle"
84-
? (new URLSearchParams(bodyFetcher.formAction?.split("?")[1] ?? "").get("eventType") ??
85-
undefined)
86-
: undefined;
82+
const [loadingEventType, setLoadingEventType] = useState<string | undefined>(undefined);
8783

8884
function selectEvent(item: WebhookSampleMeta) {
85+
setLoadingEventType(item.eventType);
8986
const query = new URLSearchParams({ provider: item.provider, eventType: item.eventType });
9087
bodyFetcher.load(`${samplesPath}?${query.toString()}`);
9188
}
@@ -161,7 +158,7 @@ export function SampleSourcePicker({
161158
<span className="truncate font-mono text-sm text-text-bright">
162159
{item.eventType}
163160
</span>
164-
{loadingEventType === item.eventType ? (
161+
{bodyFetcher.state !== "idle" && loadingEventType === item.eventType ? (
165162
<Spinner className="size-3.5 shrink-0" />
166163
) : null}
167164
</button>

0 commit comments

Comments
 (0)