/** * ConnectionBar — session picker, player info (connected state only) */ import { Component, createSignal, Show, For } from "solid-js"; import { hydrateFromServer, useJournalStream, sessions, createSession, deleteSession, disconnectStream, setSessionId, } from "../stores/journalStream"; import { journalSetState } from "../stores/journalStream"; export const ConnectionBar: Component = () => { const stream = useJournalStream(); const [newSessionName, setNewSessionName] = createSignal(""); const [showNewSession, setShowNewSession] = createSignal(false); const [error, setError] = createSignal(null); const manifest = sessions; const handleCreateSession = () => { const name = newSessionName().trim(); if (!name) return; const id = createSession(name); if (id) { setSessionId(id); hydrateFromServer(id).catch(() => {}); } setNewSessionName(""); setShowNewSession(false); }; const handleDeleteSession = (id: string) => { if (confirm(`确定要删除会话 "${id}"?此操作不可撤销。`)) { deleteSession(id); } }; const handleSessionSelect = async (id: string) => { try { await hydrateFromServer(id); setSessionId(id); } catch (e) { setError("无法加载会话"); } }; const handleDisconnect = () => { disconnectStream(); }; return (
{/* Status row */}
已连接 {stream.sessionName || stream.sessionId}
扮演 {stream.myName}
{/* GM session management */}
会话列表:
setNewSessionName(e.currentTarget.value)} placeholder="会话名称" class="flex-1 border border-gray-300 rounded px-2 py-0.5 text-xs" onKeyDown={(e) => e.key === "Enter" && handleCreateSession()} />
{([id, meta]) => (
handleSessionSelect(id)} > {meta.name || id}
)}

{error()}

); };