'use client' /** * DomainClaimCard — renders one EmailDomainClaim row + drives the two * verification paths (DNS TXT + email attestation). * * The card never knows the API directly — apps supply onVerifyDns / * onVerifyEmail / onRevoke callbacks that typically wrap * api.domainClaims.*. The verificationToken (creator-only, single-show) is * rendered when present, with copy-to-clipboard help text. startsim-o7s. */ import * as React from 'react' import type { DomainClaimLite } from './types' import { DOMAIN_CLAIM_DEFAULTS, type DomainClaimCardClassNames, } from './domain-claim-card-default-class-names' export interface DomainClaimCardProps { claim: DomainClaimLite onVerifyDns?: (claim: DomainClaimLite) => Promise | void onInitiateEmail?: (claim: DomainClaimLite) => Promise | void onVerifyEmail?: (claim: DomainClaimLite, code: string) => Promise | void onRevoke?: (claim: DomainClaimLite) => Promise | void classNames?: DomainClaimCardClassNames /** Override the DNS-record name hint shown to the user. */ dnsRecordName?: string } export function DomainClaimCard({ claim, onVerifyDns, onInitiateEmail, onVerifyEmail, onRevoke, classNames, dnsRecordName, }: DomainClaimCardProps) { const cls = { ...DOMAIN_CLAIM_DEFAULTS, ...(classNames ?? {}) } const [busy, setBusy] = React.useState<'dns' | 'email-initiate' | 'email-code' | 'revoke' | null>(null) const [error, setError] = React.useState('') const [emailCode, setEmailCode] = React.useState('') const [emailInitiated, setEmailInitiated] = React.useState(false) function recordName() { return dnsRecordName ?? `_startsim-verify.${claim.domain}` } async function run(label: typeof busy, fn: () => Promise | T) { setError('') setBusy(label) try { await fn() } catch (err) { setError(err instanceof Error ? err.message : 'Verification failed') } finally { setBusy(null) } } return (
{claim.domain} {claim.verified ? 'Verified' : 'Pending verification'}
{!claim.verified && (
{claim.verificationToken && (

DNS TXT verification

Add a TXT record at{' '} {recordName()} with this value, then click "Verify DNS".

{claim.verificationToken}
)}

Email attestation

We'll email postmaster@{claim.domain} a 6-digit code. Anyone at that mailbox can confirm the claim.

{emailInitiated && (
setEmailCode(e.target.value.replace(/\D/g, ''))} placeholder="123456" aria-label="Attestation code" className={cls.codeInput} />
)}
{error &&

{error}

}
)}
{!claim.verified && ( <> )} {onRevoke && ( )}
) }