import * as React from "react";
import {
Flex,
Icon,
Popover,
PopoverArrow,
PopoverContent,
PopoverTrigger,
Text,
Tooltip,
useColorMode
} from "@chakra-ui/core";
import dayjs from "dayjs";
import relativeTimePlugin from "dayjs/plugin/relativeTime";
import utcPlugin from "dayjs/plugin/utc";
import useConfig from "~/components/HyperglassProvider";
import Layout from "~/components/Layout";
import Table from "~/components/Table/index";
dayjs.extend(relativeTimePlugin);
dayjs.extend(utcPlugin);
const data = {
vrf: "default",
prefix: "1.1.1.0/24",
count: 4,
routes: [
{
active: true,
age: 578857,
weight: 170,
med: 0,
local_preference: 150,
as_path: [1299, 13335],
communities: [
"1299:35000",
"14525:0",
"14525:40",
"14525:1021",
"14525:2840",
"14525:3001",
"14525:4001",
"14525:9003"
],
next_hop: "62.115.189.136",
source_as: 13335,
source_rid: "162.158.140.1",
peer_rid: "2.255.254.51",
rpki_state: 1
},
{
active: false,
age: 787213,
weight: 170,
med: 2020,
local_preference: 150,
as_path: [174, 13335],
communities: [
"174:21001",
"174:22013",
"14525:0",
"14525:20",
"14525:1021",
"14525:2840",
"14525:3001",
"14525:4001",
"14525:9001"
],
next_hop: "100.64.0.122",
source_as: 13335,
source_rid: "162.158.140.1",
peer_rid: "199.34.92.1",
rpki_state: 0
},
{
active: false,
age: 616677,
weight: 200,
med: 0,
local_preference: 150,
as_path: [6939, 13335],
communities: [
"6939:7107",
"6939:8840",
"6939:9001",
"14525:0",
"14525:40",
"14525:1021",
"14525:2840",
"14525:3002",
"14525:4003",
"14525:9002"
],
next_hop: "100.64.0.122",
source_as: 13335,
source_rid: "172.68.129.1",
peer_rid: "199.34.92.6",
rpki_state: 2
},
{
active: false,
age: 1284244,
weight: 200,
med: 25090,
local_preference: 150,
as_path: [174, 13335],
communities: [],
next_hop: "100.64.0.122",
source_as: 13335,
source_rid: "108.162.239.1",
peer_rid: "199.34.92.7",
rpki_state: 3
}
],
winning_weight: "low"
};
const hiddenCols = ["active", "source_as"];
const isActiveColor = {
true: { dark: "green.300", light: "green.500" },
false: { dark: "gray.300", light: "gray.500" }
};
const arrowColor = {
true: { dark: "blackAlpha.500", light: "blackAlpha.500" },
false: { dark: "whiteAlpha.300", light: "blackAlpha.500" }
};
const rpkiIcon = ["not-allowed", "check-circle", "warning", "question"];
const rpkiColor = {
true: {
dark: ["red.500", "green.600", "yellow.500", "gray.800"],
light: ["red.500", "green.500", "yellow.500", "gray.600"]
},
false: {
dark: ["red.300", "green.300", "yellow.300", "gray.300"],
light: ["red.400", "green.500", "yellow.400", "gray.500"]
}
};
const makeColumns = fields => {
return fields.map(pair => {
const [header, accessor, align] = pair;
return { Header: header, accessor: accessor, align: align };
});
};
const longestASNLength = asPath => {
const longest = asPath.reduce((l, c) => {
const strLongest = String(l);
const strCurrent = String(c);
return strCurrent.length > strLongest.length ? strCurrent : strLongest;
});
return longest.length;
};
const MonoField = ({ v, ...props }) => (
{v}
);
const Active = ({ isActive }) => {
const { colorMode } = useColorMode();
return (
);
};
const Age = ({ inSeconds }) => {
const now = dayjs.utc();
const then = now.subtract(inSeconds, "seconds");
return (
{now.to(then, true)}
);
};
const Weight = ({ weight, winningWeight }) => {
const fixMeText =
winningWeight === "low"
? "Lower Weight is Preferred"
: "Higher Weight is Preferred";
return (
{weight}
);
};
const ASPath = ({ path, active, longestASN }) => {
const { colorMode } = useColorMode();
let paths = [];
path.map((asn, i) => {
const asnStr = String(asn);
i !== 0 &&
paths.push(
);
paths.push(
{asnStr}
);
});
return paths;
};
const Communities = ({ communities }) => {
const { colorMode } = useColorMode();
let component;
communities.length === 0
? (component = (
))
: (component = (
{communities.map(c => (
))}
));
return component;
};
const RPKIState = ({ state, active }) => {
const { web } = useConfig();
const { colorMode } = useColorMode();
const stateText = [
web.text.rpki_invalid,
web.text.rpki_valid,
web.text.rpki_unknown,
web.text.rpki_unverified
];
return (
);
};
const Cell = ({ data, rawData, longestASN }) => {
hiddenCols.includes(data.column.id) &&
data.setHiddenColumns(old => [...old, data.column.id]);
const component = {
active: ,
age: ,
weight: (
),
med: ,
local_preference: ,
as_path: (
),
communities: ,
next_hop: ,
source_as: ,
source_rid: ,
peer_rid: ,
rpki_state:
};
return component[data.column.id] ?? <> >;
};
const Structured = () => {
const config = useConfig();
const columns = makeColumns(config.parsed_data_fields);
const allASN = data.routes.map(r => r.as_path).flat();
const asLength = longestASNLength(allASN);
return (
(
|
)}
bordersHorizontal
rowHighlightBg="green"
/>
);
};
export default Structured;