返回 DeepSeek-Reasonix
TerminalSessionRail.tsx
根目录 / desktop / frontend / src / components / TerminalSessionRail.tsx
1 import { X } from "lucide-react";
2
3 import { useT } from "../lib/i18n";
4 import type { TerminalSessionView } from "../lib/types";
5
6 export function TerminalSessionRail({
7 sessions,
8 activeSessionId,
9 onSelect,
10 onClose,
11 }: {
12 sessions: TerminalSessionView[];
13 activeSessionId: string | null;
14 onSelect: (id: string) => void;
15 onClose: (id: string) => void;
16 }) {
17 const t = useT();
18 return (
19 <nav className="terminal-session-rail" aria-label={t("terminal.sessions")}>
20 <div className="terminal-session-rail__list">
21 {sessions.map((session) => (
22 <div key={session.id} className={`terminal-session${session.id === activeSessionId ? " terminal-session--active" : ""}`}>
23 <button type="button" className="terminal-session__select" onClick={() => onSelect(session.id)} aria-current={session.id === activeSessionId ? "page" : undefined}>
24 <span className={`terminal-session__status${session.running ? " terminal-session__status--running" : ""}`} aria-hidden="true" />
25 <span className="terminal-session__title">{session.title}</span>
26 </button>
27 <button type="button" className="terminal-session__close" onClick={() => onClose(session.id)} aria-label={t("terminal.closeSession")} title={t("terminal.closeSession")}>
28 <X size={12} />
29 </button>
30 </div>
31 ))}
32 </div>
33 </nav>
34 );
35 }
36
36 lines Plain Text