use dioxus::prelude::*;
use crate::context::MapContext;
#[derive(Props, Clone, PartialEq)]
pub struct GeoJsonSourceProps {
pub id: String,
pub data: String,
pub children: Element,
}
#[component]
pub fn GeoJsonSource(props: GeoJsonSourceProps) -> Element {
#[allow(unused_variables)] let ctx = use_context::<MapContext>();
#[allow(unused_variables, unused_mut)] let mut source_added = use_signal(|| false);
#[allow(unused_variables, unused_mut)] let mut prev_data = use_signal(String::new);
#[cfg(target_arch = "wasm32")]
{
use crate::interop::{add_geojson_source_js, update_geojson_source_js, remove_source_js};
use tracing::debug;
let source_id = props.id.clone();
let data = props.data.clone();
{
let map_id = ctx.map_id.clone();
let source_id = source_id.clone();
let data = data.clone();
let is_ready = ctx.is_ready;
use_effect(move || {
let map_id = map_id.clone();
let source_id = source_id.clone();
let data = data.clone();
if is_ready() && !source_added() {
debug!("Adding GeoJSON source: {}", source_id);
source_added.set(true);
prev_data.set(data.clone());
let js = add_geojson_source_js(&map_id, &source_id, &data);
spawn(async move {
let _ = document::eval(&js).await;
});
}
});
}
{
let map_id = ctx.map_id.clone();
let source_id = source_id.clone();
let data = data.clone();
let is_ready = ctx.is_ready;
use_effect(move || {
let map_id = map_id.clone();
let source_id = source_id.clone();
let data = data.clone();
if is_ready() && source_added() && prev_data() != data {
debug!("Updating GeoJSON source: {}", source_id);
prev_data.set(data.clone());
let js = update_geojson_source_js(&map_id, &source_id, &data);
spawn(async move {
let _ = document::eval(&js).await;
});
}
});
}
{
let map_id = ctx.map_id.clone();
let source_id = source_id.clone();
use_drop(move || {
debug!("Removing GeoJSON source: {}", source_id);
let js = remove_source_js(&map_id, &source_id);
spawn(async move {
let _ = document::eval(&js).await;
});
});
}
}
rsx! { {props.children} }
}