use std::sync::Arc;
use serde::{Deserialize, Serialize};
use crate::stela::Modal;
use super::Image;
#[derive(bon::Builder, Clone, Debug, Deserialize, Serialize)]
pub struct VisualMotion {
pub title: Option<String>,
pub icon: Option<MotionIcon>,
pub image: Option<Image>,
pub initial_toggle: Option<bool>,
pub variant: MotionVariant,
pub color: MotionColor,
#[builder(into)]
pub motion: Motion,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
pub enum MotionIcon {
Bell,
ChatCircle,
GlobeHemisphereWest,
Heart,
House,
MagnifyingGlass,
Plus,
PushPin,
ShareFat,
Shield,
SignIn,
SignOut,
Toggle,
Flag,
UserCircle,
#[default]
#[serde(other)]
Unknown,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
pub enum MotionVariant {
Button,
ButtonBorder,
Link,
LinkHoverButton,
LinkHoverButtonBorder,
#[default]
#[serde(other)]
Unknown,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
pub enum MotionColor {
Primary,
Secondary,
Text,
#[default]
#[serde(other)]
Unknown,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub enum Motion {
ApiCall(Arc<MotionApiCall>),
Href(Arc<MotionHref>),
Share(Arc<MotionShare>),
Submit(Arc<MotionSubmit>),
#[default]
#[serde(other)]
Unknown,
}
#[derive(bon::Builder, Debug, Deserialize, Serialize)]
pub struct MotionApiCall {
pub data: String,
}
impl From<MotionApiCall> for Motion {
fn from(value: MotionApiCall) -> Self {
Motion::ApiCall(Arc::new(value))
}
}
#[derive(bon::Builder, Debug, Deserialize, Serialize)]
pub struct MotionApiCallResponse {
pub new_toggle: Option<bool>,
pub new_text: Option<String>,
pub modal: Option<Arc<Modal>>,
pub redirect: Option<String>,
}
#[derive(bon::Builder, Debug, Deserialize, Serialize)]
pub struct MotionHref {
pub uri: String,
pub new_tab: Option<bool>,
}
impl From<MotionHref> for Motion {
fn from(value: MotionHref) -> Self {
Motion::Href(Arc::new(value))
}
}
#[derive(bon::Builder, Debug, Deserialize, Serialize)]
pub struct MotionShare {
pub title: Option<String>,
pub text: Option<String>,
pub url: Option<String>,
}
impl From<MotionShare> for Motion {
fn from(value: MotionShare) -> Self {
Motion::Share(Arc::new(value))
}
}
#[derive(bon::Builder, Debug, Deserialize, Serialize)]
pub struct MotionSubmit {}
impl From<MotionSubmit> for Motion {
fn from(value: MotionSubmit) -> Self {
Motion::Submit(Arc::new(value))
}
}