use crate::ShellLayout;
use crate::breakpoint::{DesktopSidebar, MobileSidebar, SheetSnap, ShellBreakpoint};
use dioxus::prelude::*;
#[derive(Clone, Copy)]
pub struct ShellContext {
pub layout: Signal<ShellLayout>,
pub breakpoint: ReadSignal<ShellBreakpoint>,
pub sidebar_visible: Signal<bool>,
pub sidebar_mobile_open: Signal<bool>,
pub mobile_sidebar: ReadSignal<MobileSidebar>,
pub desktop_sidebar: ReadSignal<DesktopSidebar>,
pub stack_depth: Signal<u32>,
pub modal_open: Signal<bool>,
pub search_active: Signal<bool>,
pub sheet_snap: Signal<SheetSnap>,
pub(crate) on_modal_change: Signal<Option<EventHandler<bool>>>,
pub(crate) on_search_change: Signal<Option<EventHandler<bool>>>,
}
impl ShellContext {
pub fn is_mobile(&self) -> bool {
(self.breakpoint)().is_compact()
}
pub fn toggle_sidebar(&self) {
if self.is_mobile() {
let mut mob = self.sidebar_mobile_open;
mob.set(!(self.sidebar_mobile_open)());
} else if (self.desktop_sidebar)() != DesktopSidebar::Rail {
let mut vis = self.sidebar_visible;
vis.set(!(self.sidebar_visible)());
}
}
pub fn sidebar_state(&self) -> &'static str {
if self.is_mobile() {
if (self.sidebar_mobile_open)() {
"open"
} else {
"closed"
}
} else {
match (self.desktop_sidebar)() {
DesktopSidebar::Rail => "rail",
DesktopSidebar::Full => {
if (self.sidebar_visible)() {
"expanded"
} else {
"collapsed"
}
}
DesktopSidebar::Expandable => {
if (self.sidebar_visible)() {
"expanded"
} else {
"rail"
}
}
}
}
}
pub fn push_stack(&self) {
let mut s = self.stack_depth;
s.set((self.stack_depth)() + 1);
}
pub fn pop_stack(&self) {
let d = (self.stack_depth)();
if d > 1 {
let mut s = self.stack_depth;
s.set(d - 1);
}
}
pub fn reset_stack(&self) {
let mut s = self.stack_depth;
s.set(1);
}
pub fn can_go_back(&self) -> bool {
(self.stack_depth)() > 1
}
pub fn open_modal(&self) {
let mut m = self.modal_open;
m.set(true);
if let Some(cb) = (self.on_modal_change)() {
cb.call(true);
}
}
pub fn close_modal(&self) {
let mut m = self.modal_open;
m.set(false);
if let Some(cb) = (self.on_modal_change)() {
cb.call(false);
}
}
pub fn toggle_modal(&self) {
let next = !(self.modal_open)();
let mut m = self.modal_open;
m.set(next);
if let Some(cb) = (self.on_modal_change)() {
cb.call(next);
}
}
pub fn open_search(&self) {
let mut s = self.search_active;
s.set(true);
if let Some(cb) = (self.on_search_change)() {
cb.call(true);
}
}
pub fn close_search(&self) {
let mut s = self.search_active;
s.set(false);
if let Some(cb) = (self.on_search_change)() {
cb.call(false);
}
}
pub fn toggle_search(&self) {
let next = !(self.search_active)();
let mut s = self.search_active;
s.set(next);
if let Some(cb) = (self.on_search_change)() {
cb.call(next);
}
}
pub fn set_sheet_snap(&self, snap: SheetSnap) {
let mut s = self.sheet_snap;
s.set(snap);
}
}
pub fn use_shell_context() -> ShellContext {
use_context::<ShellContext>()
}