fix: fixed crash on (some) page loads
This commit is contained in:
parent
5d0e4fb784
commit
e388b2eefa
@ -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 />
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user