"use client"; import { useState, useMemo, useEffect } from "react"; import { CronJob } from "@/app/_utils/cronjob-utils"; import { Script } from "@/app/_utils/scripts-utils"; import { getJobErrorsByJobId, JobError, } from "@/app/_utils/error-utils"; import { handleErrorClick, handleDelete, handleClone, handlePause, handleResume, handleRun, handleEditSubmit, handleNewCronSubmit, handleToggleLogging, handleBackup, } from "@/app/_components/FeatureComponents/Cronjobs/helpers"; interface CronJobListProps { cronJobs: CronJob[]; scripts: Script[]; } export const useCronJobState = ({ 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 [runningJobId, setRunningJobId] = useState(null); const [selectedUser, setSelectedUser] = useState(null); const [jobErrors, setJobErrors] = useState>({}); const [errorModalOpen, setErrorModalOpen] = useState(false); const [selectedError, setSelectedError] = useState(null); const [isLogsModalOpen, setIsLogsModalOpen] = useState(false); const [jobForLogs, setJobForLogs] = useState(null); const [isLiveLogModalOpen, setIsLiveLogModalOpen] = useState(false); const [liveLogRunId, setLiveLogRunId] = useState(""); const [liveLogJobId, setLiveLogJobId] = useState(""); const [liveLogJobComment, setLiveLogJobComment] = useState(""); const [editForm, setEditForm] = useState({ schedule: "", command: "", comment: "", logsEnabled: false, }); const [newCronForm, setNewCronForm] = useState({ schedule: "", command: "", comment: "", selectedScriptId: null as string | null, user: "", logsEnabled: false, }); useEffect(() => { const savedUser = localStorage.getItem("selectedCronUser"); if (savedUser) { setSelectedUser(savedUser); } }, []); useEffect(() => { if (selectedUser) { localStorage.setItem("selectedCronUser", selectedUser); } else { localStorage.removeItem("selectedCronUser"); } }, [selectedUser]); const filteredJobs = useMemo(() => { if (!selectedUser) return cronJobs; return cronJobs.filter((job) => job.user === selectedUser); }, [cronJobs, selectedUser]); useEffect(() => { const errors: Record = {}; filteredJobs.forEach((job) => { errors[job.id] = getJobErrorsByJobId(job.id); }); setJobErrors(errors); }, [filteredJobs]); const refreshJobErrorsLocal = () => { const errors: Record = {}; filteredJobs.forEach((job) => { errors[job.id] = getJobErrorsByJobId(job.id); }); setJobErrors(errors); }; const getHelperState = () => ({ setDeletingId, setIsDeleteModalOpen, setJobToDelete, setIsCloneModalOpen, setJobToClone, setIsCloning, setIsEditModalOpen, setEditingJob, setIsNewCronModalOpen, setNewCronForm, setRunningJobId, refreshJobErrors: refreshJobErrorsLocal, setIsLiveLogModalOpen, setLiveLogRunId, setLiveLogJobId, setLiveLogJobComment, jobToClone, editingJob, editForm, newCronForm, }); const handleErrorClickLocal = (error: JobError) => { handleErrorClick(error, setSelectedError, setErrorModalOpen); }; const handleDeleteLocal = async (id: string) => { const job = cronJobs.find(j => j.id === id); if (job) { await handleDelete(job, getHelperState()); } }; const handleCloneLocal = async (newComment: string) => { await handleClone(newComment, getHelperState()); }; const handlePauseLocal = async (id: string) => { const job = cronJobs.find(j => j.id === id); if (job) { await handlePause(job); } }; const handleResumeLocal = async (id: string) => { const job = cronJobs.find(j => j.id === id); if (job) { await handleResume(job); } }; const handleRunLocal = async (id: string) => { const job = cronJobs.find(j => j.id === id); if (!job) return; await handleRun(id, getHelperState(), job); }; const handleToggleLoggingLocal = async (id: string) => { const job = cronJobs.find(j => j.id === id); if (job) { await handleToggleLogging(job); } }; const handleViewLogs = (job: CronJob) => { setJobForLogs(job); setIsLogsModalOpen(true); }; 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 || "", logsEnabled: job.logsEnabled || false, }); setIsEditModalOpen(true); }; const handleEditSubmitLocal = async (e: React.FormEvent) => { await handleEditSubmit(e, getHelperState()); }; const handleNewCronSubmitLocal = async (e: React.FormEvent) => { await handleNewCronSubmit(e, getHelperState()); }; const handleBackupLocal = async (id: string) => { const job = cronJobs.find(j => j.id === id); if (job) { await handleBackup(job); } }; return { deletingId, runningJobId, selectedUser, setSelectedUser, jobErrors, errorModalOpen, setErrorModalOpen, selectedError, setSelectedError, isLogsModalOpen, setIsLogsModalOpen, jobForLogs, isLiveLogModalOpen, setIsLiveLogModalOpen, liveLogRunId, liveLogJobId, liveLogJobComment, filteredJobs, isNewCronModalOpen, setIsNewCronModalOpen, isEditModalOpen, setIsEditModalOpen, isDeleteModalOpen, setIsDeleteModalOpen, isCloneModalOpen, setIsCloneModalOpen, jobToDelete, jobToClone, isCloning, editForm, setEditForm, newCronForm, setNewCronForm, handleErrorClickLocal, refreshJobErrorsLocal, handleDeleteLocal, handleCloneLocal, handlePauseLocal, handleResumeLocal, handleRunLocal, handleToggleLoggingLocal, handleViewLogs, confirmDelete, confirmClone, handleEdit, handleEditSubmitLocal, handleNewCronSubmitLocal, handleBackupLocal, }; };