use super::{MountPoint, scoped};
use std::cell::RefCell;
#[cfg(feature = "islands")]
use web_sys::Element;
enum Target {
#[cfg(feature = "islands")]
Root(Element),
Range(MountPoint),
}
thread_local! {
static OFFER: RefCell<Option<Target>> = const { RefCell::new(None) };
}
#[cfg(feature = "islands")]
pub(super) fn with_root<R>(root: &Element, run: impl FnOnce() -> R) -> R {
scoped(&OFFER, Some(Target::Root(root.clone())), run)
}
pub(super) fn with_range<R>(range: Option<MountPoint>, run: impl FnOnce() -> R) -> R {
scoped(&OFFER, range.map(Target::Range), run)
}
#[cfg(feature = "islands")]
pub(super) fn take_root() -> Option<Element> {
OFFER.with_borrow_mut(|offer| match offer.take() {
Some(Target::Root(root)) => Some(root),
other => {
*offer = other;
None
}
})
}
pub(super) fn take_range() -> Option<MountPoint> {
OFFER.with_borrow_mut(|offer| match offer.take() {
Some(Target::Range(range)) => Some(range),
other => {
*offer = other;
None
}
})
}