From 33e63fda1797a5ebde32aa0117fe51cfc85cc2f9 Mon Sep 17 00:00:00 2001 From: Vinod J M Date: Fri, 2 Dec 2022 21:52:44 +0530 Subject: [PATCH] v0.14-popupV1 --- backend/api/src/lib.rs | 38 ++++------ frontend/src/main.rs | 161 +++++++++++++++++++++++++---------------- 2 files changed, 113 insertions(+), 86 deletions(-) diff --git a/backend/api/src/lib.rs b/backend/api/src/lib.rs index 251b2ab..6b97f1d 100644 --- a/backend/api/src/lib.rs +++ b/backend/api/src/lib.rs @@ -154,25 +154,6 @@ impl Books { } } - async fn set_all_descriptions(&mut self) { - for book in self.docs.iter_mut() { - let query = format!("https://openlibrary.org/{}.json", book.key); - let res = reqwest::get(query).await.expect("Unable to request"); - let resjson = res.json::().await.expect("Unable to return value"); - let description = resjson.description; - - if !description.is_none() { - if let DescriptionOL::DescriptionString(desc_string) = description.clone().unwrap() { - book.description = Some(desc_string); - } - if let DescriptionOL::DescriptionValueString(desc_val) = description.clone().unwrap() { - book.description = Some(desc_val.value); - } - } - - } - } - } impl BookUI { @@ -503,7 +484,7 @@ async fn search_openlibrary( let mut resjson = res.json::().await.expect("Unable to return value"); resjson.docs.truncate(12); resjson.set_all_cover_urls(); - resjson.set_all_descriptions().await; + //resjson.set_all_descriptions().await; print!("Search token {:?}\n", search); let mut vec = Vec::with_capacity(12); for i in 0..12 as usize { @@ -571,7 +552,7 @@ let mut resbooks: Vec = Vec::with_capacity(5); for bookandmeta in books.0.into_iter() { let mut cover = bookandmeta.clone().book.cover; if !cover.is_none() { - cover = Some(format!("{}/images/{}",backend_url,cover.unwrap())); + cover = Some(format!("{}/images/{}",backend_url, cover.unwrap())); } else { cover = Some(format!("{}/images/placeholder.jpg",backend_url)); } @@ -667,24 +648,31 @@ return Json(res); async fn create_book( Extension(ref conn): Extension, Extension(ref meili_client): Extension, - Json(doc_sent): Json, + Json(doc_sent_orig): Json, ) -> impl IntoResponse { println!("Creating book"); dotenvy::dotenv().ok(); let images_dir = env::var("IMAGES_DIR").expect("IMAGES_DIR is not set in .env file"); - + let mut doc_sent = doc_sent_orig.clone(); let mut cover = doc_sent.cover.clone(); + if doc_sent_orig.description.is_none() { + doc_sent.set_descriptions().await; + } else { + if doc_sent_orig.description.unwrap() == "".to_string() { + doc_sent.set_descriptions().await; + } + } + if !doc_sent.cover.is_none() { let img_bytes = reqwest::get(cover.unwrap()).await.unwrap().bytes().await.unwrap(); - //.expect("Could not fetch image"); - //let img_bytes = img_resp.unwrap().bytes(); let image = image::load_from_memory(&img_bytes).unwrap(); let temp_cover = doc_sent.cover.clone().unwrap(); let img_id = temp_cover.split("/").last().unwrap(); image.save(format!("{}/{}",images_dir,img_id)).expect("Failed to save image"); cover = Some(img_id.to_string()); } + let book: book::Model = book::Model{ open_library_key: doc_sent.open_library_key.to_owned(), title: (doc_sent.title.to_owned()), diff --git a/frontend/src/main.rs b/frontend/src/main.rs index d89ec80..6c3c350 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -1,7 +1,5 @@ use log::info; //use log::Level; -use std::env; - use reqwasm::http::Request; use serde::{Deserialize, Serialize}; use serde_json; @@ -72,7 +70,8 @@ enum AppRoutes { async fn fetch_books(search: String) -> Result, reqwasm::Error> { dotenvy::dotenv().ok(); - let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); + let backend_url = "http://localhost:8081"; + //env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let url = format!("{}/api/search_openlibrary?search={}", backend_url, search); let resp = Request::get(&url).send().await?; println!("Fetching books\n"); @@ -82,7 +81,8 @@ async fn fetch_books(search: String) -> Result, reqwasm::Error> { async fn search_books(search: String, page: u32) -> Result { dotenvy::dotenv().ok(); - let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); + let backend_url = "http://localhost:8081"; + //env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let url = format!("{}/api/list_search?search={}&page={}",backend_url, search, page); let resp = Request::get(&url).send().await?; println!("Fetching books\n"); @@ -92,7 +92,8 @@ async fn search_books(search: String, page: u32) -> Result Result { dotenvy::dotenv().ok(); - let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); + let backend_url = "http://localhost:8081"; + //env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let url = format!("{}/api/create", backend_url); let resp = Request::post(&url).body(serde_wasm_bindgen::to_value(&serde_json::to_string(&record).unwrap()).unwrap()).header("content-type","application/json").send().await?; Ok(resp) @@ -100,7 +101,8 @@ async fn add_book(record: BookUI) -> Result Result { dotenvy::dotenv().ok(); - let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); + let backend_url = "http://localhost:8081"; + //env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let url = format!("{}/api/create_by_isbn?isbns={}", backend_url, isbns); let resp = Request::get(&url).send().await?; println!("Adding multiple books\n"); @@ -110,7 +112,8 @@ async fn add_books_isbns(isbns: String) -> Result Result { dotenvy::dotenv().ok(); - let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); + let backend_url = "http://localhost:8081"; + //env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let url = format!("{}/api/update", backend_url); let resp = Request::post(&url).body(serde_wasm_bindgen::to_value(&serde_json::to_string(&record).unwrap()).unwrap()).header("content-type","application/json").send().await?; Ok(resp) @@ -118,7 +121,8 @@ async fn update_book(record: BookUI) -> Result Result { dotenvy::dotenv().ok(); - let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); + let backend_url = "http://localhost:8081"; + //env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let url = format!("{}/api/delete/{}", backend_url, id); let resp = Request::get(&url).send().await?; Ok(resp) @@ -126,7 +130,8 @@ async fn delete_book(id: i32) -> Result async fn list_books(page: u32) -> Result { dotenvy::dotenv().ok(); - let backend_url = env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); + let backend_url = "http://localhost:8081"; + //env::var("BACKEND_URL").expect("BACKEND_URL is not set in .env file"); let url = format!("{}/api/list?page={}", backend_url, page); let resp = Request::get(&url).send().await?; println!("Fetching books\n"); @@ -155,11 +160,11 @@ pub fn Header(cx: Scope) -> View { task = task.trim().to_string(); if !task.is_empty() { - app_state.search.set(task); + app_state.search.set(task.clone()); app_state.openlibrary.set(true); app_state.internalsearch.set(false); - info!("Fetching search\n"); + info!("Fetching search {}\n", task.clone()); value.set("".to_string()); input_ref .get::() @@ -182,7 +187,7 @@ pub fn Header(cx: Scope) -> View { app_state.openlibrary.set(false); app_state.internalsearch.set(true); - info!("Fetching search\n"); + info!("Fetching search 2\n"); } } }; @@ -255,7 +260,6 @@ pub fn Header(cx: Scope) -> View { view! { cx, header(class="header") { div(class="header-column"){ - h1 { "Search OpenLibrary" } input(ref=input_ref, class="new-todo", placeholder="Search openlibrary", @@ -264,10 +268,9 @@ pub fn Header(cx: Scope) -> View { ) button(on:click=click_searchOL) { "Search OpenLibrary" } } - button(on:click=click_listall) { "List All DB" } div(class="header-column"){ - + button(on:click=click_listall) { "List All DB" } input(ref=input_ref2, class="new-todo", placeholder="Search internal DB", @@ -294,10 +297,18 @@ pub fn Header(cx: Scope) -> View { #[component] async fn ListDB(cx: Scope<'_>) -> View { let app_state = use_context::(cx); + create_effect(cx, || { let app_state = app_state.clone(); app_state.search.track(); app_state.pagenum.track(); + app_state.openlibrary.track(); + app_state.internalsearch.track(); + + info!( + "The state changed. New value: {}", + app_state.search.get(), + ); if *app_state.openlibrary.get() == false { if *app_state.internalsearch.get() == false { @@ -316,10 +327,19 @@ async fn ListDB(cx: Scope<'_>) -> View { .unwrap().books) }) } + } else { + spawn_local(async move { + if *app_state.search.get() != "" { + if *app_state.openlibrary.get() == true { + app_state.books.set( + fetch_books(app_state.search.get().to_string() ) + .await + .unwrap(), + ) + } + } + }); } - - - }); let docs = create_memo(cx, || app_state.books.get().iter().cloned().collect::>()); @@ -355,7 +375,7 @@ pub fn BookDB(cx: Scope, bookitem: BookUIProp) -> View { let locdesc = bookitem.bookitem.clone().description.unwrap_or("".to_string()); - let coverurl = bookdisplay.clone().cover.clone().unwrap(); + let coverurl = bookdisplay.clone().cover.clone().unwrap_or("None".to_string()); let handle_delete = move |_| { spawn_local(async move { let temp = delete_book(bookdelete.id).await.unwrap(); @@ -399,25 +419,14 @@ pub fn BookDB(cx: Scope, bookitem: BookUIProp) -> View { #[component] async fn ListOL(cx: Scope<'_>) -> View { let app_state = use_context::(cx); - create_effect(cx, || { - //info!( - // "The state changed. New value: {} {}", - // app_state.search.get(), - //); - let app_state = app_state.clone(); - app_state.search.track(); - spawn_local(async move { - if *app_state.search.get() != "" { - if *app_state.openlibrary.get() == true { - app_state.books.set( - fetch_books(app_state.search.get().to_string() ) - .await - .unwrap(), - ) - } - } - }); + create_effect(cx, || { + app_state.search.track(); + + info!( + "The state changed B. New value: {}", + app_state.search.get(), + ); }); let docs = create_memo(cx, || app_state.books.get().iter().cloned().collect::>()); @@ -448,9 +457,9 @@ pub fn BookOL(cx: Scope, bookitem: BookUIProp) -> View { let book = bookitem.bookitem.clone(); let bookdisp=book.clone(); let loctitle = bookitem.bookitem.clone().title.clone(); - let locauthors = bookitem.bookitem.clone().author_name.clone().unwrap().join(", "); + let locauthors = bookitem.bookitem.clone().author_name.clone().unwrap_or(vec!["".to_string()]).join(", "); let locdesc = bookitem.bookitem.clone().description.unwrap_or("".to_string()); - let coverurl = bookdisp.cover.clone().unwrap(); + let coverurl = bookdisp.cover.clone().unwrap_or("NONE".to_string()); let app_state = use_context::(cx); let handle_add = move |_| { app_state.adding.set(true); @@ -478,7 +487,7 @@ pub fn BookOL(cx: Scope, bookitem: BookUIProp) -> View { async fn AddingUI(cx: Scope<'_>) -> View { let app_state = use_context::(cx); - let node_ref = create_node_ref(cx); + let node_ref = create_node_ref(cx); let inp_title = create_signal(cx, (*app_state.addingbook.get()).clone().title); @@ -524,8 +533,11 @@ inp_author.set((*app_state.addingbook.get()).clone().author_name.unwrap_or(vec![ app_state.updating.set(false); app_state.adding.set(false); - let dom_node = node_ref.get::(); - dom_node.set_attribute("display","none"); + let jsval = wasm_bindgen::JsValue::from_str("none"); + let dom_node = node_ref.try_get::(); + if dom_node.is_some() { + dom_node.unwrap().set_property("display", &jsval.clone()); + } }; @@ -579,21 +591,30 @@ info!("Adding book"); }; - create_effect(cx, || { + create_effect(cx, || { if *app_state.updating.get() == true || *app_state.adding.get() == true { - let dom_node = node_ref.get::(); - dom_node.remove_attribute("display"); + + let jsval = wasm_bindgen::JsValue::from_str("flex"); + + let dom_node = node_ref.try_get::(); + if dom_node.is_some() { + dom_node.unwrap().set_property("display",&jsval); + } } else { - let dom_node = node_ref.get::(); - dom_node.set_attribute("display","none"); + let jsval = wasm_bindgen::JsValue::from_str("none"); + + let dom_node = node_ref.try_get::(); + if dom_node.is_some() { + dom_node.unwrap().set_property("display",&jsval); + } } }); view! {cx, + div(class="modal-box",ref=node_ref){ (if *app_state.adding.get() == true || *app_state.updating.get() == true { view!{ cx, - div(class="modal-box",ref=node_ref){ div(class="modal-content"){ p { @@ -620,12 +641,13 @@ info!("Adding book"); } } - } } } else { view!{cx,""} }) + } + } } @@ -635,31 +657,47 @@ info!("Adding book"); async fn SelectedUI(cx: Scope<'_>) -> View { let app_state = use_context::(cx); let displ_book = create_signal(cx, (*app_state.displayingbook.get()).clone()); - let coverurl = create_signal(cx, app_state.displayingbook.get().clone().cover.clone().unwrap().to_string().clone()); + let coverurl = create_signal(cx, app_state.displayingbook.get().clone().cover.clone().unwrap_or("NONE".to_string()).to_string().clone()); let node_ref = create_node_ref(cx); + //on_mount(cx, || { + // let dom_node = node_ref.get::(); + //}); let handle_close = move |_| { app_state.displaying.set(false); - let dom_node = node_ref.get::(); - dom_node.set_attribute("display","none"); + let jsval = wasm_bindgen::JsValue::from_str("none"); + + let dom_node = node_ref.try_get::(); + if dom_node.is_some() { + dom_node.unwrap().set_property("display",&jsval); + } }; + create_effect(cx, || { if *app_state.displaying.get() == true { - let dom_node = node_ref.get::(); - dom_node.remove_attribute("display"); + let jsval = wasm_bindgen::JsValue::from_str("flex"); + let dom_node = node_ref.try_get::(); + if dom_node.is_some() { + dom_node.unwrap().set_property("display",&jsval); + } } else { - let dom_node = node_ref.get::(); - dom_node.set_attribute("display","none"); + let jsval = wasm_bindgen::JsValue::from_str("none"); + + let dom_node = node_ref.try_get::(); + if dom_node.is_some() { + dom_node.unwrap().set_property("display",&jsval); + } } }); + view! {cx, + div(class="modal-box", ref=node_ref){ (if *app_state.displaying.get() == true { view!{ cx, - div(class="modal-box", ref=node_ref){ div(class="modal-content"){ p{ div(class="select-book"){ @@ -667,14 +705,15 @@ async fn SelectedUI(cx: Scope<'_>) -> View { (format!("{:?}",displ_book.get())) button(class="close", on:click=handle_close){ "CLOSE" } } - } } } - } - } else { + }} + else { view!{cx,""} }) } + } + } @@ -691,7 +730,7 @@ async fn PageBar(cx: Scope<'_>) -> View { }; view! {cx, p { - (if *app_state.openlibrary.get() == true || *app_state.internalsearch.get() == true { + (if *app_state.openlibrary.get() == false || *app_state.internalsearch.get() == true { view!{ cx, button(class="page", on:click=handle_sub){ "Page -" }