Track logged in status and user as local resource instead of signal
This commit is contained in:
parent
f104a14f98
commit
2be665c549
@ -17,23 +17,11 @@ pub fn Personal() -> impl IntoView {
|
|||||||
#[component]
|
#[component]
|
||||||
pub fn Profile() -> impl IntoView {
|
pub fn Profile() -> impl IntoView {
|
||||||
let (dropdown_open, set_dropdown_open) = create_signal(false);
|
let (dropdown_open, set_dropdown_open) = create_signal(false);
|
||||||
let logged_in = create_rw_signal(false);
|
let user = create_local_resource(move || dropdown_open.get(), |_| async move { get_user().await });
|
||||||
// user signal is an option because the user may not be logged in
|
let logged_in = create_local_resource(move || dropdown_open.get(), |_| async move { get_user().await.is_ok() });
|
||||||
let user_signal = create_rw_signal(None);
|
|
||||||
|
|
||||||
let open_dropdown = move |_| {
|
let open_dropdown = move |_| {
|
||||||
spawn_local(async move {
|
set_dropdown_open.update(|value| *value = !*value);
|
||||||
let user = get_user().await;
|
|
||||||
if let Ok(user) = user {
|
|
||||||
logged_in.set(true);
|
|
||||||
user_signal.update(|value| {
|
|
||||||
*value = Some(user);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
logged_in.set(false);
|
|
||||||
}
|
|
||||||
set_dropdown_open.update(|value| *value = !*value);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
@ -43,11 +31,11 @@ pub fn Profile() -> impl IntoView {
|
|||||||
</div>
|
</div>
|
||||||
<div class="dropdown-container" style={move || if dropdown_open() {"display: flex"} else {"display: none"}}>
|
<div class="dropdown-container" style={move || if dropdown_open() {"display: flex"} else {"display: none"}}>
|
||||||
<Show
|
<Show
|
||||||
when=logged_in
|
when=move || logged_in.get().unwrap_or_default()
|
||||||
fallback=|| view!{
|
fallback=|| view!{
|
||||||
<DropDownNotLoggedIn />
|
<DropDownNotLoggedIn />
|
||||||
}>
|
}>
|
||||||
<DropDownLoggedIn user_signal=user_signal logged_in=logged_in></DropDownLoggedIn>
|
<DropDownLoggedIn logged_in=logged_in />
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -64,7 +52,7 @@ pub fn DropDownNotLoggedIn() -> impl IntoView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[component]
|
#[component]
|
||||||
pub fn DropDownLoggedIn(user_signal: RwSignal<Option<User>>, logged_in: RwSignal<bool>) -> impl IntoView {
|
pub fn DropDownLoggedIn(logged_in: Resource<bool, bool>) -> impl IntoView {
|
||||||
|
|
||||||
let logout = move |_| {
|
let logout = move |_| {
|
||||||
spawn_local(async move {
|
spawn_local(async move {
|
||||||
@ -73,7 +61,6 @@ pub fn DropDownLoggedIn(user_signal: RwSignal<Option<User>>, logged_in: RwSignal
|
|||||||
log!("Error logging out: {:?}", err);
|
log!("Error logging out: {:?}", err);
|
||||||
} else {
|
} else {
|
||||||
log!("Logged out successfully");
|
log!("Logged out successfully");
|
||||||
user_signal.update(|value| *value = None);
|
|
||||||
logged_in.set(false);
|
logged_in.set(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -82,15 +69,6 @@ pub fn DropDownLoggedIn(user_signal: RwSignal<Option<User>>, logged_in: RwSignal
|
|||||||
view! {
|
view! {
|
||||||
<div class="dropdown-logged">
|
<div class="dropdown-logged">
|
||||||
<h1>"Logged In"</h1>
|
<h1>"Logged In"</h1>
|
||||||
<div class="profile-info">
|
|
||||||
<h1>{move || user_signal.with(|user|
|
|
||||||
if let Some(user) = user {
|
|
||||||
user.username.clone()
|
|
||||||
} else {
|
|
||||||
"".to_string()
|
|
||||||
}
|
|
||||||
)}</h1>
|
|
||||||
</div>
|
|
||||||
<button on:click=logout class="auth-button">Log Out</button>
|
<button on:click=logout class="auth-button">Log Out</button>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user