add composer, update cannotSendMessage guard to block empty messages

This commit is contained in:
marlon-erler
2024-07-20 21:15:06 +02:00
parent 0920cff5b5
commit 757dbf9947
6 changed files with 72 additions and 10 deletions
+7
View File
@@ -344,6 +344,13 @@ main {
} }
#message-page #composer { #message-page #composer {
border-top: 1px solid var(--border); border-top: 1px solid var(--border);
display: flex;
}
#message-page #composer input {
margin: 0px;
width: 100%;
max-width: unset;
flex: 1;
} }
/* src/View/Components/chatEntry.css */ /* src/View/Components/chatEntry.css */
+27 -7
View File
@@ -738,8 +738,8 @@
() => this.encryptionKeyInput.value == this.chatModel.info.encryptionKey () => this.encryptionKeyInput.value == this.chatModel.info.encryptionKey
); );
this.cannotSendMessage = createProxyState( this.cannotSendMessage = createProxyState(
[this.settingsViewModel.username], [this.settingsViewModel.username, this.composingMessage],
() => this.settingsViewModel.username.value == "" () => this.settingsViewModel.username.value == "" || this.composingMessage.value == ""
); );
this.color.value = chatModel.color; this.color.value = chatModel.color;
this.restoreSecondaryChannels(); this.restoreSecondaryChannels();
@@ -835,11 +835,6 @@
); );
} }
// src/View/ChatPages/messagePage.tsx
function MessagePage(chatViewModel) {
return /* @__PURE__ */ createElement("div", { id: "message-page" }, /* @__PURE__ */ createElement("div", { class: "toolbar" }, /* @__PURE__ */ createElement("span", { "subscribe:innerText": chatViewModel.primaryChannel })), /* @__PURE__ */ createElement("div", { class: "content" }, /* @__PURE__ */ createElement("div", { id: "message-container" }), /* @__PURE__ */ createElement("div", { id: "composer" })));
}
// src/View/translations.ts // src/View/translations.ts
var englishTranslations = { var englishTranslations = {
general: { general: {
@@ -914,6 +909,10 @@
setEncryptionKeyButtonAudioLabel: "set encryption key", setEncryptionKeyButtonAudioLabel: "set encryption key",
showEncryptionKey: "Show encryption key", showEncryptionKey: "Show encryption key",
deleteChatButton: "Delete entire chat" deleteChatButton: "Delete entire chat"
},
message: {
composerInputPlaceholder: "Type a message...",
sendMessageButtonAudioLabel: "send message"
} }
} }
}; };
@@ -923,6 +922,27 @@
var language = navigator.language.substring(0, 2); var language = navigator.language.substring(0, 2);
var translations = allTranslations[language] || allTranslations.en; var translations = allTranslations[language] || allTranslations.en;
// src/View/ChatPages/messagePage.tsx
function MessagePage(chatViewModel) {
return /* @__PURE__ */ createElement("div", { id: "message-page" }, /* @__PURE__ */ createElement("div", { class: "toolbar" }, /* @__PURE__ */ createElement("span", { "subscribe:innerText": chatViewModel.primaryChannel })), /* @__PURE__ */ createElement("div", { class: "content" }, /* @__PURE__ */ createElement("div", { id: "message-container" }), /* @__PURE__ */ createElement("div", { id: "composer" }, /* @__PURE__ */ createElement(
"input",
{
"bind:value": chatViewModel.composingMessage,
"on:enter": chatViewModel.sendMessage,
placeholder: translations.chatPage.message.composerInputPlaceholder
}
), /* @__PURE__ */ createElement(
"button",
{
class: "primary",
"aria-label": translations.chatPage.message.sendMessageButtonAudioLabel,
"on:click": chatViewModel.sendMessage,
"toggle:disabled": chatViewModel.cannotSendMessage
},
/* @__PURE__ */ createElement("span", { class: "icon" }, "send")
))));
}
// src/View/Components/deletableListItem.tsx // src/View/Components/deletableListItem.tsx
function DeletableListItem(text, primaryButton, ondelete) { function DeletableListItem(text, primaryButton, ondelete) {
return /* @__PURE__ */ createElement("div", { class: "tile flex-row justify-apart align-center padding-0" }, /* @__PURE__ */ createElement("span", { class: "padding-h" }, text), /* @__PURE__ */ createElement("div", { class: "flex-row justify-end" }, primaryButton, /* @__PURE__ */ createElement( return /* @__PURE__ */ createElement("div", { class: "tile flex-row justify-apart align-center padding-0" }, /* @__PURE__ */ createElement("span", { class: "padding-h" }, text), /* @__PURE__ */ createElement("div", { class: "flex-row justify-end" }, primaryButton, /* @__PURE__ */ createElement(
+11
View File
@@ -15,4 +15,15 @@
/* composer */ /* composer */
#message-page #composer { #message-page #composer {
border-top: 1px solid var(--border); border-top: 1px solid var(--border);
display: flex;
}
#message-page #composer input {
margin: 0px;
width: 100%;
max-width: unset;
flex: 1;
} }
+18 -1
View File
@@ -3,6 +3,7 @@ import "./messagePage.css";
import * as React from "bloatless-react"; import * as React from "bloatless-react";
import ChatViewModel from "../../ViewModel/chatViewModel"; import ChatViewModel from "../../ViewModel/chatViewModel";
import { translations } from "../translations";
export function MessagePage(chatViewModel: ChatViewModel) { export function MessagePage(chatViewModel: ChatViewModel) {
return ( return (
@@ -12,7 +13,23 @@ export function MessagePage(chatViewModel: ChatViewModel) {
</div> </div>
<div class="content"> <div class="content">
<div id="message-container"></div> <div id="message-container"></div>
<div id="composer"></div> <div id="composer">
<input
bind:value={chatViewModel.composingMessage}
on:enter={chatViewModel.sendMessage}
placeholder={translations.chatPage.message.composerInputPlaceholder}
></input>
<button
class="primary"
aria-label={
translations.chatPage.message.sendMessageButtonAudioLabel
}
on:click={chatViewModel.sendMessage}
toggle:disabled={chatViewModel.cannotSendMessage}
>
<span class="icon">send</span>
</button>
</div>
</div> </div>
</div> </div>
); );
+5
View File
@@ -98,6 +98,11 @@ const englishTranslations = {
deleteChatButton: "Delete entire chat", deleteChatButton: "Delete entire chat",
}, },
message: {
composerInputPlaceholder: "Type a message...",
sendMessageButtonAudioLabel: "send message",
}
}, },
}; };
+4 -2
View File
@@ -155,8 +155,10 @@ export default class ChatViewModel {
); );
this.cannotSendMessage = React.createProxyState( this.cannotSendMessage = React.createProxyState(
[this.settingsViewModel.username], [this.settingsViewModel.username, this.composingMessage],
() => this.settingsViewModel.username.value == "" () =>
this.settingsViewModel.username.value == "" ||
this.composingMessage.value == ""
); );
this.color.value = chatModel.color; this.color.value = chatModel.color;