// resources/js/Pages/Home.jsx import React, { useState } from 'react'; import '../../css/Home.css'; const DomainChecker = () => { const [input, setInput] = useState(''); const [error, setError] = useState(''); const [whoisData, setWhoisData] = useState(null); const [geoData, setGeoData] = useState(null); const [dnsResults, setDnsResults] = useState([]); const [portResults, setPortResults] = useState(null); const [sslData, setSslData] = useState(null); const [loading, setLoading] = useState(false); const [whoisLoading, setWhoisLoading] = useState(false); const [portLoading, setPortLoading] = useState(false); const [sslLoading, setSslLoading] = useState(false); const [recordType, setRecordType] = useState('A'); const [selectedPorts, setSelectedPorts] = useState([]); const [customPort, setCustomPort] = useState(''); const defaultPorts = [ 21, 22, 25, 53, 80, 110, 143, 443, 465, 587, 8080, 3306, 3389 ]; const validateDomain = d => { const re = /^(?!:\/\/)(?=.{1,253}$)(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9-_]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,})$/; return re.test(d); }; const isIPv4 = ip => { const re = /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/; return re.test(ip); }; const togglePort = port => { setSelectedPorts(prev => prev.includes(port) ? prev.filter(p => p !== port) : [...prev, port] ); }; const addCustomPort = () => { const p = parseInt(customPort, 10); if (!isNaN(p) && p > 0 && p < 65536 && !selectedPorts.includes(p)) { setSelectedPorts(prev => [...prev, p]); setCustomPort(''); } else { setError('Enter a valid port (1–65535) not already selected.'); } }; const handleCheck = async () => { setError(''); setWhoisData(null); setGeoData(null); setDnsResults([]); setPortResults(null); setSslData(null); const ipMode = isIPv4(input); const domMode = validateDomain(input); if (!ipMode && !domMode) { setError('Invalid input. Enter a valid domain or IPv4 address.'); return; } setLoading(true); try { if (ipMode) { // GeoIP first const geoRes = await fetch(`/api/geoip?ip=${encodeURIComponent(input)}`); const geoJson = await geoRes.json(); if (!geoRes.ok) throw new Error(geoJson.error || 'IP lookup failed'); setGeoData(geoJson); // Then ports if (selectedPorts.length) { setPortLoading(true); const portRes = await fetch('/api/portcheck', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ip: input, ports: selectedPorts }) }); const portJson = await portRes.json(); if (!portRes.ok) throw new Error(portJson.error || 'Port check failed'); setPortResults(portJson.results); } else { setPortResults({}); } } else { // Domain β†’ DNS const dnsRes = await fetch( `/api/dns-propagation?domain=${encodeURIComponent(input)}&type=${recordType}` ); const dnsJson = await dnsRes.json(); if (!dnsRes.ok) throw new Error(dnsJson.error || 'DNS lookup failed'); setDnsResults(dnsJson); // then SSL check try { setSslLoading(true); const sslRes = await fetch(`/api/ssl-check?domain=${encodeURIComponent(input)}`); const sslJson = await sslRes.json(); if (!sslRes.ok) throw new Error(sslJson.error || 'SSL check failed'); setSslData(sslJson); } catch (e) { setError(e.message); } finally { setSslLoading(false); } } } catch (e) { setError(e.message); } finally { setLoading(false); setPortLoading(false); } }; const handleWhoisCheck = async () => { setError(''); setWhoisLoading(true); setWhoisData(null); try { const res = await fetch(`/api/whois?domain=${encodeURIComponent(input)}`); const json = await res.json(); if (!res.ok) throw new Error(json.error || 'WHOIS lookup failed'); setWhoisData(json); } catch (e) { setError(e.message); } finally { setWhoisLoading(false); } }; const getFlagUrl = code => `https://flagcdn.com/24x18/${code.toLowerCase()}.png`; return (
{/* Header */}

Domain & IP Checker

Check DNS propagation, WHOIS info, IP geolocation, or port status

{/* Input row */}
setInput(e.target.value.trim())} />
{/* Mode‑specific controls */} {isIPv4(input) ? (
{defaultPorts.map(port => ( ))} setCustomPort(e.target.value)} />
) : (
{['A','AAAA','CNAME','MX','NS','TXT','SOA','CAA'].map(type => ( ))}
)} {error &&

{error}

} {loading &&
πŸ”„ Checking, please wait...
}
{/* Port panel (IP mode) */} {isIPv4(input) && (

πŸ”Œ Port Check

{portLoading ? (
πŸ”„ Checking ports…
) : portResults ? (
{Object.entries(portResults).map(([port, isOpen]) => (
Port {port} {isOpen ? 'βœ…' : '❌'}
))}
) : (
Select ports and click β€œCheck” to see statuses
)}
)} {/* GeoIP panel (IP mode) */} {geoData && (

πŸ“ IP Location

Location:
{geoData.city_name}, {geoData.region_name}
{geoData.country_name}

Coordinates:
{geoData.latitude}, {geoData.longitude}

Timezone:
{geoData.time_zone}

ISP:
{geoData.as}

ASN:
AS{geoData.asn}

)} {/* DNS propagation (domain mode) */} {dnsResults.length > 0 && (

🌍 DNS Propagation

    {dnsResults.map((r,i) => { const [cc,loc] = r.location.split('-').map(p=>p.trim()); const icon = r.status==='success'? 'βœ…':'❌'; return (
  • {cc} {cc}
    {loc}
    {(r.result||'β€”').split('\n').map((l,j)=>(
    {l}
    ))}
    {icon}
  • ); })}
)} {/* RIGHT COLUMN: SSL above WHOIS */} {dnsResults.length > 0 && (
{/* SSL Status */} {(sslLoading || sslData) && (

πŸ”’ SSL Status

{sslLoading ? (
πŸ”„ Checking SSL…
) : ( sslData && ( <>

Issued To:
{sslData.result.issued_to}

Issuer:
{sslData.result.issuer_o} {sslData.result.issuer_cn}

Valid From:
{new Date(sslData.result.valid_from).toLocaleDateString()}

Expires On:
{new Date(sslData.result.valid_till).toLocaleDateString()}

Days Left:
{sslData.result.days_left}

Valid:
{sslData.result.cert_valid ? 'βœ…' : '❌'}

) )}
)} {/* WHOIS Information */} {!sslLoading && ( !whoisData && !whoisLoading ? (
) : whoisLoading ? (
πŸ”„ Fetching WHOIS data…
) : whoisData ? (

πŸ“„ WHOIS Information

Registrar:
{whoisData.registrar?.name}

Created:
{new Date(whoisData.create_date).toLocaleDateString()}

Updated:
{new Date(whoisData.update_date).toLocaleDateString()}

Expires:
{new Date(whoisData.expire_date).toLocaleDateString()}

Nameservers:

    {whoisData.nameservers?.map(ns=>(
  • {ns.toUpperCase()}
  • ))}
) : null )}
)}
); }; export default DomainChecker;