dioxus_leaflet/components/
marker.rs1use 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}