about summary refs log tree commit diff
path: root/frontend
diff options
context:
space:
mode:
authorBaitinq <manuelpalenzuelamerino@gmail.com>2022-11-06 23:45:08 +0100
committerBaitinq <manuelpalenzuelamerino@gmail.com>2022-11-06 23:47:05 +0100
commit850744e2049d5b48d474e35717974f420cc4ed7d (patch)
treeb29ae8699bdff51dd5209bebfdf24b41a3d1a6ba /frontend
parentIndexer: Decode html entities for website title and description (diff)
downloadOSSE-850744e2049d5b48d474e35717974f420cc4ed7d.tar.gz
OSSE-850744e2049d5b48d474e35717974f420cc4ed7d.tar.bz2
OSSE-850744e2049d5b48d474e35717974f420cc4ed7d.zip
Frontend: Display a loading animation when results have not been loaded
We now have a way to represent unloaded results in the SearchResult
struct. We simply wrap an Option over the results, meaning that None
signifies that the results have not yet been fetched.
Diffstat (limited to 'frontend')
-rw-r--r--frontend/src/app.rs34
1 files changed, 26 insertions, 8 deletions
diff --git a/frontend/src/app.rs b/frontend/src/app.rs
index 4e6e62d..d3edfa5 100644
--- a/frontend/src/app.rs
+++ b/frontend/src/app.rs
@@ -54,7 +54,7 @@ fn result_component(props: &ResultComponentProps) -> Html {
                 <p class="title mb-1">{match props.result.title.clone() {
                     None => "No Title".to_string(),
                     Some(title) => {
-                        truncate(&title, 70).to_string()
+                        truncate(&title, 70).to_string()//TODO: add ... if truncate
                 },
                 }}</p>
             </a>
@@ -62,7 +62,7 @@ fn result_component(props: &ResultComponentProps) -> Html {
                 {match props.result.description.clone() {
                     None => "No Description.".to_string(),
                     Some(description) => {
-                        truncate(&description, 200).to_string()
+                        truncate(&description, 200).to_string() //TODO: add ... if truncate
                 },
                 }}{format!("PRIO: {}", props.result.priority)}
             </p>
@@ -72,12 +72,12 @@ fn result_component(props: &ResultComponentProps) -> Html {
 
 pub struct SearchResult {
     query: String,
-    results: Result<Vec<IndexedResource>, String>,
+    results: Option<Result<Vec<IndexedResource>, String>>, //none signifies not finished loading
 }
 
 pub struct OSSE {
     pub current_search_query: String,
-    pub results: Option<SearchResult>, //TODO: some loading?
+    pub results: Option<SearchResult>, //none signifies no query yet
 }
 
 #[derive(Properties, PartialEq, Eq)]
@@ -126,8 +126,9 @@ impl Component for OSSE {
                     query: urlencoding::encode(search_query.as_str()).to_string(),
                 });
 
+                let search_query_clone = search_query.clone();
                 ctx.link().send_future(async move {
-                    let endpoint = format!("{}/search/{}", api_endpoint, search_query);
+                    let endpoint = format!("{}/search/{}", &api_endpoint, &search_query_clone);
 
                     let fetched_response = match Request::get(endpoint.as_str()).send().await {
                         Ok(response) => response,
@@ -151,7 +152,12 @@ impl Component for OSSE {
                     OSSEMessage::SearchFinished(Ok(fetched_results))
                 });
 
-                false
+                self.results = Some(SearchResult {
+                    query: search_query,
+                    results: None, //none yet
+                });
+
+                true
             }
             OSSEMessage::SearchChanged(search_query) => {
                 self.current_search_query = search_query;
@@ -163,13 +169,13 @@ impl Component for OSSE {
                     Ok(results) => {
                         self.results = Some(SearchResult {
                             query: search_query,
-                            results: Ok(results),
+                            results: Some(Ok(results)),
                         });
                     }
                     Err(error) => {
                         self.results = Some(SearchResult {
                             query: search_query,
-                            results: Err(error),
+                            results: Some(Err(error)),
                         });
                     }
                 };
@@ -196,6 +202,7 @@ impl Component for OSSE {
         });
 
         let display_results = |maybe_results: &Option<SearchResult>| -> Html {
+            //not yet searched
             if maybe_results.is_none() {
                 return html! {};
             }
@@ -204,6 +211,17 @@ impl Component for OSSE {
             let search_query = &result.query;
             let results = &result.results;
 
+            //not yet loaded results
+            if results.is_none() {
+                return html! {
+                    <div class="spinner-border text-primary" role="status">
+                        <span class="visually-hidden">{"Loading..."}</span>
+                    </div>
+                };
+            }
+
+            let results = results.as_ref().unwrap();
+
             if results.is_err() {
                 return html! {
                     <p>{format!("ERROR: {}", results.as_ref().err().unwrap())}</p>