import { useState, type SyntheticEvent } from "react"; import { useNavigate } from "react-router-dom"; import { useAuth } from "../lib/auth"; import { putBoard, putSite } from "../lib/writes"; import { BOARD } from "../lib/lexicon"; import { DEFAULT_BOARD } from "../lib/shared"; import { makeAtUri, nowIso } from "../lib/util"; import * as limits from "../lib/limits"; import { usePageTitle } from "../hooks/usePageTitle"; import { bbsUrl } from "../lib/routes"; import { Input, Textarea, Button } from "../components/form/Form"; import BoardRowEditor, { type BoardRow, } from "../components/form/BoardRowEditor"; export default function SysopCreate() { const { user, agent } = useAuth(); const navigate = useNavigate(); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [intro, setIntro] = useState(""); const [boards, setBoards] = useState([ { slug: DEFAULT_BOARD.slug, name: DEFAULT_BOARD.name, description: DEFAULT_BOARD.description, }, ]); const [error, setError] = useState(null); usePageTitle("Create community — atbbs"); async function onSubmit(e: SyntheticEvent) { e.preventDefault(); if (!agent || !user) return; const cleanBoards = boards .map((board) => ({ slug: board.slug.trim(), name: board.name.trim(), description: board.description.trim(), })) .filter((board) => board.slug); if (!name.trim() || !cleanBoards.length) { setError("Name and at least one board are required."); return; } const now = nowIso(); try { for (const board of cleanBoards) { await putBoard( agent, board.slug, board.name || board.slug, board.description, now, ); } await putSite(agent, { name: name.trim(), description: description.trim(), intro, boards: cleanBoards.map((board) => makeAtUri(user.did, BOARD, board.slug), ), createdAt: now, }); navigate(bbsUrl(user.handle)); } catch { setError("Could not create community."); } } return ( <>

Create a community

Set up your community. Your handle becomes the address.

{error &&

{error}

}
setName(e.target.value)} placeholder="My Cool Community" maxLength={limits.SITE_NAME} />
setDescription(e.target.value)} placeholder="A short description of your community" maxLength={limits.SITE_DESCRIPTION} />