Skip to content

Commit 461e987

Browse files
committed
Moved some schemas/types to core. Use id instead of friendlyId
1 parent f8b7141 commit 461e987

File tree

12 files changed

+117
-147
lines changed

12 files changed

+117
-147
lines changed

apps/webapp/app/components/runs/v3/WaitpointDetails.tsx

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { DateTime, DateTimeAccurate } from "~/components/primitives/DateTime";
22
import { Paragraph } from "~/components/primitives/Paragraph";
33
import * as Property from "~/components/primitives/PropertyTable";
4+
import { TextLink } from "~/components/primitives/TextLink";
5+
import { useEnvironment } from "~/hooks/useEnvironment";
6+
import { useOrganization } from "~/hooks/useOrganizations";
7+
import { useProject } from "~/hooks/useProject";
48
import { type WaitpointDetail } from "~/presenters/v3/WaitpointPresenter.server";
59
import { ForceTimeout } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route";
10+
import { v3WaitpointTokenPath, v3WaitpointTokensPath } from "~/utils/pathBuilder";
611
import { PacketDisplay } from "./PacketDisplay";
712
import { WaitpointStatusCombo } from "./WaitpointStatus";
8-
import { v3WaitpointTokenPath, v3WaitpointTokensPath } from "~/utils/pathBuilder";
9-
import { Link } from "@remix-run/react";
10-
import { TextLink } from "~/components/primitives/TextLink";
11-
import { useOrganization } from "~/hooks/useOrganizations";
12-
import { useProject } from "~/hooks/useProject";
13-
import { useEnvironment } from "~/hooks/useEnvironment";
13+
import { RunTag } from "./RunTag";
1414

1515
export function WaitpointDetailTable({
1616
waitpoint,
@@ -31,11 +31,7 @@ export function WaitpointDetailTable({
3131
<Property.Item>
3232
<Property.Label>Status</Property.Label>
3333
<Property.Value>
34-
<WaitpointStatusCombo
35-
status={waitpoint.status}
36-
outputIsError={waitpoint.outputIsError}
37-
className="text-sm"
38-
/>
34+
<WaitpointStatusCombo status={waitpoint.status} className="text-sm" />
3935
</Property.Value>
4036
</Property.Item>
4137
<Property.Item>
@@ -44,13 +40,13 @@ export function WaitpointDetailTable({
4440
{linkToList ? (
4541
<TextLink
4642
to={v3WaitpointTokenPath(organization, project, environment, waitpoint, {
47-
id: waitpoint.friendlyId,
43+
id: waitpoint.id,
4844
})}
4945
>
50-
{waitpoint.friendlyId}
46+
{waitpoint.id}
5147
</TextLink>
5248
) : (
53-
waitpoint.friendlyId
49+
waitpoint.id
5450
)}
5551
</Property.Value>
5652
</Property.Item>
@@ -100,6 +96,20 @@ export function WaitpointDetailTable({
10096
</div>
10197
</Property.Value>
10298
</Property.Item>
99+
<Property.Item>
100+
<Property.Label>Tags</Property.Label>
101+
<Property.Value>
102+
<div className="flex flex-wrap gap-1 pt-1 text-xs">
103+
{waitpoint.tags.map((tag) => (
104+
<RunTag
105+
key={tag}
106+
tag={tag}
107+
to={v3WaitpointTokensPath(organization, project, environment, { tags: [tag] })}
108+
/>
109+
))}
110+
</div>
111+
</Property.Value>
112+
</Property.Item>
103113
</>
104114
)}
105115
{waitpoint.status === "PENDING" ? null : waitpoint.isTimeout ? (

apps/webapp/app/components/runs/v3/WaitpointStatus.tsx

Lines changed: 18 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,60 @@
11
import { CheckCircleIcon } from "@heroicons/react/20/solid";
2-
import { type WaitpointStatus } from "@trigger.dev/database";
2+
import { type WaitpointTokenStatus } from "@trigger.dev/core/v3";
33
import assertNever from "assert-never";
44
import { TimedOutIcon } from "~/assets/icons/TimedOutIcon";
55
import { Spinner } from "~/components/primitives/Spinner";
66
import { cn } from "~/utils/cn";
77

88
export function WaitpointStatusCombo({
99
status,
10-
outputIsError,
1110
className,
1211
iconClassName,
1312
}: {
14-
status: WaitpointStatus;
15-
outputIsError: boolean;
13+
status: WaitpointTokenStatus;
1614
className?: string;
1715
iconClassName?: string;
1816
}) {
1917
return (
2018
<span className={cn("flex items-center gap-1", className)}>
21-
<WaitpointStatusIcon
22-
status={status}
23-
outputIsError={outputIsError}
24-
className={cn("h-4 w-4", iconClassName)}
25-
/>
26-
<WaitpointStatusLabel status={status} outputIsError={outputIsError} />
19+
<WaitpointStatusIcon status={status} className={cn("h-4 w-4", iconClassName)} />
20+
<WaitpointStatusLabel status={status} />
2721
</span>
2822
);
2923
}
3024

31-
export function WaitpointStatusLabel({
32-
status,
33-
outputIsError,
34-
}: {
35-
status: WaitpointStatus;
36-
outputIsError: boolean;
37-
}) {
25+
export function WaitpointStatusLabel({ status }: { status: WaitpointTokenStatus }) {
3826
return (
39-
<span className={waitpointStatusClassNameColor(status, outputIsError)}>
40-
{waitpointStatusTitle(status, outputIsError)}
41-
</span>
27+
<span className={waitpointStatusClassNameColor(status)}>{waitpointStatusTitle(status)}</span>
4228
);
4329
}
4430

4531
export function WaitpointStatusIcon({
4632
status,
47-
outputIsError,
4833
className,
4934
}: {
50-
status: WaitpointStatus;
51-
outputIsError: boolean;
35+
status: WaitpointTokenStatus;
5236
className: string;
5337
}) {
5438
switch (status) {
5539
case "PENDING":
56-
return (
57-
<Spinner className={cn(waitpointStatusClassNameColor(status, outputIsError), className)} />
58-
);
59-
case "COMPLETED": {
60-
if (outputIsError) {
61-
return (
62-
<TimedOutIcon
63-
className={cn(waitpointStatusClassNameColor(status, outputIsError), className)}
64-
/>
65-
);
66-
}
67-
return (
68-
<CheckCircleIcon
69-
className={cn(waitpointStatusClassNameColor(status, outputIsError), className)}
70-
/>
71-
);
72-
}
73-
40+
return <Spinner className={cn(waitpointStatusClassNameColor(status), className)} />;
41+
case "FAILED":
42+
return <TimedOutIcon className={cn(waitpointStatusClassNameColor(status), className)} />;
43+
case "COMPLETED":
44+
return <CheckCircleIcon className={cn(waitpointStatusClassNameColor(status), className)} />;
7445
default: {
7546
assertNever(status);
7647
}
7748
}
7849
}
7950

80-
export function waitpointStatusClassNameColor(
81-
status: WaitpointStatus,
82-
outputIsError: boolean
83-
): string {
51+
export function waitpointStatusClassNameColor(status: WaitpointTokenStatus): string {
8452
switch (status) {
8553
case "PENDING":
8654
return "text-blue-500";
55+
case "FAILED":
56+
return "text-error";
8757
case "COMPLETED": {
88-
if (outputIsError) {
89-
return "text-error";
90-
}
9158
return "text-success";
9259
}
9360
default: {
@@ -96,14 +63,13 @@ export function waitpointStatusClassNameColor(
9663
}
9764
}
9865

99-
export function waitpointStatusTitle(status: WaitpointStatus, outputIsError: boolean): string {
66+
export function waitpointStatusTitle(status: WaitpointTokenStatus): string {
10067
switch (status) {
10168
case "PENDING":
10269
return "Waiting";
70+
case "FAILED":
71+
return "Timed out";
10372
case "COMPLETED": {
104-
if (outputIsError) {
105-
return "Timed out";
106-
}
10773
return "Completed";
10874
}
10975
default: {

apps/webapp/app/components/runs/v3/WaitpointTokenFilters.tsx

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
import * as Ariakit from "@ariakit/react";
22
import { CalendarIcon, FingerPrintIcon, TagIcon, TrashIcon } from "@heroicons/react/20/solid";
33
import { Form, useFetcher } from "@remix-run/react";
4-
import { TaskTriggerSource } from "@trigger.dev/database";
4+
import { WaitpointTokenStatus, waitpointTokenStatuses } from "@trigger.dev/core/v3";
55
import { ListChecks, ListFilterIcon } from "lucide-react";
6+
import { matchSorter } from "match-sorter";
67
import { type ReactNode, useCallback, useEffect, useMemo, useState } from "react";
78
import { z } from "zod";
89
import { StatusIcon } from "~/assets/icons/StatusIcon";
10+
import { AppliedFilter } from "~/components/primitives/AppliedFilter";
911
import { Button } from "~/components/primitives/Buttons";
12+
import { FormError } from "~/components/primitives/FormError";
13+
import { Input } from "~/components/primitives/Input";
14+
import { Label } from "~/components/primitives/Label";
15+
import { Paragraph } from "~/components/primitives/Paragraph";
1016
import {
1117
ComboBox,
1218
SelectButtonItem,
@@ -17,45 +23,34 @@ import {
1723
SelectTrigger,
1824
shortcutFromIndex,
1925
} from "~/components/primitives/Select";
20-
import { useOptimisticLocation } from "~/hooks/useOptimisticLocation";
21-
import {
22-
AppliedCustomDateRangeFilter,
23-
AppliedPeriodFilter,
24-
appliedSummary,
25-
CreatedAtDropdown,
26-
CustomDateRangeDropdown,
27-
FilterMenuProvider,
28-
} from "./SharedFilters";
29-
import { useSearchParams } from "~/hooks/useSearchParam";
26+
import { Spinner } from "~/components/primitives/Spinner";
3027
import {
3128
Tooltip,
3229
TooltipContent,
3330
TooltipProvider,
3431
TooltipTrigger,
3532
} from "~/components/primitives/Tooltip";
36-
import { WaitpointStatusCombo, waitpointStatusTitle } from "./WaitpointStatus";
37-
import { Paragraph } from "~/components/primitives/Paragraph";
38-
import { AppliedFilter } from "~/components/primitives/AppliedFilter";
3933
import { useEnvironment } from "~/hooks/useEnvironment";
40-
import { matchSorter } from "match-sorter";
41-
import { Spinner } from "~/components/primitives/Spinner";
42-
import { project } from "effect/Layer";
34+
import { useOptimisticLocation } from "~/hooks/useOptimisticLocation";
35+
import { useOrganization } from "~/hooks/useOrganizations";
4336
import { useProject } from "~/hooks/useProject";
37+
import { useSearchParams } from "~/hooks/useSearchParam";
4438
import { type loader as tagsLoader } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.tags";
45-
import { useOrganization } from "~/hooks/useOrganizations";
46-
import { Label } from "~/components/primitives/Label";
47-
import { Input } from "~/components/primitives/Input";
48-
import { FormError } from "~/components/primitives/FormError";
49-
50-
const filterableStatuses = ["PENDING", "COMPLETED", "FAILED"] as const;
51-
export const WaitpointFilterStatus = z.enum(filterableStatuses);
52-
export type WaitpointFilterStatus = z.infer<typeof WaitpointFilterStatus>;
39+
import {
40+
AppliedCustomDateRangeFilter,
41+
AppliedPeriodFilter,
42+
appliedSummary,
43+
CreatedAtDropdown,
44+
CustomDateRangeDropdown,
45+
FilterMenuProvider,
46+
} from "./SharedFilters";
47+
import { WaitpointStatusCombo } from "./WaitpointStatus";
5348

5449
export const WaitpointSearchParamsSchema = z.object({
5550
id: z.string().optional(),
5651
statuses: z.preprocess(
5752
(value) => (typeof value === "string" ? [value] : value),
58-
WaitpointFilterStatus.array().optional()
53+
WaitpointTokenStatus.array().optional()
5954
),
6055
idempotencyKey: z.string().optional(),
6156
tags: z.string().array().optional(),
@@ -221,12 +216,12 @@ function MainMenu({ searchValue, trigger, clearSearchValue, setFilterType }: Men
221216
);
222217
}
223218

224-
const statuses = filterableStatuses.map((status) => ({
219+
const statuses = waitpointTokenStatuses.map((status) => ({
225220
title: statusTitle(status),
226221
value: status,
227222
}));
228223

229-
function statusTitle(status: WaitpointFilterStatus) {
224+
function statusTitle(status: WaitpointTokenStatus) {
230225
switch (status) {
231226
case "COMPLETED": {
232227
return "Completed";
@@ -288,10 +283,7 @@ function StatusDropdown({
288283
<TooltipProvider>
289284
<Tooltip>
290285
<TooltipTrigger className="group flex w-full flex-col py-0">
291-
<WaitpointStatusCombo
292-
status={item.value === "FAILED" ? "COMPLETED" : item.value}
293-
outputIsError={item.value === "FAILED"}
294-
/>
286+
<WaitpointStatusCombo status={item.value} />
295287
</TooltipTrigger>
296288
<TooltipContent side="right" sideOffset={50}>
297289
<Paragraph variant="extra-small">{statusTitle(item.value)}</Paragraph>
@@ -323,7 +315,7 @@ function AppliedStatusFilter() {
323315
<Ariakit.Select render={<div className="group cursor-pointer focus-custom" />}>
324316
<AppliedFilter
325317
label="Status"
326-
value={appliedSummary(statuses.map((v) => statusTitle(v as WaitpointFilterStatus)))}
318+
value={appliedSummary(statuses.map((v) => statusTitle(v as WaitpointTokenStatus)))}
327319
onRemove={() => del(["statuses", "cursor", "direction"])}
328320
/>
329321
</Ariakit.Select>

apps/webapp/app/presenters/v3/WaitpointPresenter.server.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { isWaitpointOutputTimeout, prettyPrintPacket } from "@trigger.dev/core/v3";
22
import { logger } from "~/services/logger.server";
33
import { BasePresenter } from "./basePresenter.server";
4-
import { RunListItem, RunListPresenter } from "./RunListPresenter.server";
4+
import { type RunListItem, RunListPresenter } from "./RunListPresenter.server";
55

66
export type WaitpointDetail = NonNullable<Awaited<ReturnType<WaitpointPresenter["call"]>>>;
77

@@ -38,6 +38,7 @@ export class WaitpointPresenter extends BasePresenter {
3838
},
3939
take: 5,
4040
},
41+
tags: true,
4142
},
4243
});
4344

@@ -77,9 +78,9 @@ export class WaitpointPresenter extends BasePresenter {
7778
}
7879

7980
return {
80-
friendlyId: waitpoint.friendlyId,
81+
id: waitpoint.friendlyId,
8182
type: waitpoint.type,
82-
status: waitpoint.status,
83+
status: waitpoint.outputIsError ? ("FAILED" as const) : waitpoint.status,
8384
idempotencyKey: waitpoint.idempotencyKey,
8485
userProvidedIdempotencyKey: waitpoint.userProvidedIdempotencyKey,
8586
idempotencyKeyExpiresAt: waitpoint.idempotencyKeyExpiresAt,
@@ -88,6 +89,7 @@ export class WaitpointPresenter extends BasePresenter {
8889
outputType: waitpoint.outputType,
8990
outputIsError: waitpoint.outputIsError,
9091
completedAfter: waitpoint.completedAfter,
92+
tags: waitpoint.tags,
9193
isTimeout,
9294
connectedRuns,
9395
};

0 commit comments

Comments
 (0)