Skip to content

Commit

Permalink
fix: class overwrites class when updating signal values (#46)
Browse files Browse the repository at this point in the history
* fix: class overwrites class when updating signal values

* fix:  class rendering of ssr mode
  • Loading branch information
luoxiaozero authored Dec 12, 2023
1 parent 69dd0c5 commit 5fa0929
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 11 deletions.
15 changes: 12 additions & 3 deletions src/alert/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
mod theme;

use crate::{theme::use_theme, utils::mount_style, Icon, Theme};
#[cfg(not(feature = "ssr"))]
use crate::utils::dyn_classes;
use crate::{
theme::use_theme,
utils::{mount_style, ssr_class},
Icon, Theme,
};
use icondata::AiIcon;
use leptos::*;
pub use theme::AlertTheme;
Expand Down Expand Up @@ -79,9 +85,12 @@ pub fn Alert(
}
.into()
});

let ssr_class = ssr_class(&class);
view! {
<div
class=move || class.get()
<div
class=ssr_class
use:dyn_classes=class
class:thaw-alert=true
style=move || css_vars.get()>
<Icon icon class="thaw-alert__icon"/>
Expand Down
6 changes: 3 additions & 3 deletions src/auto_complete/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
mod theme;

use crate::utils::{dyn_classes, ssr_class};
use crate::{
components::{Binder, Follower, FollowerPlacement, FollowerWidth},
use_theme,
Expand Down Expand Up @@ -108,9 +109,10 @@ pub fn AutoComplete(
}
};

let ssr_class = ssr_class(&class);
view! {
<Binder target_ref=auto_complete_ref>
<div class=move || class.get() class:thaw-auto-complete=true ref=auto_complete_ref on:keydown=on_keydown>
<div class=ssr_class use:dyn_classes=class class:thaw-auto-complete=true ref=auto_complete_ref on:keydown=on_keydown>
<Input
value
placeholder
Expand Down Expand Up @@ -194,5 +196,3 @@ pub fn AutoComplete(
</Binder>
}
}


12 changes: 10 additions & 2 deletions src/avatar/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
mod theme;

use crate::{use_theme, utils::mount_style, Theme};
#[cfg(not(feature = "ssr"))]
use crate::utils::dyn_classes;
use crate::{
use_theme,
utils::{mount_style, ssr_class},
Theme,
};
use leptos::*;
pub use theme::AvatarTheme;

Expand Down Expand Up @@ -28,8 +34,10 @@ pub fn Avatar(
css_vars
});
mount_style("avatar", include_str!("./avatar.css"));

let ssr_class = ssr_class(&class);
view! {
<span class=move || class.get() class:thaw-avatar=true style=move || css_vars.get()>
<span class=ssr_class use:dyn_classes=class class:thaw-avatar=true style=move || css_vars.get()>
{move || {
let src = src.get();
(!src.is_empty()).then(|| view! { <img src=src/> })
Expand Down
10 changes: 7 additions & 3 deletions src/button/mod.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
mod button_group;
mod theme;

#[cfg(not(feature = "ssr"))]
use crate::utils::dyn_classes;
use crate::{
components::{OptionComp, Wave, WaveRef},
icon::*,
theme::*,
utils::{mount_style, ComponentRef},
utils::{mount_style, ssr_class, ComponentRef},
};
pub use button_group::ButtonGroup;
use leptos::*;
Expand Down Expand Up @@ -219,10 +221,12 @@ pub fn Button(
};
callback.call(event);
};


let ssr_class = ssr_class(&class);
view! {
<button
class=move || class.get()
class=ssr_class
use:dyn_classes=class
class:thaw-button=true
class=("thaw-button--solid", move || variant.get() == ButtonVariant::Solid)
class=("thaw-button--text", move || variant.get() == ButtonVariant::Text)
Expand Down
1 change: 1 addition & 0 deletions src/time_picker/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ fn Panel(
#[cfg(not(any(feature = "csr", feature = "hydrate")))]
{
_ = time_picker_ref;
_ = panel_ref;
}

let hour_ref = create_node_ref::<html::Div>();
Expand Down
37 changes: 37 additions & 0 deletions src/utils/dyn_classes.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
use cfg_if::cfg_if;
use leptos::{html::AnyElement, HtmlElement, MaybeSignal};

pub fn dyn_classes(el: HtmlElement<AnyElement>, classes_signal: MaybeSignal<String>) {
cfg_if! {
if #[cfg(feature = "ssr")] {
let _ = el;
let _ = classes_signal;
} else {
use leptos::SignalGet;
let _ = el.dyn_classes(move || {
let classes = classes_signal.get();
if classes.is_empty() {
return vec![];
}
classes
.split_ascii_whitespace()
.map(|class| class.to_string())
.collect::<Vec<String>>()
});
}
};
}

pub fn ssr_class(class: &MaybeSignal<String>) -> String {
let ssr_class;
cfg_if! {
if #[cfg(feature = "ssr")] {
use leptos::SignalGetUntracked;
ssr_class = class.get_untracked();
} else {
let _ = class;
ssr_class = String::new();
}
};
ssr_class
}
2 changes: 2 additions & 0 deletions src/utils/mod.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
// mod callback;
mod component_ref;
mod dyn_classes;
mod event_listener;
mod mount_style;
mod signal;
mod stored_maybe_signal;

// pub use callback::AsyncCallback;
pub(crate) use component_ref::ComponentRef;
pub(crate) use dyn_classes::*;
pub(crate) use event_listener::*;
pub(crate) use mount_style::mount_style;
pub use signal::SignalWatch;
Expand Down

0 comments on commit 5fa0929

Please sign in to comment.