use std::any::Any;
use crate::error_template::{AppError, ErrorTemplate};
use leptos::{either::Either, ev::SubmitEvent, html, prelude::*};
use leptos_meta::*;
use leptos_router::{components::*, StaticSegment};
use message::Message;
use serde::{Deserialize, Serialize};
pub mod error_template;
#[cfg(feature = "ssr")]
pub mod state;
mod message;
pub fn shell(options: LeptosOptions) -> impl IntoView {
view! {
}
}
#[component]
pub fn App() -> impl IntoView {
// Provides context that manages stylesheets, titles, meta tags, etc.
provide_meta_context();
view! {
// sets the document title
// content for this welcome page
}.into_view()
}>
}
}
fn smooth_scroll_to_bottom() {
if let Some(window) = web_sys::window() {
if let Some(document) = window.document() {
if let Some(body) = document.get_element_by_id("messages") {
body.set_scroll_top(body.scroll_height());
leptos::logging::log!("moving to top");
}
}
}
}
#[component]
pub fn HomePage() -> impl IntoView {
let conversation_id = uuid::Uuid::new_v4();
let send_message = ServerAction::::new();
let messages = Resource::new(
move || (send_message.version().get()),
move |_| {
get_messages(GetMessagesRequest {
conversation_id: conversation_id.clone(),
})
},
);
let existing_messages = move || {
Suspend::new(async move {
messages.await.map(|messages| {
if messages.messages.is_empty() {
Either::Left(view! { "No messages sent yet"
})
} else {
Either::Right(
messages
.messages
.iter()
.map(move |message| {
view! {
}
})
.collect::>(),
)
}
})
})
};
// let (_, set_messages) = signal(
// message::get_messages()
// .into_iter()
// .enumerate()
// .map(|(index, value)| (index, ArcRwSignal::new(value)))
// .collect::>(),
// );
let (input, set_input) = signal("".to_string());
let on_submit = move |ev: SubmitEvent| {
// stop the page from reloading!
ev.prevent_default();
leptos::logging::log!("sending request");
send_message.dispatch(SendMessage {
request: SendMessageRequest {
conversation_id: Some(conversation_id.clone()),
role: "user".into(),
content: input.get(),
},
});
set_input.set("".into());
// let messages_len = messages.get().len();
// let mut messages = set_messages.write();
// messages.push((
// messages_len,
// ArcRwSignal::new(Message {
// role: "user".into(),
// content: input.get().into(),
// }),
// ));
// request_animation_frame(move || {
// smooth_scroll_to_bottom();
// });
};
view! {
}
}>
}
}>{existing_messages}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct GetMessagesRequest {
conversation_id: uuid::Uuid,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct Messages {
pub messages: Vec,
}
#[server]
pub async fn get_messages(req: GetMessagesRequest) -> Result {
let messages: Vec = reqwest::get(format!(
"https://lebusiness-service.prod.kjuulh.app/api/messages?conversation_id={}",
req.conversation_id,
))
.await
.map_err(|e| ServerFnError::new(e.to_string()))?
.json()
.await
.map_err(|e| ServerFnError::new(e.to_string()))?;
Ok(Messages { messages })
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct SendMessageRequest {
conversation_id: Option,
role: String,
content: String,
}
#[server]
pub async fn send_message(request: SendMessageRequest) -> Result<(), ServerFnError> {
let client = reqwest::Client::new();
client
.post("https://lebusiness-service.prod.kjuulh.app/api/messages")
.json(&request)
.send()
.await
.map_err(|e| ServerFnError::new(e.to_string()))?;
Ok(())
}