fix: fixed crash on (some) page loads

This commit is contained in:
Andrew Rioux 2025-02-09 19:02:51 -05:00
parent 5d0e4fb784
commit e388b2eefa
Signed by: andrew.rioux
GPG Key ID: 9B8BAC47C17ABB94
2 changed files with 28 additions and 50 deletions

View File

@ -1,4 +1,4 @@
use leptos::prelude::*; use leptos::{either::Either, prelude::*};
use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title};
use leptos_router::{ use leptos_router::{
components::{A, ParentRoute, Route, Router, Routes}, components::{A, ParentRoute, Route, Router, Routes},
@ -71,22 +71,14 @@ pub fn App() -> impl IntoView {
let login = ServerAction::<Login>::new(); let login = ServerAction::<Login>::new();
let (user_res, set_user_res) = signal(None); let (user_res, set_user_res) = signal(None::<User>);
let user = Resource::new( let user = Resource::new(
move || { move || login.version().get(),
login.version().get() |_| async { me().await }
},
|_| async {
#[cfg(feature = "ssr")]
tracing::info!("Checking user account");
#[cfg(feature = "hydrate")]
leptos::logging::log!("Checking user account");
me().await
}
); );
#[cfg(feature = "hydrate")]
Effect::new(move || { Effect::new(move || {
let u = user.get(); let u = user.get();
set_user_res(u.map(|u2| u2.ok()).flatten().flatten()); set_user_res(u.map(|u2| u2.ok()).flatten().flatten());
@ -94,10 +86,6 @@ pub fn App() -> impl IntoView {
provide_context(user_res); provide_context(user_res);
Effect::new(move || {
leptos::logging::log!("User resource: {:?}", user.get());
});
crate::beacons::provide_beacon_resources(); crate::beacons::provide_beacon_resources();
view! { view! {
@ -109,37 +97,26 @@ pub fn App() -> impl IntoView {
<nav> <nav>
<h1>"Sparse control"</h1> <h1>"Sparse control"</h1>
<A href="/">"Home"</A> <A href="/">"Home"</A>
<Suspense fallback=|| ()> {move || match user_res.get() {
{move || user Some(_) => Either::Left(view! {
.get() <A href="/beacons">"Beacon management"</A>
.map(|err| err.ok()) <A href="/users">"Users"</A>
.flatten() <a
.flatten() href="#"
.map(|_| view! { on:click=move |_| {
<A href="/beacons">"Beacon management"</A> leptos::task::spawn_local(async move {
<A href="/users">"Users"</A> let _ = logout().await;
<a user.refetch();
href="#" });
on:click=move |_| { }
leptos::task::spawn_local(async move { >
let _ = logout().await; "Log out"
user.refetch(); </a>
}); }),
} None => Either::Right(view! {
> <A href="/login">"Log in"</A>
"Log out" })
</a> }}
})}
{move || user
.get()
.map(|err| err.ok())
.flatten()
.flatten()
.is_none()
.then(|| view! {
<A href="/login">"Log in"</A>
})}
</Suspense>
</nav> </nav>
<crate::beacons::BeaconSidebar /> <crate::beacons::BeaconSidebar />

View File

@ -262,11 +262,12 @@ async fn add_user(name: String, password: String) -> Result<(), ServerFnError> {
#[component] #[component]
pub fn UserView() -> impl IntoView { pub fn UserView() -> impl IntoView {
#[cfg(feature = "hydrate")]
Effect::new(move || { Effect::new(move || {
let user = expect_context::<ReadSignal<Option<User>>>(); let user = expect_context::<ReadSignal<Option<crate::users::User>>>();
if user.get().is_none() { if user.get().is_none() {
let navigate = leptos_router::hooks::use_navigate(); let navigate = leptos_router::hooks::use_navigate();
navigate("/login?next=users", Default::default()); navigate("/login?next=beacons", Default::default());
} }
}); });