1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00
Files
checktheroads-hyperglass/hyperglass/ui/components/ResolvedTarget.js

146 lines
4.5 KiB
JavaScript
Raw Normal View History

2020-10-07 09:41:58 -07:00
import * as React from 'react';
import { forwardRef, useEffect } from 'react';
import { Button, Icon, Spinner, Stack, Tag, Text, Tooltip, useColorMode } from '@chakra-ui/core';
import useAxios from 'axios-hooks';
import format from 'string-format';
import { useConfig } from 'app/context';
2020-01-27 21:28:27 -07:00
format.extend(String.prototype, {});
2020-10-07 09:41:58 -07:00
const labelBg = { dark: 'secondary', light: 'secondary' };
const labelBgSuccess = { dark: 'success', light: 'success' };
2020-01-27 21:28:27 -07:00
export const ResolvedTarget = forwardRef(
({ fqdnTarget, setTarget, queryTarget, families, availVrfs }, ref) => {
const { colorMode } = useColorMode();
const config = useConfig();
const labelBgStatus = {
true: labelBgSuccess[colorMode],
2020-10-07 09:41:58 -07:00
false: labelBg[colorMode],
};
const dnsUrl = config.web.dns_provider.url;
const query4 = families.includes(4);
const query6 = families.includes(6);
const params = {
4: {
url: dnsUrl,
2020-10-07 09:41:58 -07:00
params: { name: fqdnTarget, type: 'A' },
headers: { accept: 'application/dns-json' },
crossdomain: true,
2020-10-07 09:41:58 -07:00
timeout: 1000,
},
6: {
url: dnsUrl,
2020-10-07 09:41:58 -07:00
params: { name: fqdnTarget, type: 'AAAA' },
headers: { accept: 'application/dns-json' },
crossdomain: true,
2020-10-07 09:41:58 -07:00
timeout: 1000,
},
};
2020-01-27 21:28:27 -07:00
2020-10-07 09:41:58 -07:00
const [{ data: data4, loading: loading4, error: error4 }] = useAxios(params[4]);
2020-10-07 09:41:58 -07:00
const [{ data: data6, loading: loading6, error: error6 }] = useAxios(params[6]);
2020-01-27 21:28:27 -07:00
const handleOverride = overridden => {
2020-10-07 09:41:58 -07:00
setTarget({ field: 'query_target', value: overridden });
};
2020-01-27 21:28:27 -07:00
const isSelected = value => {
return labelBgStatus[value === queryTarget];
};
2020-01-27 21:28:27 -07:00
const findAnswer = data => {
2020-10-07 09:41:58 -07:00
return data?.Answer?.filter(answerData => answerData.type === data?.Question[0]?.type)[0]
?.data;
};
useEffect(() => {
if (query6 && data6?.Answer) {
handleOverride(findAnswer(data6));
} else if (query4 && data4?.Answer && !query6 && !data6?.Answer) {
handleOverride(findAnswer(data4));
} else if (query4 && data4?.Answer) {
handleOverride(findAnswer(data4));
}
}, [data4, data6]);
return (
<Stack
ref={ref}
isInline
w="100%"
justifyContent={
2020-10-07 09:41:58 -07:00
query4 && data4?.Answer && query6 && data6?.Answer && availVrfs.length > 1
? 'space-between'
: 'flex-end'
}
2020-10-07 09:41:58 -07:00
flexWrap="wrap">
{loading4 ||
error4 ||
(query4 && findAnswer(data4) && (
<Tag my={2}>
<Tooltip
hasArrow
label={config.web.text.fqdn_tooltip.format({
2020-10-07 09:41:58 -07:00
protocol: 'IPv4',
})}
2020-10-07 09:41:58 -07:00
placement="bottom">
<Button
height="unset"
minW="unset"
fontSize="xs"
py="0.1rem"
px={2}
mr={2}
2020-10-07 09:41:58 -07:00
variantColor={labelBgStatus[findAnswer(data4) === queryTarget]}
borderRadius="md"
2020-10-07 09:41:58 -07:00
onClick={() => handleOverride(findAnswer(data4))}>
IPv4
</Button>
</Tooltip>
{loading4 && <Spinner />}
{error4 && <Icon name="warning" />}
{findAnswer(data4) && (
2020-10-07 09:41:58 -07:00
<Text fontSize="xs" fontFamily="mono" as="span" fontWeight={400}>
{findAnswer(data4)}
</Text>
)}
</Tag>
))}
{loading6 ||
error6 ||
(query6 && findAnswer(data6) && (
<Tag my={2}>
<Tooltip
hasArrow
label={config.web.text.fqdn_tooltip.format({
2020-10-07 09:41:58 -07:00
protocol: 'IPv6',
})}
2020-10-07 09:41:58 -07:00
placement="bottom">
<Button
height="unset"
minW="unset"
fontSize="xs"
py="0.1rem"
px={2}
mr={2}
variantColor={isSelected(findAnswer(data6))}
borderRadius="md"
2020-10-07 09:41:58 -07:00
onClick={() => handleOverride(findAnswer(data6))}>
IPv6
</Button>
</Tooltip>
{loading6 && <Spinner />}
{error6 && <Icon name="warning" />}
{findAnswer(data6) && (
2020-10-07 09:41:58 -07:00
<Text fontSize="xs" fontFamily="mono" as="span" fontWeight={400}>
{findAnswer(data6)}
</Text>
)}
</Tag>
))}
</Stack>
);
2020-10-07 09:41:58 -07:00
},
2020-03-28 17:46:40 -07:00
);