Files
beau-gosse-du-92/src/base.rs
2024-05-18 22:00:28 +02:00

73 lines
2.8 KiB
Rust

use std::rc::Rc;
use dioxus::prelude::*;
use futures_util::stream::StreamExt;
use tracing::{debug, error, warn};
use crate::domain::model::account::Account;
use crate::domain::model::messaging_interface::AccountMessagingProviderInterface;
use crate::domain::model::session::Session;
use crate::infrastructure::messaging::matrix::client::Client;
use crate::infrastructure::messaging::matrix::worker_tasks::LoginStyle;
use crate::ui::store::Store;
pub async fn login(mut rx: UnboundedReceiver<bool>, session: &GlobalSignal<Session>) {
while let Some(is_logged) = rx.next().await {
error!("is_logged={is_logged}");
if !is_logged {
let homeserver_url = session.read().homeserver_url.clone();
let username = session.read().username.clone();
let password = session.read().password.clone();
if homeserver_url.is_some() && username.is_some() && password.is_some() {
let (requester, account_events_receiver) =
Client::spawn(homeserver_url.unwrap()).await;
if let Err(err) = requester.init().await {
error!("Following error occureds during client init: {}", err);
}
error!("Before login");
match requester
.login(LoginStyle::Password(username.unwrap(), password.unwrap()))
.await
{
Ok(_) => {
debug!("successfully logged");
session.write().is_logged = true;
let requester = Rc::new(requester);
dioxus::prelude::spawn(async move {
// ACCOUNT.write().set_messaging_provider(requester.clone());
ACCOUNT.write().set_messaging_provider(requester.clone());
let _ = requester
.run_forever(&*ACCOUNT.read(), account_events_receiver)
.await;
});
}
Err(err) => {
error!("Error during login: {err}");
// TODO: Handle invalid login
// invalid_login.modify(|_| true);
return;
}
}
} else {
warn!("At least one of the following values is/are invalid: homeserver, username or password");
}
} else {
warn!("already logged... skip login");
}
}
error!("=== LOGIN END ===");
}
pub static STORE: GlobalSignal<Store> = Signal::global(Store::new);
// TODO: Merge ACCOUNT and SESSION
pub static ACCOUNT: GlobalSignal<Account> = Signal::global(|| Account::new(&STORE));
pub static SESSION: GlobalSignal<Session> = Signal::global(Session::new);