use leptos::context::Provider;
use leptos::prelude::*;
use orbital_base_components::{
BaseToastStack, FeedbackIntent, ToastStackPosition, ToasterConfig, DEFAULT_TOAST_LIMIT,
DEFAULT_TOAST_TIMEOUT_MS,
};
pub use orbital_base_components::ToastStackPosition as ToastPosition;
pub use orbital_base_components::{
ToastAction, ToastId, ToastOffset, ToastOptions, ToasterInjection,
DEFAULT_TOAST_TIMEOUT_MS as ToastDefaultTimeoutMs,
};
#[derive(Clone, Copy, Default, PartialEq, Eq)]
pub enum ToastIntent {
#[default]
Info,
Success,
Warning,
Error,
}
impl From<ToastIntent> for FeedbackIntent {
fn from(value: ToastIntent) -> Self {
match value {
ToastIntent::Info => FeedbackIntent::Info,
ToastIntent::Success => FeedbackIntent::Success,
ToastIntent::Warning => FeedbackIntent::Warning,
ToastIntent::Error => FeedbackIntent::Error,
}
}
}
#[component]
pub fn ToasterProvider(
#[prop(default = ToastStackPosition::BottomEnd)]
position: ToastPosition,
#[prop(optional)]
intent: ToastIntent,
#[prop(default = DEFAULT_TOAST_TIMEOUT_MS)]
timeout: i32,
#[prop(default = false)]
pause_on_hover: bool,
#[prop(default = DEFAULT_TOAST_LIMIT)]
limit: u32,
#[prop(optional)]
offset: ToastOffset,
#[prop(optional)]
inline: bool,
children: Children,
) -> impl IntoView {
let config = ToasterConfig {
default_position: position,
default_intent: intent.into(),
default_timeout: timeout,
default_pause_on_hover: pause_on_hover,
limit,
offset,
inline,
};
let injection = ToasterInjection::new(config);
view! {
<Provider value=injection>
{children()}
<BaseToastStack />
</Provider>
}
}