"use client"; import { Card, CardContent, CardHeader, CardTitle } from "./ui/Card"; import { Button } from "./ui/Button"; import { Trash2, Clock, Edit, Plus, Files } from "lucide-react"; import { CronJob } from "@/app/_utils/system"; import { removeCronJob, editCronJob, createCronJob, cloneCronJob, } from "@/app/_server/actions/cronjobs"; import { useState } from "react"; import { CreateTaskModal } from "./modals/CreateTaskModal"; import { EditTaskModal } from "./modals/EditTaskModal"; import { DeleteTaskModal } from "./modals/DeleteTaskModal"; import { CloneTaskModal } from "./modals/CloneTaskModal"; import { type Script } from "@/app/_server/actions/scripts"; import { showToast } from "./ui/Toast"; interface CronJobListProps { cronJobs: CronJob[]; scripts: Script[]; } export function CronJobList({ cronJobs, scripts }: CronJobListProps) { const [deletingId, setDeletingId] = useState(null); const [editingJob, setEditingJob] = useState(null); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [isNewCronModalOpen, setIsNewCronModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isCloneModalOpen, setIsCloneModalOpen] = useState(false); const [jobToDelete, setJobToDelete] = useState(null); const [jobToClone, setJobToClone] = useState(null); const [isCloning, setIsCloning] = useState(false); const [editForm, setEditForm] = useState({ schedule: "", command: "", comment: "", }); const [newCronForm, setNewCronForm] = useState({ schedule: "", command: "", comment: "", selectedScriptId: null as string | null, }); const handleDelete = async (id: string) => { setDeletingId(id); try { const result = await removeCronJob(id); if (result.success) { showToast("success", "Cron job deleted successfully"); } else { showToast("error", "Failed to delete cron job", result.message); } } catch (error) { showToast( "error", "Failed to delete cron job", "Please try again later." ); } finally { setDeletingId(null); setIsDeleteModalOpen(false); setJobToDelete(null); } }; const handleClone = async (newComment: string) => { if (!jobToClone) return; setIsCloning(true); try { const result = await cloneCronJob(jobToClone.id, newComment); if (result.success) { setIsCloneModalOpen(false); setJobToClone(null); showToast("success", "Cron job cloned successfully"); } else { showToast("error", "Failed to clone cron job", result.message); } } finally { setIsCloning(false); } }; const confirmDelete = (job: CronJob) => { setJobToDelete(job); setIsDeleteModalOpen(true); }; const confirmClone = (job: CronJob) => { setJobToClone(job); setIsCloneModalOpen(true); }; const handleEdit = (job: CronJob) => { setEditingJob(job); setEditForm({ schedule: job.schedule, command: job.command, comment: job.comment || "", }); setIsEditModalOpen(true); }; const handleEditSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!editingJob) return; try { const formData = new FormData(); formData.append("id", editingJob.id); formData.append("schedule", editForm.schedule); formData.append("command", editForm.command); formData.append("comment", editForm.comment); const result = await editCronJob(formData); if (result.success) { setIsEditModalOpen(false); setEditingJob(null); showToast("success", "Cron job updated successfully"); } else { showToast("error", "Failed to update cron job", result.message); } } catch (error) { showToast( "error", "Failed to update cron job", "Please try again later." ); } }; const handleNewCronSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { const formData = new FormData(); formData.append("schedule", newCronForm.schedule); formData.append("command", newCronForm.command); formData.append("comment", newCronForm.comment); if (newCronForm.selectedScriptId) { formData.append("selectedScriptId", newCronForm.selectedScriptId); } const result = await createCronJob(formData); if (result.success) { setIsNewCronModalOpen(false); setNewCronForm({ schedule: "", command: "", comment: "", selectedScriptId: null, }); showToast("success", "Cron job created successfully"); } else { showToast("error", "Failed to create cron job", result.message); } } catch (error) { showToast( "error", "Failed to create cron job", "Please try again later." ); } }; return ( <>
Scheduled Tasks

{cronJobs.length} scheduled job {cronJobs.length !== 1 ? "s" : ""}

{cronJobs.length === 0 ? (

No scheduled tasks yet

Create your first scheduled task to automate your system operations and boost productivity.

) : (
{cronJobs.map((job) => (
{job.schedule}
                            {job.command}
                          
{job.comment && (

{job.comment}

)}
))}
)}
setIsNewCronModalOpen(false)} onSubmit={handleNewCronSubmit} scripts={scripts} form={newCronForm} onFormChange={(updates) => setNewCronForm((prev) => ({ ...prev, ...updates })) } /> setIsEditModalOpen(false)} onSubmit={handleEditSubmit} form={editForm} onFormChange={(updates) => setEditForm((prev) => ({ ...prev, ...updates })) } /> setIsDeleteModalOpen(false)} onConfirm={() => jobToDelete ? handleDelete(jobToDelete.id) : undefined } job={jobToDelete} /> setIsCloneModalOpen(false)} onConfirm={handleClone} isCloning={isCloning} /> ); }