Skip to content

Commit fceaccd

Browse files
committed
refactor: replace addError overloaded params with ErrorOptions bag
Replace the overloaded `opts?: Error | string | MessageOptions` parameter with a typed `ErrorOptions` bag (`{ error?, details?, persist? }`). This eliminates type-sniffing, fixes bug report generation receiving `[object Object]` for MessageOptions callers, and makes each call site explicit about what it's passing. Also moves `bugReport` from MessageOptions to the Message type since it's generated output, not caller input. Tightens generateBugReport signature to `(error?: Error)`. Adds store-based content assertion to the E2E test.
1 parent 43c1f7c commit fceaccd

File tree

17 files changed

+74
-74
lines changed

17 files changed

+74
-74
lines changed

src/components/MessageItem.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export default defineComponent({
3030
});
3131
3232
const copyBugReport = () => {
33-
const report = message.value.options.bugReport;
33+
const report = message.value.bugReport;
3434
if (report) copy(report);
3535
};
3636
@@ -50,7 +50,7 @@ export default defineComponent({
5050
<span>{{ message.title }}</span>
5151
<div>
5252
<v-btn
53-
v-if="message.options.bugReport"
53+
v-if="message.bugReport"
5454
:prepend-icon="copied ? 'mdi-check' : 'mdi-content-copy'"
5555
variant="tonal"
5656
size="small"

src/components/PatientStudyVolumeBrowser.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export default defineComponent({
118118
if (err instanceof Error) {
119119
const messageStore = useMessageStore();
120120
messageStore.addError('Failed to generate thumbnails', {
121+
error: err,
121122
details: `${err}. More details can be found in the developer's console.`,
122123
});
123124
}

src/components/SampleDataBrowser.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ export default defineComponent({
115115
} catch (error) {
116116
status.progress[sample.name].state = ProgressState.Error;
117117
const messageStore = useMessageStore();
118-
messageStore.addError('Failed to load sample data', error as Error);
118+
messageStore.addError('Failed to load sample data', {
119+
error: error as Error,
120+
});
119121
} finally {
120122
delete status.progress[sample.name];
121123
}

src/composables/useErrorMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export async function useErrorMessage(message: string, task: Function) {
77
if (err instanceof Error) {
88
const messageStore = useMessageStore();
99
messageStore.addError(message, {
10+
error: err,
1011
details: `${err}. More details can be found in the developer's console.`,
1112
});
1213
}

src/composables/useGlobalErrorHook.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@ export function useGlobalErrorHook() {
77

88
const onError = (event: ErrorEvent) => {
99
console.error(event);
10-
const errorMessage = event.message ?? 'Unknown global error';
10+
const error = event.error ?? event.message ?? 'Unknown global error';
1111

12-
captureException(event.error ?? errorMessage);
12+
captureException(error);
1313

14-
const details = event.error ? event.error : { details: errorMessage };
15-
messageStore.addError('Application error (click for details)', details);
14+
const errorOptions =
15+
error instanceof Error ? { error } : { details: String(error) };
16+
messageStore.addError(
17+
'Application error (click for details)',
18+
errorOptions
19+
);
1620
};
1721

1822
onMounted(() => {

src/composables/useWebGLWatchdog.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ function getVolumeMapperContext(view: View) {
3333
export function useWebGLWatchdog(view: MaybeRef<Maybe<View>>) {
3434
const reportError = useThrottleFn(() => {
3535
const messageStore = useMessageStore();
36-
messageStore.addError(Messages.WebGLLost.title, Messages.WebGLLost.details);
36+
messageStore.addError(Messages.WebGLLost.title, {
37+
details: Messages.WebGLLost.details,
38+
});
3739

3840
const contexts: Record<string, any> = {};
3941
const viewVal = unref(view);

src/io/import/processors/restoreStateFile.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,9 @@ function resolveToLeafSources(
5252
return [{ type: 'file', file, fileType: src.fileType }];
5353
}
5454
const missingFile = filePath ?? String(src.fileId);
55-
useMessageStore().addError(
56-
'State file missing expected file',
57-
missingFile
58-
);
55+
useMessageStore().addError('State file missing expected file', {
56+
details: missingFile,
57+
});
5958
return [];
6059
}
6160

src/store/__tests__/messages.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('Message store', () => {
1212

1313
const innerError = new Error('inner error');
1414
const ids = [
15-
messageStore.addError('an error', innerError),
15+
messageStore.addError('an error', { error: innerError }),
1616
messageStore.addWarning('warning'),
1717
messageStore.addInfo('info'),
1818
messageStore.addInfo('loading', {
@@ -26,7 +26,7 @@ describe('Message store', () => {
2626
type: MessageType.Error,
2727
title: 'an error',
2828
options: {
29-
details: String(innerError),
29+
details: innerError.stack ?? String(innerError),
3030
persist: false,
3131
},
3232
},
@@ -57,7 +57,7 @@ describe('Message store', () => {
5757
expect(messageStore.messages).to.have.length(4);
5858

5959
ids.forEach((id, index) => {
60-
expect(messageStore.byID[id]).to.deep.equal(expected[index]);
60+
expect(messageStore.byID[id]).toMatchObject(expected[index]);
6161
});
6262

6363
messageStore.clearOne(ids[1]);

src/store/dicom-web/dicom-web-store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ export const useDicomWebStore = defineStore('dicom-web', () => {
202202
};
203203
} catch (error) {
204204
const messageStore = useMessageStore();
205-
messageStore.addError('Failed to load DICOM', error as Error);
205+
messageStore.addError('Failed to load DICOM', { error: error as Error });
206206
volumes.value[volumeKey] = {
207207
...volumes.value[volumeKey],
208208
state: 'Error',

src/store/image-cache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export const useImageCacheStore = defineStore('image-cache', () => {
5353
imageErrors[id].push(error);
5454

5555
const messageStore = useMessageStore();
56-
messageStore.addError('Error loading DICOM data', error);
56+
messageStore.addError('Error loading DICOM data', { error });
5757
};
5858

5959
imageListenerCleanup[id] = () => {

0 commit comments

Comments
 (0)