2020-01-27 21:28:27 -07:00
|
|
|
import React, { useEffect, useState } 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 "~/components/HyperglassProvider";
|
2020-03-22 09:55:06 -07:00
|
|
|
import useMedia from "~/components/MediaProvider";
|
2020-01-27 21:28:27 -07:00
|
|
|
|
|
|
|
format.extend(String.prototype, {});
|
|
|
|
|
|
|
|
const labelBg = { dark: "secondary", light: "secondary" };
|
|
|
|
const labelBgSuccess = { dark: "success", light: "success" };
|
|
|
|
|
2020-01-28 18:42:28 -10:00
|
|
|
const ResolvedTarget = React.forwardRef(({ fqdnTarget, setTarget, queryTarget }, ref) => {
|
2020-01-27 21:28:27 -07:00
|
|
|
const { colorMode } = useColorMode();
|
2020-03-22 09:55:06 -07:00
|
|
|
const { mediaSize } = useMedia();
|
2020-01-27 21:28:27 -07:00
|
|
|
const config = useConfig();
|
|
|
|
const labelBgStatus = { true: labelBgSuccess[colorMode], false: labelBg[colorMode] };
|
2020-02-01 01:13:26 -10:00
|
|
|
const dnsUrl = config.web.dns_provider.url;
|
2020-01-27 21:28:27 -07:00
|
|
|
const params4 = {
|
2020-02-01 01:13:26 -10:00
|
|
|
url: dnsUrl,
|
2020-01-28 18:42:28 -10:00
|
|
|
params: { name: fqdnTarget, type: "A" },
|
2020-01-27 21:28:27 -07:00
|
|
|
headers: { accept: "application/dns-json" },
|
2020-03-24 12:32:00 -07:00
|
|
|
crossdomain: true,
|
2020-01-27 21:28:27 -07:00
|
|
|
timeout: 1000
|
|
|
|
};
|
|
|
|
const params6 = {
|
2020-02-01 01:13:26 -10:00
|
|
|
url: dnsUrl,
|
2020-01-28 18:42:28 -10:00
|
|
|
params: { name: fqdnTarget, type: "AAAA" },
|
2020-01-27 21:28:27 -07:00
|
|
|
headers: { accept: "application/dns-json" },
|
2020-03-24 12:32:00 -07:00
|
|
|
crossdomain: true,
|
2020-01-27 21:28:27 -07:00
|
|
|
timeout: 1000
|
|
|
|
};
|
|
|
|
|
|
|
|
const [{ data: data4, loading: loading4, error: error4 }] = useAxios(params4);
|
|
|
|
const [{ data: data6, loading: loading6, error: error6 }] = useAxios(params6);
|
|
|
|
|
|
|
|
const handleOverride = overridden => {
|
|
|
|
setTarget({ field: "query_target", value: overridden });
|
|
|
|
};
|
|
|
|
|
|
|
|
const isSelected = value => {
|
2020-01-28 18:42:28 -10:00
|
|
|
return labelBgStatus[value === queryTarget];
|
2020-01-27 21:28:27 -07:00
|
|
|
};
|
|
|
|
|
2020-03-19 17:32:46 -07:00
|
|
|
const findAnswer = data => {
|
|
|
|
return data?.Answer?.filter(answerData => answerData.type === data.Question[0].type)[0]
|
|
|
|
.data;
|
|
|
|
};
|
|
|
|
|
2020-01-27 21:28:27 -07:00
|
|
|
useEffect(() => {
|
2020-03-19 17:32:46 -07:00
|
|
|
if (data6 && data6.Answer) {
|
|
|
|
handleOverride(findAnswer(data6));
|
|
|
|
} else if (data4 && data4.Answer && !data6?.Answer) {
|
|
|
|
handleOverride(findAnswer(data4));
|
2020-01-27 21:28:27 -07:00
|
|
|
}
|
2020-02-01 00:48:36 -10:00
|
|
|
}, [data4, data6]);
|
2020-01-27 21:28:27 -07:00
|
|
|
return (
|
|
|
|
<Stack
|
|
|
|
ref={ref}
|
|
|
|
isInline
|
|
|
|
w="100%"
|
|
|
|
justifyContent={data4?.Answer && data6?.Answer ? "space-between" : "flex-end"}
|
2020-03-22 09:55:06 -07:00
|
|
|
flexWrap="wrap"
|
2020-01-27 21:28:27 -07:00
|
|
|
>
|
|
|
|
{loading4 ||
|
|
|
|
error4 ||
|
2020-03-19 17:32:46 -07:00
|
|
|
(findAnswer(data4) && (
|
2020-03-22 09:55:06 -07:00
|
|
|
<Tag my={2}>
|
2020-01-27 21:28:27 -07:00
|
|
|
<Tooltip
|
|
|
|
hasArrow
|
2020-01-28 09:14:47 -07:00
|
|
|
label={config.web.text.fqdn_tooltip.format({ protocol: "IPv4" })}
|
2020-01-27 21:28:27 -07:00
|
|
|
placement="bottom"
|
|
|
|
>
|
|
|
|
<Button
|
|
|
|
height="unset"
|
|
|
|
minW="unset"
|
|
|
|
fontSize="xs"
|
|
|
|
py="0.1rem"
|
|
|
|
px={2}
|
|
|
|
mr={2}
|
2020-03-19 17:32:46 -07:00
|
|
|
variantColor={labelBgStatus[findAnswer(data4) === queryTarget]}
|
2020-01-27 21:28:27 -07:00
|
|
|
borderRadius="md"
|
2020-03-19 17:32:46 -07:00
|
|
|
onClick={() => handleOverride(findAnswer(data4))}
|
2020-01-27 21:28:27 -07:00
|
|
|
>
|
|
|
|
IPv4
|
|
|
|
</Button>
|
|
|
|
</Tooltip>
|
|
|
|
{loading4 && <Spinner />}
|
|
|
|
{error4 && <Icon name="warning" />}
|
2020-03-19 17:32:46 -07:00
|
|
|
{findAnswer(data4) && (
|
2020-01-27 21:28:27 -07:00
|
|
|
<Text fontSize="xs" fontFamily="mono" as="span" fontWeight={400}>
|
2020-03-19 17:32:46 -07:00
|
|
|
{findAnswer(data4)}
|
2020-01-27 21:28:27 -07:00
|
|
|
</Text>
|
|
|
|
)}
|
|
|
|
</Tag>
|
|
|
|
))}
|
|
|
|
{loading6 ||
|
|
|
|
error6 ||
|
2020-03-19 17:32:46 -07:00
|
|
|
(findAnswer(data6) && (
|
2020-03-22 09:55:06 -07:00
|
|
|
<Tag my={2}>
|
2020-01-27 21:28:27 -07:00
|
|
|
<Tooltip
|
|
|
|
hasArrow
|
2020-01-28 09:14:47 -07:00
|
|
|
label={config.web.text.fqdn_tooltip.format({ protocol: "IPv6" })}
|
2020-01-27 21:28:27 -07:00
|
|
|
placement="bottom"
|
|
|
|
>
|
|
|
|
<Button
|
|
|
|
height="unset"
|
|
|
|
minW="unset"
|
|
|
|
fontSize="xs"
|
|
|
|
py="0.1rem"
|
|
|
|
px={2}
|
|
|
|
mr={2}
|
2020-03-19 17:32:46 -07:00
|
|
|
variantColor={isSelected(findAnswer(data6))}
|
2020-01-27 21:28:27 -07:00
|
|
|
borderRadius="md"
|
2020-03-19 17:32:46 -07:00
|
|
|
onClick={() => handleOverride(findAnswer(data6))}
|
2020-01-27 21:28:27 -07:00
|
|
|
>
|
|
|
|
IPv6
|
|
|
|
</Button>
|
|
|
|
</Tooltip>
|
|
|
|
{loading6 && <Spinner />}
|
|
|
|
{error6 && <Icon name="warning" />}
|
2020-03-19 17:32:46 -07:00
|
|
|
{findAnswer(data6) && (
|
2020-01-27 21:28:27 -07:00
|
|
|
<Text fontSize="xs" fontFamily="mono" as="span" fontWeight={400}>
|
2020-03-19 17:32:46 -07:00
|
|
|
{findAnswer(data6)}
|
2020-01-27 21:28:27 -07:00
|
|
|
</Text>
|
|
|
|
)}
|
|
|
|
</Tag>
|
|
|
|
))}
|
|
|
|
</Stack>
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
ResolvedTarget.displayName = "ResolvedTarget";
|
|
|
|
export default ResolvedTarget;
|