From c1fcbcf9326a47558d882f7fb039bb0315e3d4e8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 21 Mar 2026 11:06:35 +0000 Subject: [PATCH] fix: prevent gallery browser-open rejection crash Co-authored-by: Dylan Boudro --- src/screens/GalleryDetail.test.ts | 27 +++++++++++++++++++++++++++ src/screens/GalleryDetail.tsx | 13 ++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/screens/GalleryDetail.test.ts diff --git a/src/screens/GalleryDetail.test.ts b/src/screens/GalleryDetail.test.ts new file mode 100644 index 0000000..2adfbec --- /dev/null +++ b/src/screens/GalleryDetail.test.ts @@ -0,0 +1,27 @@ +import { describe, it, expect, vi } from 'vitest' +import { openGenerationInBrowser } from './GalleryDetail.js' + +describe('openGenerationInBrowser', () => { + it('opens the generation URL', async () => { + const setError = vi.fn<(value: string | null) => void>() + const openBrowser = vi.fn<(target: string) => Promise>().mockResolvedValue(undefined) + + openGenerationInBrowser('gen_123', setError, openBrowser) + await Promise.resolve() + + expect(openBrowser).toHaveBeenCalledWith('https://www.pixelmuse.studio/g/gen_123') + expect(setError).not.toHaveBeenCalled() + }) + + it('handles browser open failures without throwing', async () => { + const setError = vi.fn<(value: string | null) => void>() + const openBrowser = vi + .fn<(target: string) => Promise>() + .mockRejectedValue(new Error('No browser available')) + + expect(() => openGenerationInBrowser('gen_456', setError, openBrowser)).not.toThrow() + await Promise.resolve() + + expect(setError).toHaveBeenCalledWith('No browser available') + }) +}) diff --git a/src/screens/GalleryDetail.tsx b/src/screens/GalleryDetail.tsx index 5953137..12f82d4 100644 --- a/src/screens/GalleryDetail.tsx +++ b/src/screens/GalleryDetail.tsx @@ -13,6 +13,17 @@ interface Props { back: () => void } +export function openGenerationInBrowser( + generationId: string, + setError: (value: string | null) => void, + openBrowser: (target: string) => Promise = open, +): void { + const url = `https://www.pixelmuse.studio/g/${generationId}` + void openBrowser(url).catch((err: unknown) => { + setError(err instanceof Error ? err.message : 'Failed to open in browser') + }) +} + export default function GalleryDetail({ client, generationId, back }: Props) { const [generation, setGeneration] = useState(null) const [imagePath, setImagePath] = useState(null) @@ -49,7 +60,7 @@ export default function GalleryDetail({ client, generationId, back }: Props) { if (confirming) return if (input === 'd') setConfirming(true) if (input === 'o' && generation) { - open(`https://www.pixelmuse.studio/g/${generation.id}`) + openGenerationInBrowser(generation.id, setError) } })