enhance(frontend): Enterでチャットのメッセージを送信できるように

This commit is contained in:
syuilo 2025-03-25 13:19:54 +09:00
parent 8c1fc85d00
commit 2272eceffa
6 changed files with 78 additions and 13 deletions

20
locales/index.d.ts vendored
View File

@ -5448,6 +5448,14 @@ export interface Locale extends ILocale {
* *
*/ */
"home": string; "home": string;
/**
*
*/
"send": string;
/**
*
*/
"newline": string;
/** /**
* *
*/ */
@ -5614,11 +5622,23 @@ export interface Locale extends ILocale {
* *
*/ */
"showNavbarSubButtons": string; "showNavbarSubButtons": string;
/**
*
*/
"ifOn": string;
/**
*
*/
"ifOff": string;
"_chat": { "_chat": {
/** /**
* *
*/ */
"showSenderName": string; "showSenderName": string;
/**
* Enterで送信
*/
"sendOnEnter": string;
}; };
}; };
"_preferencesProfile": { "_preferencesProfile": {

View File

@ -1359,6 +1359,8 @@ _chat:
members: "メンバー" members: "メンバー"
searchMessages: "メッセージを検索" searchMessages: "メッセージを検索"
home: "ホーム" home: "ホーム"
send: "送信"
newline: "改行"
muteThisRoom: "このルームをミュート" muteThisRoom: "このルームをミュート"
deleteRoom: "ルームを削除" deleteRoom: "ルームを削除"
cannotChatWithTheUser: "このユーザーとのチャットを開始できません" cannotChatWithTheUser: "このユーザーとのチャットを開始できません"
@ -1404,9 +1406,12 @@ _settings:
makeEveryTextElementsSelectable: "全てのテキスト要素を選択可能にする" makeEveryTextElementsSelectable: "全てのテキスト要素を選択可能にする"
makeEveryTextElementsSelectable_description: "有効にすると、一部のシチュエーションでのユーザビリティが低下する場合があります。" makeEveryTextElementsSelectable_description: "有効にすると、一部のシチュエーションでのユーザビリティが低下する場合があります。"
showNavbarSubButtons: "ナビゲーションバーに副ボタンを表示" showNavbarSubButtons: "ナビゲーションバーに副ボタンを表示"
ifOn: "オンのとき"
ifOff: "オフのとき"
_chat: _chat:
showSenderName: "送信者の名前を表示" showSenderName: "送信者の名前を表示"
sendOnEnter: "Enterで送信"
_preferencesProfile: _preferencesProfile:
profileName: "プロファイル名" profileName: "プロファイル名"

View File

@ -151,8 +151,16 @@ function onDrop(ev: DragEvent): void {
} }
function onKeydown(ev: KeyboardEvent) { function onKeydown(ev: KeyboardEvent) {
if ((ev.key === 'Enter') && (ev.ctrlKey || ev.metaKey)) { if (ev.key === 'Enter') {
send(); if (prefer.s['chat.sendOnEnter']) {
if (!(ev.ctrlKey || ev.metaKey || ev.shiftKey)) {
send();
}
} else {
if ((ev.ctrlKey || ev.metaKey)) {
send();
}
}
} }
} }

View File

@ -434,7 +434,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #label><SearchLabel>{{ i18n.ts.chat }}</SearchLabel></template> <template #label><SearchLabel>{{ i18n.ts.chat }}</SearchLabel></template>
<template #icon><i class="ti ti-messages"></i></template> <template #icon><i class="ti ti-messages"></i></template>
<div class="_gaps_m"> <div class="_gaps_s">
<SearchMarker :keywords="['show', 'sender', 'name']"> <SearchMarker :keywords="['show', 'sender', 'name']">
<MkPreferenceContainer k="chat.showSenderName"> <MkPreferenceContainer k="chat.showSenderName">
<MkSwitch v-model="chatShowSenderName"> <MkSwitch v-model="chatShowSenderName">
@ -442,6 +442,28 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkSwitch> </MkSwitch>
</MkPreferenceContainer> </MkPreferenceContainer>
</SearchMarker> </SearchMarker>
<SearchMarker :keywords="['send', 'enter', 'newline']">
<MkPreferenceContainer k="chat.sendOnEnter">
<MkSwitch v-model="chatSendOnEnter">
<template #label><SearchLabel>{{ i18n.ts._settings._chat.sendOnEnter }}</SearchLabel></template>
<template #caption>
<div class="_gaps_s">
<div>
<b>{{ i18n.ts._settings.ifOn }}:</b>
<div>{{ i18n.ts._chat.send }}: Enter</div>
<div>{{ i18n.ts._chat.newline }}: Shift + Enter</div>
</div>
<div>
<b>{{ i18n.ts._settings.ifOff }}:</b>
<div>{{ i18n.ts._chat.send }}: Ctrl + Enter</div>
<div>{{ i18n.ts._chat.newline }}: Enter</div>
</div>
</div>
</template>
</MkSwitch>
</MkPreferenceContainer>
</SearchMarker>
</div> </div>
</MkFolder> </MkFolder>
</SearchMarker> </SearchMarker>
@ -627,6 +649,7 @@ const useBlurEffectForModal = prefer.model('useBlurEffectForModal');
const useBlurEffect = prefer.model('useBlurEffect'); const useBlurEffect = prefer.model('useBlurEffect');
const defaultFollowWithReplies = prefer.model('defaultFollowWithReplies'); const defaultFollowWithReplies = prefer.model('defaultFollowWithReplies');
const chatShowSenderName = prefer.model('chat.showSenderName'); const chatShowSenderName = prefer.model('chat.showSenderName');
const chatSendOnEnter = prefer.model('chat.sendOnEnter');
watch(lang, () => { watch(lang, () => {
miLocalStorage.setItem('lang', lang.value as string); miLocalStorage.setItem('lang', lang.value as string);
@ -654,6 +677,7 @@ watch([
squareAvatars, squareAvatars,
highlightSensitiveMedia, highlightSensitiveMedia,
enableSeasonalScreenEffect, enableSeasonalScreenEffect,
chatShowSenderName,
], async () => { ], async () => {
await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
}); });

View File

@ -377,6 +377,9 @@ export const PREF_DEF = {
'chat.showSenderName': { 'chat.showSenderName': {
default: false, default: false,
}, },
'chat.sendOnEnter': {
default: false,
},
'game.dropAndFusion': { 'game.dropAndFusion': {
default: { default: {

View File

@ -491,55 +491,60 @@ export const searchIndexes: SearchIndexItem[] = [
label: i18n.ts._settings._chat.showSenderName, label: i18n.ts._settings._chat.showSenderName,
keywords: ['show', 'sender', 'name'], keywords: ['show', 'sender', 'name'],
}, },
{
id: 'omEy5Q3Ev',
label: i18n.ts._settings._chat.sendOnEnter,
keywords: ['send', 'enter', 'newline'],
},
], ],
label: i18n.ts.chat, label: i18n.ts.chat,
keywords: ['chat', 'messaging'], keywords: ['chat', 'messaging'],
}, },
{ {
id: 'sCscGhMmH', id: '5fy7VEy6i',
children: [ children: [
{ {
id: 'dLkRNHn3k', id: 'EosiWZvak',
label: i18n.ts.squareAvatars, label: i18n.ts.squareAvatars,
keywords: ['avatar', 'icon', 'square'], keywords: ['avatar', 'icon', 'square'],
}, },
{ {
id: 'BvooTWFW5', id: 'qY5xTzl35',
label: i18n.ts.seasonalScreenEffect, label: i18n.ts.seasonalScreenEffect,
keywords: ['effect', 'show'], keywords: ['effect', 'show'],
}, },
{ {
id: 'yzbghkAq0', id: '2VSnj81vC',
label: i18n.ts.openImageInNewTab, label: i18n.ts.openImageInNewTab,
keywords: ['image', 'photo', 'picture', 'media', 'thumbnail', 'new', 'tab'], keywords: ['image', 'photo', 'picture', 'media', 'thumbnail', 'new', 'tab'],
}, },
{ {
id: 'aSbKFHbOy', id: 'hdQa7W2H1',
label: i18n.ts.withRepliesByDefaultForNewlyFollowed, label: i18n.ts.withRepliesByDefaultForNewlyFollowed,
keywords: ['follow', 'replies'], keywords: ['follow', 'replies'],
}, },
{ {
id: '89bn97UgY', id: 'nnj4DkjhP',
label: i18n.ts.whenServerDisconnected, label: i18n.ts.whenServerDisconnected,
keywords: ['server', 'disconnect', 'reconnect', 'reload', 'streaming'], keywords: ['server', 'disconnect', 'reconnect', 'reload', 'streaming'],
}, },
{ {
id: 'hgf3rgdA6', id: 'Eh7vTluDO',
label: i18n.ts.numberOfPageCache, label: i18n.ts.numberOfPageCache,
keywords: ['cache', 'page'], keywords: ['cache', 'page'],
}, },
{ {
id: '6FVdHPhhv', id: 'vTRSKf1JA',
label: i18n.ts.forceShowAds, label: i18n.ts.forceShowAds,
keywords: ['ad', 'show'], keywords: ['ad', 'show'],
}, },
{ {
id: '5Bx5DAST1', id: 'dwhQfcLGt',
label: i18n.ts.hemisphere, label: i18n.ts.hemisphere,
keywords: [], keywords: [],
}, },
{ {
id: 'wv7Cwiwb1', id: 'Ar1lj7f7U',
label: i18n.ts.additionalEmojiDictionary, label: i18n.ts.additionalEmojiDictionary,
keywords: ['emoji', 'dictionary', 'additional', 'extra'], keywords: ['emoji', 'dictionary', 'additional', 'extra'],
}, },