use dioxus::prelude::*;
use crate::context::MapContext;
#[derive(Props, Clone, PartialEq, Eq)]
pub struct CircleLayerProps {
pub id: String,
pub source: String,
#[props(default)]
pub paint: Option<serde_json::Value>,
#[props(default)]
pub layout: Option<serde_json::Value>,
}
#[component]
#[allow(unused_variables)] pub fn CircleLayer(props: CircleLayerProps) -> Element {
#[allow(unused_variables)] let ctx = use_context::<MapContext>();
#[allow(unused_variables, unused_mut)] let mut layer_added = use_signal(|| false);
#[cfg(target_arch = "wasm32")]
{
use crate::interop::{add_layer_js, remove_layer_js};
use tracing::debug;
let layer_id = props.id.clone();
let source_id = props.source.clone();
let paint = props.paint.clone().unwrap_or(serde_json::json!({
"circle-radius": 6,
"circle-color": "#3b82f6",
"circle-stroke-width": 2,
"circle-stroke-color": "#000000"
}));
let layout = props.layout.clone().unwrap_or(serde_json::json!({}));
{
let map_id = ctx.map_id.clone();
let layer_id = layer_id.clone();
let source_id = source_id.clone();
let paint = paint.clone();
let layout = layout.clone();
let is_ready = ctx.is_ready;
use_effect(move || {
let map_id = map_id.clone();
let layer_id = layer_id.clone();
let source_id = source_id.clone();
let paint = paint.clone();
let layout = layout.clone();
if is_ready() && !layer_added() {
debug!("Adding circle layer: {}", layer_id);
layer_added.set(true);
let js = add_layer_js(
&map_id,
&layer_id,
"circle",
&source_id,
&paint.to_string(),
&layout.to_string(),
);
spawn(async move {
let _ = document::eval(&js).await;
});
}
});
}
{
let map_id = ctx.map_id.clone();
let layer_id = layer_id.clone();
use_drop(move || {
debug!("Removing circle layer: {}", layer_id);
let js = remove_layer_js(&map_id, &layer_id);
spawn(async move {
let _ = document::eval(&js).await;
});
});
}
}
rsx! {}
}