diff options
| author | Kit La Touche <kit@transneptune.net> | 2024-10-03 23:30:10 -0400 |
|---|---|---|
| committer | Kit La Touche <kit@transneptune.net> | 2024-10-03 23:30:10 -0400 |
| commit | 30c13478d61065a512f5bc8824fecbf2ee6afc81 (patch) | |
| tree | 5b9f0fe65458f6d19f7f0b3fed9c8d3e4676a175 /hi-ui/src/lib | |
| parent | 01d995c731c296292cd3f1f9a4702eb96a0bf628 (diff) | |
Handle basics of interface scrolling
Diffstat (limited to 'hi-ui/src/lib')
| -rw-r--r-- | hi-ui/src/lib/ActiveChannel.svelte | 31 | ||||
| -rw-r--r-- | hi-ui/src/lib/CreateChannelForm.svelte | 3 | ||||
| -rw-r--r-- | hi-ui/src/lib/LogIn.svelte | 3 | ||||
| -rw-r--r-- | hi-ui/src/lib/LogOut.svelte | 3 | ||||
| -rw-r--r-- | hi-ui/src/lib/Message.svelte | 38 | ||||
| -rw-r--r-- | hi-ui/src/lib/MessageInput.svelte | 18 |
6 files changed, 67 insertions, 29 deletions
diff --git a/hi-ui/src/lib/ActiveChannel.svelte b/hi-ui/src/lib/ActiveChannel.svelte index 680a785..84f9119 100644 --- a/hi-ui/src/lib/ActiveChannel.svelte +++ b/hi-ui/src/lib/ActiveChannel.svelte @@ -1,28 +1,33 @@ <script> import { activeChannel, events } from '../store'; + import Message from './Message.svelte'; - let channel; - let allMessages = []; - $: messages = allMessages.filter( - (ev) => ev.type === 'message' && channel !== null && ev.channel.id === channel.id + let container; + $: messages = $events.filter( + (ev) => ( + ev.type === 'message' + && $activeChannel !== null + && ev.channel.id === $activeChannel.id + ) ); - activeChannel.subscribe((value) => { - channel = value; - }); + // TODO: eventually, store scroll height/last unread in channel? scroll there? - events.subscribe((value) => { - allMessages = value; - }); + let scroll = (message) => { + message.scrollIntoView(); + } </script> -<div> +<div class="container" bind:this={container}> {#each messages as message} - <div> - <pre><tt>{message.at} @{message.sender.name}: {message.message.body}</tt></pre> + <div use:scroll> + <Message {...message} /> </div> {/each} </div> <style> + .container { + overflow: scroll; + } </style> diff --git a/hi-ui/src/lib/CreateChannelForm.svelte b/hi-ui/src/lib/CreateChannelForm.svelte index 584fa61..70dc13d 100644 --- a/hi-ui/src/lib/CreateChannelForm.svelte +++ b/hi-ui/src/lib/CreateChannelForm.svelte @@ -7,7 +7,6 @@ let disabled = false; async function handleSubmit(event) { - event.preventDefault(); disabled = true; const response = await createChannel(name); if (200 <= response.status && response.status < 300) { @@ -18,7 +17,7 @@ } </script> -<form on:submit={handleSubmit}> +<form on:submit|preventDefault={handleSubmit}> <input type="text" placeholder="channel name" bind:value={name} disabled={disabled} /> <button type="submit">create</button> </form> diff --git a/hi-ui/src/lib/LogIn.svelte b/hi-ui/src/lib/LogIn.svelte index df734ee..1ec6772 100644 --- a/hi-ui/src/lib/LogIn.svelte +++ b/hi-ui/src/lib/LogIn.svelte @@ -7,7 +7,6 @@ let password = ''; async function handleLogin(event) { - event.preventDefault(); disabled = true; const response = await logIn(username, password); if (200 <= response.status && response.status < 300) { @@ -19,7 +18,7 @@ } </script> -<form class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4" on:submit={handleLogin}> +<form class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4" on:submit|preventDefault={handleLogin}> <div class="mb-4"> <label class="block text-gray-700 text-sm font-bold mb-2" for="username"> username diff --git a/hi-ui/src/lib/LogOut.svelte b/hi-ui/src/lib/LogOut.svelte index 64d26c9..738be24 100644 --- a/hi-ui/src/lib/LogOut.svelte +++ b/hi-ui/src/lib/LogOut.svelte @@ -9,7 +9,6 @@ }); async function handleLogout(event) { - event.preventDefault(); const response = await logOut(); if (200 <= response.status && response.status < 300) { currentUser.update(() => null); @@ -17,7 +16,7 @@ } </script> -<form on:submit={handleLogout}> +<form on:submit|preventDefault={handleLogout}> @{user.username} <button class="border-slate-500 border-solid border-2 font-bold p-1 rounded" diff --git a/hi-ui/src/lib/Message.svelte b/hi-ui/src/lib/Message.svelte new file mode 100644 index 0000000..d3ecbd8 --- /dev/null +++ b/hi-ui/src/lib/Message.svelte @@ -0,0 +1,38 @@ +<script> + import { currentUser } from '../store'; + import { deleteMessage } from '../apiServer'; + + export let at; + export let sender; + export let message; + + let timestamp = new Date(at).toTimeString(); + + function handleDeleteMessage() { + deleteMessage(message.id); + } +</script> + +<div class="hover:bg-zinc-300 flex flex-row"> + <div class="sender basis-20 text-right mr-1"> + @{sender.name}: + </div> + <div class="body grow"> + {message.body} + </div> + <div class="timestamp basis-6"> + <!-- TODO: this is too long and looks awful. --> + <!-- {timestamp} --> + </div> + {#if sender.id === $currentUser?.id} + <div class="controls basis-1 hidden relative -top-3 rounded-md border-2 border-slate-600 px-1 bg-slate-300"> + <button on:click|preventDefault={handleDeleteMessage}>🗑</button> + </div> + {/if} +</div> + +<style> + div:hover .controls { + display: block; + } +</style> diff --git a/hi-ui/src/lib/MessageInput.svelte b/hi-ui/src/lib/MessageInput.svelte index 96e9577..938e467 100644 --- a/hi-ui/src/lib/MessageInput.svelte +++ b/hi-ui/src/lib/MessageInput.svelte @@ -1,27 +1,25 @@ <script> + import { tick } from 'svelte'; import { postToChannel } from '../apiServer'; import { activeChannel } from '../store'; + let self; let input; - let disabled = false; - let activeChannelId; - - activeChannel.subscribe((value) => { - activeChannelId = value ? value.id : null; - }); + $: disabled = $activeChannel == null; async function handleSubmit(event) { - event.preventDefault(); disabled = true; // TODO try/catch: - await postToChannel(activeChannelId, input); + await postToChannel($activeChannel?.id, input); input = ''; disabled = false; + await tick(); + self.focus(); } </script> -<form on:submit={handleSubmit}> - <input type="text" class="border rounded px-3" bind:value={input} disabled={disabled}> +<form on:submit|preventDefault={handleSubmit}> + <input type="text" class="border rounded px-3" bind:this={self} bind:value={input} disabled={disabled}> <button type="submit">➤</button> </form> |
