use matrix_sdk::ruma::{OwnedRoomId, OwnedUserId};
#[derive(Clone, Debug, PartialEq)]
pub enum CallType {
Voice,
Video,
}
#[derive(Clone, Debug, PartialEq)]
pub enum CallDirection {
Outgoing,
Incoming,
}
#[derive(Clone, Debug, PartialEq)]
pub enum CallStatus {
Idle,
Ringing(CallDirection),
Connecting,
InCall,
Ended(CallEndReason),
}
#[derive(Clone, Debug, PartialEq)]
pub enum CallEndReason {
HungUp,
Declined,
Timeout,
Error(String),
RemoteHangup,
}
#[derive(Clone, Debug, PartialEq)]
pub struct CallParticipant {
pub user_id: OwnedUserId,
pub display_name: String,
pub avatar_url: Option<String>,
pub is_muted: bool,
pub is_video_muted: bool,
pub is_screen_sharing: bool,
pub is_speaking: bool,
}
#[derive(Clone, Debug)]
pub struct CallState {
pub status: CallStatus,
pub room_id: Option<OwnedRoomId>,
pub call_type: CallType,
pub is_muted: bool,
pub is_video_enabled: bool,
pub is_screen_sharing: bool,
pub duration_secs: u64,
pub call_id: Option<String>,
pub participants: Vec<CallParticipant>,
pub is_on_hold: bool,
pub is_group_call: bool,
pub widget_url: Option<String>,
}
impl Default for CallState {
fn default() -> Self {
Self {
status: CallStatus::Idle,
room_id: None,
call_type: CallType::Voice,
is_muted: false,
is_video_enabled: false,
is_screen_sharing: false,
duration_secs: 0,
call_id: None,
participants: Vec::new(),
is_on_hold: false,
is_group_call: false,
widget_url: None,
}
}
}
impl CallState {
pub fn is_active(&self) -> bool {
!matches!(self.status, CallStatus::Idle | CallStatus::Ended(_))
}
pub fn format_duration(&self) -> String {
let mins = self.duration_secs / 60;
let secs = self.duration_secs % 60;
format!("{mins:02}:{secs:02}")
}
}