"use client" import { useMemo } from "react" import { PageHeader } from "@/components/page-header" import { DataTable } from "@/components/data-table" import { ipRanges as mockIpRanges } from "@/lib/data" import { Button } from "@/components/ui/button" import { UploadIcon, DownloadIcon, PlusIcon, FilterIcon, LoaderCircleIcon } from "lucide-react" import { useDataSource } from "@/lib/data-source" import { useEvoBGP } from "@/lib/evobgp-context" import { cn } from "@/lib/utils" export default function IpRangesPage() { const { mode } = useDataSource() const { enabled, snapshot, loading, error } = useEvoBGP() /** При включённом EvoBGP в live локальные моки не показываем — только каталог API (или пусто при загрузке/ошибке). */ const useEvoCatalog = mode === "live" && enabled const rows = useMemo(() => { if (!useEvoCatalog) return mockIpRanges if (loading && !snapshot) return [] return snapshot?.ipRanges ?? [] }, [useEvoCatalog, loading, snapshot]) return (
} />

IP-диапазоны

CIDR-блоки, отправляемые в address-list MikroTik по всем настроенным фильтрам

{useEvoCatalog && (

{loading && } {error ? `EvoBGP: ${error}` : snapshot?.fetchedAt ? `Источник: EvoBGP, обновлено ${new Date(snapshot.fetchedAt).toLocaleString("ru-RU")}` : loading ? "Загрузка EvoBGP…" : "EvoBGP"}

)}
{d.cidr}, }, { key: "asn", label: "ASN", render: (d) => {d.asn}, }, { key: "country", label: "Страна", render: (d) => {d.country}, }, { key: "purpose", label: "Назначение", render: (d) => {d.purpose}, }, { key: "filter", label: "Фильтр", render: (d) => ( {d.filter} ), }, { key: "updated", label: "Обновлён", render: (d) => {d.updated}, }, { key: "enabled", label: "Статус", render: (d) => ( {d.enabled ? "Активен" : "Отключён"} ), }, ]} />
) }