add marker for unread messages

This commit is contained in:
marlon-erler
2024-07-10 15:40:25 +02:00
parent 26aa74923c
commit f68b253bb9
8 changed files with 50 additions and 4 deletions
+4
View File
@@ -0,0 +1,4 @@
/* src/styles.css */
[unread] {
border-left: 10px solid var(--text-warn);
}
+22 -2
View File
@@ -331,6 +331,9 @@
// src/utility.ts // src/utility.ts
var storageKeys = { var storageKeys = {
hasUnread(id) {
return id + "has-unread-messages";
},
primaryChannel(id) { primaryChannel(id) {
return id + "primary-channel"; return id + "primary-channel";
}, },
@@ -353,12 +356,13 @@
id; id;
isSubscribed = new State(false); isSubscribed = new State(false);
primaryChannel = new State(""); primaryChannel = new State("");
hasUnreadMessages;
secondaryChannels; secondaryChannels;
encryptionKey; encryptionKey;
messages; messages;
composingMessage; composingMessage;
newSecondaryChannelName;
primaryChannelInput; primaryChannelInput;
newSecondaryChannelName;
cannotSendMessage; cannotSendMessage;
cannotResendMessage; cannotResendMessage;
cannotAddSecondaryChannel; cannotAddSecondaryChannel;
@@ -375,6 +379,10 @@
this.secondaryChannels = restoreListState( this.secondaryChannels = restoreListState(
storageKeys.secondaryChannels(id) storageKeys.secondaryChannels(id)
); );
this.hasUnreadMessages = restoreState(
storageKeys.hasUnread(id),
false
);
this.encryptionKey = restoreState(storageKeys.encyptionKey(id), ""); this.encryptionKey = restoreState(storageKeys.encyptionKey(id), "");
this.messages = restoreListState(storageKeys.messages(id)); this.messages = restoreListState(storageKeys.messages(id));
this.composingMessage = restoreState( this.composingMessage = restoreState(
@@ -442,6 +450,7 @@
}; };
handleMessage = (chatMessage) => { handleMessage = (chatMessage) => {
this.messages.add(chatMessage); this.messages.add(chatMessage);
if (selectedChat.value != this) this.hasUnreadMessages.value = true;
}; };
// messages // messages
sendNewMessage = async () => { sendNewMessage = async () => {
@@ -735,6 +744,7 @@
} }
function selectChat(chat) { function selectChat(chat) {
selectedChat.value = chat; selectedChat.value = chat;
chat.hasUnreadMessages.value = false;
document.getElementById("message-tab")?.scrollIntoView(); document.getElementById("message-tab")?.scrollIntoView();
} }
chatIds.value.forEach((id) => chats.add(new Chat(id))); chatIds.value.forEach((id) => chats.add(new Chat(id)));
@@ -1100,7 +1110,17 @@
[selectedChat], [selectedChat],
() => selectedChat.value == chat () => selectedChat.value == chat
); );
return /* @__PURE__ */ createElement("button", { class: "tile", "on:click": select, "toggle:selected": isSelected }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", { class: "ellipsis", "subscribe:innerText": chat.primaryChannel })), /* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward")); return /* @__PURE__ */ createElement(
"button",
{
class: "tile",
"on:click": select,
"toggle:selected": isSelected,
"toggle:unread": chat.hasUnreadMessages
},
/* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", { class: "ellipsis", "subscribe:innerText": chat.primaryChannel })),
/* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward")
);
}; };
function ChatListSection() { function ChatListSection() {
return /* @__PURE__ */ createElement("div", { class: "flex-column" }, /* @__PURE__ */ createElement("h2", null, translation.chats), /* @__PURE__ */ createElement("label", { class: "tile" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "forum"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, translation.primaryChannel), /* @__PURE__ */ createElement( return /* @__PURE__ */ createElement("div", { class: "flex-column" }, /* @__PURE__ */ createElement("h2", null, translation.chats), /* @__PURE__ */ createElement("label", { class: "tile" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "forum"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, translation.primaryChannel), /* @__PURE__ */ createElement(
+8 -1
View File
@@ -5,6 +5,7 @@ import {
chatIds, chatIds,
chats, chats,
isConnected, isConnected,
selectedChat,
senderName, senderName,
updateMailbox, updateMailbox,
} from "../Model/model"; } from "../Model/model";
@@ -28,14 +29,15 @@ export class Chat {
isSubscribed = new React.State(false); isSubscribed = new React.State(false);
primaryChannel = new React.State(""); primaryChannel = new React.State("");
hasUnreadMessages: React.State<boolean>;
secondaryChannels: React.ListState<string>; secondaryChannels: React.ListState<string>;
encryptionKey: React.State<string>; encryptionKey: React.State<string>;
messages: React.ListState<ChatMessage>; messages: React.ListState<ChatMessage>;
composingMessage: React.State<string>; composingMessage: React.State<string>;
newSecondaryChannelName: React.State<string>;
primaryChannelInput: React.State<string>; primaryChannelInput: React.State<string>;
newSecondaryChannelName: React.State<string>;
cannotSendMessage: React.State<boolean>; cannotSendMessage: React.State<boolean>;
cannotResendMessage: React.State<boolean>; cannotResendMessage: React.State<boolean>;
@@ -58,6 +60,10 @@ export class Chat {
); );
// messaging // messaging
this.hasUnreadMessages = React.restoreState(
storageKeys.hasUnread(id),
false
);
this.encryptionKey = React.restoreState(storageKeys.encyptionKey(id), ""); this.encryptionKey = React.restoreState(storageKeys.encyptionKey(id), "");
this.messages = React.restoreListState(storageKeys.messages(id)); this.messages = React.restoreListState(storageKeys.messages(id));
@@ -147,6 +153,7 @@ export class Chat {
handleMessage = (chatMessage: ChatMessage): void => { handleMessage = (chatMessage: ChatMessage): void => {
this.messages.add(chatMessage); this.messages.add(chatMessage);
if (selectedChat.value != this) this.hasUnreadMessages.value = true;
}; };
// messages // messages
+1
View File
@@ -160,6 +160,7 @@ export function closeChatView() {
export function selectChat(chat: Chat) { export function selectChat(chat: Chat) {
selectedChat.value = chat; selectedChat.value = chat;
chat.hasUnreadMessages.value = false;
document.getElementById("message-tab")?.scrollIntoView(); document.getElementById("message-tab")?.scrollIntoView();
} }
+6 -1
View File
@@ -23,7 +23,12 @@ const chatConverter: React.ListItemConverter<Chat> = (chat) => {
); );
return ( return (
<button class="tile" on:click={select} toggle:selected={isSelected}> <button
class="tile"
on:click={select}
toggle:selected={isSelected}
toggle:unread={chat.hasUnreadMessages}
>
<div> <div>
<b class="ellipsis" subscribe:innerText={chat.primaryChannel}></b> <b class="ellipsis" subscribe:innerText={chat.primaryChannel}></b>
</div> </div>
+2
View File
@@ -1,3 +1,5 @@
import "./styles.css";
import { MessageTab } from "./Tabs/messageTab"; import { MessageTab } from "./Tabs/messageTab";
import { OverviewTab } from "./Tabs/overviewTab"; import { OverviewTab } from "./Tabs/overviewTab";
+3
View File
@@ -0,0 +1,3 @@
[unread] {
border-left: 10px solid var(--text-warn);
}
+4
View File
@@ -1,4 +1,8 @@
export const storageKeys = { export const storageKeys = {
hasUnread(id: string): string {
return id + "has-unread-messages";
},
primaryChannel(id: string): string { primaryChannel(id: string): string {
return id + "primary-channel"; return id + "primary-channel";
}, },