"use client" import { useCallback, useEffect, useRef, useState } from "react" import { PageHeader } from "@/components/page-header" import { backups as mockBackups, servers as mockServers, type Backup, type Server } from "@/lib/data" import { createFilterQuery } from "@/components/reui/filters/filters-query" import type { FilterQuery } from "@/components/reui/filters/filters-types" import type { BackupScheduleSettingsDto, BackupStorageSettingsDto } from "@mmapp/contracts/backups" import { KpiStatGrid } from "@/components/reui-kit/kpi-stat-grid" import { Alert, AlertAction, AlertDescription, AlertTitle } from "@/components/reui/alert" import { Button } from "@/components/ui/button" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { CloudIcon, ClockIcon, HardDriveIcon, PlusIcon, RefreshCwIcon, } from "lucide-react" import { useDataSource } from "@/lib/data-source" import { serverListSchema } from "@mmapp/contracts/servers" import { can } from "@/lib/auth" import { userApiError } from "@/shared/api/users" import { toFrontendServer } from "@/entities/server/model/mappers" import { createBackupsAsync, deleteBackup, getBackupJob, getBackupScheduleSettings, getBackupStorageSettings, listBackups, putBackupScheduleSettings, putBackupStorageSettings, restoreBackup, syncBackupsFromStorage, testBackupStorage, type BackupItem, } from "@/shared/api/backups" import { requestJson, requestBlob } from "@/shared/api/http-client" import { toast } from "sonner" import { BackupsHistory } from "@/components/backups/backups-history" import { BackupsSettings, WEEK_DAYS, defaultSchedule, defaultStorageForm, type BackupScheduleForm, type BackupStorageForm, } from "@/components/backups/backups-settings" import { BackupCreateSheet } from "@/components/backups/backup-create-sheet" import { BackupDeleteDialog, BackupRestoreDialog } from "@/components/backups/backup-confirm-dialogs" type PageTab = "history" | "settings" type KindFilter = "all" | "auto" | "manual" type Resource = "backups" | "servers" | "schedule" | "storage" type ResourceState = { known: boolean; error: string | null; receivedAt: string | null } const unknownResource = (): ResourceState => ({ known: false, error: null, receivedAt: null }) export default function BackupsPage() { const { mode, backendUrl, prefsHydrated } = useDataSource() if (!prefsHydrated) return
Загрузка настроек источника…
returnДемонстрационные данные. Операции и сохранение недоступны.
} {!canRead &&Нет права mm:backups:read
} {isLive && !canReadServers &&Каталог устройств недоступен без mm:servers:read.
} {isLive && canRead &&История недоступна без права чтения
: !known("backups") ?{resources.backups.error ? "История резервных копий пока неизвестна" : "Загрузка резервных копий…"}
:Настройки резервных копий пока неизвестны
: }