diff --git a/src/components/journal/CreateSessionDialog.tsx b/src/components/journal/CreateSessionDialog.tsx index 0ce847a..2b82498 100644 --- a/src/components/journal/CreateSessionDialog.tsx +++ b/src/components/journal/CreateSessionDialog.tsx @@ -1,11 +1,10 @@ /** * CreateSessionDialog — modal for naming a new session */ -import { Component, createSignal, Show } from "solid-js"; +import { Component, createSignal, onMount } from "solid-js"; import { createSession } from "../stores/journalStream"; interface CreateSessionDialogProps { - open: boolean; onClose: () => void; } @@ -23,56 +22,56 @@ export const CreateSessionDialog: Component = ( props.onClose(); }; + onMount(() => inputRef?.focus()); + return ( - +
e.stopPropagation()} > -
e.stopPropagation()} - > -
-

新建会话

- -
-

输入新会话的名称。

- setName(e.currentTarget.value)} - onKeyDown={(e) => { - if (e.key === "Enter") handleCreate(); - if (e.key === "Escape") props.onClose(); - }} - placeholder="会话名称" - class="w-full border border-gray-300 rounded px-2 py-1.5 text-sm" - autofocus - /> -
- - -
+
+

新建会话

+ +
+

输入新会话的名称。

+ setName(e.currentTarget.value)} + onKeyDown={(e) => { + if (e.key === "Enter") handleCreate(); + if (e.key === "Escape") props.onClose(); + }} + placeholder="会话名称" + class="w-full border border-gray-300 rounded px-2 py-1.5 text-sm" + autofocus + /> +
+ +
- +
); }; diff --git a/src/components/journal/JournalHeader.tsx b/src/components/journal/JournalHeader.tsx index 0628e06..ae37cac 100644 --- a/src/components/journal/JournalHeader.tsx +++ b/src/components/journal/JournalHeader.tsx @@ -7,6 +7,7 @@ import { SessionDropdown } from "./SessionDropdown"; interface JournalHeaderProps { onClose: () => void; + onCreateSession: () => void; } export const JournalHeader: Component = (props) => { @@ -51,7 +52,7 @@ export const JournalHeader: Component = (props) => {

{/* Clickable subtitle — session dropdown (GM only) */} - +
diff --git a/src/components/journal/JournalPanel.tsx b/src/components/journal/JournalPanel.tsx index 0f3df92..c2752d9 100644 --- a/src/components/journal/JournalPanel.tsx +++ b/src/components/journal/JournalPanel.tsx @@ -13,6 +13,7 @@ import { JournalContext } from "./JournalContext"; import { JournalHeader } from "./JournalHeader"; import { ConnectDialog } from "./ConnectDialog"; import { InviteDialog } from "./InviteDialog"; +import { CreateSessionDialog } from "./CreateSessionDialog"; export interface JournalPanelProps { open: boolean; @@ -22,6 +23,7 @@ export interface JournalPanelProps { export const JournalPanel: Component = (props) => { const stream = useJournalStream(); const [showInvite, setShowInvite] = createSignal(false); + const [showCreateSession, setShowCreateSession] = createSignal(false); // Player list (exclude gm and observer) const playerEntries = () => @@ -48,7 +50,10 @@ export const JournalPanel: Component = (props) => { > {/* Header */} - + setShowCreateSession(true)} + /> {/* Player list tabs */} @@ -88,6 +93,11 @@ export const JournalPanel: Component = (props) => { setShowInvite(false)} /> + + {/* Create session modal */} + + setShowCreateSession(false)} /> + diff --git a/src/components/journal/SessionDropdown.tsx b/src/components/journal/SessionDropdown.tsx index dd39790..06ed6bf 100644 --- a/src/components/journal/SessionDropdown.tsx +++ b/src/components/journal/SessionDropdown.tsx @@ -8,13 +8,15 @@ import { hydrateFromServer, useJournalStream, } from "../stores/journalStream"; -import { CreateSessionDialog } from "./CreateSessionDialog"; -export const SessionDropdown: Component = () => { +interface SessionDropdownProps { + onCreate: () => void; +} + +export const SessionDropdown: Component = (props) => { const stream = useJournalStream(); const manifest = sessions; const [dropdownOpen, setDropdownOpen] = createSignal(false); - const [showCreateDialog, setShowCreateDialog] = createSignal(false); let dropdownRef!: HTMLDivElement; const handleSessionSelect = (id: string) => { @@ -75,7 +77,8 @@ export const SessionDropdown: Component = () => { onClick={(e) => { e.stopPropagation(); e.preventDefault(); - setShowCreateDialog(true); + setDropdownOpen(false); + props.onCreate(); }} class="w-full text-left px-3 py-1 text-xs text-blue-600 hover:bg-gray-100" > @@ -83,10 +86,6 @@ export const SessionDropdown: Component = () => { - setShowCreateDialog(false)} - /> ); };