dioxus_leaflet/components/
polygon.rs

1use dioxus::{core::use_drop, prelude::*};
2use dioxus_logger::tracing::error;
3use std::rc::Rc;
4
5use crate::{LatLng, PathOptions, interop, types::Id};
6
7#[component]
8pub fn Polygon(
9    coordinates: ReadSignal<Vec<Vec<Vec<LatLng>>>>,
10
11    #[props(default = PathOptions::default())] options: ReadSignal<PathOptions>,
12
13    children: Element,
14) -> Element {
15    let id: Rc<Id> = use_context();
16    let id = use_context_provider(|| Rc::new(Id::polygon(&id, dioxus_core::current_scope_id().0)));
17
18    let id2 = id.clone();
19    use_effect(move || {
20        let id = id2.clone();
21        let coords = coordinates();
22        let opts = options();
23        spawn(async move {
24            if let Err(e) = interop::update_polygon(&id, &coords, &opts).await {
25                error!("{e}");
26            }
27        });
28    });
29
30    let id2 = id.clone();
31    use_drop(move || {
32        let id = id2.clone();
33        spawn(async move {
34            if let Err(e) = interop::delete_polygon(&id).await {
35                error!("{e}");
36            }
37        });
38    });
39
40    rsx!({ children })
41}