import { useParams } from 'common' import { toString as CronToString } from 'cronstrue' import { Edit3, List } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' import { BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, cn, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import { PageHeader, PageHeaderAside, PageHeaderBreadcrumb, PageHeaderDescription, PageHeaderMeta, PageHeaderSummary, PageHeaderTitle, } from 'ui-patterns/PageHeader' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { CreateCronJobSheet } from './CreateCronJobSheet/CreateCronJobSheet' import { isSecondsFormat, parseCronJobCommand } from './CronJobs.utils' import { PreviousRunsTab } from './PreviousRunsTab' import { useCronJobQuery } from '@/data/database-cron-jobs/database-cron-job-query' import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const CronJobPage = () => { const router = useRouter() const { ref, id, pageId, childId } = useParams() const childLabel = router?.query?.['child-label'] as string const { data: project } = useSelectedProjectQuery() const [isEditSheetOpen, setIsEditSheetOpen] = useState(false) const jobId = Number(childId) const { data: job, isPending: isLoading } = useCronJobQuery({ projectRef: project?.ref, connectionString: project?.connectionString, id: jobId, }) const { data: edgeFunctions = [] } = useEdgeFunctionsQuery({ projectRef: project?.ref }) // Parse the cron job command to check if it's an edge function const cronJobValues = parseCronJobCommand(job?.command || '', project?.ref!) const edgeFunction = cronJobValues.type === 'edge_function' ? cronJobValues.edgeFunctionName : undefined const edgeFunctionSlug = edgeFunction?.split('/functions/v1/').pop() const isValidEdgeFunction = edgeFunctions.some((x) => x.slug === edgeFunctionSlug) const pageTitle = childLabel || childId || 'Cron Job' const pageSubtitle = job ? (
{job.schedule.toLowerCase()}
{!isSecondsFormat(job.schedule) && ({CronToString(job.schedule.toLowerCase())}
)}
{job.command}
Command