diff options
| author | Kit La Touche <kit@transneptune.net> | 2024-11-11 23:01:31 -0500 |
|---|---|---|
| committer | Kit La Touche <kit@transneptune.net> | 2024-11-11 23:01:31 -0500 |
| commit | d5199183bc8114dc78adb19f66b09f1e61c67f1b (patch) | |
| tree | 997a94e320aa3ade7caafa23cd01c2d653dcd331 | |
| parent | dfca11aceffaafc105509a2800d70eb9c9bed2e7 (diff) | |
| parent | a0fc6434cb1f65b558a0a94c5cdddf5d79d15206 (diff) | |
Merge branch 'main' into prop/pwa
| -rw-r--r-- | ui/lib/apiServer.js | 4 | ||||
| -rw-r--r-- | ui/lib/components/Message.svelte | 32 | ||||
| -rw-r--r-- | ui/lib/components/MessageRun.svelte | 4 | ||||
| -rw-r--r-- | ui/routes/(login)/invite/[invite]/+page.svelte | 6 |
4 files changed, 36 insertions, 10 deletions
diff --git a/ui/lib/apiServer.js b/ui/lib/apiServer.js index 6ada0f7..fee1a81 100644 --- a/ui/lib/apiServer.js +++ b/ui/lib/apiServer.js @@ -34,6 +34,10 @@ export async function postToChannel(channelId, body) { return apiServer.post(`/channels/${channelId}`, { body }); } +export async function deleteMessage(messageId) { + return apiServer.delete(`/messages/${messageId}`, {}); +} + export async function createInvite() { return apiServer.post(`/invite`, {}); } diff --git a/ui/lib/components/Message.svelte b/ui/lib/components/Message.svelte index 68c5c91..0c8eeec 100644 --- a/ui/lib/components/Message.svelte +++ b/ui/lib/components/Message.svelte @@ -2,16 +2,38 @@ import { marked } from 'marked'; import DOMPurify from 'dompurify'; + import { deleteMessage } from '$lib/apiServer'; + function scroll(message) { message.scrollIntoView(); } - let { at, body } = $props(); + let { id, at, body, editable = false } = $props(); let renderedBody = $derived(DOMPurify.sanitize(marked.parse(body, { breaks: true }))); + let deleteArmed = $state(false); + + function onDelete(event) { + event.preventDefault(); + if (deleteArmed) { + deleteArmed = false; + deleteMessage(id); + } else { + deleteArmed = true; + } + } + + function onmouseleave() { + deleteArmed = false; + } </script> -<div class="message relative"> - <span class="timestamp chip variant-soft absolute top-0 right-0">{at}</span> +<div class="message relative" class:bg-warning-800={deleteArmed} {onmouseleave}> + <div class="handle chip bg-surface-700 absolute -top-6 right-0"> + {at} + {#if editable} + <button onclick={onDelete}>🗑️</button> + {/if} + </div> <section use:scroll class="py-1 message-body"> <!-- eslint-disable-next-line svelte/no-at-html-tags --> {@html renderedBody} @@ -19,10 +41,10 @@ </div> <style> - .message .timestamp { + .message .handle { display: none; } - .message:hover .timestamp { + .message:hover .handle { display: flex; } .message-body { diff --git a/ui/lib/components/MessageRun.svelte b/ui/lib/components/MessageRun.svelte index 2e8c613..83a82a9 100644 --- a/ui/lib/components/MessageRun.svelte +++ b/ui/lib/components/MessageRun.svelte @@ -16,7 +16,7 @@ <span class="chip variant-soft sticky top-o left-0"> @{name}: </span> - {#each messages as { at, body }} - <Message {at} {body} /> + {#each messages as { id, at, body }} + <Message {id} {at} {body} editable={ownMessage} /> {/each} </div> diff --git a/ui/routes/(login)/invite/[invite]/+page.svelte b/ui/routes/(login)/invite/[invite]/+page.svelte index 18bf437..4433bd6 100644 --- a/ui/routes/(login)/invite/[invite]/+page.svelte +++ b/ui/routes/(login)/invite/[invite]/+page.svelte @@ -11,10 +11,10 @@ let pending = false; let disabled = $derived(pending); - async function onSubmit(event) { + async function onSubmit(event, inviteId) { event.preventDefault(); pending = true; - const response = await acceptInvite(data.invite.id, username, password); + const response = await acceptInvite(inviteId, username, password); if (200 <= response.status && response.status < 300) { username = ''; password = ''; @@ -32,5 +32,5 @@ <div class="card m-4 p-4"> <p>Hi there! {invite.issuer} invites you to the conversation.</p> </div> - <LogIn {disabled} bind:username bind:password onsubmit={onSubmit} /> + <LogIn {disabled} bind:username bind:password onsubmit={(event) => onSubmit(event, invite.id)} /> {/await} |
