From e318a38e3913f6a1c8fe46c12d8ddcdc5b0503e1 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Sun, 30 Oct 2022 15:34:46 +0100 Subject: Frontend: Move app-specific code to app.rs --- crawler/src/main.rs | 1 + frontend/src/app.rs | 178 ++++++++++++++++++++++++++++++++++++++++++++++++ frontend/src/main.rs | 186 +-------------------------------------------------- 3 files changed, 181 insertions(+), 184 deletions(-) create mode 100644 frontend/src/app.rs diff --git a/crawler/src/main.rs b/crawler/src/main.rs index a3dc06b..ce9943f 100644 --- a/crawler/src/main.rs +++ b/crawler/src/main.rs @@ -124,6 +124,7 @@ async fn crawl_url(http_client: &Client, url: &str) -> Result<(String, Vec Html { + html! { +
+ + {props.result.url.clone()}{"--"}{props.result.title.clone()}{"----"}{props.result.description.clone()}{format!("PRIO: {}", props.result.priority)} + +
+ } +} + +pub struct OSSE { + pub search_query: String, + pub results: Option>, //TODO: some loading? +} + +#[derive(Properties, PartialEq, Eq)] +pub struct OSSEProps { + pub api_endpoint: String, +} + +pub enum OSSEMessage { + SearchSubmitted, + SearchChanged(String), + SearchFinished(Vec), +} + +impl Component for OSSE { + type Message = OSSEMessage; + type Properties = OSSEProps; + + fn create(ctx: &Context) -> Self { + OSSE { + search_query: "".to_string(), + results: None, + } + } + + fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { + match msg { + OSSEMessage::SearchSubmitted => { + let search_query = self.search_query.clone(); + let api_endpoint = ctx.props().api_endpoint.clone(); + ctx.link().send_future(async move { + let endpoint = format!("{}/search/{}", api_endpoint, search_query); + + let fetched_response = Request::get(endpoint.as_str()).send().await.unwrap(); + + let fetched_results: Vec = match fetched_response.json().await { + Err(e) => panic!("Im panic: {}", e), + Ok(json) => json, + }; + + OSSEMessage::SearchFinished(fetched_results) + }); + + false + }, + OSSEMessage::SearchChanged(search_query) => { + self.search_query = search_query; + + true + }, + OSSEMessage::SearchFinished(search_results) => { + self.results = Some(search_results); + + true + }, + } + } + + fn view(&self, ctx: &Context) -> Html { + let onsubmit = ctx.link().callback(|event: FocusEvent| { + event.prevent_default(); + + OSSEMessage::SearchSubmitted + }); + + let oninput = ctx.link().callback(|event: InputEvent| { + let target: EventTarget = event + .target() + .expect("Event should have a target when dispatched"); + let input = target.unchecked_into::().value(); + + OSSEMessage::SearchChanged(input) + }); + + let display_results = |maybe_results: &Option>| -> Html { + let maybe_results = maybe_results.as_ref(); + if maybe_results.is_none() { + return html! {}; + } + + let results = maybe_results.unwrap(); + if !results.is_empty() { + results + .iter() + .sorted() + .map(|r| { + html! { +
+ +
+ } + }) + .collect::() + } else { + html! { +

{"No results!"}

+ } + } + }; + + html! { + <> +
+ +
+
+ //SET AT MIDDLE OF VIEWPORT IF NO SEARCHING AND TOP 25% IF SEARCHING +
+
+
+
+ {"OSSE"} +

{"Your favorite independent search engine."}

+
+
+ + +
+
+
+
+ {display_results(&self.results)} +
+
+
+
+
+ + + } + } +} + +//Your favorite search engine in navbar +//Search in middle \ No newline at end of file diff --git a/frontend/src/main.rs b/frontend/src/main.rs index b83ccdd..fd19fb4 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -1,188 +1,6 @@ -use gloo_net::http::Request; -use itertools::Itertools; -use wasm_bindgen::*; -use web_sys::{EventTarget, HtmlInputElement}; -use yew::prelude::*; -use lib::lib::*; +mod app; -#[derive(Properties, Clone, PartialEq, Eq)] -pub struct ResultComponentProps { - result: IndexedResource, -} - -#[function_component(ResultComponent)] -fn result_component(props: &ResultComponentProps) -> Html { - html! { - - {props.result.url.clone()}{"--"}{props.result.title.clone()}{"----"}{props.result.description.clone()}{format!("PRIO: {}", props.result.priority)} - - } -} - -pub struct OSSE { - pub search_query: String, - pub results: Option>, //TODO: some loading? -} - -#[derive(Properties, PartialEq, Eq)] -pub struct OSSEProps { - pub api_endpoint: String, -} - -pub enum OSSEMessage { - SearchSubmitted, - SearchChanged(String), - SearchFinished(Vec), -} - -impl Component for OSSE { - type Message = OSSEMessage; - type Properties = OSSEProps; - - fn create(_ctx: &Context) -> Self { - OSSE { - search_query: "".to_string(), - results: None, - } - } - - fn update(&mut self, ctx: &Context, msg: Self::Message) -> bool { - match msg { - OSSEMessage::SearchSubmitted => { - let search_query = self.search_query.clone(); - let api_endpoint = ctx.props().api_endpoint.clone(); - ctx.link().send_future(async move { - let endpoint = format!("{}/search/{}", api_endpoint, search_query); - - let fetched_response = Request::get(endpoint.as_str()).send().await.unwrap(); - - let fetched_results: Vec = match fetched_response.json().await { - Err(e) => panic!("Im panic: {}", e), - Ok(json) => json, - }; - - OSSEMessage::SearchFinished(fetched_results) - }); - - false - }, - OSSEMessage::SearchChanged(search_query) => { - self.search_query = search_query; - - true - }, - OSSEMessage::SearchFinished(search_results) => { - self.results = Some(search_results); - - true - }, - } - } - - fn view(&self, ctx: &Context) -> Html { - let onsubmit = ctx.link().callback(|event: FocusEvent| { - event.prevent_default(); - - OSSEMessage::SearchSubmitted - }); - - let oninput = ctx.link().callback(|event: InputEvent| { - let target: EventTarget = event - .target() - .expect("Event should have a target when dispatched"); - let input = target.unchecked_into::().value(); - - OSSEMessage::SearchChanged(input) - }); - - let display_results = |maybe_results: &Option>| -> Html { - let maybe_results = maybe_results.as_ref(); - if maybe_results.is_none() { - return html! {}; - } - - let results = maybe_results.unwrap(); - if !results.is_empty() { - results - .iter() - .sorted() - .map(|r| { - html! { -
- -
- } - }) - .collect::() - } else { - html! { -

{"No results!"}

- } - } - }; - - html! { - <> -
- -
-
- //SET AT MIDDLE OF VIEWPORT IF NO SEARCHING AND TOP 25% IF SEARCHING -
-
-
-
- {"OSSE"} -

{"Your favorite independent search engine."}

-
-
- - -
-
-
-
- {display_results(&self.results)} -
-
-
-
-
- - - } - } -} - -#[function_component(App)] -fn app() -> Html { - html! { - <> - - - } -} - -//Your favorite search engine in navbar -//Search in middle +use app::App; fn main() { yew::start_app::(); -- cgit 1.4.1