use freya_core::{
prelude::{
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(|| {
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(|| {
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() -> Theme {
try_consume_context::<State<Theme>>()
.map(|theme| theme.read().to_owned())
.unwrap_or_default()
}
#[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())
}