v0.14-popupV1

This commit is contained in:
2022-12-02 21:52:44 +05:30
parent ea81b3a52c
commit 33e63fda17
2 changed files with 113 additions and 86 deletions

View File

@@ -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::<BookPageOL>().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::<Books>().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<BookUI> = 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<DatabaseConnection>,
Extension(ref meili_client): Extension<Client>,
Json(doc_sent): Json<BookUI>,
Json(doc_sent_orig): Json<BookUI>,
) -> 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()),

View File

@@ -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<Vec<BookUI>, 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<Vec<BookUI>, reqwasm::Error> {
async fn search_books(search: String, page: u32) -> Result<PaginatedBookUIList, 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/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<PaginatedBookUIList,
async fn add_book(record: BookUI) -> Result<reqwasm::http::Response, 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/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<reqwasm::http::Response, reqwasm::Er
async fn add_books_isbns(isbns: String) -> Result<reqwasm::http::Response, 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/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<reqwasm::http::Response, reqw
async fn update_book(record: BookUI) -> Result<reqwasm::http::Response, 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/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<reqwasm::http::Response, reqwasm:
async fn delete_book(id: i32) -> Result<reqwasm::http::Response, 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/delete/{}", backend_url, id);
let resp = Request::get(&url).send().await?;
Ok(resp)
@@ -126,7 +130,8 @@ async fn delete_book(id: i32) -> Result<reqwasm::http::Response, reqwasm::Error>
async fn list_books(page: u32) -> Result<PaginatedBookUIList, 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/list?page={}", backend_url, page);
let resp = Request::get(&url).send().await?;
println!("Fetching books\n");
@@ -155,11 +160,11 @@ pub fn Header<G: Html>(cx: Scope) -> View<G> {
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::<DomNode>()
@@ -182,7 +187,7 @@ pub fn Header<G: Html>(cx: Scope) -> View<G> {
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<G: Html>(cx: Scope) -> View<G> {
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<G: Html>(cx: Scope) -> View<G> {
)
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<G: Html>(cx: Scope) -> View<G> {
#[component]
async fn ListDB<G: Html>(cx: Scope<'_>) -> View<G> {
let app_state = use_context::<AppState>(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<G: Html>(cx: Scope<'_>) -> View<G> {
.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::<Vec<_>>());
@@ -355,7 +375,7 @@ pub fn BookDB<G: Html>(cx: Scope, bookitem: BookUIProp) -> View<G> {
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<G: Html>(cx: Scope, bookitem: BookUIProp) -> View<G> {
#[component]
async fn ListOL<G: Html>(cx: Scope<'_>) -> View<G> {
let app_state = use_context::<AppState>(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(),
)
}
}
});
info!(
"The state changed B. New value: {}",
app_state.search.get(),
);
});
let docs = create_memo(cx, || app_state.books.get().iter().cloned().collect::<Vec<_>>());
@@ -448,9 +457,9 @@ pub fn BookOL<G: Html>(cx: Scope, bookitem: BookUIProp) -> View<G> {
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::<AppState>(cx);
let handle_add = move |_| {
app_state.adding.set(true);
@@ -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::<DomNode>();
dom_node.set_attribute("display","none");
let jsval = wasm_bindgen::JsValue::from_str("none");
let dom_node = node_ref.try_get::<DomNode>();
if dom_node.is_some() {
dom_node.unwrap().set_property("display", &jsval.clone());
}
};
@@ -581,19 +593,28 @@ info!("Adding book");
create_effect(cx, || {
if *app_state.updating.get() == true || *app_state.adding.get() == true {
let dom_node = node_ref.get::<DomNode>();
dom_node.remove_attribute("display");
let jsval = wasm_bindgen::JsValue::from_str("flex");
let dom_node = node_ref.try_get::<DomNode>();
if dom_node.is_some() {
dom_node.unwrap().set_property("display",&jsval);
}
} else {
let dom_node = node_ref.get::<DomNode>();
dom_node.set_attribute("display","none");
let jsval = wasm_bindgen::JsValue::from_str("none");
let dom_node = node_ref.try_get::<DomNode>();
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,7 +641,6 @@ info!("Adding book");
}
}
}
}
}
else {
@@ -628,6 +648,8 @@ info!("Adding book");
})
}
}
}
@@ -635,31 +657,47 @@ info!("Adding book");
async fn SelectedUI<G: Html>(cx: Scope<'_>) -> View<G> {
let app_state = use_context::<AppState>(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::<DomNode>();
//});
let handle_close = move |_| {
app_state.displaying.set(false);
let dom_node = node_ref.get::<DomNode>();
dom_node.set_attribute("display","none");
let jsval = wasm_bindgen::JsValue::from_str("none");
let dom_node = node_ref.try_get::<DomNode>();
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::<DomNode>();
dom_node.remove_attribute("display");
let jsval = wasm_bindgen::JsValue::from_str("flex");
let dom_node = node_ref.try_get::<DomNode>();
if dom_node.is_some() {
dom_node.unwrap().set_property("display",&jsval);
}
} else {
let dom_node = node_ref.get::<DomNode>();
dom_node.set_attribute("display","none");
let jsval = wasm_bindgen::JsValue::from_str("none");
let dom_node = node_ref.try_get::<DomNode>();
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"){
@@ -669,12 +707,13 @@ async fn SelectedUI<G: Html>(cx: Scope<'_>) -> View<G> {
}
}
}
}
}
} else {
}}
else {
view!{cx,""}
})
}
}
}
@@ -691,7 +730,7 @@ async fn PageBar<G: Html>(cx: Scope<'_>) -> View<G> {
};
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 -" }