diff --git a/app/(main)/backups/page.tsx b/app/(main)/backups/page.tsx index 167034fb..970954a1 100644 --- a/app/(main)/backups/page.tsx +++ b/app/(main)/backups/page.tsx @@ -1,11 +1,11 @@ "use client" -import { useCallback, useEffect, useState } from "react" +import { useCallback, useEffect, useRef, useState } from "react" import { PageHeader } from "@/components/page-header" -import type { Backup, Server } from "@/lib/data" +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 { BackupStorageSettingsDto } from "@mmapp/contracts/backups" +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" @@ -18,7 +18,9 @@ import { RefreshCwIcon, } from "lucide-react" import { useDataSource } from "@/lib/data-source" -import { listServers } from "@/shared/api/servers" +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, @@ -34,7 +36,7 @@ import { testBackupStorage, type BackupItem, } from "@/shared/api/backups" -import { requestBlob } from "@/shared/api/http-client" +import { requestJson, requestBlob } from "@/shared/api/http-client" import { toast } from "sonner" import { BackupsHistory } from "@/components/backups/backups-history" import { @@ -51,14 +53,36 @@ import { BackupDeleteDialog, BackupRestoreDialog } from "@/components/backups/ba 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 { backendUrl } = useDataSource() + const { mode, backendUrl, prefsHydrated } = useDataSource() + if (!prefsHydrated) return
Загрузка настроек источника…
+ returnДемонстрационные данные. Операции и сохранение недоступны.
} + {!canRead &&Нет права mm:backups:read
} + {isLive && !canReadServers &&Каталог устройств недоступен без mm:servers:read.
} + {isLive && canRead &&{resources.backups.error ? "История резервных копий пока неизвестна" : "Загрузка резервных копий…"}
:Настройки резервных копий пока неизвестны
: }