use dioxus::prelude::*; use dioxus_native_core::{ node_ref::{AttributeMask, NodeView}, real_dom::RealDom, state::{ParentDepState, State}, NodeMask, SendAnyMap, }; use dioxus_native_core_macro::{sorted_str_slice, State}; use std::sync::{Arc, Mutex}; use tokio::time::sleep; #[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct BlablaState {} /// Font style are inherited by default if not specified otherwise by some of the supported attributes. impl ParentDepState for BlablaState { type Ctx = (); type DepState = (Self,); const NODE_MASK: NodeMask = NodeMask::new_with_attrs(AttributeMask::Static(&sorted_str_slice!(["blabla",]))); fn reduce<'a>( &mut self, _node: NodeView, _parent: Option<(&'a Self,)>, _ctx: &Self::Ctx, ) -> bool { false } } #[derive(Clone, State, Default, Debug)] pub struct NodeState { #[parent_dep_state(blabla)] blabla: BlablaState, } mod dioxus_elements { macro_rules! builder_constructors { ( $( $(#[$attr:meta])* $name:ident { $( $(#[$attr_method:meta])* $fil:ident: $vil:ident, )* }; )* ) => { $( #[allow(non_camel_case_types)] $(#[$attr])* pub struct $name; impl $name { pub const TAG_NAME: &'static str = stringify!($name); pub const NAME_SPACE: Option<&'static str> = None; $( pub const $fil: (&'static str, Option<&'static str>, bool) = (stringify!($fil), None, false); )* } impl GlobalAttributes for $name {} )* } } pub trait GlobalAttributes {} pub trait SvgAttributes {} builder_constructors! { blabla { }; } } #[test] fn native_core_is_okay() { use std::time::Duration; fn app(cx: Scope) -> Element { let colors = use_state(cx, || vec!["green", "blue", "red"]); let padding = use_state(cx, || 10); use_effect(cx, colors, |colors| async move { sleep(Duration::from_millis(1000)).await; colors.with_mut(|colors| colors.reverse()); }); use_effect(cx, padding, |padding| async move { sleep(Duration::from_millis(10)).await; padding.with_mut(|padding| { if *padding < 65 { *padding += 1; } else { *padding = 5; } }); }); let _big = colors[0]; let _mid = colors[1]; let _small = colors[2]; cx.render(rsx! { blabla {} }) } let rt = tokio::runtime::Builder::new_current_thread() .enable_time() .build() .unwrap(); rt.block_on(async { let rdom = Arc::new(Mutex::new(RealDom::::new())); let mut dom = VirtualDom::new(app); let muts = dom.rebuild(); let (to_update, _diff) = rdom.lock().unwrap().apply_mutations(muts); let ctx = SendAnyMap::new(); rdom.lock().unwrap().update_state(to_update, ctx); for _ in 0..10 { dom.wait_for_work().await; let mutations = dom.render_immediate(); let (to_update, _diff) = rdom.lock().unwrap().apply_mutations(mutations); let ctx = SendAnyMap::new(); rdom.lock().unwrap().update_state(to_update, ctx); } }); }