1 Commits

Author SHA1 Message Date
3f1e5d3f8c chore(deps): update rust crate axum to 0.8
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-01-13 05:43:45 +00:00
7 changed files with 355 additions and 610 deletions

712
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,14 +9,14 @@ lto = true
opt-level = 'z'
[workspace.dependencies]
leptos = { version = "0.8.0", features = ["nightly"] }
leptos_meta = { version = "0.8.0" }
leptos_router = { version = "0.8.0", features = ["nightly"] }
leptos_axum = { version = "0.8.0" }
server_fn = { version = "0.8.0", features = [] }
leptos = { version = "0.7.2", features = ["nightly"] }
leptos_meta = { version = "0.7.2" }
leptos_router = { version = "0.7.2", features = ["nightly"] }
leptos_axum = { version = "0.7.2" }
server_fn = { version = "0.7.2", features = [] }
serde = { version = "1", features = ["derive"] }
axum = "0.7.9"
axum = "0.8"
cfg-if = "1"
console_error_panic_hook = "0.1.7"
console_log = "1"
@@ -28,7 +28,6 @@ tokio = { version = "1.37.0", features = ["full"] }
tower = { version = "0.5.0", features = ["full"] }
tower-http = { version = "0.6", features = ["full"] }
wasm-bindgen = "=0.2.100"
uuid = { version = "1.1.2", features = ["serde", "v4"] }
# See https://github.com/akesson/cargo-leptos for documentation of all the parameters.

View File

@@ -18,7 +18,6 @@ serde.workspace = true
http.workspace = true
cfg-if.workspace = true
thiserror.workspace = true
uuid.workspace = true
reqwest = { version = "0.12.11", optional = true, features = ["json"] }
serde_json = { version = "1.0.134", optional = true }
web-sys = { version = "0.3.76", features = [
@@ -36,7 +35,6 @@ ssr = [
"dep:leptos_axum",
"dep:serde_json",
"dep:axum",
"reqwest",
]
reqwest = ["dep:reqwest"]
axum = ["dep:axum"]

View File

@@ -25,7 +25,7 @@ impl AppError {
#[component]
pub fn ErrorTemplate(
#[prop(optional)] outside_errors: Option<Errors>,
#[prop(optional, into)] errors: Option<RwSignal<Errors>>,
#[prop(optional)] errors: Option<RwSignal<Errors>>,
) -> impl IntoView {
let errors = match outside_errors {
Some(e) => RwSignal::new(e),
@@ -49,9 +49,7 @@ pub fn ErrorTemplate(
cfg_if! { if #[cfg(feature="ssr")] {
let response = use_context::<ResponseOptions>();
if let Some(response) = response {
if let Some(resp) = errors.first() {
response.set_status(resp.status_code());
}
response.set_status(errors[0].status_code());
}
}}

View File

@@ -1,12 +1,9 @@
use std::any::Any;
use crate::error_template::{AppError, ErrorTemplate};
use leptos::{either::Either, ev::SubmitEvent, html, prelude::*};
use leptos::{ev::SubmitEvent, html, prelude::*};
use leptos_meta::*;
use leptos_router::{components::*, StaticSegment};
use message::Message;
use serde::{Deserialize, Serialize};
pub mod error_template;
@@ -73,94 +70,34 @@ fn smooth_scroll_to_bottom() {
#[component]
pub fn HomePage() -> impl IntoView {
let conversation_id = uuid::Uuid::new_v4();
let send_message = ServerAction::<SendMessage>::new();
let messages = Resource::new(
move || (send_message.version().get()),
move |_| {
get_messages(GetMessagesRequest {
conversation_id: conversation_id.clone(),
})
},
let (messages, set_messages) = signal(
message::get_messages()
.into_iter()
.enumerate()
.map(|(index, value)| (index, ArcRwSignal::new(value)))
.collect::<Vec<_>>(),
);
let existing_messages = move || {
Suspend::new(async move {
messages.await.map(|messages| {
if messages.messages.is_empty() {
Either::Left(view! { <p>"No messages sent yet"</p> })
} else {
Either::Right(
messages
.messages
.iter()
.map(move |message| {
view! {
<div class=format!(
"flex {}",
if message.role == "assistant" {
"justify-start"
} else {
"justify-end"
},
)>
<div class=format!(
"max-w-[80%] rounded-sm px-4 py-3 {}",
if message.role == "assistant" {
"bg-white border border-gray-200"
} else {
"bg-blue-500 text-white"
},
)>{message.content.clone()}</div>
</div>
}
})
.collect::<Vec<_>>(),
)
}
})
})
};
// let (_, set_messages) = signal(
// message::get_messages()
// .into_iter()
// .enumerate()
// .map(|(index, value)| (index, ArcRwSignal::new(value)))
// .collect::<Vec<_>>(),
// );
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()),
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(),
},
});
content: input.get().into(),
}),
));
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();
// });
request_animation_frame(move || {
smooth_scroll_to_bottom();
});
};
view! {
@@ -176,21 +113,38 @@ pub fn HomePage() -> impl IntoView {
<div class="overflow-y-auto flex-1 px-4" id="messages">
<div class="py-6 mx-auto space-y-6 max-w-5xl">
<For
each=move || messages.get()
key=|message| message.0
children=move |(_id, message)| {
let message = message.read();
<Transition fallback=move || {
view! {
<div class="flex justify-start">
<div class="py-3 px-4 bg-white rounded-sm border border-gray-200 max-w-[80%]">
"Loading..."
view! {
<div class=format!(
"flex {}",
if message.role == "assistant" {
"justify-start"
} else {
"justify-end"
},
)>
<div class=format!(
"max-w-[80%] rounded-sm px-4 py-3 {}",
if message.role == "assistant" {
"bg-white border border-gray-200"
} else {
"bg-blue-500 text-white"
},
)>{message.content.clone()}</div>
</div>
</div>
}
}
}>
<ErrorBoundary fallback=|errors| {
view! { <ErrorTemplate errors /> }
}>{existing_messages}</ErrorBoundary>
</Transition>
/>
<div class="flex justify-start">
<div class="py-3 px-4 bg-white rounded-sm border border-gray-200 max-w-[80%]">
"Loading..."
</div>
</div>
<div />
</div>
</div>
@@ -217,48 +171,3 @@ pub fn HomePage() -> impl IntoView {
</div>
}
}
#[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<Message>,
}
#[server]
pub async fn get_messages(req: GetMessagesRequest) -> Result<Messages, ServerFnError> {
let messages: Vec<Message> = 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<uuid::Uuid>,
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(())
}

View File

@@ -1,6 +1,3 @@
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct Message {
pub role: String,
pub content: String,

View File

@@ -13,12 +13,12 @@
}
},
"node_modules/@playwright/test": {
"version": "1.50.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.50.1.tgz",
"integrity": "sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==",
"version": "1.49.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz",
"integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==",
"dev": true,
"dependencies": {
"playwright": "1.50.1"
"playwright": "1.49.1"
},
"bin": {
"playwright": "cli.js"
@@ -42,12 +42,12 @@
}
},
"node_modules/playwright": {
"version": "1.50.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz",
"integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==",
"version": "1.49.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz",
"integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==",
"dev": true,
"dependencies": {
"playwright-core": "1.50.1"
"playwright-core": "1.49.1"
},
"bin": {
"playwright": "cli.js"
@@ -60,9 +60,9 @@
}
},
"node_modules/playwright-core": {
"version": "1.50.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz",
"integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==",
"version": "1.49.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz",
"integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==",
"dev": true,
"bin": {
"playwright-core": "cli.js"
@@ -74,12 +74,12 @@
},
"dependencies": {
"@playwright/test": {
"version": "1.50.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.50.1.tgz",
"integrity": "sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==",
"version": "1.49.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz",
"integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==",
"dev": true,
"requires": {
"playwright": "1.50.1"
"playwright": "1.49.1"
}
},
"fsevents": {
@@ -90,19 +90,19 @@
"optional": true
},
"playwright": {
"version": "1.50.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz",
"integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==",
"version": "1.49.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz",
"integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==",
"dev": true,
"requires": {
"fsevents": "2.3.2",
"playwright-core": "1.50.1"
"playwright-core": "1.49.1"
}
},
"playwright-core": {
"version": "1.50.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz",
"integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==",
"version": "1.49.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz",
"integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==",
"dev": true
}
}