fossdb-client 0.0.1

FossDB client
Documentation
use crate::api::{types::*, ApiClient};
use crate::hooks::storage::{LocalStorage, StorageKey};
use dioxus::prelude::*;

#[derive(Clone, Debug, PartialEq)]
pub struct AuthState {
    pub token: Option<String>,
    pub user: Option<UserResponse>,
}

impl Default for AuthState {
    fn default() -> Self {
        let token: Option<String> = LocalStorage::get(StorageKey::AuthToken);
        let user: Option<UserResponse> = LocalStorage::get(StorageKey::UserData);

        Self { token, user }
    }
}

#[derive(Copy, Clone)]
pub struct AuthContext {
    auth_state: Signal<AuthState>,
}

impl AuthContext {
    pub fn is_authenticated(&self) -> bool {
        self.auth_state.read().token.is_some()
    }

    pub fn token(&self) -> Option<String> {
        self.auth_state.read().token.clone()
    }

    pub fn user(&self) -> Option<UserResponse> {
        self.auth_state.read().user.clone()
    }

    pub fn login(&mut self, token: String, user: User) {
        let user_response = UserResponse::from(user);
        let _ = LocalStorage::set(StorageKey::AuthToken, &token);
        let _ = LocalStorage::set(StorageKey::UserData, &user_response);
        self.auth_state.write().token = Some(token.clone());
        self.auth_state.write().user = Some(user_response.clone());
    }

    pub fn logout(&mut self) {
        LocalStorage::remove(StorageKey::AuthToken);
        LocalStorage::remove(StorageKey::UserData);
        LocalStorage::remove(StorageKey::Subscriptions);
        self.auth_state.write().token = None;
        self.auth_state.write().user = None;
    }
}

pub fn use_auth() -> AuthContext {
    let auth_state = use_context::<Signal<AuthState>>();

    AuthContext { auth_state }
}

pub fn use_api_client() -> ApiClient {
    let auth = use_auth();
    ApiClient::new().with_token(auth.token())
}