use std::cell::{Cell, RefCell};
use cranpose_core::{CompositionLocal, CompositionLocalProvider, compositionLocalOf};
use cranpose_macros::composable;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub struct AccessibilityState {
pub screen_reader_on: bool,
}
thread_local! {
static PLATFORM_ACCESSIBILITY_STATE: Cell<AccessibilityState> =
const { Cell::new(AccessibilityState { screen_reader_on: false }) };
}
pub fn set_platform_accessibility_state(state: AccessibilityState) -> bool {
PLATFORM_ACCESSIBILITY_STATE.with(|cell| {
let changed = cell.get() != state;
cell.set(state);
changed
})
}
pub fn platform_accessibility_state() -> AccessibilityState {
PLATFORM_ACCESSIBILITY_STATE.with(Cell::get)
}
pub fn local_accessibility_state() -> CompositionLocal<AccessibilityState> {
thread_local! {
static LOCAL: RefCell<Option<CompositionLocal<AccessibilityState>>> =
const { RefCell::new(None) };
}
LOCAL.with(|cell| {
let mut local = cell.borrow_mut();
local
.get_or_insert_with(|| compositionLocalOf(platform_accessibility_state))
.clone()
})
}
#[composable]
pub fn ProvideAccessibilityState(state: AccessibilityState, content: impl FnOnce()) {
let local = local_accessibility_state();
CompositionLocalProvider(vec![local.provides(state)], move || {
content();
});
}
#[cfg(test)]
#[path = "tests/accessibility_state_tests.rs"]
mod tests;