63 lines
1.6 KiB
Rust
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))
|
|
}
|
|
}
|