Skip to main content

dioxus_clerk/components/
signed_in.rs

1use crate::context::use_clerk_context;
2use dioxus::prelude::*;
3
4/// Render children when a signed-in session is known.
5///
6/// # Example
7///
8/// ```no_run
9/// use dioxus::prelude::*;
10/// use dioxus_clerk::*;
11///
12/// #[component]
13/// fn AccountNav() -> Element {
14///     rsx! {
15///         SignedIn { UserButton {} }
16///     }
17/// }
18/// ```
19#[component]
20pub fn SignedIn(
21    /// Whether a session with pending after-auth tasks is treated as signed
22    /// out. clerk-js's default is `true`; set `false` to render children for a
23    /// pending session (for example to host its task UI). Mirrors Clerk React's
24    /// `treatPendingAsSignedOut`.
25    #[props(default = true)]
26    treat_pending_as_signed_out: bool,
27    children: Element,
28) -> Element {
29    let ctx = use_clerk_context();
30    let auth = ctx.auth.read();
31    if auth
32        .resolve_pending(treat_pending_as_signed_out)
33        .should_render_signed_in()
34    {
35        rsx! { {children} }
36    } else {
37        rsx! {}
38    }
39}
40
41/// Render children only after clerk-js has loaded and auth resolved to signed in.
42///
43/// The loading-aware counterpart to [`SignedIn`], mirroring
44/// [`crate::SignedOutWhenLoaded`]. This is useful in fullstack/SSR apps that
45/// render before clerk-js has finished resolving the browser session: use
46/// `fallback` for the interim (for example an avatar skeleton) and render
47/// [`crate::ClerkFailed`] or [`crate::use_clerk_error`] nearby for failures.
48///
49/// # Example
50///
51/// ```no_run
52/// use dioxus::prelude::*;
53/// use dioxus_clerk::*;
54///
55/// #[component]
56/// fn AccountNav() -> Element {
57///     rsx! {
58///         SignedInWhenLoaded {
59///             fallback: rsx! { span { "Checking auth..." } },
60///             UserButton {}
61///         }
62///     }
63/// }
64/// ```
65#[component]
66pub fn SignedInWhenLoaded(
67    /// Rendered while clerk-js is loading and no resolved signed-out state is known.
68    #[props(default = rsx! {})]
69    fallback: Element,
70    /// Whether a session with pending after-auth tasks is treated as signed
71    /// out. See [`SignedIn`].
72    #[props(default = true)]
73    treat_pending_as_signed_out: bool,
74    children: Element,
75) -> Element {
76    let ctx = use_clerk_context();
77    let auth = ctx.auth.read();
78    let auth = auth.resolve_pending(treat_pending_as_signed_out);
79    let load_error = ctx.load_error.read();
80
81    if auth.is_loaded() && auth.should_render_signed_in() {
82        rsx! { {children} }
83    } else if !auth.is_loaded() && !auth.should_render_signed_out() && load_error.is_none() {
84        fallback
85    } else {
86        rsx! {}
87    }
88}