add config option to send on Enter vs send on CTRL-Enter

This commit is contained in:
or-else
2025-08-10 15:25:05 +03:00
parent 0b05d480c7
commit 79a1bc98b2
71 changed files with 891 additions and 232 deletions
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+133 -23
View File
@@ -8665,15 +8665,15 @@ const PACKAGE_VERSION = "0.25.0";
/***/ }),
/***/ "./src/views/acc-appearance-view.jsx":
/*!*******************************************!*\
!*** ./src/views/acc-appearance-view.jsx ***!
\*******************************************/
/***/ "./src/views/acc-general-view.jsx":
/*!****************************************!*\
!*** ./src/views/acc-general-view.jsx ***!
\****************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ AccAppearanceView; }
/* harmony export */ "default": function() { return /* binding */ AccGeneralView; }
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
@@ -8681,15 +8681,18 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
class AccAppearanceView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
class AccGeneralView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
constructor(props) {
super(props);
this.state = {
colorSchema: props.colorSchema || 'light dark',
textSize: props.textSize * 10 || '100'
textSize: props.textSize * 10 || '100',
sendOnEnter: props.sendOnEnter || 'plain'
};
this.isMac = (navigator.userAgentData && navigator.userAgentData.platform || navigator.platform).toLowerCase().startsWith('mac');
this.handleColorSchemaSelected = this.handleColorSchemaSelected.bind(this);
this.handleTextSizeChanged = this.handleTextSizeChanged.bind(this);
this.handleSendOnEnterSelected = this.handleSendOnEnterSelected.bind(this);
}
handleColorSchemaSelected(e) {
this.setState({
@@ -8703,6 +8706,13 @@ class AccAppearanceView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
});
this.props.onTextSizeChanged(e.currentTarget.value / 10 | 0);
}
handleSendOnEnterSelected(e) {
console.log('handleSendOnEnterSelected', e.currentTarget.value);
this.setState({
sendOnEnter: e.currentTarget.value
});
this.props.onSendOnEnterChanged(e.currentTarget.value);
}
render() {
return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
id: "settings-form",
@@ -8728,7 +8738,7 @@ class AccAppearanceView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
id: "system",
name: "color-scheme-select",
value: "light dark",
checked: this.state.colorSchema === 'light dark',
checked: this.state.colorSchema == 'light dark',
onChange: this.handleColorSchemaSelected
}), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
htmlFor: "system"
@@ -8752,7 +8762,7 @@ class AccAppearanceView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
id: "light",
name: "color-scheme-select",
value: "light",
checked: this.state.colorSchema === 'light',
checked: this.state.colorSchema == 'light',
onChange: this.handleColorSchemaSelected
}), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
htmlFor: "light"
@@ -8771,7 +8781,7 @@ class AccAppearanceView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
id: "dark",
name: "color-scheme-select",
value: "dark",
checked: this.state.colorSchema === 'dark',
checked: this.state.colorSchema == 'dark',
onChange: this.handleColorSchemaSelected
}), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
htmlFor: "dark"
@@ -8828,7 +8838,83 @@ class AccAppearanceView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
}), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", {
value: "120",
label: "120%"
})))));
})))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "hr"
}), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "small"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "label_keyboard",
defaultMessage: [{
"type": 0,
"value": "Keyboard:"
}]
}))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
className: "quoted"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
key: "plain"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
type: "radio",
id: "plain",
name: "send-select",
value: "plain",
checked: this.state.sendOnEnter == 'plain',
onChange: this.handleSendOnEnterSelected
}), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
htmlFor: "send_plain"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "send_plain",
defaultMessage: [{
"type": 0,
"value": "Send on Enter"
}]
}), "\xA0"), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "small gray"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "send_plain_explained",
defaultMessage: [{
"type": 0,
"value": "Press Shift + Enter for new line"
}]
})))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
key: "command"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
type: "radio",
id: "command",
name: "send-select",
value: "command",
checked: this.state.sendOnEnter == 'command',
onChange: this.handleSendOnEnterSelected
}), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
htmlFor: "send_command"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "send_command",
defaultMessage: [{
"type": 0,
"value": "Send on "
}, {
"type": 1,
"value": "key"
}],
values: {
key: this.isMac ? '⌘ + Enter' : 'Ctrl + Enter'
}
}), "\xA0"), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "small gray"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "send_command_explained",
defaultMessage: [{
"type": 0,
"value": "Press Enter for new line"
}]
})))))));
}
}
;
@@ -10907,6 +10993,7 @@ class MessagesView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Compone
disabled: !this.state.isWriter || this.state.deleted,
reply: this.state.reply,
initMessage: this.state.contentToEdit,
sendOnEnter: this.props.sendOnEnter,
onKeyPress: this.sendKeyPress,
onRecordingProgress: this.sendKeyPress,
onSendMessage: this.sendMessage,
@@ -11364,7 +11451,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _widgets_side_navbar_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../widgets/side-navbar.jsx */ "./src/widgets/side-navbar.jsx");
/* harmony import */ var _topic_common_view_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./topic-common-view.jsx */ "./src/views/topic-common-view.jsx");
/* harmony import */ var _contacts_view_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./contacts-view.jsx */ "./src/views/contacts-view.jsx");
/* harmony import */ var _acc_appearance_view_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./acc-appearance-view.jsx */ "./src/views/acc-appearance-view.jsx");
/* harmony import */ var _acc_general_view_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./acc-general-view.jsx */ "./src/views/acc-general-view.jsx");
/* harmony import */ var _acc_notifications_view_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./acc-notifications-view.jsx */ "./src/views/acc-notifications-view.jsx");
/* harmony import */ var _acc_support_view_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./acc-support-view.jsx */ "./src/views/acc-support-view.jsx");
/* harmony import */ var _login_view_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./login-view.jsx */ "./src/views/login-view.jsx");
@@ -11446,11 +11533,11 @@ const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
"value": "Notifications"
}]
},
appearance: {
id: "sidepanel_title_appearance",
acc_general: {
id: "sidepanel_title_acc_general",
defaultMessage: [{
"type": 0,
"value": "Appearance"
"value": "General"
}]
},
support: {
@@ -11602,11 +11689,13 @@ class SidepanelView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
onUpdateTopicDesc: this.props.onUpdateAccountDesc,
onUpdateTagsRequest: this.props.onUpdateAccountTags,
onError: this.props.onError
}) : view === 'appearance' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_appearance_view_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
}) : view === 'acc_general' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_general_view_jsx__WEBPACK_IMPORTED_MODULE_7__["default"], {
colorSchema: this.props.colorSchema,
textSize: this.props.textSize,
sendOnEnter: this.props.sendOnEnter,
onChangeColorSchema: this.props.onChangeColorSchema,
onTextSizeChanged: this.props.onTextSizeChanged
onTextSizeChanged: this.props.onTextSizeChanged,
onSendOnEnterChanged: this.props.onSendOnEnterChanged
}) : view === 'notif' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_notifications_view_jsx__WEBPACK_IMPORTED_MODULE_8__["default"], {
messageSounds: this.props.messageSounds,
desktopAlerts: this.props.desktopAlerts,
@@ -11867,6 +11956,7 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);
this.handleChangeColorSchema = this.handleChangeColorSchema.bind(this);
this.handleChangeTextSize = this.handleChangeTextSize.bind(this);
this.handleSendOnEnter = this.handleSendOnEnter.bind(this);
this.handleSettings = this.handleSettings.bind(this);
this.handleGlobalSettings = this.handleGlobalSettings.bind(this);
this.handleShowArchive = this.handleShowArchive.bind(this);
@@ -11935,6 +12025,7 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
incognitoMode: false,
colorSchema: settings.colorSchema || _config_js__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_COLOR_SCHEME,
textSize: settings.textSize || _config_js__WEBPACK_IMPORTED_MODULE_11__.DEFAULT_TEXT_SIZE,
sendOnEnter: settings.sendOnEnter || 'plain',
desktopAlerts: persist && !!settings.desktopAlerts,
desktopAlertsEnabled: ((0,_lib_host_name_js__WEBPACK_IMPORTED_MODULE_15__.isSecureConnection)() || (0,_lib_host_name_js__WEBPACK_IMPORTED_MODULE_15__.isLocalHost)()) && typeof firebase_app__WEBPACK_IMPORTED_MODULE_2__.initializeApp != 'undefined' && typeof navigator != 'undefined' && typeof FIREBASE_INIT != 'undefined',
firebaseToken: persist ? _lib_local_storage_js__WEBPACK_IMPORTED_MODULE_16__["default"].getObject('firebase-token') : null,
@@ -12204,7 +12295,7 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
newTopicTabSelected: hash.params.tab
};
if (hash.path && hash.path.length > 0) {
if (['register', 'settings', 'edit', 'notif', 'appearance', 'security', 'support', 'general', 'crop', 'cred', 'reset', 'newtpk', 'archive', 'blocked', 'contacts', ''].includes(hash.path[0])) {
if (['register', 'settings', 'edit', 'notif', 'acc_general', 'security', 'support', 'general', 'crop', 'cred', 'reset', 'newtpk', 'archive', 'blocked', 'contacts', ''].includes(hash.path[0])) {
newState.sidePanelSelected = hash.path[0];
} else {
console.warn("Unknown sidepanel view", hash.path[0]);
@@ -12797,6 +12888,14 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
});
document.documentElement.style.setProperty('--message-text-size', `${size}pt`);
}
handleSendOnEnter(option) {
this.setState({
sendOnEnter: option
});
_lib_local_storage_js__WEBPACK_IMPORTED_MODULE_16__["default"].updateObject('settings', {
sendOnEnter: option
});
}
handleUpdateAccountTagsRequest(_, tags) {
this.tinode.getMeTopic().setMeta({
tags: tags
@@ -12910,7 +13009,7 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
handleSidepanelCancel() {
const parsed = _lib_navigation_js__WEBPACK_IMPORTED_MODULE_17__["default"].parseUrlHash(window.location.hash);
let path = '';
if (['security', 'support', 'general', 'notif', 'appearance'].includes(parsed.path[0])) {
if (['security', 'support', 'general', 'notif', 'acc_general'].includes(parsed.path[0])) {
path = 'edit';
} else if ('crop' == parsed.path[0]) {
path = 'general';
@@ -13580,6 +13679,7 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
reqCredMethod: this.state.reqCredMethod,
textSize: this.state.textSize,
colorSchema: this.state.colorSchema,
sendOnEnter: this.state.sendOnEnter,
onGlobalSettings: this.handleGlobalSettings,
onSignUp: this.handleNewAccount,
onSettings: this.handleSettings,
@@ -13595,6 +13695,7 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
onToggleIncognitoMode: this.handleToggleIncognitoMode,
onChangeColorSchema: this.handleChangeColorSchema,
onTextSizeChanged: this.handleChangeTextSize,
onSendOnEnterChanged: this.handleSendOnEnter,
onCredAdd: this.handleCredAdd,
onCredDelete: this.handleCredDelete,
onCredConfirm: this.handleCredConfirm,
@@ -13631,6 +13732,7 @@ class TinodeWeb extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component)
serverAddress: this.state.serverAddress,
applicationVisible: this.state.applicationVisible,
colorSchema: this.state.colorSchema,
sendOnEnter: this.state.sendOnEnter,
forwardMessage: this.state.forwardMessage,
onCancelForwardMessage: this.handleHideForwardDialog,
callTopic: this.state.callTopic,
@@ -19483,10 +19585,18 @@ class SendMessage extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComp
return;
}
if (e.key === 'Enter') {
if (!e.shiftKey) {
e.preventDefault();
e.stopPropagation();
this.handleSend(e);
if (this.props.sendOnEnter == 'plain') {
if (!e.shiftKey) {
e.preventDefault();
e.stopPropagation();
this.handleSend(e);
}
} else {
if (e.ctrlKey || e.metaKey) {
e.preventDefault();
e.stopPropagation();
this.handleSend(e);
}
}
}
}
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -145,7 +145,7 @@ class AccSecurityView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Comp
})), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
className: "small"
className: "small gray"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "incognito_mode_description",
defaultMessage: [{
File diff suppressed because one or more lines are too long
@@ -219,15 +219,15 @@ class AccountSettingsView extends (react__WEBPACK_IMPORTED_MODULE_0___default().
className: "flat-button",
onClick: e => {
e.preventDefault();
this.props.onNavigate('appearance');
this.props.onNavigate('acc_general');
}
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "material-icons"
}, "tune"), "\xA0", react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "sidepanel_title_appearance",
id: "sidepanel_title_acc_general",
defaultMessage: [{
"type": 0,
"value": "Appearance"
"value": "General"
}]
})), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
href: "#",
File diff suppressed because one or more lines are too long