use std::rc::Rc;
use dioxus::{html::MountedData, signals::Signal, web::WebEventExt};
use floating_ui_dom::{
ARROW_NAME, Arrow as CoreArrow, ArrowOptions as CoreArrowOptions, Middleware, MiddlewareReturn,
MiddlewareState, Padding,
};
#[derive(Clone, PartialEq)]
pub struct ArrowOptions {
pub element: Signal<Option<Rc<MountedData>>>,
pub padding: Option<Padding>,
}
impl ArrowOptions {
pub fn new(element: Signal<Option<Rc<MountedData>>>) -> Self {
ArrowOptions {
element,
padding: None,
}
}
pub fn element(mut self, value: Signal<Option<Rc<MountedData>>>) -> Self {
self.element = value;
self
}
pub fn padding(mut self, value: Padding) -> Self {
self.padding = Some(value);
self
}
}
#[derive(Clone, PartialEq)]
pub struct Arrow {
options: ArrowOptions,
}
impl Arrow {
pub fn new(options: ArrowOptions) -> Self {
Arrow { options }
}
}
impl Middleware<web_sys::Element, web_sys::Window> for Arrow {
fn name(&self) -> &'static str {
ARROW_NAME
}
fn compute(
&self,
state: MiddlewareState<web_sys::Element, web_sys::Window>,
) -> MiddlewareReturn {
match (self.options.element)().map(|element| element.as_web_event()) {
Some(element) => CoreArrow::new(CoreArrowOptions {
element,
padding: self.options.padding.clone(),
})
.compute(state),
_ => MiddlewareReturn {
x: None,
y: None,
data: None,
reset: None,
},
}
}
}