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;