fix outbox

This commit is contained in:
marlon-erler
2024-07-11 02:09:44 +02:00
parent 6cb4c1ef5f
commit fbed8f8780
4 changed files with 71 additions and 57 deletions
+27 -24
View File
@@ -453,7 +453,7 @@
this.messages = restoreListState(storageKeys.messages(id)); this.messages = restoreListState(storageKeys.messages(id));
this.objects = restoreMapState(storageKeys.objects(id)); this.objects = restoreMapState(storageKeys.objects(id));
this.outbox = restoreListState(storageKeys.outbox(id)); this.outbox = restoreListState(storageKeys.outbox(id));
this.objectOutbox = restoreListState(storageKeys.itemOutbox(id)); this.objectOutbox = restoreMapState(storageKeys.itemOutbox(id));
this.isOutBoxEmpty = createProxyState( this.isOutBoxEmpty = createProxyState(
[this.outbox], [this.outbox],
() => this.outbox.value.size == 0 () => this.outbox.value.size == 0
@@ -556,31 +556,20 @@
}; };
sendMessageFromText = async (text) => { sendMessageFromText = async (text) => {
const chatMessage = await this.createChatMessage(text); const chatMessage = await this.createChatMessage(text);
this.sendMessage(chatMessage); this.outbox.add(chatMessage);
this.sendMessagesInOutbox();
}; };
resendMessage = (chatMessage) => { resendMessage = (chatMessage) => {
if (this.cannotResendMessage.value == true) return; if (this.cannotResendMessage.value == true) return;
this.sendMessageFromText(chatMessage.body); this.sendMessageFromText(chatMessage.body);
}; };
sendMessage = async (chatMessage) => {
if (isConnected.value == true && this.isSubscribed.value == true) {
const encrypted = this.encryptionKey.value == "" ? chatMessage.body : await encryptString(chatMessage.body, this.encryptionKey.value);
chatMessage.body = encrypted;
const messageString = JSON.stringify(chatMessage);
UDN.sendMessage(chatMessage.channel, messageString);
} else {
if (chatMessage.messageObject) return this.objectOutbox.add(chatMessage);
this.outbox.add(chatMessage);
}
};
sendMessagesInOutbox = () => { sendMessagesInOutbox = () => {
this.outbox.value.forEach((message) => { this.outbox.value.forEach((message) => {
this.sendMessage(message); this.sendMessage(message);
this.outbox.remove(message);
}); });
this.objectOutbox.value.forEach((message) => { this.objectOutbox.value.forEach(async (object) => {
this.sendMessage(message); const chatMessage = await this.createChatMessage("", object);
this.objectOutbox.remove(message); this.sendMessage(chatMessage);
}); });
}; };
clearMessages = () => { clearMessages = () => {
@@ -593,14 +582,28 @@
this.outbox.remove(chatMessage); this.outbox.remove(chatMessage);
}; };
decryptReceivedMessage = async (chatMessage) => { decryptReceivedMessage = async (chatMessage) => {
chatMessage.body = await decryptString(chatMessage.body, this.encryptionKey.value); chatMessage.body = await decryptString(
chatMessage.body,
this.encryptionKey.value
);
this.messages.callSubscriptions(); this.messages.callSubscriptions();
}; };
sendMessage = async (chatMessage) => {
if (isConnected.value == false || this.isSubscribed.value == false) return;
const encryptedBody = this.encryptionKey.value == "" ? chatMessage.body : await encryptString(chatMessage.body, this.encryptionKey.value);
chatMessage.body = encryptedBody;
const messageString = JSON.stringify(chatMessage);
UDN.sendMessage(chatMessage.channel, messageString);
this.outbox.remove(chatMessage);
};
// objects // objects
async createObject(object) { async addObjectAndSend(object) {
this.objects.set(object.id, object); this.objects.set(object.id, object);
const chatMessage = await this.createChatMessage("", object); await this.sendObject(object);
this.sendMessage(chatMessage); }
async sendObject(object) {
this.objectOutbox.set(object.id, object);
this.sendMessagesInOutbox();
} }
// channel // channel
setChannel = () => { setChannel = () => {
@@ -1126,7 +1129,7 @@
} }
function saveAndClose() { function saveAndClose() {
object.title = editingTitle.value; object.title = editingTitle.value;
chat.objects.set(object.id, object); chat.addObjectAndSend(object);
closeModal(); closeModal();
} }
function deleteAndClose() { function deleteAndClose() {
@@ -1152,7 +1155,7 @@
return ItemDetailModal(chat, selectedObject.value, isShowingObjectModal); return ItemDetailModal(chat, selectedObject.value, isShowingObjectModal);
}); });
function createItem() { function createItem() {
chat.createObject({ chat.addObjectAndSend({
id: UUID(), id: UUID(),
title: "new item" title: "new item"
}); });
@@ -1164,7 +1167,7 @@
} }
return /* @__PURE__ */ createElement("button", { "on:click": select }, object.title); return /* @__PURE__ */ createElement("button", { "on:click": select }, object.title);
}; };
return /* @__PURE__ */ createElement("div", { class: "chat-tool-view" }, /* @__PURE__ */ createElement("button", { "on:click": createItem }, "+"), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("div", { "children:append": [chat.objects, itemConverter] }), /* @__PURE__ */ createElement("div", { "children:set": objectModal })); return /* @__PURE__ */ createElement("div", { class: "chat-tool-view" }, /* @__PURE__ */ createElement("button", { "on:click": createItem }, "+"), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("div", { "children:prepend": [chat.objects, itemConverter] }), /* @__PURE__ */ createElement("div", { "children:set": objectModal }));
} }
// src/Views/Chat/messageComposer.tsx // src/Views/Chat/messageComposer.tsx
+40 -30
View File
@@ -44,7 +44,7 @@ export class Chat {
messages: React.ListState<ChatMessage>; messages: React.ListState<ChatMessage>;
objects: React.MapState<MessageObject>; objects: React.MapState<MessageObject>;
outbox: React.ListState<ChatMessage>; outbox: React.ListState<ChatMessage>;
objectOutbox: React.ListState<ChatMessage>; objectOutbox: React.MapState<MessageObject>;
isOutBoxEmpty: React.State<boolean>; isOutBoxEmpty: React.State<boolean>;
composingMessage: React.State<string>; composingMessage: React.State<string>;
@@ -80,7 +80,7 @@ export class Chat {
this.messages = React.restoreListState(storageKeys.messages(id)); this.messages = React.restoreListState(storageKeys.messages(id));
this.objects = React.restoreMapState(storageKeys.objects(id)); this.objects = React.restoreMapState(storageKeys.objects(id));
this.outbox = React.restoreListState(storageKeys.outbox(id)); this.outbox = React.restoreListState(storageKeys.outbox(id));
this.objectOutbox = React.restoreListState(storageKeys.itemOutbox(id)); this.objectOutbox = React.restoreMapState(storageKeys.itemOutbox(id));
this.isOutBoxEmpty = React.createProxyState( this.isOutBoxEmpty = React.createProxyState(
[this.outbox], [this.outbox],
() => this.outbox.value.size == 0 () => this.outbox.value.size == 0
@@ -214,7 +214,8 @@ export class Chat {
sendMessageFromText = async (text: string): Promise<void> => { sendMessageFromText = async (text: string): Promise<void> => {
const chatMessage = await this.createChatMessage(text); const chatMessage = await this.createChatMessage(text);
this.sendMessage(chatMessage); this.outbox.add(chatMessage);
this.sendMessagesInOutbox();
}; };
resendMessage = (chatMessage: ChatMessage) => { resendMessage = (chatMessage: ChatMessage) => {
@@ -222,31 +223,13 @@ export class Chat {
this.sendMessageFromText(chatMessage.body); this.sendMessageFromText(chatMessage.body);
}; };
sendMessage = async (chatMessage: ChatMessage): Promise<void> => {
if (isConnected.value == true && this.isSubscribed.value == true) {
const encrypted =
this.encryptionKey.value == ""
? chatMessage.body
: await encryptString(chatMessage.body, this.encryptionKey.value);
chatMessage.body = encrypted;
const messageString = JSON.stringify(chatMessage);
UDN.sendMessage(chatMessage.channel, messageString);
} else {
if (chatMessage.messageObject) return this.objectOutbox.add(chatMessage);
this.outbox.add(chatMessage);
}
};
sendMessagesInOutbox = () => { sendMessagesInOutbox = () => {
this.outbox.value.forEach((message) => { this.outbox.value.forEach((message) => {
this.sendMessage(message); this.sendMessage(message);
this.outbox.remove(message);
}); });
this.objectOutbox.value.forEach((message) => { this.objectOutbox.value.forEach(async (object) => {
this.sendMessage(message); const chatMessage = await this.createChatMessage("", object);
this.objectOutbox.remove(message); this.sendMessage(chatMessage);
}); });
}; };
@@ -263,16 +246,43 @@ export class Chat {
}; };
decryptReceivedMessage = async (chatMessage: ChatMessage): Promise<void> => { decryptReceivedMessage = async (chatMessage: ChatMessage): Promise<void> => {
chatMessage.body = await decryptString(chatMessage.body, this.encryptionKey.value); chatMessage.body = await decryptString(
chatMessage.body,
this.encryptionKey.value
);
this.messages.callSubscriptions(); this.messages.callSubscriptions();
}; };
// objects sendMessage = async (chatMessage: ChatMessage): Promise<void> => {
async createObject(object: MessageObject): Promise<void> { if (isConnected.value == false || this.isSubscribed.value == false) return;
this.objects.set(object.id, object);
const chatMessage = await this.createChatMessage("", object); const encryptedBody =
this.sendMessage(chatMessage); this.encryptionKey.value == ""
? chatMessage.body
: await encryptString(chatMessage.body, this.encryptionKey.value);
chatMessage.body = encryptedBody;
const messageString = JSON.stringify(chatMessage);
UDN.sendMessage(chatMessage.channel, messageString);
this.outbox.remove(chatMessage);
};
// objects
addObjectAndSend(object: MessageObject): void {
this.objects.set(object.id, object);
this.sendObject(object);
}
sendObject(object: MessageObject): void {
this.objectOutbox.set(object.id, object);
this.sendMessagesInOutbox();
}
deleteObject(object: MessageObject): void {
this.objects.remove(object.id);
this.objectOutbox.remove(object.id);
} }
// channel // channel
+2 -2
View File
@@ -16,7 +16,7 @@ export function ChatToolView(chat: Chat) {
}); });
function createItem() { function createItem() {
chat.createObject({ chat.addObjectAndSend({
id: React.UUID(), id: React.UUID(),
title: "new item", title: "new item",
}); });
@@ -35,7 +35,7 @@ export function ChatToolView(chat: Chat) {
<div class="chat-tool-view"> <div class="chat-tool-view">
<button on:click={createItem}>+</button> <button on:click={createItem}>+</button>
<hr></hr> <hr></hr>
<div children:append={[chat.objects, itemConverter]}></div> <div children:prepend={[chat.objects, itemConverter]}></div>
<div children:set={objectModal}></div> <div children:set={objectModal}></div>
</div> </div>
+2 -1
View File
@@ -15,7 +15,8 @@ export function ItemDetailModal(
function saveAndClose() { function saveAndClose() {
object.title = editingTitle.value; object.title = editingTitle.value;
chat.objects.set(object.id, object);
chat.addObjectAndSend(object);
closeModal(); closeModal();
} }