import { useCallback, useState } from 'react' import { Loading, ErrorState } from '../../../components/PageState.jsx' import { useAsync } from '../../../lib/useAsync.js' import { shortDate, categoryLabel } from '../../../lib/format.js' import { api } from '../../../api/client.js' import PostEditor from './PostEditor.jsx' const FILTERS = [ { key: 'all', label: 'All' }, { key: 'news', label: 'News', db: 'news' }, { key: 'five_on_friday', label: 'Five on Friday', db: 'five_on_friday' }, { key: 'newsletter', label: 'Newsletter', db: 'newsletter' }, { key: 'screenshot', label: 'Screenshots', db: 'screenshot' }, ] export default function PostsAdmin() { const [tick, setTick] = useState(0) const reload = useCallback(() => setTick((t) => t + 1), []) const { loading, error, data } = useAsync(() => api.admin.listPosts(), [tick]) const [filter, setFilter] = useState('all') const [editing, setEditing] = useState(null) // null | 'new' | post object const posts = (data || []).filter((p) => filter === 'all' || p.category === filter) return (
{FILTERS.map((f) => ( ))}
{loading && } {error && } {!loading && !error && (
{posts.length === 0 && ( )} {posts.map((p) => ( ))}
Title Category Status Date
No posts in this category yet.
{p.title} {categoryLabel(p.category)} {p.published ? 'Published' : 'Draft'} {shortDate(p.published_at || p.created_at)} setEditing(p)}> Edit
)} {editing && ( setEditing(null)} onSaved={() => { setEditing(null) reload() }} /> )}
) }