// @ts-nocheck import React, { useEffect, useState } from "react"; import { useKeyboard } from "@opentui/react"; import type { SmithersDb } from "../../../db/adapter.js"; import type { SelectOption } from "@opentui/core"; import { formatAge } from "../../format.js"; export function CronList({ adapter, onBack, }: { adapter: SmithersDb; onBack: () => void; }) { const [crons, setCrons] = useState([]); const [selectedIndex, setSelectedIndex] = useState(0); useEffect(() => { let mounted = true; async function poll() { try { const jobs = await adapter.listCrons(false); if (mounted) setCrons(jobs as any[]); } catch {} if (mounted) setTimeout(poll, 2000); } poll(); return () => { mounted = false; }; }, [adapter]); useKeyboard(async (key) => { if (key.name === "escape") { onBack(); return; } if (crons.length > 0) { if (key.name === "down" || key.name === "j") { setSelectedIndex(Math.min(crons.length - 1, selectedIndex + 1)); } else if (key.name === "up" || key.name === "k") { setSelectedIndex(Math.max(0, selectedIndex - 1)); } else if (key.name === "backspace" || key.name === "delete") { const id = crons[selectedIndex].cronId; await adapter.deleteCron(id); const next = await adapter.listCrons(false); setCrons(next as any[]); setSelectedIndex(Math.max(0, Math.min(selectedIndex, next.length - 1))); } } }); const selectedJob = crons[selectedIndex]; return ( {/* Left List */} Active Cron Triggers: {crons.length} {crons.map((c, i) => ( {i === selectedIndex ? "▶ " : " "}{c.workflowPath.slice(0, 30)} ))} {/* Right Details */} {selectedJob ? ( Workflow: {selectedJob.workflowPath} Setup: {selectedJob.pattern} Status: {selectedJob.enabled ? "ACTIVE" : "PAUSED"} Registered: {formatAge(selectedJob.createdAtMs)} Last Pired: {selectedJob.lastRunAtMs ? formatAge(selectedJob.lastRunAtMs) : "Never"} Next Fire: {selectedJob.nextRunAtMs ? formatAge(selectedJob.nextRunAtMs) : "Pending"} [Backspace] Kill Trigger {selectedJob.errorJson && ( Last Error: {selectedJob.errorJson} )} ) : ( No schedules found. Run `smithers cron add`. )} ); }