53 lines
1.4 KiB
Rust
53 lines
1.4 KiB
Rust
use std::sync::Arc;
|
|
|
|
use dioxus::prelude::*;
|
|
use matrix_sdk::Client as MatrixClient;
|
|
use tokio::sync::broadcast::Receiver;
|
|
use tokio::sync::mpsc::UnboundedSender;
|
|
|
|
use super::client::RoomEvent;
|
|
use super::worker_tasks::{LoginStyle, WorkerTask};
|
|
use crate::utils::oneshot;
|
|
|
|
pub struct Receivers {
|
|
pub room_receiver: RefCell<Receiver<RoomEvent>>,
|
|
}
|
|
|
|
impl Clone for Receivers {
|
|
fn clone(&self) -> Self {
|
|
Self {
|
|
room_receiver: RefCell::new(self.room_receiver.borrow().resubscribe()),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct Requester {
|
|
pub matrix_client: Arc<MatrixClient>,
|
|
pub tx: UnboundedSender<WorkerTask>,
|
|
pub receivers: Receivers,
|
|
}
|
|
|
|
impl Requester {
|
|
pub async fn init(&self) -> anyhow::Result<()> {
|
|
let (reply, mut response) = oneshot();
|
|
|
|
// TODO: Handle error case.
|
|
self.tx.send(WorkerTask::Init(reply)).unwrap();
|
|
match response.recv().await {
|
|
Some(result) => Ok(result),
|
|
None => Err(anyhow::Error::msg("TBD")),
|
|
}
|
|
}
|
|
|
|
pub async fn login(&self, style: LoginStyle) -> anyhow::Result<()> {
|
|
let (reply, mut response) = oneshot();
|
|
|
|
// TODO: Handle error case.
|
|
self.tx.send(WorkerTask::Login(style, reply)).unwrap();
|
|
match response.recv().await {
|
|
Some(result) => result,
|
|
None => Err(anyhow::Error::msg("TBD")),
|
|
}
|
|
}
|
|
}
|