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; diff --git a/packages/frontend/src/pages/chat/room.form.vue b/packages/frontend/src/pages/chat/room.form.vue index 9389b16ce7..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'; @@ -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: printError(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: printError(err), + }); + }).finally(() => { sending.value = false; }); } diff --git a/packages/frontend/src/utility/misskey-api.ts b/packages/frontend/src/utility/misskey-api.ts index f8c4657655..a5736e11ed 100644 --- a/packages/frontend/src/utility/misskey-api.ts +++ b/packages/frontend/src/utility/misskey-api.ts @@ -144,3 +144,21 @@ 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; + } + } + + 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); +}