Add support for iterating through polls

This commit is contained in:
Yash Karandikar 2021-11-07 10:02:42 -06:00
parent 7e14e94178
commit 1bb14d0fa0
Signed by: karx
GPG key ID: A794DA2529474BA5
2 changed files with 80 additions and 7 deletions

View file

@ -2,18 +2,82 @@ use sycamore::prelude::*;
use wasm_bindgen_futures::spawn_local;
fn main() {
let state = Signal::new(String::new());
spawn_local(cloned!((state) => async move {
let resp = surf::get(env!("FIREBASE_URL")).recv_string().await.unwrap();
let parsed = json::parse(&resp).unwrap();
let items = Signal::new(Vec::new());
let length = Signal::new(0u8);
let error = Signal::new(String::new());
state.set(parsed["votes"].to_string());
spawn_local(cloned!((length, error) => async move {
let result = async move {
let resp = surf::get(format!("{}/polls/items.json", env!("FIREBASE_URL"))).recv_string().await?;
let parsed = json::parse(&resp)?;
let num = match parsed.as_u8() {
Some(val) => val,
None => 0
};
length.set(num);
Ok::<(), Box<dyn ::std::error::Error>>(())
}.await;
if let Err(_) = result {
error.set(String::from("Failed to get data from API"));
}
}));
create_effect(cloned!((items, length, error) => move || {
let num = *length.get();
if num > 0 {
spawn_local(cloned!((items, error) => async move {
let result = async move {
let mut builder = Vec::new();
for i in 0..num {
let resp = surf::get(format!("{}/polls/{}/description.json", env!("FIREBASE_URL"), i)).recv_string().await?;
let parsed = json::parse(&resp)?;
let string = String::from(match parsed.as_str() {
Some(val) => val,
None => ""
});
builder.push(string);
}
items.set(builder);
Ok::<(), Box<dyn ::std::error::Error>>(())
}.await;
if let Err(_) = result {
error.set(String::from("Failed to get data from API"));
}
}));
}
}));
sycamore::render(|| {
template! {
div(class="wrapper") {
p { (state.get()) }
(length.get())
ul {
// (templates)
Keyed(KeyedProps {
iterable: items.handle(),
template: |x| template! {
li {(x)}
},
key: |x| (*x).clone(),
})
}
}
(if *error.get() != "" {
template! { div(class="footer") { "Failed to get data from API" } }
} else {
template!{}
})
}
});
}
}

View file

@ -2,4 +2,13 @@
margin: auto;
width: 60%;
padding: 10px;
}
.footer {
position: fixed;
left: 0;
bottom: 0;
width: 100%;
background-color: red;
color: white;
text-align: center;
}