diff --git a/src/domain/session/room/RoomViewModel.js b/src/domain/session/room/RoomViewModel.js index af163c5f..12c4307a 100644 --- a/src/domain/session/room/RoomViewModel.js +++ b/src/domain/session/room/RoomViewModel.js @@ -115,12 +115,28 @@ export class RoomViewModel extends ViewModel { } } -class ComposerViewModel { +class ComposerViewModel extends ViewModel { constructor(roomVM) { + super(); this._roomVM = roomVM; + this._isEmpty = true; } sendMessage(message) { - return this._roomVM._sendMessage(message); + const success = this._roomVM._sendMessage(message); + if (success) { + this._isEmpty = true; + this.emitChange("canSend"); + } + return success; + } + + get canSend() { + return !this._isEmpty; + } + + setInput(text) { + this._isEmpty = text.length === 0; + this.emitChange("canSend"); } } diff --git a/src/ui/web/css/room.css b/src/ui/web/css/room.css index 2f00ec0c..252313a3 100644 --- a/src/ui/web/css/room.css +++ b/src/ui/web/css/room.css @@ -64,8 +64,12 @@ limitations under the License. margin: 0; } +.MessageComposer { + display: flex; +} + .MessageComposer > input { display: block; - width: 100%; + flex: 1; box-sizing: border-box; } diff --git a/src/ui/web/css/themes/element/icons/send.svg b/src/ui/web/css/themes/element/icons/send.svg new file mode 100644 index 00000000..b47ab8ea --- /dev/null +++ b/src/ui/web/css/themes/element/icons/send.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/ui/web/css/themes/element/theme.css b/src/ui/web/css/themes/element/theme.css index 517537bb..a481db73 100644 --- a/src/ui/web/css/themes/element/theme.css +++ b/src/ui/web/css/themes/element/theme.css @@ -138,11 +138,36 @@ a { color: red; } +.MessageComposer { + border-top: 1px solid rgba(245, 245, 245, 0.90); +} + .MessageComposer > input { padding: 0.8em; border: none; } +.MessageComposer > button.send { + margin: 8px; + width: 32px; + height: 32px; + display: block; + border-radius: 100%; + border: none; + text-indent: 200%; + overflow: hidden; + + background-color: #03B381; + background-image: url('icons/send.svg'); + background-repeat: no-repeat; + background-position: center; +} + +.MessageComposer > button.send:disabled { + background-color: #E3E8F0; +} + + .message-container { padding: 2px 10px; margin: 5px 10px 0 10px; diff --git a/src/ui/web/session/room/MessageComposer.js b/src/ui/web/session/room/MessageComposer.js index cdf56dba..e07e77e3 100644 --- a/src/ui/web/session/room/MessageComposer.js +++ b/src/ui/web/session/room/MessageComposer.js @@ -22,19 +22,32 @@ export class MessageComposer extends TemplateView { this._input = null; } - render(t) { + render(t, vm) { this._input = t.input({ placeholder: "Send a message ...", - onKeydown: e => this._onKeyDown(e) + onKeydown: e => this._onKeyDown(e), + onInput: () => vm.setInput(this._input.value), }); - return t.div({className: "MessageComposer"}, [this._input]); + return t.div({className: "MessageComposer"}, [ + this._input, + t.button({ + className: "send", + title: vm.i18n`Send`, + disabled: vm => !vm.canSend, + onClick: () => this._trySend(), + }, vm.i18n`Send`), + ]); + } + + _trySend() { + if (this.value.sendMessage(this._input.value)) { + this._input.value = ""; + } } _onKeyDown(event) { if (event.key === "Enter") { - if (this.value.sendMessage(this._input.value)) { - this._input.value = ""; - } + this._trySend(); } } }