import { Clock3, Pencil, RefreshCw, Trash2, Webhook, Zap } from "lucide-react"; import type { RoutineTrigger } from "@paperclipai/shared"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { ToggleSwitch } from "@/components/ui/toggle-switch"; import { describeSchedule } from "./ScheduleEditor"; import { timeAgo } from "../lib/timeAgo"; interface TriggerListCardProps { trigger: RoutineTrigger; onEdit: () => void; onDelete: () => void; onToggleEnabled: (enabled: boolean) => void; onRotateSecret?: () => void; togglePending?: boolean; } export function TriggerListCard({ trigger, onEdit, onDelete, onToggleEnabled, onRotateSecret, togglePending, }: TriggerListCardProps) { const isSchedule = trigger.kind === "schedule"; const isWebhook = trigger.kind === "webhook"; const Icon = isSchedule ? Clock3 : isWebhook ? Webhook : Zap; const summary = isSchedule && trigger.cronExpression ? describeSchedule(trigger.cronExpression) : isWebhook ? `Webhook${trigger.publicId ? ` · ${trigger.publicId}` : ""}` : "API trigger"; const nextRun = isSchedule && trigger.enabled && trigger.nextRunAt ? new Date(trigger.nextRunAt).toLocaleString(undefined, { weekday: "short", day: "numeric", month: "short", hour: "2-digit", minute: "2-digit", }) : trigger.enabled ? "—" : "Disabled"; const lastFired = trigger.lastFiredAt ? timeAgo(trigger.lastFiredAt) : "Never"; const resultIsError = typeof trigger.lastResult === "string" && /error|fail/i.test(trigger.lastResult); return (
{trigger.label || (isSchedule ? "Schedule" : isWebhook ? "Webhook" : "Trigger")} {trigger.kind} {!trigger.enabled && ( paused )}
{summary}
{isSchedule && trigger.cronExpression && (
{trigger.cronExpression} {trigger.timezone ? ` · ${trigger.timezone}` : ""}
)}
Next run
{nextRun}
Last fired
{lastFired}
Last result
{trigger.lastResult ? ( {trigger.lastResult} ) : ( — )}
{isWebhook && onRotateSecret && ( )}
); }