leptos_leaflet/components/
video_overlay.rs

1use leptos::logging::log;
2use leptos::prelude::*;
3
4use crate::core::IntoThreadSafeJsValue;
5
6use super::{Bounds, LeafletMapContext};
7
8/// A video overlay component.
9#[component(transparent)]
10pub fn VideoOverlay(
11    #[prop(into)] url: String,
12    #[prop(into)] bounds: Bounds,
13    #[prop(into, optional)] opacity: Option<Signal<f64>>,
14    #[prop(into, optional)] alt: Option<Signal<String>>,
15    #[prop(into, optional)] interactive: Option<Signal<bool>>,
16    #[prop(into, optional)] cross_origin: Option<Signal<String>>,
17    #[prop(into, optional)] cross_origin_toggle: Option<Signal<bool>>,
18    #[prop(into, optional)] error_overlay_url: Option<Signal<String>>,
19    #[prop(into, optional)] z_index: Option<Signal<f64>>,
20    #[prop(into, optional)] class_name: Option<Signal<String>>,
21    #[prop(into, optional)] bubbling_mouse_events: Option<Signal<bool>>,
22    #[prop(into, optional)] pane: Option<Signal<String>>,
23    #[prop(into, optional)] attribution: Option<Signal<String>>,
24    #[prop(into, optional)] autoplay: Option<Signal<bool>>,
25    #[prop(into, optional)] looped: Option<Signal<bool>>,
26    #[prop(into, optional)] keep_aspect_ratio: Option<Signal<bool>>,
27    #[prop(into, optional)] muted: Option<Signal<bool>>,
28    #[prop(into, optional)] plays_inline: Option<Signal<bool>>,
29) -> impl IntoView {
30    let map_context = use_context::<LeafletMapContext>().expect("map context not found");
31    Effect::new(move |_| {
32        if let Some(map) = map_context.map() {
33            log!("Adding image layer: {}", url);
34            let options = leaflet::VideoOverlayOptions::new();
35            if let Some(opacity) = opacity {
36                options.set_opacity(opacity.get_untracked());
37            }
38            if let Some(alt) = &alt {
39                options.set_alt(alt.get_untracked());
40            }
41            if let Some(interactive) = interactive {
42                options.set_interactive(interactive.get_untracked());
43            }
44            if let Some(cross_origin) = &cross_origin {
45                options.set_cross_origin(cross_origin.get_untracked());
46            }
47            if let Some(cross_origin_toggle) = cross_origin_toggle {
48                options.set_cross_origin_toggle(cross_origin_toggle.get_untracked());
49            }
50            if let Some(error_overlay_url) = &error_overlay_url {
51                options.set_error_overlay_url(error_overlay_url.get_untracked());
52            }
53            if let Some(z_index) = z_index {
54                options.set_z_index(z_index.get_untracked());
55            }
56            if let Some(class_name) = &class_name {
57                options.set_class_name(class_name.get_untracked());
58            }
59            if let Some(bubbling_mouse_events) = bubbling_mouse_events {
60                options.set_bubbling_mouse_events(bubbling_mouse_events.get_untracked());
61            }
62            if let Some(pane) = &pane {
63                options.set_pane(pane.get_untracked());
64            }
65            if let Some(attribution) = &attribution {
66                options.set_attribution(attribution.get_untracked());
67            }
68            if let Some(autoplay) = autoplay {
69                options.set_autoplay(autoplay.get_untracked());
70            }
71            if let Some(looped) = looped {
72                options.set_looped(looped.get_untracked());
73            }
74            if let Some(keep_aspect_ratio) = keep_aspect_ratio {
75                options.set_keep_aspect_ratio(keep_aspect_ratio.get_untracked());
76            }
77            if let Some(muted) = muted {
78                options.set_muted(muted.get_untracked());
79            }
80            if let Some(plays_inline) = plays_inline {
81                options.set_plays_inline(plays_inline.get_untracked());
82            }
83
84            let map_layer = leaflet::VideoOverlay::new_with_options(
85                &url,
86                &bounds.as_lat_lng_bounds(),
87                &options,
88            )
89            .into_thread_safe_js_value();
90            map_layer.add_to(&map);
91            on_cleanup(move || {
92                map_layer.remove();
93            });
94        }
95    });
96}