import styled from 'styled-components'; import { ChangeEvent, FormEvent, useState } from 'react'; import { useNavigate, NavigateOptions } from 'react-router-dom'; import Heading from 'components/Form/Heading'; import Input from 'components/Form/Input' import Button from 'components/Form/Button'; import { StyledCard } from 'components/Form/Card'; import Footer from 'components/misc/Footer'; import FancyBackground from 'components/misc/FancyBackground'; import docs from 'utils/docs'; import colors from 'styles/colors'; import { determineAddressType } from 'utils/address-type-checker'; const HomeContainer = styled.section` display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100%; font-family: 'PTMono'; padding: 1.5rem 1rem 4rem 1rem; footer { z-index: 1; } `; const UserInputMain = styled.form` background: ${colors.backgroundLighter}; box-shadow: 4px 4px 0px ${colors.bgShadowColor}; border-radius: 8px; padding: 1rem; z-index: 5; margin: 1rem; width: calc(100% - 2rem); max-width: 60rem; z-index: 2; `; const SponsorCard = styled.div` background: ${colors.backgroundLighter}; box-shadow: 4px 4px 0px ${colors.bgShadowColor}; border-radius: 8px; padding: 1rem; z-index: 5; margin: 1rem; width: calc(100% - 2rem); max-width: 60rem; z-index: 2; .inner { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 1rem; p { margin: 0.25rem 0; } } a { color: ${colors.textColor}; } img { border-radius: 0.25rem; box-shadow: 2px 2px 0px ${colors.fgShadowColor}; transition: box-shadow 0.2s; margin: 0 auto; display: block; width: 200px; &:hover { box-shadow: 4px 4px 0px ${colors.fgShadowColor}; } &:active { box-shadow: -2px -2px 0px ${colors.fgShadowColor}; } } .cta { font-size: 0.78rem; a { color: ${colors.primary}; } } `; // const FindIpButton = styled.a` // margin: 0.5rem; // cursor: pointer; // display: block; // text-align: center; // color: ${colors.primary}; // text-decoration: underline; // `; const ErrorMessage = styled.p` color: ${colors.danger}; margin: 0.5rem; `; const SiteFeaturesWrapper = styled(StyledCard)` margin: 1rem; width: calc(100% - 2rem); max-width: 60rem; z-index: 2; .links { display: flex; justify-content: center; gap: 0.5rem; a { width: 100%; button { width: calc(100% - 2rem); } } @media(max-width: 600px) { flex-wrap: wrap; } } ul { -webkit-column-width: 150px; -moz-column-width: 150px; column-width: 150px; list-style: none; padding: 0 1rem; font-size: 0.9rem; li { margin: 0.1rem 0; text-indent: -1.2rem; break-inside: avoid-column; } li:before { content: '✓'; color: ${colors.primary}; margin-right: 0.5rem; } } a { color: ${colors.primary}; } `; const Home = (): JSX.Element => { const defaultPlaceholder = 'e.g. https://duck.com/'; const [userInput, setUserInput] = useState(''); const [errorMsg, setErrMsg] = useState(''); const [placeholder] = useState(defaultPlaceholder); const [inputDisabled] = useState(false); const navigate = useNavigate(); /* Check is valid address, either show err or redirect to results page */ const submit = () => { let address = userInput.endsWith("/") ? userInput.slice(0, -1) : userInput; const addressType = determineAddressType(address); if (addressType === 'empt') { setErrMsg('Field must not be empty'); } else if (addressType === 'err') { setErrMsg('Must be a valid URL, IPv4 or IPv6 Address'); } else { // if the addressType is 'url' and address doesn't start with 'http://' or 'https://', prepend 'https://' if (addressType === 'url' && !/^https?:\/\//i.test(address)) { address = 'https://' + address; } const resultRouteParams: NavigateOptions = { state: { address, addressType } }; navigate(`/results/${encodeURIComponent(address)}`, resultRouteParams); } }; /* Update user input state, and hide error message if field is valid */ const inputChange = (event: ChangeEvent) => { setUserInput(event.target.value); const isError = ['err', 'empt'].includes(determineAddressType(event.target.value)); if (!isError) setErrMsg(''); }; // const findIpAddress = () => { // setUserInput(''); // setPlaceholder('Looking up your IP...'); // setInputDisabled(true); // fetch('https://ipapi.co/json/') // .then(function(response) { // response.json().then(jsonData => { // setUserInput(jsonData.ip); // setPlaceholder(defaultPlaceholder); // setInputDisabled(true); // }); // }) // .catch(function(error) { // console.log('Failed to get IP address :\'(', error) // }); // }; const formSubmitEvent = (event: FormEvent) => { event.preventDefault(); submit(); } return ( Web Check Icon Web Check {/* Or, find my IP */} { errorMsg && {errorMsg}} Sponsored by

Terminal Trove - The $HOME of all things in the terminal.
Get updates on the latest CLI/TUI tools via the Terminal Trove newsletter

Terminal Trove
Supported Checks
    {docs.map((doc, index) => (
  • {doc.title}
  • ))}
  • + more!