Documentation
use super::*;

pub fn use_element_h(id: &'static str) -> Signal<Option<Result<f64>>> {
    let ret: Signal<Option<Result<f64>>> = use_signal(|| None);
    let drop_token: Signal<Option<DropToken>> = use_signal(|| None);

    let update = {
        let mut ret: Signal<_> = ret.to_owned();
        move || {
            let Some(win) = ::web_sys::window() else {
                ret.set(Some(Err(Error::MissingWindow)));
                return
            };
            let Some(doc) = win.document() else {
                ret.set(Some(Err(Error::MissingDocument)));
                return
            };
            let Some(element) = doc.get_element_by_id(id) else {
                ret.set(None);
                return
            };
            let new: f64 = element.get_bounding_client_rect().height();
            ret.set(Some(Ok(new)));
        }
    };

    use_effect({
        let mut update = update.to_owned();
        move || {
            update();
        }
    });

    use_effect({
        let update = update.to_owned();
        let mut ret: Signal<_> = ret.to_owned();
        let mut drop_token: Signal<_> = drop_token.to_owned();
        move || {
            match on_animation_frame({
                let mut update = update.to_owned();
                move || {
                    update();
                }
            }) {
                Ok(new_drop_token) => {
                    drop_token.set(None);
                    drop_token.set(Some(new_drop_token));
                },
                Err(e) => {
                    ret.set(Some(Err(Error::EventListenerAttachmentFailure(e))));
                }
            }
        }
    });

    use_drop({
        let mut drop_token: Signal<_> = drop_token.to_owned();
        move || {
            drop_token.set(None);
        }
    });

    ret
}