1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00
Files
checktheroads-hyperglass/hyperglass/ui/components/user-ip.tsx
2021-12-18 23:45:06 -07:00

100 lines
2.9 KiB
TypeScript

import { useMemo } from 'react';
import { Button, Stack, Text, VStack, useDisclosure } from '@chakra-ui/react';
import { DynamicIcon, Prompt } from '~/components';
import { useConfig, useColorValue } from '~/context';
import { useStrf, useWtf } from '~/hooks';
interface UserIPProps {
setTarget(target: string): void;
}
export const UserIP = (props: UserIPProps): JSX.Element => {
const { setTarget } = props;
const { onOpen, ...disclosure } = useDisclosure();
const strF = useStrf();
const { web } = useConfig();
const errorColor = useColorValue('red.500', 'red.300');
const noIPv4 = strF(web.text.noIp, { protocol: 'IPv4' });
const noIPv6 = strF(web.text.noIp, { protocol: 'IPv6' });
const [ipv4, ipv6, query] = useWtf();
const hasResult = useMemo(
() => (!ipv4.isError || !ipv6.isError) && (ipv4.data?.ip !== null || ipv6.data?.ip !== null),
[ipv4, ipv6],
);
const show4 = useMemo(() => !ipv4.isError && ipv4.data?.ip !== null, [ipv4]);
const show6 = useMemo(() => !ipv6.isError && ipv6.data?.ip !== null, [ipv6]);
function handleOpen(): void {
onOpen();
query();
}
return (
<Prompt
trigger={
<Button size="sm" onClick={handleOpen}>
{web.text.ipButton}
</Button>
}
onOpen={handleOpen}
{...disclosure}
>
<VStack w="100%" spacing={4} justify="center">
{hasResult && (
<Text fontSize="sm" textAlign="center">
{web.text.ipSelect}
</Text>
)}
<Stack spacing={2}>
{show4 && (
<Button
size="sm"
fontSize="xs"
fontFamily="mono"
colorScheme="primary"
isDisabled={ipv4.isError}
isLoading={ipv4.isLoading}
justifyContent="space-between"
onClick={() => {
ipv4?.data?.ip && setTarget(ipv4.data.ip);
disclosure.onClose();
}}
rightIcon={<DynamicIcon icon={{ fa: 'FaArrowCircleRight' }} boxSize="18px" />}
>
{ipv4?.data?.ip ?? noIPv4}
</Button>
)}
{show6 && (
<Button
size="sm"
fontSize="xs"
fontFamily="mono"
colorScheme="secondary"
isDisabled={ipv6.isError}
isLoading={ipv6.isLoading}
justifyContent="space-between"
onClick={() => {
ipv6?.data?.ip && setTarget(ipv6.data.ip);
disclosure.onClose();
}}
rightIcon={<DynamicIcon icon={{ fa: 'FaArrowCircleRight' }} boxSize="18px" />}
>
{ipv6?.data?.ip ?? noIPv6}
</Button>
)}
{!hasResult && (
<Text fontSize="sm" textAlign="center" color={errorColor}>
{web.text.ipError}
</Text>
)}
</Stack>
</VStack>
</Prompt>
);
};