refac/enh: channel message

This commit is contained in:
Timothy Jaeryang Baek 2025-11-28 10:45:48 -05:00
parent b9e849f17d
commit 25994dd3da
6 changed files with 32 additions and 7 deletions

View file

@ -90,6 +90,7 @@ class MessageModel(BaseModel):
class MessageForm(BaseModel): class MessageForm(BaseModel):
temp_id: Optional[str] = None
content: str content: str
reply_to_id: Optional[str] = None reply_to_id: Optional[str] = None
parent_id: Optional[str] = None parent_id: Optional[str] = None

View file

@ -765,7 +765,7 @@ async def new_message_handler(
"message_id": message.id, "message_id": message.id,
"data": { "data": {
"type": "message", "type": "message",
"data": message.model_dump(), "data": {"temp_id": form_data.temp_id, **message.model_dump()},
}, },
"user": UserNameResponse(**user.model_dump()).model_dump(), "user": UserNameResponse(**user.model_dump()).model_dump(),
"channel": channel.model_dump(), "channel": channel.model_dump(),

View file

@ -378,6 +378,7 @@ export const getChannelThreadMessages = async (
}; };
type MessageForm = { type MessageForm = {
temp_id?: string;
reply_to_id?: string; reply_to_id?: string;
parent_id?: string; parent_id?: string;
content: string; content: string;

View file

@ -4,6 +4,7 @@
import { onDestroy, onMount, tick } from 'svelte'; import { onDestroy, onMount, tick } from 'svelte';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { v4 as uuidv4 } from 'uuid';
import { import {
chatId, chatId,
@ -118,7 +119,8 @@
if (type === 'message') { if (type === 'message') {
if ((data?.parent_id ?? null) === null) { if ((data?.parent_id ?? null) === null) {
messages = [data, ...messages]; const tempId = data?.temp_id ?? null;
messages = [{ ...data, temp_id: null }, ...messages.filter((m) => m?.temp_id !== tempId)];
if (typingUsers.find((user) => user.id === event.user.id)) { if (typingUsers.find((user) => user.id === event.user.id)) {
typingUsers = typingUsers.filter((user) => user.id !== event.user.id); typingUsers = typingUsers.filter((user) => user.id !== event.user.id);
@ -183,11 +185,30 @@
return; return;
} }
const res = await sendMessage(localStorage.token, id, { const tempId = uuidv4();
const message = {
temp_id: tempId,
content: content, content: content,
data: data, data: data,
reply_to_id: replyToMessage?.id ?? null reply_to_id: replyToMessage?.id ?? null
}).catch((error) => { };
const ts = Date.now() * 1000000; // nanoseconds
messages = [
{
...message,
id: tempId,
user_id: $user?.id,
user: $user,
reply_to_message: replyToMessage ?? null,
created_at: ts,
updated_at: ts
},
...messages
];
const res = await sendMessage(localStorage.token, id, message).catch((error) => {
toast.error(`${error}`); toast.error(`${error}`);
return null; return null;
}); });

View file

@ -128,11 +128,12 @@
{message} {message}
{thread} {thread}
replyToMessage={replyToMessage?.id === message.id} replyToMessage={replyToMessage?.id === message.id}
disabled={!channel?.write_access} disabled={!channel?.write_access || message?.temp_id}
pending={!!message?.temp_id}
showUserProfile={messageIdx === 0 || showUserProfile={messageIdx === 0 ||
messageList.at(messageIdx - 1)?.user_id !== message.user_id || messageList.at(messageIdx - 1)?.user_id !== message.user_id ||
messageList.at(messageIdx - 1)?.meta?.model_id !== message?.meta?.model_id || messageList.at(messageIdx - 1)?.meta?.model_id !== message?.meta?.model_id ||
message?.reply_to_message} message?.reply_to_message !== null}
onDelete={() => { onDelete={() => {
messages = messages.filter((m) => m.id !== message.id); messages = messages.filter((m) => m.id !== message.id);

View file

@ -47,6 +47,7 @@
export let replyToMessage = false; export let replyToMessage = false;
export let disabled = false; export let disabled = false;
export let pending = false;
export let onDelete: Function = () => {}; export let onDelete: Function = () => {};
export let onEdit: Function = () => {}; export let onEdit: Function = () => {};
@ -380,7 +381,7 @@
</div> </div>
</div> </div>
{:else} {:else}
<div class=" min-w-full markdown-prose"> <div class=" min-w-full markdown-prose {pending ? 'opacity-50' : ''}">
{#if (message?.content ?? '').trim() === '' && message?.meta?.model_id} {#if (message?.content ?? '').trim() === '' && message?.meta?.model_id}
<Skeleton /> <Skeleton />
{:else} {:else}