import { useState } from 'react' import { Link } from 'react-router-dom' import PublicLayout from '../../components/PublicLayout.jsx' import PageHeader from '../../components/PageHeader.jsx' import { Loading, ErrorState, EmptyState } from '../../components/PageState.jsx' import { useAsync } from '../../lib/useAsync.js' import { monthTile } from '../../lib/format.js' import { api } from '../../api/client.js' import { useSite } from '../../contexts/SiteContext.jsx' export default function Newsletter() { const { loading, error, data } = useAsync(() => api.posts('newsletter')) const issues = data || [] return (
{loading && } {error && } {!loading && !error && issues.length === 0 && No issues published yet.} {issues.map((i) => { const tile = monthTile(i.published_at || i.created_at) return (
{tile.mon} {tile.num}

{i.title}

{i.excerpt || ''}

Read → ) })}
) } function SubscribeBox() { const { contactEmail } = useSite() const [email, setEmail] = useState('') const [status, setStatus] = useState(null) // null | 'sending' | 'done' | 'mailto' | 'error' async function onSubmit(e) { e.preventDefault() if (!email) return setStatus('sending') try { const res = await api.contact({ email, message: `Newsletter subscription request from ${email}` }) setStatus(res && res.fallback === 'mailto' ? 'mailto' : 'done') } catch { setStatus('error') } } return (
Get each issue in your inbox the day it ships. {status === 'done' && Thanks — we'll be in touch.} {status === 'mailto' && ( Email us to subscribe → )} {status !== 'done' && status !== 'mailto' && (
setEmail(e.target.value)} className="input" style={{ borderRadius: 999, minWidth: 200, width: 'auto' }} />
)} {status === 'error' && Something went wrong.}
) }