From 9635b4daef51afec09308553e0312ce12f778ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABlle=20Huisman?= Date: Sat, 7 Mar 2026 15:08:18 +0100 Subject: [PATCH] feat: add input addons --- packages/core/shield/src/actions/sign_out.rs | 2 ++ packages/core/shield/src/form.rs | 14 ++++++++++++++ .../shield-credentials/src/email_password.rs | 4 ++++ .../shield-credentials/src/username_password.rs | 4 ++++ .../methods/shield-oauth/src/actions/sign_in.rs | 10 +++++++++- .../methods/shield-oidc/src/actions/sign_in.rs | 14 +++++++++++--- .../methods/shield-workos/src/actions/index.rs | 12 ++++++++++++ .../methods/shield-workos/src/actions/sign_in.rs | 10 ++++++++++ .../methods/shield-workos/src/actions/sign_up.rs | 10 ++++++++++ 9 files changed, 76 insertions(+), 4 deletions(-) diff --git a/packages/core/shield/src/actions/sign_out.rs b/packages/core/shield/src/actions/sign_out.rs index ee5209d..b058385 100644 --- a/packages/core/shield/src/actions/sign_out.rs +++ b/packages/core/shield/src/actions/sign_out.rs @@ -45,6 +45,8 @@ impl SignOutAction { value: Some(InputValue::String { value: Self::name(), }), + addon_start: None, + addon_end: None, }], }]) } diff --git a/packages/core/shield/src/form.rs b/packages/core/shield/src/form.rs index 4a7c606..be4dd12 100644 --- a/packages/core/shield/src/form.rs +++ b/packages/core/shield/src/form.rs @@ -15,6 +15,8 @@ pub struct Input { pub label: Option, pub r#type: InputType, pub value: Option, + pub addon_start: Option, + pub addon_end: Option, } #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] @@ -26,6 +28,18 @@ pub enum InputValue { String { value: String }, } +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))] +#[serde( + tag = "type", + rename_all = "kebab-case", + rename_all_fields = "camelCase" +)] +pub enum InputAddon { + Image { src: String }, + Text { text: String }, +} + #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))] #[serde(tag = "type", rename_all = "kebab-case")] diff --git a/packages/methods/shield-credentials/src/email_password.rs b/packages/methods/shield-credentials/src/email_password.rs index 06aa745..c84b1c0 100644 --- a/packages/methods/shield-credentials/src/email_password.rs +++ b/packages/methods/shield-credentials/src/email_password.rs @@ -51,6 +51,8 @@ impl Credentials for EmailPasswordCredentials ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "password".to_owned(), @@ -62,6 +64,8 @@ impl Credentials for EmailPasswordCredentials ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, ], } diff --git a/packages/methods/shield-credentials/src/username_password.rs b/packages/methods/shield-credentials/src/username_password.rs index 6f2d18b..adcd1b7 100644 --- a/packages/methods/shield-credentials/src/username_password.rs +++ b/packages/methods/shield-credentials/src/username_password.rs @@ -51,6 +51,8 @@ impl Credentials for UsernamePasswordCredentia ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "password".to_owned(), @@ -62,6 +64,8 @@ impl Credentials for UsernamePasswordCredentia ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, ], } diff --git a/packages/methods/shield-oauth/src/actions/sign_in.rs b/packages/methods/shield-oauth/src/actions/sign_in.rs index 94dd855..92e7dc7 100644 --- a/packages/methods/shield-oauth/src/actions/sign_in.rs +++ b/packages/methods/shield-oauth/src/actions/sign_in.rs @@ -2,7 +2,7 @@ use async_trait::async_trait; use oauth2::{CsrfToken, PkceCodeChallenge, Scope, url::form_urlencoded::parse}; use serde::Deserialize; use shield::{ - Action, ActionMethod, ConfigurationError, Form, Input, InputType, InputTypeHidden, + Action, ActionMethod, ConfigurationError, Form, Input, InputAddon, InputType, InputTypeHidden, InputTypeSubmit, InputValue, MethodSession, Provider, Request, Response, ResponseType, SessionAction, ShieldError, SignInAction, erased_action, }; @@ -61,6 +61,8 @@ impl Action for OauthSignInAction { label: None, r#type: InputType::Hidden(InputTypeHidden::default()), value: Some(InputValue::Origin), + addon_start: None, + addon_end: None, }, Input { name: "redirectUrl".to_owned(), @@ -69,6 +71,8 @@ impl Action for OauthSignInAction { value: Some(InputValue::Query { key: "redirectUrl".to_owned(), }), + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -77,6 +81,10 @@ impl Action for OauthSignInAction { value: Some(InputValue::String { value: format!("Sign in with {}", provider.name()), }), + addon_start: provider + .icon_url + .map(|icon_url| InputAddon::Image { src: icon_url }), + addon_end: None, }, ], }]) diff --git a/packages/methods/shield-oidc/src/actions/sign_in.rs b/packages/methods/shield-oidc/src/actions/sign_in.rs index d62f7d8..b77d125 100644 --- a/packages/methods/shield-oidc/src/actions/sign_in.rs +++ b/packages/methods/shield-oidc/src/actions/sign_in.rs @@ -5,9 +5,9 @@ use openidconnect::{ }; use serde::Deserialize; use shield::{ - Action, ActionMethod, Form, Input, InputType, InputTypeHidden, InputTypeSubmit, InputValue, - MethodSession, Provider, Request, Response, ResponseType, SessionAction, ShieldError, - SignInAction, erased_action, + Action, ActionMethod, Form, Input, InputAddon, InputType, InputTypeHidden, InputTypeSubmit, + InputValue, MethodSession, Provider, Request, Response, ResponseType, SessionAction, + ShieldError, SignInAction, erased_action, }; use url::Url; @@ -64,6 +64,8 @@ impl Action for OidcSignInAction { label: None, r#type: InputType::Hidden(InputTypeHidden::default()), value: Some(InputValue::Origin), + addon_start: None, + addon_end: None, }, Input { name: "redirectUrl".to_owned(), @@ -72,6 +74,8 @@ impl Action for OidcSignInAction { value: Some(InputValue::Query { key: "redirectUrl".to_owned(), }), + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -80,6 +84,10 @@ impl Action for OidcSignInAction { value: Some(InputValue::String { value: format!("Sign in with {}", provider.name()), }), + addon_start: provider + .icon_url + .map(|icon_url| InputAddon::Image { src: icon_url }), + addon_end: None, }, ], }]) diff --git a/packages/methods/shield-workos/src/actions/index.rs b/packages/methods/shield-workos/src/actions/index.rs index 0f944fb..9e40728 100644 --- a/packages/methods/shield-workos/src/actions/index.rs +++ b/packages/methods/shield-workos/src/actions/index.rs @@ -88,6 +88,8 @@ impl Action for WorkosIndexAction { ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -96,6 +98,8 @@ impl Action for WorkosIndexAction { value: Some(InputValue::String { value: "Continue".to_owned(), }), + addon_start: None, + addon_end: None, }, ], }] @@ -116,6 +120,8 @@ impl Action for WorkosIndexAction { value: Some(InputValue::String { value: oauth_provider.to_string(), }), + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -133,6 +139,8 @@ impl Action for WorkosIndexAction { ) .to_owned(), }), + addon_start: None, + addon_end: None, }, ], }), @@ -149,6 +157,8 @@ impl Action for WorkosIndexAction { value: Some(InputValue::String { value: connection.id.to_string(), }), + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -157,6 +167,8 @@ impl Action for WorkosIndexAction { value: Some(InputValue::String { value: format!("Continue with {}", connection.name).to_owned(), }), + addon_start: None, + addon_end: None, }, ], })) diff --git a/packages/methods/shield-workos/src/actions/sign_in.rs b/packages/methods/shield-workos/src/actions/sign_in.rs index 6bbede8..d937c62 100644 --- a/packages/methods/shield-workos/src/actions/sign_in.rs +++ b/packages/methods/shield-workos/src/actions/sign_in.rs @@ -60,6 +60,8 @@ impl Action for WorkosSignInAction { ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "password".to_owned(), @@ -71,6 +73,8 @@ impl Action for WorkosSignInAction { ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -79,6 +83,8 @@ impl Action for WorkosSignInAction { value: Some(InputValue::String { value: "Sign in".to_owned(), }), + addon_start: None, + addon_end: None, }, ], }, @@ -92,6 +98,8 @@ impl Action for WorkosSignInAction { required: Some(true), }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -100,6 +108,8 @@ impl Action for WorkosSignInAction { value: Some(InputValue::String { value: "Email sign-in code".to_owned(), }), + addon_start: None, + addon_end: None, }, ], }, diff --git a/packages/methods/shield-workos/src/actions/sign_up.rs b/packages/methods/shield-workos/src/actions/sign_up.rs index 86db882..ce29f82 100644 --- a/packages/methods/shield-workos/src/actions/sign_up.rs +++ b/packages/methods/shield-workos/src/actions/sign_up.rs @@ -60,6 +60,8 @@ impl Action for WorkosSignUpAction { ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "password".to_owned(), @@ -71,6 +73,8 @@ impl Action for WorkosSignUpAction { ..Default::default() }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -79,6 +83,8 @@ impl Action for WorkosSignUpAction { value: Some(InputValue::String { value: "Sign up".to_owned(), }), + addon_start: None, + addon_end: None, }, ], }, @@ -92,6 +98,8 @@ impl Action for WorkosSignUpAction { required: Some(true), }), value: None, + addon_start: None, + addon_end: None, }, Input { name: "submit".to_owned(), @@ -100,6 +108,8 @@ impl Action for WorkosSignUpAction { value: Some(InputValue::String { value: "Email sign-up code".to_owned(), }), + addon_start: None, + addon_end: None, }, ], },