fix: transform handlers don't auto-open bottom panel unnecessarily

This commit is contained in:
2026-02-27 15:05:00 +01:00
parent b1e9275580
commit f9527b384b
3 changed files with 53 additions and 4 deletions

View File

@@ -10,6 +10,7 @@ import {
buildBlogmarkTransformOutputEntries,
buildBlogmarkTransformToastNotifications,
parseBlogmarkCreatedEventPayload,
shouldAutoOpenPanelForOutputEntries,
} from './navigation/blogmarkTransformOutput';
import { createDeferredEventGate } from './navigation/deferredEventGate';
import { createAndFocusPost } from './navigation/postCreation';
@@ -288,10 +289,12 @@ const App: React.FC = () => {
});
});
useAppStore.setState({
panelVisible: true,
panelActiveTab: 'output',
});
if (shouldAutoOpenPanelForOutputEntries(outputEntries)) {
useAppStore.setState({
panelVisible: true,
panelActiveTab: 'output',
});
}
}
blogmarkEventGateRef.current.push(created, processBlogmarkCreated);

View File

@@ -142,6 +142,12 @@ export function buildBlogmarkTransformOutputEntries(
return entries;
}
export function shouldAutoOpenPanelForOutputEntries(
entries: Array<Omit<PanelOutputEntry, 'id' | 'createdAt'>>,
): boolean {
return entries.some((entry) => entry.kind === 'error' || entry.kind === 'stdout');
}
export function buildBlogmarkTransformToastNotifications(
transform: BlogmarkTransformDebugInfo | undefined,
t: (key: string, values?: Record<string, string | number>) => string,

View File

@@ -3,6 +3,7 @@ import {
buildBlogmarkTransformOutputEntries,
buildBlogmarkTransformToastNotifications,
parseBlogmarkCreatedEventPayload,
shouldAutoOpenPanelForOutputEntries,
} from '../../../src/renderer/navigation/blogmarkTransformOutput';
describe('parseBlogmarkCreatedEventPayload', () => {
@@ -123,3 +124,42 @@ describe('buildBlogmarkTransformToastNotifications', () => {
]);
});
});
describe('shouldAutoOpenPanelForOutputEntries', () => {
it('returns false for empty entries', () => {
expect(shouldAutoOpenPanelForOutputEntries([])).toBe(false);
});
it('returns false when all entries are result kind', () => {
expect(shouldAutoOpenPanelForOutputEntries([
{ kind: 'result', message: 'summary:2:0' },
{ kind: 'result', message: 'applied:alpha, beta' },
])).toBe(false);
});
it('returns true when entries contain an error', () => {
expect(shouldAutoOpenPanelForOutputEntries([
{ kind: 'result', message: 'summary:1:1' },
{ kind: 'error', message: 'failed:broken:boom' },
])).toBe(true);
});
it('returns true when entries contain stdout', () => {
expect(shouldAutoOpenPanelForOutputEntries([
{ kind: 'result', message: 'summary:1:0' },
{ kind: 'stdout', message: 'hello from python' },
])).toBe(true);
});
it('returns true when entries contain only errors', () => {
expect(shouldAutoOpenPanelForOutputEntries([
{ kind: 'error', message: 'uncaught exception' },
])).toBe(true);
});
it('returns true when entries contain only stdout', () => {
expect(shouldAutoOpenPanelForOutputEntries([
{ kind: 'stdout', message: 'debug output' },
])).toBe(true);
});
});