Skip to content

Commit 3bbfef8

Browse files
feat(shield-leptos): add style (#133)
1 parent 9a3d20b commit 3bbfef8

19 files changed

Lines changed: 160 additions & 39 deletions

File tree

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/leptos-actix/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ leptos_actix = { workspace = true, optional = true }
4848
leptos_meta.workspace = true
4949
leptos_router.workspace = true
5050
shield.workspace = true
51+
# shield-bootstrap = { workspace = true, features = ["leptos"] }
5152
shield-leptos.workspace = true
5253
shield-leptos-actix = { workspace = true, optional = true }
5354
shield-memory = { workspace = true, optional = true }

examples/leptos-actix/src/home.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use leptos::{either::Either, prelude::*};
22
use leptos_router::components::A;
3-
use shield_leptos::integration::LeptosUser;
3+
use shield_leptos::LeptosUser;
44

55
#[server]
66
pub async fn user() -> Result<Option<LeptosUser>, ServerFnError> {
7-
use shield_leptos::context::extract_user;
7+
use shield_leptos::extract_user;
88

99
Ok(extract_user().await)
1010
}

examples/leptos-axum/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ leptos_axum = { workspace = true, optional = true }
4444
leptos_meta.workspace = true
4545
leptos_router.workspace = true
4646
shield.workspace = true
47+
# shield-bootstrap = { workspace = true, features = ["leptos"] }
4748
shield-leptos.workspace = true
4849
shield-leptos-axum = { workspace = true, features = [
4950
"utoipa",

examples/leptos-axum/src/home.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use leptos::{either::Either, prelude::*};
22
use leptos_router::components::A;
3-
use shield_leptos::integration::LeptosUser;
3+
use shield_leptos::LeptosUser;
44

55
#[server]
66
pub async fn user() -> Result<Option<LeptosUser>, ServerFnError> {
7-
use shield_leptos::context::extract_user;
7+
use shield_leptos::extract_user;
88

99
Ok(extract_user().await)
1010
}

packages/core/shield/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ futures.workspace = true
2020
serde = { workspace = true, features = ["derive"] }
2121
serde_json.workspace = true
2222
thiserror.workspace = true
23+
tracing.workspace = true
2324
utoipa = { workspace = true, optional = true }

packages/core/shield/src/action.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
use std::any::Any;
22

33
use async_trait::async_trait;
4+
use serde::{Deserialize, Serialize};
45

56
use crate::{
67
error::ShieldError, form::Form, provider::Provider, request::Request, response::Response,
78
session::Session,
89
};
910

11+
// TODO: Think of a better name.
12+
#[derive(Clone, Debug, Deserialize, Serialize)]
13+
pub struct ActionForms {
14+
pub id: String,
15+
pub name: String,
16+
pub forms: Vec<Form>,
17+
}
18+
1019
#[async_trait]
1120
pub trait Action<P: Provider>: ErasedAction + Send + Sync {
1221
fn id(&self) -> String;

packages/core/shield/src/shield.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use std::{any::Any, collections::HashMap, sync::Arc};
22

33
use futures::future::try_join_all;
4+
use tracing::warn;
45

56
use crate::{
6-
Session, error::ShieldError, form::Form, method::ErasedMethod, options::ShieldOptions,
7-
storage::Storage, user::User,
7+
action::ActionForms, error::ShieldError, method::ErasedMethod, options::ShieldOptions,
8+
session::Session, storage::Storage, user::User,
89
};
910

1011
#[derive(Clone)]
@@ -68,14 +69,23 @@ impl<U: User> Shield<U> {
6869
&self,
6970
action_id: &str,
7071
session: Session,
71-
) -> Result<Vec<Form>, ShieldError> {
72+
) -> Result<ActionForms, ShieldError> {
73+
let mut action_name = None::<String>;
7274
let mut forms = vec![];
7375

7476
for (_, method) in self.methods.iter() {
7577
let Some(action) = method.erased_action_by_id(action_id) else {
7678
continue;
7779
};
7880

81+
let name = action.erased_name();
82+
if let Some(action_name) = &action_name {
83+
if *action_name != name {
84+
warn!("Action name mismatch `{}` != `{}`", action_name, name);
85+
}
86+
}
87+
action_name = Some(name);
88+
7989
for provider in method.erased_providers().await? {
8090
if !action.erased_condition(&*provider, session.clone())? {
8191
continue;
@@ -87,7 +97,11 @@ impl<U: User> Shield<U> {
8797
}
8898
}
8999

90-
Ok(forms)
100+
Ok(ActionForms {
101+
id: action_id.to_owned(),
102+
name: action_name.unwrap_or(action_id.to_owned()),
103+
forms,
104+
})
91105
}
92106
}
93107

packages/core/shield/src/shield_dyn.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use std::{any::Any, sync::Arc};
22

33
use async_trait::async_trait;
44

5-
use crate::{Session, error::ShieldError, form::Form, shield::Shield, user::User};
5+
use crate::{
6+
action::ActionForms, error::ShieldError, session::Session, shield::Shield, user::User,
7+
};
68

79
#[async_trait]
810
pub trait DynShield: Send + Sync {
@@ -12,7 +14,7 @@ pub trait DynShield: Send + Sync {
1214
&self,
1315
action_id: &str,
1416
session: Session,
15-
) -> Result<Vec<Form>, ShieldError>;
17+
) -> Result<ActionForms, ShieldError>;
1618
}
1719

1820
#[async_trait]
@@ -25,7 +27,7 @@ impl<U: User> DynShield for Shield<U> {
2527
&self,
2628
action_id: &str,
2729
session: Session,
28-
) -> Result<Vec<Form>, ShieldError> {
30+
) -> Result<ActionForms, ShieldError> {
2931
self.action_forms(action_id, session).await
3032
}
3133
}
@@ -45,7 +47,7 @@ impl ShieldDyn {
4547
&self,
4648
action_id: &str,
4749
session: Session,
48-
) -> Result<Vec<Form>, ShieldError> {
50+
) -> Result<ActionForms, ShieldError> {
4951
self.0.action_forms(action_id, session).await
5052
}
5153
}

packages/integrations/shield-dioxus/src/routes/action.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use dioxus::prelude::*;
2-
use shield::Form;
2+
use shield::ActionForms;
33

4-
use crate::{DioxusIntegrationDyn, form::ToRsx};
4+
use crate::{DioxusIntegrationDyn, ErasedDioxusStyle};
55

66
#[derive(Clone, PartialEq, Props)]
77
pub struct ActionProps {
@@ -15,20 +15,19 @@ pub fn Action(props: ActionProps) -> Element {
1515

1616
move || forms(action_id.clone())
1717
})?;
18+
let style = use_context::<ErasedDioxusStyle>();
1819

1920
let response_read = response.read();
2021
let response = response_read.as_ref().unwrap();
2122

2223
match response {
23-
Ok(forms) => rsx! {
24-
{forms.iter().map(ToRsx::to_rsx)}
25-
},
24+
Ok(forms) => style.render(forms),
2625
Err(err) => rsx! { "{err}" },
2726
}
2827
}
2928

3029
#[server]
31-
async fn forms(action_id: String) -> Result<Vec<Form>, ServerFnError> {
30+
async fn forms(action_id: String) -> Result<ActionForms, ServerFnError> {
3231
let FromContext(integration): FromContext<DioxusIntegrationDyn> = extract().await?;
3332
let shield = integration.extract_shield().await;
3433
let session = integration.extract_session().await;

0 commit comments

Comments
 (0)