"use client" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogTitle, } from "@/components/ui/alert-dialog" import { Alert, AlertDescription, AlertTitle } from "@/components/reui/alert" import type { Backup } from "@/lib/data" import { backupFileMissing } from "@/lib/backup-file-state" import { AlertCircleIcon, LoaderCircleIcon, TriangleAlertIcon } from "lucide-react" export function BackupDeleteDialog({ backup, busy, error, onConfirm, onCancel, returnFocus, }: { backup: Backup | null busy: boolean error?: string | null onConfirm: () => void onCancel: () => void returnFocus?: () => HTMLElement | null }) { return ( { if (!v && !busy) onCancel() }}> {backup && backupFileMissing(backup) ? "Удалить запись о бэкапе?" : "Удалить бэкап?"} {backup && backupFileMissing(backup) ? <>Локальный файл {backup.filename} отсутствует. Будет удалена только запись из истории. : <>Файл {backup?.filename} будет удалён {backup?.storage === "s3" || backup?.storage === "both" ? " локально; объект S3 — через текущее подключение к хранилищу" : " с диска"}.} {error &&

{error}

} Отмена {busy ? : null} Удалить
) } export function BackupRestoreDialog({ backup, busy, blocked = false, error, onConfirm, onCancel, returnFocus, }: { backup: Backup | null busy: boolean blocked?: boolean error?: string | null onConfirm: () => void onCancel: () => void returnFocus?: () => HTMLElement | null }) { return ( { if (!v && !busy) onCancel() }}> Восстановить конфигурацию? Файл {backup?.filename} будет загружен на {backup?.server} и импортирован. Это изменит рабочую конфигурацию роутера Сессия может оборваться. Убедитесь, что выбран именно этот сервер и этот снимок. {error &&

{error}

} {blocked && !busy ? "Закрыть" : "Отмена"} {busy ? : null} Восстановить
) }