import { useMutation, useSuspenseQuery } from "@tanstack/react-query"; import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, type DragEndEvent, } from "@dnd-kit/core"; import { arrayMove, SortableContext, sortableKeyboardCoordinates, rectSortingStrategy } from "@dnd-kit/sortable"; import { CalendarClock, Plus } from "lucide-react"; import { useState } from "react"; import { EmptyState } from "~/client/components/empty-state"; import { Button } from "~/client/components/ui/button"; import { listBackupSchedulesOptions, reorderBackupSchedulesMutation, } from "~/client/api-client/@tanstack/react-query.gen"; import { SortableCard } from "~/client/components/sortable-card"; import { BackupCard } from "../components/backup-card"; import { Link } from "@tanstack/react-router"; export function BackupsPage() { const { data: schedules } = useSuspenseQuery({ ...listBackupSchedulesOptions(), }); const [localItems, setLocalItems] = useState(null); const items = localItems ?? schedules?.map((s) => s.shortId) ?? []; const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 8 }, }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }), ); const reorderMutation = useMutation({ ...reorderBackupSchedulesMutation(), }); const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (over && active.id !== over.id) { setLocalItems((currentItems) => { const baseItems = currentItems ?? schedules?.map((s) => s.shortId) ?? []; const activeId = String(active.id); const overId = String(over.id); let oldIndex = baseItems.indexOf(activeId); let newIndex = baseItems.indexOf(overId); if (oldIndex === -1 || newIndex === -1) { const freshItems = schedules?.map((s) => s.shortId) ?? []; oldIndex = freshItems.indexOf(activeId); newIndex = freshItems.indexOf(overId); if (oldIndex === -1 || newIndex === -1) { return currentItems; } const newItems = arrayMove(freshItems, oldIndex, newIndex); reorderMutation.mutate({ body: { scheduleShortIds: newItems } }); return newItems; } const newItems = arrayMove(baseItems, oldIndex, newIndex); reorderMutation.mutate({ body: { scheduleShortIds: newItems } }); return newItems; }); } }; if (!schedules || schedules.length === 0) { return ( Create a backup job } /> ); } const scheduleMap = new Map(schedules.map((s) => [s.shortId, s])); return (
{items.map((id) => { const schedule = scheduleMap.get(id); if (!schedule) return null; return ( ); })}
Create a backup job
); }