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_router::{
components::{A, ParentRoute, Route, Router, Routes},
@ -71,22 +71,14 @@ pub fn App() -> impl IntoView {
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(
move || {
login.version().get()
},
|_| async {
#[cfg(feature = "ssr")]
tracing::info!("Checking user account");
#[cfg(feature = "hydrate")]
leptos::logging::log!("Checking user account");
me().await
}
move || login.version().get(),
|_| async { me().await }
);
#[cfg(feature = "hydrate")]
Effect::new(move || {
let u = user.get();
set_user_res(u.map(|u2| u2.ok()).flatten().flatten());
@ -94,10 +86,6 @@ pub fn App() -> impl IntoView {
provide_context(user_res);
Effect::new(move || {
leptos::logging::log!("User resource: {:?}", user.get());
});
crate::beacons::provide_beacon_resources();
view! {
@ -109,13 +97,8 @@ pub fn App() -> impl IntoView {
<nav>
<h1>"Sparse control"</h1>
<A href="/">"Home"</A>
<Suspense fallback=|| ()>
{move || user
.get()
.map(|err| err.ok())
.flatten()
.flatten()
.map(|_| view! {
{move || match user_res.get() {
Some(_) => Either::Left(view! {
<A href="/beacons">"Beacon management"</A>
<A href="/users">"Users"</A>
<a
@ -129,17 +112,11 @@ pub fn App() -> impl IntoView {
>
"Log out"
</a>
})}
{move || user
.get()
.map(|err| err.ok())
.flatten()
.flatten()
.is_none()
.then(|| view! {
}),
None => Either::Right(view! {
<A href="/login">"Log in"</A>
})}
</Suspense>
})
}}
</nav>
<crate::beacons::BeaconSidebar />

View File

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