add mailbox

This commit is contained in:
marlon-erler
2024-07-09 00:28:07 +02:00
parent 1a6969e4d0
commit e54941d6bf
6 changed files with 247 additions and 32 deletions
BIN
View File
Binary file not shown.
+123 -10
View File
@@ -295,14 +295,20 @@
// node_modules/udn-frontend/index.ts // node_modules/udn-frontend/index.ts
var UDNFrontend = class { var UDNFrontend = class {
ws; ws;
// handlers // HANDLERS
connectionHandler = () => { connectionHandler = () => {
}; };
disconnectionHandler = () => { disconnectionHandler = () => {
}; };
messageHandler = (data) => { messageHandler = (data) => {
}; };
// init mailboxHandler = (mailboxId2) => {
};
mailboxConnectionHandler = (mailboxId2) => {
};
mailboxDeleteHandler = (mailboxId2) => {
};
// INIT
set onconnect(handler) { set onconnect(handler) {
this.connectionHandler = handler; this.connectionHandler = handler;
} }
@@ -312,15 +318,26 @@
set onmessage(handler) { set onmessage(handler) {
this.messageHandler = handler; this.messageHandler = handler;
} }
// utility methods set onmailboxcreate(handler) {
this.mailboxHandler = handler;
}
set onmailboxconnect(handler) {
this.mailboxConnectionHandler = handler;
}
set onmailboxdelete(handler) {
this.mailboxDeleteHandler = handler;
}
// UTILITY METHODS
send(messageObject) { send(messageObject) {
if (this.ws == void 0) return false; if (this.ws == void 0) return false;
const messageString = JSON.stringify(messageObject); const messageString = JSON.stringify(messageObject);
this.ws.send(messageString); this.ws.send(messageString);
return true; return true;
} }
// public methods // PUBLIC METHODS
// connection
connect(address) { connect(address) {
try {
this.disconnect(); this.disconnect();
this.ws = new WebSocket(address); this.ws = new WebSocket(address);
this.ws.addEventListener("open", this.connectionHandler); this.ws.addEventListener("open", this.connectionHandler);
@@ -328,12 +345,24 @@
this.ws.addEventListener("message", (message) => { this.ws.addEventListener("message", (message) => {
const dataString = message.data.toString(); const dataString = message.data.toString();
const data = JSON.parse(dataString); const data = JSON.parse(dataString);
if (data.assignedMailboxId) {
return this.mailboxHandler(data.assignedMailboxId);
} else if (data.connectedMailboxId) {
return this.mailboxConnectionHandler(data.connectedMailboxId);
} else if (data.deletedMailbox) {
return this.mailboxDeleteHandler(data.deletedMailbox);
} else {
this.messageHandler(data); this.messageHandler(data);
}
}); });
} catch (error) {
console.error(error);
}
} }
disconnect() { disconnect() {
this.ws?.close(); this.ws?.close();
} }
// message
sendMessage(channel, body) { sendMessage(channel, body) {
const messageObject = { const messageObject = {
messageChannel: channel, messageChannel: channel,
@@ -341,6 +370,7 @@
}; };
return this.send(messageObject); return this.send(messageObject);
} }
// subscription
subscribe(channel) { subscribe(channel) {
const messageObject = { const messageObject = {
subscribeChannel: channel subscribeChannel: channel
@@ -353,6 +383,25 @@
}; };
return this.send(messageObject); return this.send(messageObject);
} }
// mailbox
requestMailbox() {
const messageObject = {
requestingMailboxSetup: true
};
return this.send(messageObject);
}
connectMailbox(mailboxId2) {
const messageObject = {
requestedMailbox: mailboxId2
};
return this.send(messageObject);
}
deleteMailbox(mailboxId2) {
const messageObject = {
deletingMailbox: mailboxId2
};
return this.send(messageObject);
}
}; };
// src/translations.ts // src/translations.ts
@@ -382,6 +431,10 @@
showEncryptionKey: "Show encryption key", showEncryptionKey: "Show encryption key",
myName: "My Name", myName: "My Name",
yourNamePlaceholder: "Jane Doe", yourNamePlaceholder: "Jane Doe",
mailbox: "Mailbox",
requestMailbox: "Enable",
deleteMailbox: "Disable",
mailboxExplanation: "If you can't receive messages, they will be kept on the server temporarily",
// messages // messages
messages: "Messages", messages: "Messages",
composerPlaceholder: "Type a message...", composerPlaceholder: "Type a message...",
@@ -421,6 +474,10 @@
showEncryptionKey: "Mostrar clave de cifrado", showEncryptionKey: "Mostrar clave de cifrado",
myName: "Mi nombre", myName: "Mi nombre",
yourNamePlaceholder: "Juan P\xE9rez", yourNamePlaceholder: "Juan P\xE9rez",
mailbox: "Buz\xF3n",
requestMailbox: "Activar",
deleteMailbox: "Desactivar",
mailboxExplanation: "Si no puedes recibir mensajes, se guardar\xE1n temporalmente en el servidor",
// messages // messages
messages: "Mensajes", messages: "Mensajes",
composerPlaceholder: "Escribe un mensaje...", composerPlaceholder: "Escribe un mensaje...",
@@ -458,6 +515,10 @@
showEncryptionKey: "Schl\xFCssel anzeigen", showEncryptionKey: "Schl\xFCssel anzeigen",
myName: "Mein Name", myName: "Mein Name",
yourNamePlaceholder: "Max Mustermann", yourNamePlaceholder: "Max Mustermann",
mailbox: "Briefkasten",
requestMailbox: "Aktivieren",
deleteMailbox: "Deaktivieren",
mailboxExplanation: "Nachrichten werden tempor\xE4r auf dem Server gespeichert, wenn du sie nicht empfangen kannst",
// messages // messages
messages: "Nachrichten", messages: "Nachrichten",
composerPlaceholder: "Neue Nachricht...", composerPlaceholder: "Neue Nachricht...",
@@ -505,14 +566,22 @@
[serverAddress, currentAddress, isConnected], [serverAddress, currentAddress, isConnected],
() => serverAddress.value == "" || currentAddress.value == serverAddress.value && isConnected.value == true () => serverAddress.value == "" || currentAddress.value == serverAddress.value && isConnected.value == true
); );
var mailboxId = restoreState("mailbox-id", "");
var isMailboxConnected = new State(false);
var cannotRequestMailbox = createProxyState(
[isConnected, isMailboxConnected],
() => isConnected.value == false || isMailboxConnected.value == true
);
var cannotDeleteMailbox = createProxyState(
[isConnected, mailboxId, isMailboxConnected],
() => isConnected.value == false || mailboxId.value == "" || isMailboxConnected.value == false
);
var encryptionKey = restoreState("encryption-key", ""); var encryptionKey = restoreState("encryption-key", "");
var isEncryptionUnavailable = window.crypto.subtle == void 0; var isEncryptionUnavailable = window.crypto.subtle == void 0;
var currentPrimaryChannel = new State(""); var currentPrimaryChannel = new State("");
var primaryChannel = restoreState("primary-channel", ""); var primaryChannel = restoreState("primary-channel", "");
var newSecondaryChannelName = new State(""); var newSecondaryChannelName = new State("");
var secondaryChannels = restoreListState("secondary-channels"); var secondaryChannels = restoreListState("secondary-channels");
var senderName = restoreState("sender-name", "");
var messageBody = restoreState("message", "");
var cannotSetChannel = createProxyState( var cannotSetChannel = createProxyState(
[primaryChannel, currentPrimaryChannel, isConnected], [primaryChannel, currentPrimaryChannel, isConnected],
() => primaryChannel.value == "" || isConnected.value == false () => primaryChannel.value == "" || isConnected.value == false
@@ -525,6 +594,8 @@
[newSecondaryChannelName], [newSecondaryChannelName],
() => newSecondaryChannelName.value == "" () => newSecondaryChannelName.value == ""
); );
var senderName = restoreState("sender-name", "");
var messageBody = restoreState("message", "");
var cannotSendMessage = createProxyState( var cannotSendMessage = createProxyState(
[currentPrimaryChannel, messageBody, senderName, isConnected], [currentPrimaryChannel, messageBody, senderName, isConnected],
() => isConnected.value == false || currentPrimaryChannel.value == "" || messageBody.value == "" || senderName.value == "" () => isConnected.value == false || currentPrimaryChannel.value == "" || messageBody.value == "" || senderName.value == ""
@@ -540,6 +611,12 @@
if (cannotDisonnect.value == true) return; if (cannotDisonnect.value == true) return;
UDN.disconnect(); UDN.disconnect();
} }
function requestMailbox() {
UDN.requestMailbox();
}
function deleteMailbox() {
UDN.deleteMailbox(mailboxId.value);
}
async function sendMessage() { async function sendMessage() {
if (cannotSendMessage.value == true) return; if (cannotSendMessage.value == true) return;
const secondaryChannelNames = [ const secondaryChannelNames = [
@@ -568,10 +645,6 @@
function deleteMessage(message) { function deleteMessage(message) {
messages.remove(message); messages.remove(message);
} }
async function decryptReceivedMessage(message) {
message.body = await decryptMessage(message.body);
messages.callSubscriptions();
}
function setChannel() { function setChannel() {
if (cannotSetChannel.value == true) return; if (cannotSetChannel.value == true) return;
if (currentPrimaryChannel != void 0) { if (currentPrimaryChannel != void 0) {
@@ -592,9 +665,28 @@
function removeSecondaryChannel(channel) { function removeSecondaryChannel(channel) {
secondaryChannels.remove(channel); secondaryChannels.remove(channel);
} }
async function decryptReceivedMessage(message) {
message.body = await decryptMessage(message.body);
messages.callSubscriptions();
}
UDN.onconnect = () => { UDN.onconnect = () => {
UDN.ws?.addEventListener("message", console.log);
isConnected.value = true; isConnected.value = true;
setChannel(); setChannel();
if (mailboxId.value != "") {
UDN.connectMailbox(mailboxId.value);
}
};
UDN.onmailboxcreate = (id) => {
mailboxId.value = id;
UDN.connectMailbox(id);
};
UDN.onmailboxconnect = () => {
isMailboxConnected.value = true;
};
UDN.onmailboxdelete = () => {
isMailboxConnected.value = false;
mailboxId.value = "";
}; };
UDN.onmessage = (data) => { UDN.onmessage = (data) => {
if (data.subscribed != void 0 && data.messageChannel != void 0) { if (data.subscribed != void 0 && data.messageChannel != void 0) {
@@ -605,6 +697,7 @@
}; };
UDN.ondisconnect = () => { UDN.ondisconnect = () => {
isConnected.value = false; isConnected.value = false;
isMailboxConnected.value = false;
}; };
function handleSubscriptionConfirmation(channel, isSubscribed) { function handleSubscriptionConfirmation(channel, isSubscribed) {
if (isSubscribed == true) { if (isSubscribed == true) {
@@ -652,6 +745,9 @@
return encryptionData; return encryptionData;
} }
} }
if (serverAddress.value != "") {
connect();
}
// src/Views/messageComposer.tsx // src/Views/messageComposer.tsx
function MessageComposer() { function MessageComposer() {
@@ -809,6 +905,23 @@
}, },
translation.connectToServer, translation.connectToServer,
/* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward") /* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward")
)), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("div", { class: "tile" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "inbox"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", null, translation.mailbox), /* @__PURE__ */ createElement("span", { class: "secondary" }, translation.mailboxExplanation))), /* @__PURE__ */ createElement("div", { class: "flex-row width-input justify-end" }, /* @__PURE__ */ createElement(
"button",
{
class: "danger width-50",
"on:click": deleteMailbox,
"toggle:disabled": cannotDeleteMailbox
},
translation.deleteMailbox
), /* @__PURE__ */ createElement(
"button",
{
class: "primary width-50",
"on:click": requestMailbox,
"toggle:disabled": cannotRequestMailbox
},
translation.requestMailbox,
/* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward")
))); )));
} }
+1 -1
View File
@@ -2,7 +2,7 @@
"dependencies": { "dependencies": {
"bloatless-react": "^1.2.4", "bloatless-react": "^1.2.4",
"esbuild": "latest", "esbuild": "latest",
"udn-frontend": "^1.0.3" "udn-frontend": "^1.0.6"
}, },
"scripts": { "scripts": {
"build": "esbuild src/index.tsx --bundle --outdir=dist" "build": "esbuild src/index.tsx --bundle --outdir=dist"
+31
View File
@@ -2,9 +2,13 @@ import * as React from "bloatless-react";
import { import {
cannotConnect, cannotConnect,
cannotDeleteMailbox,
cannotDisonnect, cannotDisonnect,
cannotRequestMailbox,
connect, connect,
deleteMailbox,
disconnect, disconnect,
requestMailbox,
serverAddress, serverAddress,
} from "../model"; } from "../model";
@@ -41,6 +45,33 @@ export function ConnectionInputView() {
<span class="icon">arrow_forward</span> <span class="icon">arrow_forward</span>
</button> </button>
</div> </div>
<hr></hr>
<div class="tile">
<span class="icon">inbox</span>
<div>
<b>{translation.mailbox}</b>
<span class="secondary">{translation.mailboxExplanation}</span>
</div>
</div>
<div class="flex-row width-input justify-end">
<button
class="danger width-50"
on:click={deleteMailbox}
toggle:disabled={cannotDeleteMailbox}
>
{translation.deleteMailbox}
</button>
<button
class="primary width-50"
on:click={requestMailbox}
toggle:disabled={cannotRequestMailbox}
>
{translation.requestMailbox}
<span class="icon">arrow_forward</span>
</button>
</div>
</div> </div>
); );
} }
+68 -12
View File
@@ -61,11 +61,28 @@ export const cannotConnect = React.createProxyState(
(currentAddress.value == serverAddress.value && isConnected.value == true) (currentAddress.value == serverAddress.value && isConnected.value == true)
); );
// mailbox
export const mailboxId = React.restoreState("mailbox-id", "");
export const isMailboxConnected = new React.State(false);
export const cannotRequestMailbox = React.createProxyState(
[isConnected, isMailboxConnected],
() => isConnected.value == false || isMailboxConnected.value == true
);
export const cannotDeleteMailbox = React.createProxyState(
[isConnected, mailboxId, isMailboxConnected],
() =>
isConnected.value == false ||
mailboxId.value == "" ||
isMailboxConnected.value == false
);
// encryption // encryption
export const encryptionKey = React.restoreState("encryption-key", ""); export const encryptionKey = React.restoreState("encryption-key", "");
export const isEncryptionUnavailable = window.crypto.subtle == undefined; export const isEncryptionUnavailable = window.crypto.subtle == undefined;
// sending // channel
export const currentPrimaryChannel = new React.State(""); export const currentPrimaryChannel = new React.State("");
export const primaryChannel = React.restoreState("primary-channel", ""); export const primaryChannel = React.restoreState("primary-channel", "");
@@ -73,10 +90,6 @@ export const newSecondaryChannelName = new React.State("");
export const secondaryChannels = export const secondaryChannels =
React.restoreListState<Channel>("secondary-channels"); React.restoreListState<Channel>("secondary-channels");
export const senderName = React.restoreState("sender-name", "");
export const messageBody = React.restoreState("message", "");
export const cannotSetChannel = React.createProxyState( export const cannotSetChannel = React.createProxyState(
[primaryChannel, currentPrimaryChannel, isConnected], [primaryChannel, currentPrimaryChannel, isConnected],
() => primaryChannel.value == "" || isConnected.value == false () => primaryChannel.value == "" || isConnected.value == false
@@ -92,6 +105,11 @@ export const cannotAddSecondaryChannel = React.createProxyState(
() => newSecondaryChannelName.value == "" () => newSecondaryChannelName.value == ""
); );
// sending
export const senderName = React.restoreState("sender-name", "");
export const messageBody = React.restoreState("message", "");
export const cannotSendMessage = React.createProxyState( export const cannotSendMessage = React.createProxyState(
[currentPrimaryChannel, messageBody, senderName, isConnected], [currentPrimaryChannel, messageBody, senderName, isConnected],
() => () =>
@@ -105,18 +123,29 @@ export const cannotSendMessage = React.createProxyState(
export const messages = React.restoreListState<Message>("messages"); export const messages = React.restoreListState<Message>("messages");
// METHODS // METHODS
export function connect() { // connection
export function connect(): void {
if (cannotConnect.value == true) return; if (cannotConnect.value == true) return;
currentAddress.value = serverAddress.value; currentAddress.value = serverAddress.value;
isConnected.value = false; isConnected.value = false;
UDN.connect(serverAddress.value); UDN.connect(serverAddress.value);
} }
export function disconnect() { export function disconnect(): void {
if (cannotDisonnect.value == true) return; if (cannotDisonnect.value == true) return;
UDN.disconnect(); UDN.disconnect();
} }
// mailbox
export function requestMailbox(): void {
UDN.requestMailbox();
}
export function deleteMailbox(): void {
UDN.deleteMailbox(mailboxId.value);
}
// messages
export async function sendMessage(): Promise<void> { export async function sendMessage(): Promise<void> {
if (cannotSendMessage.value == true) return; if (cannotSendMessage.value == true) return;
@@ -158,11 +187,7 @@ export function deleteMessage(message: Message): void {
messages.remove(message); messages.remove(message);
} }
export async function decryptReceivedMessage(message: Message): Promise<void> { // channels
message.body = await decryptMessage(message.body);
messages.callSubscriptions();
}
export function setChannel(): void { export function setChannel(): void {
if (cannotSetChannel.value == true) return; if (cannotSetChannel.value == true) return;
@@ -190,10 +215,35 @@ export function removeSecondaryChannel(channel: Channel): void {
secondaryChannels.remove(channel); secondaryChannels.remove(channel);
} }
// encryption
export async function decryptReceivedMessage(message: Message): Promise<void> {
message.body = await decryptMessage(message.body);
messages.callSubscriptions();
}
// LISTENERS // LISTENERS
UDN.onconnect = () => { UDN.onconnect = () => {
UDN.ws?.addEventListener("message", console.log)
isConnected.value = true; isConnected.value = true;
setChannel(); setChannel();
if (mailboxId.value != "") {
UDN.connectMailbox(mailboxId.value);
}
};
UDN.onmailboxcreate = (id) => {
mailboxId.value = id;
UDN.connectMailbox(id);
};
UDN.onmailboxconnect = () => {
isMailboxConnected.value = true;
};
UDN.onmailboxdelete = () => {
isMailboxConnected.value = false;
mailboxId.value = "";
}; };
UDN.onmessage = (data) => { UDN.onmessage = (data) => {
@@ -206,6 +256,7 @@ UDN.onmessage = (data) => {
UDN.ondisconnect = () => { UDN.ondisconnect = () => {
isConnected.value = false; isConnected.value = false;
isMailboxConnected.value = false;
}; };
// UTILITY // UTILITY
@@ -265,3 +316,8 @@ async function decryptMessage(encryptionData: string): Promise<string> {
return encryptionData; return encryptionData;
} }
} }
// INIT
if (serverAddress.value != "") {
connect();
}
+15
View File
@@ -25,6 +25,11 @@ const englishTranslations = {
showEncryptionKey: "Show encryption key", showEncryptionKey: "Show encryption key",
myName: "My Name", myName: "My Name",
yourNamePlaceholder: "Jane Doe", yourNamePlaceholder: "Jane Doe",
mailbox: "Mailbox",
requestMailbox: "Enable",
deleteMailbox: "Disable",
mailboxExplanation:
"If you can't receive messages, they will be kept on the server temporarily",
// messages // messages
messages: "Messages", messages: "Messages",
@@ -69,6 +74,11 @@ const allTranslations: { [key: string]: typeof englishTranslations } = {
showEncryptionKey: "Mostrar clave de cifrado", showEncryptionKey: "Mostrar clave de cifrado",
myName: "Mi nombre", myName: "Mi nombre",
yourNamePlaceholder: "Juan Pérez", yourNamePlaceholder: "Juan Pérez",
mailbox: "Buzón",
requestMailbox: "Activar",
deleteMailbox: "Desactivar",
mailboxExplanation:
"Si no puedes recibir mensajes, se guardarán temporalmente en el servidor",
// messages // messages
messages: "Mensajes", messages: "Mensajes",
@@ -110,6 +120,11 @@ const allTranslations: { [key: string]: typeof englishTranslations } = {
showEncryptionKey: "Schlüssel anzeigen", showEncryptionKey: "Schlüssel anzeigen",
myName: "Mein Name", myName: "Mein Name",
yourNamePlaceholder: "Max Mustermann", yourNamePlaceholder: "Max Mustermann",
mailbox: "Briefkasten",
requestMailbox: "Aktivieren",
deleteMailbox: "Deaktivieren",
mailboxExplanation:
"Nachrichten werden temporär auf dem Server gespeichert, wenn du sie nicht empfangen kannst",
// messages // messages
messages: "Nachrichten", messages: "Nachrichten",