diff --git a/src/lib/blah/connection/chatServer.ts b/src/lib/blah/connection/chatServer.ts
index a4a5fd6..baf3432 100644
--- a/src/lib/blah/connection/chatServer.ts
+++ b/src/lib/blah/connection/chatServer.ts
@@ -52,13 +52,11 @@ export class BlahChatServerConnection {
});
}
- private async apiCall
(path: `/${string}`, payload?: P): Promise {
+ private async apiCall(method: 'POST' | 'GET', path: `/${string}`, payload?: P): Promise {
if (payload && !this.keypair) throw new Error('Must make authorized API call with a keypair');
let response: Response;
- if (payload) {
- response = await this.fetchWithSignedPayload(`${this.endpoint}${path}`, payload);
- } else {
+ if (method === 'GET') {
if (this.keypair) {
response = await this.fetchWithAuthHeader(`${this.endpoint}${path}`);
} else {
@@ -66,9 +64,11 @@ export class BlahChatServerConnection {
headers: BlahChatServerConnection.commonHeaders
});
}
+ } else {
+ response = await this.fetchWithSignedPayload(`${this.endpoint}${path}`, payload, { method });
}
- if (!response.ok) throw BlahError.fromResponse(response);
+ if (!response.ok) throw await BlahError.fromResponse(response);
return await response.json();
}
@@ -82,20 +82,20 @@ export class BlahChatServerConnection {
user: this.keypair.id
};
- await this.apiCall(`/room/${id}/join`, payload);
+ await this.apiCall('POST', `/room/${id}/admin`, payload);
}
async sendMessage(room: string, message: BlahRichText): Promise {
if (!this.keypair) throw new Error('Must send message with a keypair');
const payload: BlahMessage = { room, rich_text: message, typ: 'chat' };
- await this.fetchWithSignedPayload(`/room/${room}/item`, payload);
+ await this.apiCall('POST', `/room/${room}/item`, payload);
}
async fetchRoom(
roomId: string
): Promise<{ room: BlahRoomInfo; messages: BlahSignedPayload[] }> {
const [room, messages]: [BlahRoomInfo, [number, BlahSignedPayload][]] =
- await this.apiCall(`/room/${roomId}/item`);
+ await this.apiCall('GET', `/room/${roomId}/item`);
return { room, messages: messages.toSorted(([a], [b]) => a - b).map(([, message]) => message) };
}
diff --git a/src/lib/blah/connection/error.ts b/src/lib/blah/connection/error.ts
index 23e053a..ac7bcb3 100644
--- a/src/lib/blah/connection/error.ts
+++ b/src/lib/blah/connection/error.ts
@@ -1,14 +1,16 @@
export class BlahError extends Error {
+ statusCode: number;
raw: Record;
- constructor(errRespJson: { message: string } & Record) {
+ constructor(statusCode: number, errRespJson: { message: string } & Record) {
super(errRespJson.message);
+ this.statusCode = statusCode;
this.raw = errRespJson;
this.name = 'BlahError';
}
static async fromResponse(response: Response): Promise {
const errRespJson = await response.json();
- return new BlahError(errRespJson);
+ return new BlahError(response.status, errRespJson);
}
}
diff --git a/src/lib/components/RichTextInput.svelte b/src/lib/components/RichTextInput.svelte
index 9e71d6f..90ee199 100644
--- a/src/lib/components/RichTextInput.svelte
+++ b/src/lib/components/RichTextInput.svelte
@@ -5,6 +5,7 @@
import { tw } from '$lib/tw';
export let delta: Delta | null = null;
+ export let plainText: string | undefined = undefined;
export let placeholder: string = '';
let className = '';
@@ -23,7 +24,7 @@
{placeholder}
{:then Input}
-
+
{/await}
diff --git a/src/lib/components/RichTextInput/ClientInput.svelte b/src/lib/components/RichTextInput/ClientInput.svelte
index 54f6d02..55d25b4 100644
--- a/src/lib/components/RichTextInput/ClientInput.svelte
+++ b/src/lib/components/RichTextInput/ClientInput.svelte
@@ -2,6 +2,7 @@
import { Delta, Editor, asRoot, h } from 'typewriter-editor';
export let delta: Delta = new Delta();
+ export let plainText: string | undefined = undefined;
export let placeholder: string = '';
const editor = new Editor();
@@ -23,12 +24,13 @@
render: (attributes, children) => h('s', null, children)
});
- delta = editor.getDelta();
editor.on('change', () => {
delta = editor.getDelta();
+ if (typeof plainText === 'string') plainText = editor.getText();
});
- $: editor.setDelta(delta);
+ $: editor.setDelta(delta ?? new Delta());
+ $: if (typeof plainText === 'string' && plainText !== editor.getText()) editor.setText(plainText);
diff --git a/src/lib/keystore.ts b/src/lib/keystore.ts
index 821cc5d..9d81dfa 100644
--- a/src/lib/keystore.ts
+++ b/src/lib/keystore.ts
@@ -1,5 +1,10 @@
import { persisted } from 'svelte-persisted-store';
import type { EncodedBlahKeyPair } from './blah/crypto';
+import { derived } from 'svelte/store';
export const keyStore = persisted('weblah-keypairs', []);
export const currentKeyIndex = persisted('weblah-current-key-index', 0);
+export const currentKeyPair = derived(
+ [keyStore, currentKeyIndex],
+ ([keyStore, currentKeyIndex]) => keyStore[currentKeyIndex]
+);
diff --git a/src/routes/(app)/IdentityMenu.svelte b/src/routes/(app)/IdentityMenu.svelte
index b374016..2ba3146 100644
--- a/src/routes/(app)/IdentityMenu.svelte
+++ b/src/routes/(app)/IdentityMenu.svelte
@@ -1,13 +1,13 @@
-
+
-
+
diff --git a/src/routes/(app)/chats/[chatId]/ChatInput.svelte b/src/routes/(app)/chats/[chatId]/ChatInput.svelte
index fc24c1b..c34a735 100644
--- a/src/routes/(app)/chats/[chatId]/ChatInput.svelte
+++ b/src/routes/(app)/chats/[chatId]/ChatInput.svelte
@@ -1,12 +1,57 @@
-
+
+