import { useEffect } from 'react'; import { Button, Icon, Spinner, Stack, Tag, Text, Tooltip } from '@chakra-ui/react'; import { useQuery } from 'react-query'; import { useConfig } from '~/context'; import { useStrf } from '~/hooks'; import type { DnsOverHttps, ColorNames } from '~/types'; import type { TResolvedTarget } from './types'; function findAnswer(data: DnsOverHttps.Response | undefined): string { let answer = ''; if (typeof data !== 'undefined') { answer = data?.Answer?.filter(answerData => answerData.type === data?.Question[0]?.type)[0] ?.data; } return answer; } export const ResolvedTarget = (props: TResolvedTarget) => { const { fqdnTarget, setTarget, queryTarget, families, availVrfs } = props; const { web } = useConfig(); const dnsUrl = web.dns_provider.url; const query4 = Array.from(families).includes(4); const query6 = Array.from(families).includes(6); const tooltip4 = useStrf(web.text.fqdn_tooltip, { protocol: 'IPv4' }); const tooltip6 = useStrf(web.text.fqdn_tooltip, { protocol: 'IPv6' }); const { data: data4, isLoading: isLoading4, isError: isError4 } = useQuery( [fqdnTarget, 4], dnsQuery, ); const { data: data6, isLoading: isLoading6, isError: isError6 } = useQuery( [fqdnTarget, 6], dnsQuery, ); async function dnsQuery( target: string, family: 4 | 6, ): Promise { let json; const type = family === 4 ? 'A' : family === 6 ? 'AAAA' : ''; const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 1000); const res = await fetch(`${dnsUrl}?name=${target}&type=${type}`, { headers: { accept: 'application/dns-json' }, signal: controller.signal, mode: 'cors', }); json = await res.json(); clearTimeout(timeout); return json; } function handleOverride(value: string): void { setTarget({ field: 'query_target', value }); } function isSelected(value: string): ColorNames { if (value === queryTarget) { return 'success'; } else { return 'secondary'; } } 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 ( 1 ? 'space-between' : 'flex-end' } flexWrap="wrap"> {isLoading4 || isError4 || (query4 && findAnswer(data4) && ( {isLoading4 && } {isError4 && } {findAnswer(data4) && ( {findAnswer(data4)} )} ))} {isLoading6 || isError6 || (query6 && findAnswer(data6) && ( {isLoading6 && } {isError6 && } {findAnswer(data6) && ( {findAnswer(data6)} )} ))} ); };