import { useEffect, useState } from 'react' import Modal from 'react-bootstrap/Modal' import { apiRequest } from '../api/client' import { PageHeader, AdminButton, AdminAlert } from '../components/admin' interface Domain { id: number name: string port: string site_id: number site_name: string site_path: string } interface Certificate { name: string path: string } export function DomainsPage() { const [domains, setDomains] = useState([]) const [certificates, setCertificates] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [requesting, setRequesting] = useState(null) const [requestDomain, setRequestDomain] = useState(null) const [requestEmail, setRequestEmail] = useState('') const load = () => { setLoading(true) Promise.all([ apiRequest('/ssl/domains'), apiRequest<{ certificates: Certificate[] }>('/ssl/certificates'), ]) .then(([d, c]) => { setDomains(d) setCertificates(c.certificates || []) }) .catch((err) => setError(err.message)) .finally(() => setLoading(false)) } useEffect(() => { load() }, []) const handleRequestCert = (e: React.FormEvent) => { e.preventDefault() if (!requestDomain) return setRequesting(requestDomain.name) apiRequest<{ status: boolean }>('/ssl/request', { method: 'POST', body: JSON.stringify({ domain: requestDomain.name, webroot: requestDomain.site_path, email: requestEmail, }), }) .then(() => { setRequestDomain(null) load() }) .catch((err) => setError(err.message)) .finally(() => setRequesting(null)) } const hasCert = (domain: string) => certificates.some((c) => c.name === domain || c.name.startsWith(domain + ' ')) if (loading) { return ( <>

Loading…

) } return ( <> {error ? {error} : null}
Request Let's Encrypt certificates for your site domains. Requires certbot and nginx configured for the domain.
Domains (from sites)
{domains.length === 0 ? (
No domains. Add a site first.
) : ( domains.map((d) => (
{d.name} {d.port !== '80' ? :{d.port} : null} ({d.site_name})
{hasCert(d.name) ? ( Cert ) : ( { setRequestDomain(d) setRequestEmail('') }} > {requesting === d.name ? ( ) : ( 'Request SSL' )} )}
)) )}
Certificates
{certificates.length === 0 ? (
No certificates yet
) : ( certificates.map((c) => (
{c.name}
)) )}
setRequestDomain(null)} centered> Request SSL for {requestDomain?.name} {requestDomain ? (
setRequestEmail(e.target.value)} placeholder="admin@example.com" className="form-control" required />
setRequestDomain(null)}> Cancel {requesting ? 'Requesting…' : 'Request'}
) : null}
) }