vertigo_forms/
with_loader.rs

1use std::rc::Rc;
2use vertigo::{Computed, DomNode, Resource, component, dom};
3
4use crate::Spinner;
5
6/// Wraps [Resource\<T\>](https://docs.rs/vertigo/latest/vertigo/enum.Resource.html)
7/// and shows [Spinner], error or renders value based on Resource variant.
8///
9/// See also [with_loader].
10#[component]
11pub fn WithLoader<T: Clone + PartialEq + 'static>(
12    resource: Computed<Resource<T>>,
13    render: Rc<dyn Fn(T) -> DomNode>,
14) {
15    with_loader(resource, render)
16}
17
18/// Wraps [Resource\<T\>](https://docs.rs/vertigo/latest/vertigo/enum.Resource.html)
19/// and shows [Spinner], error or renders value based on Resource variant.
20///
21/// See also [WithLoader].
22pub fn with_loader<T: Clone + PartialEq + 'static>(
23    resource: Computed<Resource<T>>,
24    render: Rc<dyn Fn(T) -> DomNode>,
25) -> DomNode {
26    resource.render_value(move |res| match res {
27        Resource::Loading => dom! {
28            <Spinner />
29        },
30        Resource::Ready(value) => render(value),
31        Resource::Error(err) => dom! {
32            <main>{err}</main>
33        },
34    })
35}