From 398043eba028aea6c4898217352da65db6ed04e6 Mon Sep 17 00:00:00 2001 From: Adrian Wannenmacher Date: Tue, 13 Dec 2022 09:10:51 +0100 Subject: [PATCH] add history buttons --- .../router/src/components/history_buttons.rs | 80 +++++++++++++++++++ packages/router/src/lib.rs | 3 + 2 files changed, 83 insertions(+) create mode 100644 packages/router/src/components/history_buttons.rs diff --git a/packages/router/src/components/history_buttons.rs b/packages/router/src/components/history_buttons.rs new file mode 100644 index 000000000..6f7109178 --- /dev/null +++ b/packages/router/src/components/history_buttons.rs @@ -0,0 +1,80 @@ +use dioxus::prelude::*; +use dioxus_router_core::RouterMessage; +use log::error; + +use crate::utils::use_router_internal::use_router_internal; + +#[derive(Debug, Props)] +pub struct HistoryButtonProps<'a> { + pub children: Element<'a>, +} + +#[allow(non_snake_case)] +pub fn GoBackButton<'a>(cx: Scope<'a, HistoryButtonProps<'a>>) -> Element { + let HistoryButtonProps { children } = cx.props; + + // hook up to router + let router = match use_router_internal(&cx) { + Some(r) => r, + None => { + let msg = "`GoBackButton` must have access to a parent router"; + error!("{msg}, will be inactive"); + #[cfg(debug_assertions)] + panic!("{}", msg); + #[cfg(not(debug_assertions))] + anyhow::bail!("{msg}"); + } + }; + let state = loop { + if let Some(state) = router.state.try_read() { + break state; + } + }; + let sender = router.sender.clone(); + + let disabled = !state.can_go_back; + + render! { + button { + disabled: "{disabled}", + prevent_default: "onclick", + onclick: move |_| { let _ = sender.unbounded_send(RouterMessage::GoBack); }, + children + } + } +} + +#[allow(non_snake_case)] +pub fn GoForwardButton<'a>(cx: Scope<'a, HistoryButtonProps<'a>>) -> Element { + let HistoryButtonProps { children } = cx.props; + + // hook up to router + let router = match use_router_internal(&cx) { + Some(r) => r, + None => { + let msg = "`GoForwardButton` must have access to a parent router"; + error!("{msg}, will be inactive"); + #[cfg(debug_assertions)] + panic!("{}", msg); + #[cfg(not(debug_assertions))] + anyhow::bail!("{msg}"); + } + }; + let state = loop { + if let Some(state) = router.state.try_read() { + break state; + } + }; + let sender = router.sender.clone(); + + let disabled = !state.can_go_back; + + render! { + button { + disabled: "{disabled}", + prevent_default: "onclick", + onclick: move |_| { let _ = sender.unbounded_send(RouterMessage::GoForward); }, + children + } + } +} diff --git a/packages/router/src/lib.rs b/packages/router/src/lib.rs index 0eab933a1..47e179c0a 100644 --- a/packages/router/src/lib.rs +++ b/packages/router/src/lib.rs @@ -1,6 +1,9 @@ pub mod components { pub(crate) mod default_errors; + mod history_buttons; + pub use history_buttons::*; + mod link; pub use link::*;