Skip to content

Commit 6a83464

Browse files
committed
fix: Drawer cannot be closed when the placement is changed
1 parent 1dbe00b commit 6a83464

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

demo/src/components/syntect-css.css

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
/** https://github.com/AmjadHD/sublime_one_theme */
22

3+
.syntect-comment {
4+
font-style: italic;
5+
color: hsl(220, 10%, 40%);
6+
}
7+
38
/** light */
49

510
.color-scheme--light .syntect-support.syntect-function,

demo_markdown/docs/drawer/mod.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ let show = create_rw_signal(false);
55
let placement = create_rw_signal(DrawerPlacement::Top);
66

77
let open = Callback::new(move |new_placement: DrawerPlacement| {
8+
// Note: Since `show` changes are made in real time,
9+
// please put it in front of `show.set(true)` when changing `placement`.
810
placement.set(new_placement);
911
show.set(true);
1012
});

thaw/src/components/css_transition/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub fn CSSTransition<T, CF, IV>(
77
#[prop(into)] show: MaybeSignal<bool>,
88
#[prop(into)] name: MaybeSignal<String>,
99
#[prop(optional, into)] on_enter: Option<Callback<()>>,
10+
#[prop(optional, into)] on_after_enter: Option<Callback<()>>,
1011
#[prop(optional, into)] on_after_leave: Option<Callback<()>>,
1112
children: CF,
1213
) -> impl IntoView
@@ -28,6 +29,9 @@ where
2829
match class {
2930
RemoveClassName::Enter(active, to) => {
3031
let _ = class_list.remove_2(&active, &to);
32+
if let Some(on_after_enter) = on_after_enter {
33+
on_after_enter.call(());
34+
}
3135
}
3236
RemoveClassName::Leave(active, to) => {
3337
let _ = class_list.remove_2(&active, &to);

thaw/src/drawer/mod.rs

+18-2
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,29 @@ pub fn Drawer(
4040
let mask_ref = NodeRef::<html::Div>::new();
4141
let drawer_ref = NodeRef::<html::Div>::new();
4242

43+
let is_css_transition = RwSignal::new(false);
44+
let placement = Memo::new(move |_| {
45+
if is_css_transition.get() {
46+
placement.get_untracked().as_str()
47+
} else {
48+
placement.get_untracked().as_str()
49+
}
50+
});
51+
let on_after_enter = move |_| {
52+
is_css_transition.set(false);
53+
};
54+
4355
let is_lock = RwSignal::new(show.get_untracked());
4456
Effect::new(move |_| {
4557
if show.get() {
4658
is_lock.set(true);
59+
is_css_transition.set(true);
4760
}
4861
});
4962
use_lock_html_scroll(is_lock.into());
5063
let on_after_leave = move |_| {
5164
is_lock.set(false);
65+
is_css_transition.set(false);
5266
};
5367

5468
view! {
@@ -70,15 +84,17 @@ pub fn Drawer(
7084
node_ref=drawer_ref
7185
show=show.signal()
7286
name=Memo::new(move |_| {
73-
format!("slide-in-from-{}-transition", placement.get().as_str())
87+
format!("slide-in-from-{}-transition", placement.get())
7488
})
89+
90+
on_after_enter
7591
on_after_leave
7692
let:display
7793
>
7894
<div
7995
class=class_list![
8096
"thaw-drawer", move || format!("thaw-drawer--placement-{}", placement
81-
.get().as_str()), class.map(| c | move || c.get())
97+
.get()), class.map(| c | move || c.get())
8298
]
8399

84100
style=move || display.get()

0 commit comments

Comments
 (0)