From 37cde1a75696946518d039a194f175aefad69bc5 Mon Sep 17 00:00:00 2001 From: Andy Jiang <72869031+jiangmuran@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:05:03 +0800 Subject: [PATCH 1/2] fix: surface download errors for files pages --- packages/ui-default/pages/problem_config.page.tsx | 13 +++++++++---- packages/ui-default/pages/problem_files.page.tsx | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/ui-default/pages/problem_config.page.tsx b/packages/ui-default/pages/problem_config.page.tsx index ba8ab02d25..7960094a72 100644 --- a/packages/ui-default/pages/problem_config.page.tsx +++ b/packages/ui-default/pages/problem_config.page.tsx @@ -82,10 +82,15 @@ const page = new NamedPage('problem_config', () => { async function handleClickDownloadAll() { const files = reduxStore.getState().testdata.map((i) => i.name); - const { links, pdoc } = await request.post('./files', { operation: 'get_links', files, type: 'testdata' }); - const targets: { filename: string, url: string }[] = []; - for (const filename of Object.keys(links)) targets.push({ filename, url: links[filename] }); - await download(`${pdoc.docId} ${pdoc.title}.zip`, targets); + try { + const { links, pdoc } = await request.post('./files', { operation: 'get_links', files, type: 'testdata' }); + const targets: { filename: string, url: string }[] = []; + for (const filename of Object.keys(links)) targets.push({ filename, url: links[filename] }); + await download(`${pdoc.docId} ${pdoc.title}.zip`, targets); + } catch (error) { + const err = error as any; + Notification.error(err.params ? [err.message, ...err.params].join(' ') : err.message); + } } async function uploadConfig(config: object) { diff --git a/packages/ui-default/pages/problem_files.page.tsx b/packages/ui-default/pages/problem_files.page.tsx index e73f447617..db4e01b680 100644 --- a/packages/ui-default/pages/problem_files.page.tsx +++ b/packages/ui-default/pages/problem_files.page.tsx @@ -26,10 +26,15 @@ const page = new NamedPage('problem_files', () => { const type = $(ev.currentTarget).closest('[data-type]').attr('data-type'); const files = ensureAndGetSelectedFiles(type); if (files === null) return; - const { links, pdoc } = await request.post('', { operation: 'get_links', files, type }); - const targets = []; - for (const filename of Object.keys(links)) targets.push({ filename, url: links[filename] }); - await download(`${pdoc.docId} ${pdoc.title} ${type}.zip`, targets); + try { + const { links, pdoc } = await request.post('', { operation: 'get_links', files, type }); + const targets = []; + for (const filename of Object.keys(links)) targets.push({ filename, url: links[filename] }); + await download(`${pdoc.docId} ${pdoc.title} ${type}.zip`, targets); + } catch (error) { + const err = error as any; + Notification.error(err.params ? [err.message, ...err.params].join(' ') : err.message); + } } async function handleGenerateTestdata(ev) { From 2dcfa5749508308685f6ccc104f406693e4bd887 Mon Sep 17 00:00:00 2001 From: Andy Jiang <72869031+jiangmuran@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:13:56 +0800 Subject: [PATCH 2/2] fix: guard error formatting for download failures --- packages/ui-default/pages/problem_config.page.tsx | 10 ++++++++-- packages/ui-default/pages/problem_files.page.tsx | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/ui-default/pages/problem_config.page.tsx b/packages/ui-default/pages/problem_config.page.tsx index 7960094a72..32771fb249 100644 --- a/packages/ui-default/pages/problem_config.page.tsx +++ b/packages/ui-default/pages/problem_config.page.tsx @@ -88,8 +88,14 @@ const page = new NamedPage('problem_config', () => { for (const filename of Object.keys(links)) targets.push({ filename, url: links[filename] }); await download(`${pdoc.docId} ${pdoc.title}.zip`, targets); } catch (error) { - const err = error as any; - Notification.error(err.params ? [err.message, ...err.params].join(' ') : err.message); + const err = error as { message?: string; params?: unknown }; + const params = Array.isArray(err.params) + ? err.params + : err.params + ? [String(err.params)] + : []; + const message = [err.message, ...params].filter(Boolean).join(' ') || i18n('Unknown error'); + Notification.error(message); } } diff --git a/packages/ui-default/pages/problem_files.page.tsx b/packages/ui-default/pages/problem_files.page.tsx index db4e01b680..706c89cc16 100644 --- a/packages/ui-default/pages/problem_files.page.tsx +++ b/packages/ui-default/pages/problem_files.page.tsx @@ -32,8 +32,14 @@ const page = new NamedPage('problem_files', () => { for (const filename of Object.keys(links)) targets.push({ filename, url: links[filename] }); await download(`${pdoc.docId} ${pdoc.title} ${type}.zip`, targets); } catch (error) { - const err = error as any; - Notification.error(err.params ? [err.message, ...err.params].join(' ') : err.message); + const err = error as { message?: string; params?: unknown }; + const params = Array.isArray(err.params) + ? err.params + : err.params + ? [String(err.params)] + : []; + const message = [err.message, ...params].filter(Boolean).join(' ') || i18n('Unknown error'); + Notification.error(message); } }