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' && (
)}
{status === 'error' && Something went wrong.}
)
}