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):
temp_id: Optional[str] = None
content: str
reply_to_id: Optional[str] = None
parent_id: Optional[str] = None

View file

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

View file

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

View file

@ -4,6 +4,7 @@
import { onDestroy, onMount, tick } from 'svelte';
import { goto } from '$app/navigation';
import { v4 as uuidv4 } from 'uuid';
import {
chatId,
@ -118,7 +119,8 @@
if (type === 'message') {
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)) {
typingUsers = typingUsers.filter((user) => user.id !== event.user.id);
@ -183,11 +185,30 @@
return;
}
const res = await sendMessage(localStorage.token, id, {
const tempId = uuidv4();
const message = {
temp_id: tempId,
content: content,
data: data,
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}`);
return null;
});

View file

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

View file

@ -47,6 +47,7 @@
export let replyToMessage = false;
export let disabled = false;
export let pending = false;
export let onDelete: Function = () => {};
export let onEdit: Function = () => {};
@ -380,7 +381,7 @@
</div>
</div>
{: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}
<Skeleton />
{:else}