dioxus_leaflet/components/
marker.rs

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