use alloc::boxed::Box;
use alloc::rc::Rc;
use nami::watcher::Context;
use waterui::{AnyView, component::Dynamic};
use crate::reactive::WuiWatcher;
opaque!(WuiDynamic, Dynamic);
ffi_view!(Dynamic, *mut WuiDynamic, dynamic);
#[unsafe(no_mangle)]
pub unsafe extern "C" fn waterui_dynamic_connect(
dynamic: *mut WuiDynamic,
watcher: *mut WuiWatcher<AnyView>,
) {
unsafe {
let watcher = (*Box::from_raw(watcher)).into_inner();
let dynamic = &mut *dynamic;
dynamic.0.clone().connect(move |ctx| {
let metadata = ctx.metadata().clone();
let value = ctx.into_value();
let callback = Rc::clone(&watcher);
callback(Context::new(value, metadata));
});
}
}