freya_components/
native_container.rs

1use dioxus::prelude::*;
2use freya_core::accessibility::AccessibilityFocusStrategy;
3use freya_elements::{
4    self as dioxus_elements,
5    events::{
6        Key,
7        KeyboardEvent,
8        Modifiers,
9    },
10};
11use freya_hooks::{
12    use_init_native_platform,
13    use_platform,
14};
15
16#[allow(non_snake_case)]
17#[component]
18pub fn NativeContainer(children: Element) -> Element {
19    let mut native_platform = use_init_native_platform();
20    let platform = use_platform();
21
22    let onglobalkeydown = move |e: KeyboardEvent| {
23        let allowed_to_navigate = native_platform.navigation_mark.peek().allowed();
24        if e.key == Key::Tab && allowed_to_navigate {
25            if e.modifiers.contains(Modifiers::SHIFT) {
26                platform.focus(AccessibilityFocusStrategy::Backward);
27            } else {
28                platform.focus(AccessibilityFocusStrategy::Forward);
29            }
30        } else {
31            native_platform.navigation_mark.write().set_allowed(true)
32        }
33    };
34
35    rsx!(rect {
36        width: "100%",
37        height: "100%",
38        onglobalkeydown,
39        {children}
40    })
41}