import { useEffect, useState } from 'react'; import { useThreadStore, type Thread, type ForumTag } from '../stores/thread.ts'; interface ForumViewProps { channelId: string; channelName: string; onOpenThread: (thread: { id: string; name: string }) => void; } export function ForumView({ channelId, channelName, onOpenThread }: ForumViewProps) { const threads = useThreadStore((s) => s.threadsByParent[channelId] || []); const tags = useThreadStore((s) => s.tagsByForum[channelId] || []); const fetchThreads = useThreadStore((s) => s.fetchThreads); const fetchForumTags = useThreadStore((s) => s.fetchForumTags); const createThread = useThreadStore((s) => s.createThread); const createForumTag = useThreadStore((s) => s.createForumTag); const [title, setTitle] = useState(''); const [body, setBody] = useState(''); const [selectedTagIds, setSelectedTagIds] = useState([]); const [tagName, setTagName] = useState(''); const [showForm, setShowForm] = useState(false); useEffect(() => { fetchThreads(channelId); fetchForumTags(channelId); }, [channelId, fetchThreads, fetchForumTags]); const handlePost = async () => { if (!title.trim()) return; const t = await createThread(channelId, { name: title.trim(), tag_ids: selectedTagIds }); if (body.trim()) { // ponytail: send first message via thread store after creation const { sendThreadMessage } = useThreadStore.getState(); await sendThreadMessage(t.id, body.trim()); } setTitle(''); setBody(''); setSelectedTagIds([]); setShowForm(false); }; const toggleTag = (id: string) => { setSelectedTagIds((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]); }; const handleCreateTag = async () => { if (!tagName.trim()) return; await createForumTag(channelId, { name: tagName.trim() }); setTagName(''); }; return (
■ {channelName}
{showForm && (
setTitle(e.target.value)} placeholder="post title" className="terminal-input w-full" />