import { useQuery } from "@tanstack/react-query"; import { CalendarClock, Database, HardDrive, Plus } from "lucide-react"; import { Link } from "react-router"; import { BackupStatusDot } from "../components/backup-status-dot"; import { EmptyState } from "~/client/components/empty-state"; import { Button } from "~/client/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/client/components/ui/card"; import type { Route } from "./+types/backups"; import { listBackupSchedules } from "~/client/api-client"; import { listBackupSchedulesOptions } from "~/client/api-client/@tanstack/react-query.gen"; export const handle = { breadcrumb: () => [{ label: "Backups" }], }; export function meta(_: Route.MetaArgs) { return [ { title: "Zerobyte - Backup Jobs" }, { name: "description", content: "Automate volume backups with scheduled jobs and retention policies.", }, ]; } export const clientLoader = async () => { const jobs = await listBackupSchedules(); if (jobs.data) return jobs.data; return []; }; export default function Backups({ loaderData }: Route.ComponentProps) { const { data: schedules, isLoading } = useQuery({ ...listBackupSchedulesOptions(), initialData: loaderData, refetchInterval: 10000, refetchOnWindowFocus: true, }); if (isLoading) { return (
Loading backup schedules...
{schedule.cronExpression}