use freya_core::{
prelude::{
Readable,
State,
provide_context,
provide_context_for_scope_id,
try_consume_context,
use_consume,
use_hook,
},
scope_id::ScopeId,
};
use crate::theming::component_themes::Theme;
pub fn use_init_theme(theme_cb: impl FnOnce() -> Theme) -> State<Theme> {
use_hook(|| {
if let Some(existing) = try_consume_context::<State<Theme>>() {
existing
} else {
let state = State::create(theme_cb());
provide_context(state);
state
}
})
}
pub fn use_init_root_theme(theme_cb: impl FnOnce() -> Theme) -> State<Theme> {
use_hook(|| {
if let Some(existing) = try_consume_context::<State<Theme>>() {
existing
} else {
let state = State::create_in_scope(theme_cb(), ScopeId::ROOT);
provide_context_for_scope_id(state, ScopeId::ROOT);
state
}
})
}
pub fn use_theme() -> State<Theme> {
use_consume::<State<Theme>>()
}
pub fn get_theme_or_default() -> Readable<Theme> {
try_consume_context::<State<Theme>>()
.map(|v| v.into())
.unwrap_or_else(|| Theme::default().into())
}
#[derive(Clone, Copy, PartialEq, Debug, Default)]
pub enum SurfaceThemeIndicator {
#[default]
Primary,
Opposite,
}
pub fn use_init_surface_theme_indicator(theme: impl FnOnce() -> SurfaceThemeIndicator) {
use_hook(|| provide_context(theme()))
}
pub fn use_surface_theme_indicator() -> SurfaceThemeIndicator {
use_hook(|| try_consume_context().unwrap_or_default())
}