import { useEffect, useMemo, useState } from "react"; import { useSelector } from "react-redux"; import { ServiceProvider, ServiceConfig, ServiceError, HandleAvailability, ServiceErrorCode } from "../nip05/ServiceProvider"; type Nip05ServiceProps = { name: string, service: URL | string, about: JSX.Element, link: string }; type ReduxStore = any; export default function Nip5Service(props: Nip05ServiceProps) { const pubkey = useSelector(s => s.login.publicKey); const svc = new ServiceProvider(props.service); const [serviceConfig, setServiceConfig] = useState(); const [error, setError] = useState(); const [handle, setHandle] = useState(""); const [domain, setDomain] = useState(""); const [availabilityResponse, setAvailabilityResponse] = useState(); const domainConfig = useMemo(() => serviceConfig?.domains.find(a => a.name === domain), [domain]); useEffect(() => { svc.GetConfig() .then(a => { if ('error' in a) { setError(a as ServiceError) } else { let svc = a as ServiceConfig; setServiceConfig(svc); let defaultDomain = svc.domains.find(a => a.default)?.name || svc.domains[0].name; setDomain(defaultDomain); } }) .catch(console.error) }, [props]); useEffect(() => { if(handle.length === 0) { setAvailabilityResponse(undefined); } if (handle && domain) { if (!domainConfig?.regex[0].match(handle)) { setAvailabilityResponse({ available: false, why: "REGEX" }); return; } svc.CheckAvailable(handle, domain) .then(a => { if ('error' in a) { setError(a as ServiceError); } else { setAvailabilityResponse(a as HandleAvailability); } }) .catch(console.error); } }, [handle, domain]); function mapError(e: ServiceErrorCode, t: string | null): string | undefined { let whyMap = new Map([ ["TOO_SHORT", "name too short"], ["TOO_LONG", "name too long"], ["REGEX", "name has disallowed characters"], ["REGISTERED", "name is registered"], ["DISALLOWED_null", "name is blocked"], ["DISALLOWED_later", "name will be available later"], ]); return whyMap.get(e === "DISALLOWED" ? `${e}_${t}` : e); } return ( <>

{props.name}

{props.about}

Find out more info about {props.name} at {props.link}

{error && {error.error}}
setHandle(e.target.value)} />  @ 
{availabilityResponse?.available &&
{availabilityResponse.quote?.price.toLocaleString()} sats  
Buy Now
} {availabilityResponse?.available === false &&
Not available: {mapError(availabilityResponse.why!, availabilityResponse.reasonTag || null)}
} ) }