import { useId, useState } from "react"; import { useMutation, useSuspenseQuery } from "@tanstack/react-query"; import { Database, HardDrive, Plus } from "lucide-react"; import { toast } from "sonner"; import { createBackupScheduleMutation, listRepositoriesOptions, listVolumesOptions, } from "~/client/api-client/@tanstack/react-query.gen"; import { Button } from "~/client/components/ui/button"; import { Card, CardContent } from "~/client/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/client/components/ui/select"; import { parseError } from "~/client/lib/errors"; import { EmptyState } from "~/client/components/empty-state"; import { getCronExpression } from "~/utils/utils"; import { CreateScheduleForm, type BackupScheduleFormValues } from "../components/create-schedule-form"; import { Link, useNavigate } from "@tanstack/react-router"; export function CreateBackupPage() { const navigate = useNavigate(); const formId = useId(); const [selectedVolumeId, setSelectedVolumeId] = useState(); const { data: volumesData } = useSuspenseQuery({ ...listVolumesOptions(), }); const { data: repositoriesData } = useSuspenseQuery({ ...listRepositoriesOptions(), }); const createSchedule = useMutation({ ...createBackupScheduleMutation(), onSuccess: (data) => { toast.success("Backup job created successfully"); void navigate({ to: `/backups/${data.id}` }); }, onError: (error) => { toast.error("Failed to create backup job", { description: parseError(error)?.message, }); }, }); const handleSubmit = (formValues: BackupScheduleFormValues) => { if (!selectedVolumeId) return; const cronExpression = getCronExpression( formValues.frequency, formValues.dailyTime, formValues.weeklyDay, formValues.monthlyDays, formValues.cronExpression, ); const retentionPolicy: Record = {}; if (formValues.keepLast) retentionPolicy.keepLast = formValues.keepLast; if (formValues.keepHourly) retentionPolicy.keepHourly = formValues.keepHourly; if (formValues.keepDaily) retentionPolicy.keepDaily = formValues.keepDaily; if (formValues.keepWeekly) retentionPolicy.keepWeekly = formValues.keepWeekly; if (formValues.keepMonthly) retentionPolicy.keepMonthly = formValues.keepMonthly; if (formValues.keepYearly) retentionPolicy.keepYearly = formValues.keepYearly; createSchedule.mutate({ body: { name: formValues.name, volumeId: selectedVolumeId, repositoryId: formValues.repositoryId, enabled: true, cronExpression, retentionPolicy: Object.keys(retentionPolicy).length > 0 ? retentionPolicy : undefined, includePatterns: formValues.includePatterns, excludePatterns: formValues.excludePatterns, excludeIfPresent: formValues.excludeIfPresent, oneFileSystem: formValues.oneFileSystem, }, }); }; const selectedVolume = volumesData.find((v) => v.id === selectedVolumeId); if (!volumesData.length) { return ( Go to volumes } /> ); } if (!repositoriesData?.length) { return ( Go to repositories } /> ); } return (
{selectedVolume ? ( <>
) : (

Select a volume

Choose a volume from the dropdown above to configure its backup schedule.

)}
); }