change layouts

This commit is contained in:
Bartal Læarsson
2026-06-18 22:46:33 +01:00
parent 9d9b04d01b
commit fb9b719d52
5 changed files with 322 additions and 129 deletions
+42 -6
View File
@@ -14,11 +14,33 @@ use crate::{
const MAX_MESSAGE_CHARS: usize = 1_000;
const MAX_NAME_CHARS: usize = 40;
#[derive(Clone, Copy)]
enum MessageView {
User,
Supporter,
}
fn render_message(msg: &Message) -> String {
let (bubble_class, label) = match msg.sender {
MessageSender::User => ("msg-user", "You"),
MessageSender::Supporter => ("msg-supporter", "Support"),
MessageSender::System => ("msg-system", ""),
render_message_for(msg, MessageView::User)
}
fn render_supporter_message(msg: &Message) -> String {
render_message_for(msg, MessageView::Supporter)
}
fn render_message_for(msg: &Message, view: MessageView) -> String {
let bubble_class = match msg.sender {
MessageSender::User => "msg-user",
MessageSender::Supporter => "msg-supporter",
MessageSender::System => "msg-system",
};
let label = match (view, &msg.sender) {
(_, MessageSender::System) => "",
(MessageView::User, MessageSender::User) => "You",
(MessageView::User, MessageSender::Supporter) => "Support",
(MessageView::Supporter, MessageSender::User) => "User",
(MessageView::Supporter, MessageSender::Supporter) => "You",
};
if msg.sender == MessageSender::System {
@@ -83,6 +105,20 @@ pub async fn get_messages(
Html(html)
}
/// GET /supporter/messages/:session_id
pub async fn get_supporter_messages(
Path(session_id): Path<String>,
State(state): State<Arc<AppState>>,
) -> Html<String> {
let Some(session) = state.sessions.get(&session_id) else {
return Html(render_system_notice(
"Session not found. Chat history may have been cleared.",
));
};
let html: String = session.messages.iter().map(render_supporter_message).collect();
Html(html)
}
/// POST /send/:session_id — user sends a message
pub async fn send_message(
ConnectInfo(addr): ConnectInfo<SocketAddr>,
@@ -162,7 +198,7 @@ pub async fn supporter_send_message(
content,
timestamp: Utc::now(),
};
let rendered = render_message(&msg);
let rendered = render_supporter_message(&msg);
session.messages.push(msg);
session.status = SessionStatus::Active;
@@ -212,7 +248,7 @@ pub async fn get_sessions(State(state): State<Arc<AppState>>) -> Html<String> {
let escaped_name = html_escape(name);
html.push_str(&format!(
"<button class=\"session-item\" \
hx-get=\"/messages/{id}\" \
hx-get=\"/supporter/messages/{id}\" \
hx-target=\"#supporter-messages\" \
hx-swap=\"innerHTML\" \
data-session-id=\"{id}\" \
+1
View File
@@ -40,6 +40,7 @@ async fn main() {
.route("/ws/user/:session_id", get(handlers::ws::user_ws))
.route("/ws/supporter/:supporter_id", get(handlers::ws::supporter_ws))
.route("/messages/:session_id", get(handlers::chat::get_messages))
.route("/supporter/messages/:session_id", get(handlers::chat::get_supporter_messages))
.route("/send/:session_id", post(handlers::chat::send_message))
.route(
"/supporter/send/:session_id",