rust-galmon-web/src/uitools/loading.rs

63 lines
1.6 KiB
Rust

use std::rc::Rc;
use yew::prelude::*;
pub fn loading<COMP>(title: &str) -> Html<COMP>
where
COMP: Component,
{
html!{
<div class="d-flex align-items-center">
<span class="spinner-border spinner-border-sm text-info mr-2" role="status"/>
<span class="text-info"> { "Loading " } { title } { "..." }</span>
</div>
}
}
pub fn load_error<COMP, M>(title: &str, refresh: M, error: &str) -> Html<COMP>
where
COMP: Component + Renderable<COMP>,
M: Fn() -> COMP::Message + 'static,
{
html!{
<div class="d-flex align-items-center">
<span class="text-danger">
<span class="clickable mr-2" onclick=move |_| refresh()> { crate::uitools::icons::icon_refresh() } </span>
{ "Loading " } { title } { " failed: " }{ error }
</span>
</div>
}
}
pub fn show<COMP, M, D, T>(title: &str, data: Option<Rc<Result<T, String>>>, refresh: M, display: D) -> Html<COMP>
where
COMP: Component + Renderable<COMP>,
M: Fn() -> COMP::Message + 'static,
D: FnOnce(&T) -> Html<COMP>,
{
if let Some(data) = data {
match &*data {
Ok(v) => display(v),
Err(e) => load_error(title, refresh, e.as_str()),
}
} else {
loading(title)
}
}
pub fn show_with<COMP, M, D, F, T>(title: &str, data: Option<Rc<Result<T, String>>>, refresh: M, display: D, display_fail: F) -> Html<COMP>
where
COMP: Component + Renderable<COMP>,
M: Fn() -> COMP::Message + 'static,
D: FnOnce(&T) -> Html<COMP>,
F: FnOnce(Html<COMP>) -> Html<COMP>,
{
if let Some(data) = data {
match &*data {
Ok(v) => display(v),
Err(e) => display_fail(load_error(title, refresh, e.as_str())),
}
} else {
display_fail(loading(title))
}
}