Show latest message in console header (when closed)
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import { useAtom, useAtomValue } from "jotai";
|
import { useAtom, useAtomValue } from "jotai";
|
||||||
import {
|
import {
|
||||||
|
appOutputAtom,
|
||||||
previewModeAtom,
|
previewModeAtom,
|
||||||
previewPanelKeyAtom,
|
previewPanelKeyAtom,
|
||||||
selectedAppIdAtom,
|
selectedAppIdAtom,
|
||||||
@@ -29,6 +30,12 @@ interface PreviewHeaderProps {
|
|||||||
onRestart: () => void;
|
onRestart: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ConsoleHeaderProps {
|
||||||
|
isOpen: boolean;
|
||||||
|
onToggle: () => void;
|
||||||
|
latestMessage?: string;
|
||||||
|
}
|
||||||
|
|
||||||
// Preview Header component with preview mode toggle
|
// Preview Header component with preview mode toggle
|
||||||
const PreviewHeader = ({
|
const PreviewHeader = ({
|
||||||
previewMode,
|
previewMode,
|
||||||
@@ -81,16 +88,21 @@ const PreviewHeader = ({
|
|||||||
const ConsoleHeader = ({
|
const ConsoleHeader = ({
|
||||||
isOpen,
|
isOpen,
|
||||||
onToggle,
|
onToggle,
|
||||||
}: {
|
latestMessage,
|
||||||
isOpen: boolean;
|
}: ConsoleHeaderProps) => (
|
||||||
onToggle: () => void;
|
|
||||||
}) => (
|
|
||||||
<div
|
<div
|
||||||
onClick={onToggle}
|
onClick={onToggle}
|
||||||
className="flex items-center gap-2 px-4 py-1.5 border-t border-border cursor-pointer hover:bg-[var(--background-darkest)] transition-colors"
|
className="flex items-start gap-2 px-4 py-1.5 border-t border-border cursor-pointer hover:bg-[var(--background-darkest)] transition-colors"
|
||||||
>
|
>
|
||||||
<Logs size={16} />
|
<Logs size={16} className="mt-0.5" />
|
||||||
<span className="text-sm font-medium">System Messages</span>
|
<div className="flex flex-col">
|
||||||
|
<span className="text-sm font-medium">System Messages</span>
|
||||||
|
{!isOpen && latestMessage && (
|
||||||
|
<span className="text-xs text-gray-500 truncate max-w-[200px] md:max-w-[400px]">
|
||||||
|
{latestMessage}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<div className="flex-1" />
|
<div className="flex-1" />
|
||||||
{isOpen ? <ChevronDown size={16} /> : <ChevronUp size={16} />}
|
{isOpen ? <ChevronDown size={16} /> : <ChevronUp size={16} />}
|
||||||
</div>
|
</div>
|
||||||
@@ -104,6 +116,11 @@ export function PreviewPanel() {
|
|||||||
const { runApp, stopApp, restartApp, error, loading, app } = useRunApp();
|
const { runApp, stopApp, restartApp, error, loading, app } = useRunApp();
|
||||||
const runningAppIdRef = useRef<number | null>(null);
|
const runningAppIdRef = useRef<number | null>(null);
|
||||||
const key = useAtomValue(previewPanelKeyAtom);
|
const key = useAtomValue(previewPanelKeyAtom);
|
||||||
|
const appOutput = useAtomValue(appOutputAtom);
|
||||||
|
|
||||||
|
const messageCount = appOutput.length;
|
||||||
|
const latestMessage =
|
||||||
|
messageCount > 0 ? appOutput[messageCount - 1]?.message : undefined;
|
||||||
|
|
||||||
const handleRestart = useCallback(() => {
|
const handleRestart = useCallback(() => {
|
||||||
restartApp();
|
restartApp();
|
||||||
@@ -183,6 +200,7 @@ export function PreviewPanel() {
|
|||||||
<ConsoleHeader
|
<ConsoleHeader
|
||||||
isOpen={true}
|
isOpen={true}
|
||||||
onToggle={() => setIsConsoleOpen(false)}
|
onToggle={() => setIsConsoleOpen(false)}
|
||||||
|
latestMessage={latestMessage}
|
||||||
/>
|
/>
|
||||||
<Console />
|
<Console />
|
||||||
</div>
|
</div>
|
||||||
@@ -192,7 +210,11 @@ export function PreviewPanel() {
|
|||||||
</PanelGroup>
|
</PanelGroup>
|
||||||
</div>
|
</div>
|
||||||
{!isConsoleOpen && (
|
{!isConsoleOpen && (
|
||||||
<ConsoleHeader isOpen={false} onToggle={() => setIsConsoleOpen(true)} />
|
<ConsoleHeader
|
||||||
|
isOpen={false}
|
||||||
|
onToggle={() => setIsConsoleOpen(true)}
|
||||||
|
latestMessage={latestMessage}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user