/** * ComposePanel — type picker + dynamic form + send button */ import { Component, createSignal, For, Show, createMemo } from "solid-js"; import { registeredTypes, canEmit } from "./registry"; import { sendMessage, useJournalStream } from "../stores/journalStream"; import type { MessageTypeDef } from "./registry"; import { DynamicForm } from "./DynamicForm"; export const ComposePanel: Component = () => { const stream = useJournalStream(); const [selectedType, setSelectedType] = createSignal("chat"); const [formData, setFormData] = createSignal>({}); const [error, setError] = createSignal(null); const [sending, setSending] = createSignal(false); const role = () => stream.myRole; // Available types filtered by role const availableTypes = createMemo(() => { const types: string[] = []; for (const type of registeredTypes()) { if (canEmit(type, role())) { types.push(type); } } // Default to chat if available, otherwise first if (types.includes("chat")) { return types; } return types; }); const handleSend = () => { setError(null); setSending(true); const result = sendMessage(selectedType(), formData()); if (!result.success) { setError(result.error); } else { setFormData({}); // Reset on success } setSending(false); }; return (
{/* Type picker */}
{/* Dynamic form */}

{error()}

); };