summary refs log tree commit diff stats
path: root/src/components/async_fetch.rs
blob: 43469a7676d1c66f4e3bb0f1ad652e8a2f5a1641 (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
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 {
    (
        @map_error_in_producer
        fetcher = $fetcher:expr,
        producer = $producer:expr $(,)?
    ) => {{
        AsyncFetch! {
            @map_error_in_producer
            from_resource = leptos::prelude::LocalResource::new(move || $fetcher),
            producer = $producer
        }
    }};

    (
        @map_error_in_producer
        from_resource = $resource:expr,
        producer = $producer:expr $(,)?
    ) => {{
        use leptos::prelude::{ElementChild, Suspend, Transition};

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