Zwei Nachbesserungen am Cockpit-Modus (noch Teil von 0.2.1.9): - Im Cockpit werden IMMER alle vier Kacheln gezeigt (Chat/Editor/Desktop/ Vorschau) statt erst bei Code-Projekten — Editor/Desktop/Vorschau als Platzhalter mit Status-Untertitel. Vorher wirkten sie "verschwunden". - Der "⤢ Uebersicht"-Button hing im Chat genau ueber dem Abbrechen-Button der "ARIA denkt"-Leiste. Jetzt sitzt er im Navigations-Header links (nur sichtbar im Cockpit + Fokus), via neuem cockpitNav-Signal-Singleton. In-Content-Button entfernt. tsc clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
76 lines
3.0 KiB
TypeScript
76 lines
3.0 KiB
TypeScript
/**
|
|
* WorkspaceScreen — Screen-Wrapper fuer den Workspace-Canvas.
|
|
*
|
|
* Buendelt die Signale, die entscheiden welche Kacheln sichtbar sind:
|
|
* - projectFocus: aktives Projekt + dessen kind ('code'|'chat')
|
|
* - codeFile: kam schon eine Code-Datei rein? (Live-Reveal des Editors)
|
|
* - desktop: ist ein QEMU-Desktop verfuegbar? (Live-Reveal der VNC-Kachel)
|
|
*
|
|
* Ersetzt den bisherigen Chat-Tab: die ChatScreen lebt als Kachel im Canvas,
|
|
* bleibt aber genau eine Instanz.
|
|
*/
|
|
|
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
import projectFocus, { FocusSnapshot } from '../services/projectFocus';
|
|
import codeFile from '../services/codeFile';
|
|
import desktop from '../services/desktop';
|
|
import viewMode, { ViewModeValue } from '../services/viewMode';
|
|
import ChatScreen from '../screens/ChatScreen';
|
|
import { TileId, TILE_ORDER } from './layout';
|
|
import WorkspaceCanvas from './WorkspaceCanvas';
|
|
|
|
const WorkspaceScreen: React.FC = () => {
|
|
const [mode, setMode] = useState<ViewModeValue>(viewMode.get());
|
|
const [focus, setFocus] = useState<FocusSnapshot>(projectFocus.get());
|
|
const [hasCode, setHasCode] = useState(false);
|
|
const [hasDesktop, setHasDesktop] = useState(false);
|
|
|
|
useEffect(() => viewMode.subscribe(setMode), []);
|
|
useEffect(() => projectFocus.subscribe(setFocus), []);
|
|
|
|
const pid = focus.focusedProjectId;
|
|
const kind = projectFocus.getProjectKind(pid);
|
|
|
|
// Code-Signal: hat der Spiegel schon Dateien fuer dieses Projekt?
|
|
useEffect(() => {
|
|
setHasCode(codeFile.getFiles(pid).length > 0);
|
|
return codeFile.subscribe((u) => {
|
|
if ((u.projectId || '') === (pid || '')) setHasCode(true);
|
|
});
|
|
}, [pid]);
|
|
|
|
// Desktop-Signal + einmaliger Check beim Betreten eines Code-Projekts.
|
|
useEffect(() => {
|
|
setHasDesktop(desktop.getStatus().available);
|
|
const unsub = desktop.subscribeStatus((s) => setHasDesktop(s.available));
|
|
if (kind === 'code') desktop.requestCheck(pid);
|
|
return unsub;
|
|
}, [pid, kind]);
|
|
|
|
// Im Cockpit immer alle Kacheln zeigen (Editor/Desktop/Vorschau als
|
|
// Platzhalter, bis ein Code-Projekt/VM aktiv ist) — sonst „fehlen" sie
|
|
// gefuehlt. isCode blendet nur die Untertitel-Info um.
|
|
const visibleTiles: TileId[] = TILE_ORDER;
|
|
const isCode = kind === 'code' || hasCode || hasDesktop;
|
|
|
|
const subtitles = useMemo(() => {
|
|
const fileCount = codeFile.getFiles(pid).length;
|
|
return {
|
|
chat: pid ? projectFocus.getProjectName(pid) : 'Hauptchat',
|
|
editor: isCode ? `${fileCount} Datei${fileCount === 1 ? '' : 'en'}` : 'kein Code-Projekt',
|
|
vnc: hasDesktop ? 'verbunden' : 'kein Desktop',
|
|
preview: undefined,
|
|
} as Partial<Record<TileId, string>>;
|
|
}, [pid, focus.projectNameById, isCode, hasCode, hasDesktop]);
|
|
|
|
// Kompakt-Ansicht: klassischer Vollbild-Chat, exakt wie vor dem Umbau.
|
|
if (mode === 'compact') {
|
|
return <ChatScreen />;
|
|
}
|
|
|
|
// Cockpit: zoombarer Kachel-Desktop.
|
|
return <WorkspaceCanvas projectId={pid} visibleTiles={visibleTiles} subtitles={subtitles} />;
|
|
};
|
|
|
|
export default WorkspaceScreen;
|