diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts index 1954d435c..d8e792051 100644 --- a/packages/backend/src/server/api/ApiCallService.ts +++ b/packages/backend/src/server/api/ApiCallService.ts @@ -389,11 +389,9 @@ export class ApiCallService implements OnApplicationShutdown { id: err.id, }, { - e: { - message: err.message, - code: err.name, - id: err.id, - }, + message: err.message, + code: err.name, + id: err.id, }, ); } else { @@ -416,11 +414,9 @@ export class ApiCallService implements OnApplicationShutdown { kind: 'server', }, { - e: { - message: err.message, - code: err.name, - id: errId, - }, + message: err.message, + code: err.name, + id: errId, }, ); } diff --git a/packages/backend/src/server/api/endpoint-base.ts b/packages/backend/src/server/api/endpoint-base.ts index e061aa3a8..a549e48f2 100644 --- a/packages/backend/src/server/api/endpoint-base.ts +++ b/packages/backend/src/server/api/endpoint-base.ts @@ -63,7 +63,7 @@ export abstract class Endpoint { id: '3d81ceae-475f-4600-b2a8-2bc116157532', }, { param: errors[0].schemaPath, - reason: errors[0].message, + reason: errors[0].message ?? 'Invalid', }); return Promise.reject(err); } diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts index e8c39fe73..b6e2bd5ae 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts @@ -85,11 +85,9 @@ export default class extends Endpoint { // eslint- id: '5c77c4d7-0f68-48f9-8694-8453a2294840', }, { - e: { - message: err.message, - code: err.name, - } - } + message: err.message, + code: err.name, + }, ); } diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts index ad2d11fcb..9083ef15f 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/create.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts @@ -191,10 +191,8 @@ export default class extends Endpoint { // eslint- id: '6708863c-6791-4487-aa01-2d682c6e7db0', }, { - e: { - message: err.message, - code: err.name, - }, + message: err.message, + code: err.name, }, ); } finally { diff --git a/packages/backend/src/server/api/error.ts b/packages/backend/src/server/api/error.ts index 67a819e8d..b05447050 100644 --- a/packages/backend/src/server/api/error.ts +++ b/packages/backend/src/server/api/error.ts @@ -11,15 +11,15 @@ export class ApiError extends Error { public id: string; public kind: string; public httpStatusCode?: number; - public info?: any; + public info?: Record; - constructor(err: E, info?: any | null | undefined) { + constructor(err: E, info?: Record | null | undefined) { super(err.message); this.message = err.message; this.code = err.code; this.id = err.id; this.kind = err.kind ?? 'client'; this.httpStatusCode = err.httpStatusCode; - this.info = info; + this.info = info ?? undefined; } } diff --git a/packages/frontend/src/components/MkDialog.vue b/packages/frontend/src/components/MkDialog.vue index e4a8a6625..a1cecfbc2 100644 --- a/packages/frontend/src/components/MkDialog.vue +++ b/packages/frontend/src/components/MkDialog.vue @@ -48,6 +48,15 @@ SPDX-License-Identifier: AGPL-3.0-only +
+ {{ i18n.ts.details }} +
+ + + + +
+
{{ okText ?? ((showCancelButton || input || select) ? i18n.ts.ok : i18n.ts.gotIt) }} {{ cancelText ?? i18n.ts.cancel }} @@ -66,6 +75,7 @@ import MkButton from '@/components/MkButton.vue'; import MkInput from '@/components/MkInput.vue'; import MkSelect from '@/components/MkSelect.vue'; import MkTextarea from '@/components/MkTextarea.vue'; +import MkKeyValue from '@/components/MkKeyValue.vue'; import { i18n } from '@/i18n.js'; type Input = { @@ -89,11 +99,12 @@ type Result = string | number | true | null; const props = withDefaults(defineProps<{ type?: 'success' | 'error' | 'warning' | 'info' | 'question' | 'waiting'; + icon?: string; title?: string | null; text?: string | null; input?: Input; select?: Select; - icon?: string; + details?: Record; actions?: { text: string; primary?: boolean, @@ -107,11 +118,12 @@ const props = withDefaults(defineProps<{ cancelText?: string; }>(), { type: 'info', + icon: undefined, title: undefined, text: undefined, input: undefined, select: undefined, - icon: undefined, + details: undefined, actions: undefined, showOkButton: true, showCancelButton: false, diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index aa238d04c..d63faa551 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -47,6 +47,7 @@ export const apiWithDialog = (( } else { alert({ type: 'error', - text: err, + title: err.message, + text: err.id, + details: err.info, }); } }); @@ -217,6 +221,7 @@ export function alert(props: { type?: 'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question'; title?: string | null; text?: string | null; + details?: Record; }): Promise { return new Promise(resolve => { popup(MkDialog, props, { @@ -231,6 +236,7 @@ export function confirm(props: { type: 'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question'; title?: string | null; text?: string | null; + details?: Record; okText?: string; cancelText?: string; }): Promise<{ canceled: boolean }> { @@ -257,6 +263,7 @@ export function actions; actions: T; }): Promise<{ canceled: true; result: undefined;