Skip to main content

dioxus_clerk/components/
redirect.rs

1use crate::options::RedirectOptions;
2use dioxus::prelude::*;
3
4/// Redirect signed-out users to Clerk's sign-in flow after clerk-js loads.
5///
6/// # Example
7///
8/// ```no_run
9/// use dioxus::prelude::*;
10/// use dioxus_clerk::*;
11///
12/// #[component]
13/// fn ProtectedPage() -> Element {
14///     rsx! {
15///         SignedOut { RedirectToSignIn {} }
16///         SignedIn { h1 { "Dashboard" } }
17///     }
18/// }
19/// ```
20#[component]
21pub fn RedirectToSignIn(
22    /// Always redirect here after sign-in.
23    #[props(into)]
24    force_redirect_url: Option<String>,
25    /// Fallback redirect URL after sign-in.
26    #[props(into)]
27    fallback_redirect_url: Option<String>,
28    /// Always redirect here after sign-up from sign-in.
29    #[props(into)]
30    sign_up_force_redirect_url: Option<String>,
31    /// Fallback redirect URL after sign-up from sign-in.
32    #[props(into)]
33    sign_up_fallback_redirect_url: Option<String>,
34    /// Advanced options forwarded to Clerk, as a
35    /// [`RedirectOptions`](crate::RedirectOptions) builder or a raw
36    /// `serde_json::Value`. Explicit props win when both set the same Clerk
37    /// option key.
38    #[props(default = RedirectOptions::from_value(serde_json::Value::Null), into)]
39    options: RedirectOptions,
40) -> Element {
41    let options = options
42        .maybe_force_redirect_url(force_redirect_url)
43        .maybe_fallback_redirect_url(fallback_redirect_url)
44        .maybe_sign_up_force_redirect_url(sign_up_force_redirect_url)
45        .maybe_sign_up_fallback_redirect_url(sign_up_fallback_redirect_url)
46        .into_value();
47
48    #[cfg(clerk_client)]
49    crate::lifecycle::use_redirect_to_sign_in(options.clone());
50    #[cfg(not(clerk_client))]
51    let _ = &options;
52    rsx! {}
53}
54
55/// Redirect signed-out users to Clerk's sign-up flow after clerk-js loads.
56#[component]
57pub fn RedirectToSignUp(
58    /// Always redirect here after sign-up.
59    #[props(into)]
60    force_redirect_url: Option<String>,
61    /// Fallback redirect URL after sign-up.
62    #[props(into)]
63    fallback_redirect_url: Option<String>,
64    /// Always redirect here after sign-in from sign-up.
65    #[props(into)]
66    sign_in_force_redirect_url: Option<String>,
67    /// Fallback redirect URL after sign-in from sign-up.
68    #[props(into)]
69    sign_in_fallback_redirect_url: Option<String>,
70    /// Advanced options forwarded to Clerk, as a
71    /// [`RedirectOptions`](crate::RedirectOptions) builder or a raw
72    /// `serde_json::Value`. Explicit props win when both set the same Clerk
73    /// option key.
74    #[props(default = RedirectOptions::from_value(serde_json::Value::Null), into)]
75    options: RedirectOptions,
76) -> Element {
77    let options = options
78        .maybe_force_redirect_url(force_redirect_url)
79        .maybe_fallback_redirect_url(fallback_redirect_url)
80        .maybe_sign_in_force_redirect_url(sign_in_force_redirect_url)
81        .maybe_sign_in_fallback_redirect_url(sign_in_fallback_redirect_url)
82        .into_value();
83
84    #[cfg(clerk_client)]
85    crate::lifecycle::use_redirect_to_sign_up(options.clone());
86    #[cfg(not(clerk_client))]
87    let _ = &options;
88    rsx! {}
89}