From 45212cbd5647f04b45cccc4da4cc17e6ec28e2f1 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 26 Jul 2025 19:14:49 -0400 Subject: [PATCH 1/5] show popup when chat API returns an error --- packages/frontend/src/pages/chat/room.form.vue | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/pages/chat/room.form.vue b/packages/frontend/src/pages/chat/room.form.vue index 9389b16ce7..eafe458ab3 100644 --- a/packages/frontend/src/pages/chat/room.form.vue +++ b/packages/frontend/src/pages/chat/room.form.vue @@ -194,8 +194,13 @@ function send() { }).then(message => { clear(); }).catch(err => { - console.error(err); - }).then(() => { + console.error('Error in chat:', err); + return os.alert({ + type: 'error', + title: i18n.ts.error, + text: String(err), + }); + }).finally(() => { sending.value = false; }); } else if (props.room) { @@ -206,8 +211,13 @@ function send() { }).then(message => { clear(); }).catch(err => { - console.error(err); - }).then(() => { + console.error('Error in chat:', err); + return os.alert({ + type: 'error', + title: i18n.ts.error, + text: String(err), + }); + }).finally(() => { sending.value = false; }); } From c803228952ba32405090667df7eec81efa7f1542 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 26 Jul 2025 20:05:03 -0400 Subject: [PATCH 2/5] implement printError function for frontend --- packages/frontend/src/utility/misskey-api.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/frontend/src/utility/misskey-api.ts b/packages/frontend/src/utility/misskey-api.ts index f8c4657655..689ba587aa 100644 --- a/packages/frontend/src/utility/misskey-api.ts +++ b/packages/frontend/src/utility/misskey-api.ts @@ -144,3 +144,17 @@ export function misskeyApiGet< return promise; } + +export function printError(error: unknown): string { + if (error != null && typeof(error) === 'object') { + if ('info' in error && typeof (error.info) === 'object' && error.info) { + if ('e' in error.info && typeof (error.info.e) === 'object' && error.info.e) { + if ('message' in error.info.e && typeof (error.info.e.message) === 'string') return error.info.e.message; + if ('code' in error.info.e && typeof (error.info.e.code) === 'string') return error.info.e.code; + if ('id' in error.info.e && typeof (error.info.e.id) === 'string') return error.info.e.id; + } + } + } + + return String(error); +} From dc1416d5d8e45346cbb120c1127708aabe8f0353 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 26 Jul 2025 20:05:13 -0400 Subject: [PATCH 3/5] fix rendering of errors from Chat API --- packages/frontend/src/pages/chat/room.form.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/pages/chat/room.form.vue b/packages/frontend/src/pages/chat/room.form.vue index eafe458ab3..8b1fed5156 100644 --- a/packages/frontend/src/pages/chat/room.form.vue +++ b/packages/frontend/src/pages/chat/room.form.vue @@ -43,7 +43,7 @@ import * as os from '@/os.js'; import { i18n } from '@/i18n.js'; import { uploadFile } from '@/utility/upload.js'; import { miLocalStorage } from '@/local-storage.js'; -import { misskeyApi } from '@/utility/misskey-api.js'; +import { misskeyApi, printError } from '@/utility/misskey-api.js'; import { prefer } from '@/preferences.js'; import { Autocomplete } from '@/utility/autocomplete.js'; import { emojiPicker } from '@/utility/emoji-picker.js'; @@ -198,7 +198,7 @@ function send() { return os.alert({ type: 'error', title: i18n.ts.error, - text: String(err), + text: printError(err), }); }).finally(() => { sending.value = false; @@ -215,7 +215,7 @@ function send() { return os.alert({ type: 'error', title: i18n.ts.error, - text: String(err), + text: printError(err), }); }).finally(() => { sending.value = false; From e78c4d99f6b4b31270d918cf64462b410ca27ac0 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 26 Jul 2025 20:08:30 -0400 Subject: [PATCH 4/5] fix database type of chat_message.text --- ...753574755478-change-chat_message-text-type.js | 16 ++++++++++++++++ packages/backend/src/models/ChatMessage.ts | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 packages/backend/migration/1753574755478-change-chat_message-text-type.js diff --git a/packages/backend/migration/1753574755478-change-chat_message-text-type.js b/packages/backend/migration/1753574755478-change-chat_message-text-type.js new file mode 100644 index 0000000000..d286f8ff3a --- /dev/null +++ b/packages/backend/migration/1753574755478-change-chat_message-text-type.js @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class ChangeChatMessageTextType1753574755478 { + name = 'ChangeChatMessageTextType1753574755478' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "chat_message" ALTER COLUMN "text" TYPE text`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "chat_message" ALTER COLUMN "text" TYPE varchar(4096)`); + } +} diff --git a/packages/backend/src/models/ChatMessage.ts b/packages/backend/src/models/ChatMessage.ts index 3d2b64268e..536947335b 100644 --- a/packages/backend/src/models/ChatMessage.ts +++ b/packages/backend/src/models/ChatMessage.ts @@ -50,8 +50,8 @@ export class MiChatMessage { @JoinColumn() public toRoom: MiChatRoom | null; - @Column('varchar', { - length: 4096, nullable: true, + @Column('text', { + nullable: true, }) public text: string | null; From cd5a4ee392abe783b4bc25d75b87a1d8cc012a81 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 26 Jul 2025 20:18:05 -0400 Subject: [PATCH 5/5] support ApiError responses in renderError --- packages/frontend/src/utility/misskey-api.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/frontend/src/utility/misskey-api.ts b/packages/frontend/src/utility/misskey-api.ts index 689ba587aa..a5736e11ed 100644 --- a/packages/frontend/src/utility/misskey-api.ts +++ b/packages/frontend/src/utility/misskey-api.ts @@ -154,6 +154,10 @@ export function printError(error: unknown): string { if ('id' in error.info.e && typeof (error.info.e.id) === 'string') return error.info.e.id; } } + + if ('message' in error && typeof (error.message) === 'string') return error.message; + if ('code' in error && typeof (error.code) === 'string') return error.code; + if ('id' in error && typeof (error.id) === 'string') return error.id; } return String(error);