use crate::auth_models::{AuthSession, AuthenticatedUser};
use leptos::prelude::*;
#[derive(Clone)]
pub struct AuthContext {
session: RwSignal<AuthSession>,
reload_token: RwSignal<u64>,
}
impl AuthContext {
pub fn session(&self) -> RwSignal<AuthSession> {
self.session
}
pub fn reload_token(&self) -> RwSignal<u64> {
self.reload_token
}
pub fn trigger_refresh(&self) {
self.reload_token
.update(|value| *value = value.wrapping_add(1));
}
}
pub fn provide_auth_context(initial: AuthSession) -> AuthContext {
let context = AuthContext {
session: RwSignal::new(initial),
reload_token: RwSignal::new(0),
};
provide_context(context.clone());
context
}
pub fn use_auth_context() -> AuthContext {
use_context::<AuthContext>().expect("AuthContext should be provided near the application root")
}
pub fn use_auth_state() -> Memo<AuthSession> {
let auth = use_auth_context();
let session = auth.session();
Memo::new(move |_| session.get())
}
pub fn use_authenticated_user() -> Memo<Option<AuthenticatedUser>> {
let auth = use_auth_context();
let session = auth.session();
Memo::new(move |_| session.with(|auth| auth.user().cloned()))
}