summary refs log tree commit diff stats
path: root/src/components/async_fetch.rs
blob: f24e3a5810774f390f87a2418a616789c651b2e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
macro_rules! AsyncResource {
    (
        (
            $(
                $input_name:ident : $input_type:ty = $input:expr
            ),*
        ) -> $output:ty $fetcher:block
    ) => {{
        async fn fetcher($($input_name : $input_type),*) -> $output $fetcher

        leptos::prelude::LocalResource::new(move || fetcher($($input),*))
    }}
}
pub(crate) use AsyncResource;

macro_rules! AsyncFetch {
    (
        fetcher = $fetcher:block
        producer = |$bound_variable:pat_param| $producer:block
    ) => {{
        use leptos::{
            prelude::{ElementChild, LocalResource, Suspend, Transition},
            view,
        };

        view! {
            <Transition fallback=|| {
                view! { <p>"Loading..."</p> }
            }>
                {move || Suspend::new(async move {
                    let resource = { LocalResource::new(move || $fetcher) };
                    resource
                        .await
                        .map(|$bound_variable| $producer)
                })}
            </Transition>
        }
    }};
    (
        @map_error_in_producer
        from_resource = $resource:ident
        producer = |$bound_variable:pat_param| $producer:block
    ) => {{
        use leptos::prelude::{ElementChild, Suspend, Transition};

        leptos::view! {
            <Transition fallback=|| {
                view! { <p>"Loading..."</p> }
            }>
                {move || Suspend::new(async move {
                    $resource
                        .await
                        .map(|$bound_variable| $producer)
                })}
            </Transition>
        }
    }};
}
pub(crate) use AsyncFetch;