mirror of
				https://github.com/checktheroads/hyperglass
				synced 2024-05-11 05:55:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { useEffect, useMemo } from 'react';
 | 
						|
import dynamic from 'next/dynamic';
 | 
						|
import { Button, chakra, Icon, Stack, Text, VStack } from '@chakra-ui/react';
 | 
						|
import { useConfig, useColorValue } from '~/context';
 | 
						|
import { useStrf, useLGState, useDNSQuery } from '~/hooks';
 | 
						|
 | 
						|
const RightArrow = chakra(
 | 
						|
  dynamic<MeronexIcon>(() => import('@meronex/icons/fa').then(i => i.FaArrowCircleRight)),
 | 
						|
);
 | 
						|
 | 
						|
const LeftArrow = chakra(
 | 
						|
  dynamic<MeronexIcon>(() => import('@meronex/icons/fa').then(i => i.FaArrowCircleLeft)),
 | 
						|
);
 | 
						|
 | 
						|
import type { DnsOverHttps } 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 { setTarget, errorClose } = props;
 | 
						|
  const { web } = useConfig();
 | 
						|
  const { displayTarget, isSubmitting, families, queryTarget } = useLGState();
 | 
						|
 | 
						|
  const color = useColorValue('secondary.500', 'secondary.300');
 | 
						|
  const errorColor = useColorValue('red.500', 'red.300');
 | 
						|
 | 
						|
  const query4 = Array.from(families.value).includes(4);
 | 
						|
  const query6 = Array.from(families.value).includes(6);
 | 
						|
 | 
						|
  const tooltip4 = useStrf(web.text.fqdn_tooltip, { protocol: 'IPv4' });
 | 
						|
  const tooltip6 = useStrf(web.text.fqdn_tooltip, { protocol: 'IPv6' });
 | 
						|
 | 
						|
  const [messageStart, messageEnd] = web.text.fqdn_message.split('{fqdn}');
 | 
						|
  const [errorStart, errorEnd] = web.text.fqdn_error.split('{fqdn}');
 | 
						|
 | 
						|
  const { data: data4, isLoading: isLoading4, isError: isError4, error: error4 } = useDNSQuery(
 | 
						|
    displayTarget.value,
 | 
						|
    4,
 | 
						|
  );
 | 
						|
 | 
						|
  const { data: data6, isLoading: isLoading6, isError: isError6, error: error6 } = useDNSQuery(
 | 
						|
    displayTarget.value,
 | 
						|
    6,
 | 
						|
  );
 | 
						|
 | 
						|
  isError4 && console.error(error4);
 | 
						|
  isError6 && console.error(error6);
 | 
						|
 | 
						|
  const answer4 = useMemo(() => findAnswer(data4), [data4]);
 | 
						|
  const answer6 = useMemo(() => findAnswer(data6), [data6]);
 | 
						|
 | 
						|
  function handleOverride(value: string): void {
 | 
						|
    setTarget({ field: 'query_target', value });
 | 
						|
  }
 | 
						|
  function selectTarget(value: string): void {
 | 
						|
    queryTarget.set(value);
 | 
						|
    isSubmitting.set(true);
 | 
						|
  }
 | 
						|
 | 
						|
  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 (
 | 
						|
    <VStack w="100%" spacing={4} justify="center">
 | 
						|
      {(answer4 || answer6) && (
 | 
						|
        <Text fontSize="sm" textAlign="center">
 | 
						|
          {messageStart}
 | 
						|
          <Text as="span" fontSize="sm" fontWeight="bold" color={color}>
 | 
						|
            {`${displayTarget.value}`.toLowerCase()}
 | 
						|
          </Text>
 | 
						|
          {messageEnd}
 | 
						|
        </Text>
 | 
						|
      )}
 | 
						|
      <Stack spacing={2}>
 | 
						|
        {!isLoading4 && !isError4 && query4 && answer4 && (
 | 
						|
          <Button
 | 
						|
            size="sm"
 | 
						|
            fontSize="xs"
 | 
						|
            title={tooltip4}
 | 
						|
            fontFamily="mono"
 | 
						|
            colorScheme="primary"
 | 
						|
            justifyContent="space-between"
 | 
						|
            onClick={() => selectTarget(answer4)}
 | 
						|
            rightIcon={<RightArrow boxSize="18px" />}>
 | 
						|
            {answer4}
 | 
						|
          </Button>
 | 
						|
        )}
 | 
						|
        {!isLoading6 && !isError6 && query6 && answer6 && (
 | 
						|
          <Button
 | 
						|
            size="sm"
 | 
						|
            fontSize="xs"
 | 
						|
            title={tooltip6}
 | 
						|
            fontFamily="mono"
 | 
						|
            colorScheme="secondary"
 | 
						|
            justifyContent="space-between"
 | 
						|
            onClick={() => selectTarget(answer6)}
 | 
						|
            rightIcon={<RightArrow boxSize="18px" />}>
 | 
						|
            {answer6}
 | 
						|
          </Button>
 | 
						|
        )}
 | 
						|
        {!answer4 && !answer6 && (
 | 
						|
          <>
 | 
						|
            <Text fontSize="sm" textAlign="center" color={errorColor}>
 | 
						|
              {errorStart}
 | 
						|
              <Text as="span" fontSize="sm" fontWeight="bold">
 | 
						|
                {`${displayTarget.value}`.toLowerCase()}
 | 
						|
              </Text>
 | 
						|
              {errorEnd}
 | 
						|
            </Text>
 | 
						|
            <Button
 | 
						|
              colorScheme="red"
 | 
						|
              variant="outline"
 | 
						|
              onClick={errorClose}
 | 
						|
              leftIcon={<LeftArrow />}>
 | 
						|
              {web.text.fqdn_error_button}
 | 
						|
            </Button>
 | 
						|
          </>
 | 
						|
        )}
 | 
						|
      </Stack>
 | 
						|
    </VStack>
 | 
						|
  );
 | 
						|
};
 |