add: working chat ui

This commit is contained in:
trisua 2025-08-27 20:22:12 -04:00
parent f53eb3d367
commit b360c5e737
14 changed files with 319 additions and 53 deletions

View file

@ -11,6 +11,7 @@ use axum::{
response::{Html, IntoResponse},
};
use axum_extra::extract::CookieJar;
use serde::Deserialize;
use tetratto_core::model::Error;
pub async fn list_request(
@ -106,33 +107,21 @@ pub async fn single_message_request(
}
};
let mut chat = match data.get_chat_by_id(message.chat).await {
Ok(x) => x,
Err(e) => {
return Err(render_error(e, tera, data.0.0.clone(), Some(user)).await);
}
};
if !chat.last_message_read_by.contains(&user.id) {
// update chat
chat.last_message_read_by.push(user.id);
if let Err(e) = data
.update_chat_last_message_read_by(user.id, chat.last_message_read_by)
.await
{
return Err(render_error(e, tera, data.0.0.clone(), Some(user)).await);
}
}
let mut ctx = default_context(&data.0.0, &build_code, &Some(user));
ctx.insert("message", &message);
Ok(Html(tera.render("message.lisp", &ctx).unwrap()))
}
#[derive(Deserialize)]
pub struct MessagesProps {
pub use_id: String,
}
pub async fn messages_request(
jar: CookieJar,
Extension(data): Extension<State>,
Path((id, before)): Path<(usize, usize)>,
Query(props): Query<MessagesProps>,
) -> impl IntoResponse {
let (ref data, ref tera, ref build_code) = *data.read().await;
let user = match get_user_from_token!(jar, data.2) {
@ -142,7 +131,11 @@ pub async fn messages_request(
}
};
let messages = match data.get_messages_by_chat_before(id, before, 12, 0).await {
let messages = match if before > 0 {
data.get_messages_by_chat_before(id, before, 12, 0).await
} else {
data.get_messages_by_chat(id, 12, 0).await
} {
Ok(x) => x,
Err(e) => {
return Err(render_error(e, tera, data.0.0.clone(), Some(user)).await);
@ -150,6 +143,42 @@ pub async fn messages_request(
};
let mut ctx = default_context(&data.0.0, &build_code, &Some(user));
ctx.insert(
"first_message_time",
&match messages.first() {
Some(x) => x.created,
None => 0,
},
);
ctx.insert("messages", &messages);
ctx.insert("id", &props.use_id);
Ok(Html(tera.render("messages.lisp", &ctx).unwrap()))
}
pub async fn read_receipt_request(
jar: CookieJar,
Extension(data): Extension<State>,
Path(id): Path<usize>,
) -> impl IntoResponse {
let (ref data, ref tera, ref build_code) = *data.read().await;
let user = match get_user_from_token!(jar, data.2) {
Some(x) => x,
None => {
return Err(render_error(Error::NotAllowed, tera, data.0.0.clone(), None).await);
}
};
let chat = match data.get_chat_by_id(id).await {
Ok(x) => x,
Err(e) => {
return Err(render_error(e, tera, data.0.0.clone(), Some(user)).await);
}
};
let mut ctx = default_context(&data.0.0, &build_code, &Some(user));
ctx.insert("chat", &chat);
Ok(Html(tera.render("read_receipt.lisp", &ctx).unwrap()))
}