use std::sync::Arc;
use as_variant::as_variant;
use matrix_sdk::{
Error,
send_queue::{AbstractProgress, SendHandle},
};
use ruma::{EventId, OwnedEventId, OwnedTransactionId};
use super::TimelineEventItemId;
#[derive(Debug, Clone)]
pub(in crate::timeline) struct LocalEventTimelineItem {
pub send_state: EventSendState,
pub transaction_id: OwnedTransactionId,
pub send_handle: Option<SendHandle>,
}
impl LocalEventTimelineItem {
pub(crate) fn identifier(&self) -> TimelineEventItemId {
if let Some(event_id) =
as_variant!(&self.send_state, EventSendState::Sent { event_id } => event_id)
{
TimelineEventItemId::EventId(event_id.clone())
} else {
TimelineEventItemId::TransactionId(self.transaction_id.clone())
}
}
pub fn event_id(&self) -> Option<&EventId> {
as_variant!(&self.send_state, EventSendState::Sent { event_id } => event_id)
}
pub fn with_send_state(&self, send_state: EventSendState) -> Self {
Self { send_state, ..self.clone() }
}
}
#[derive(Clone, Debug)]
pub enum EventSendState {
NotSentYet {
progress: Option<MediaUploadProgress>,
},
SendingFailed {
error: Arc<Error>,
is_recoverable: bool,
},
Sent {
event_id: OwnedEventId,
},
}
#[derive(Clone, Debug)]
pub struct MediaUploadProgress {
pub index: u64,
pub progress: AbstractProgress,
}