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>, } 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, pub tx: UnboundedSender, 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")), } } }