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 @@ -
+
- - -
+