dioxus_leaflet/components/
marker.rs

1use dioxus::{core::{use_drop, spawn_forever}, prelude::*};
2use dioxus_logger::tracing::error;
3use std::{collections::HashMap, rc::Rc};
4
5use crate::{LatLng, MarkerIcon, interop, types::Id};
6
7#[component]
8pub fn Marker(
9    coordinate: ReadSignal<LatLng>,
10
11    #[props(default = None)] icon: ReadSignal<Option<MarkerIcon>>,
12
13    #[props(default = None)] custom_data: ReadSignal<Option<HashMap<String, String>>>,
14
15    on_click: Option<EventHandler>,
16
17    children: Element,
18) -> Element {
19    let map: Rc<Id> = use_context();
20    let id = use_context_provider(|| Rc::new(Id::marker(&map, dioxus_core::current_scope_id().0)));
21
22    let id2 = id.clone();
23    use_effect(move || {
24        let id = id2.clone();
25        let coord = coordinate();
26        let icon = icon();
27        spawn(async move {
28            if let Err(e) = interop::update_marker(&id, &coord, &icon).await {
29                error!("Error rendering marker: {e}");
30            }
31        });
32    });
33
34    let id2 = id.clone();
35    use_drop(move || {
36        let id = id2.clone();
37        spawn_forever(async move {
38            if let Err(e) = interop::delete_marker(&id).await {
39                error!("Error deleting marker: {e}");
40            }
41        });
42    });
43
44    rsx!({ children })
45}