use super::layout::into_node;
use super::widgets::screen_href;
use crate::i18n::Text;
use crate::render::Render;
use crate::screen::{Component, Node, ScreenDef};
use serde_json::{Value as Json, json};
into_node!(Share);
pub struct Share {
target: Option<(&'static str, Json)>,
title: Option<Text>,
label: Option<Text>,
}
impl Share {
pub fn page() -> Self {
Share {
target: None,
title: None,
label: None,
}
}
pub fn screen<S: ScreenDef>(_screen: S, params: S::Params) -> Self {
Share {
target: Some((
S::META.name,
serde_json::to_value(params).unwrap_or(Json::Null),
)),
title: None,
label: None,
}
}
pub fn title(mut self, title: impl Into<Text>) -> Self {
self.title = Some(title.into());
self
}
pub fn label(mut self, label: impl Into<Text>) -> Self {
self.label = Some(label.into());
self
}
}
impl Component for Share {
fn render(&self, out: &mut String, r: &Render) {
let t = |key: &str| r.text(&Text::key(format!("zeyn.ui.share.{key}")));
let url = self
.target
.as_ref()
.map(|(screen, params)| format!(r#" data-url="{}""#, screen_href(r, screen, params)))
.unwrap_or_default();
let title = self
.title
.as_ref()
.map(|t| format!(r#" data-title="{}""#, r.text(t)))
.unwrap_or_default();
let label = match &self.label {
Some(l) => r.text(l),
None => t("label"),
};
out.push_str(&format!(
r#"<button type="button" class="z-button z-share" data-zeyn-share{url}{title} data-copied="{}" data-failed="{}" data-testid="{}.share" hidden>{label}</button>"#,
t("copied"),
t("failed"),
r.scope
));
}
fn schema(&self) -> Json {
json!({
"type": "share",
"screen": self.target.as_ref().map(|(s, _)| s),
"params": self.target.as_ref().map(|(_, p)| p),
"title": self.title,
"label": self.label,
})
}
}