@@ -4,7 +4,8 @@ use anyhow::{Context, Result};
44use matrix_sdk:: {
55 event_cache:: paginator:: PaginatorError ,
66 room:: { power_levels:: RoomPowerLevelChanges , Room as SdkRoom , RoomMemberRole } ,
7- ComposerDraft , RoomHero as SdkRoomHero , RoomMemberships , RoomState ,
7+ ComposerDraft as SdkComposerDraft , ComposerDraftType as SdkComposerDraftType ,
8+ RoomHero as SdkRoomHero , RoomMemberships , RoomState ,
89} ;
910use matrix_sdk_ui:: timeline:: { PaginationError , RoomExt , TimelineFocus } ;
1011use mime:: Mime ;
@@ -677,12 +678,12 @@ impl Room {
677678 /// Store the given `ComposerDraft` in the state store using the current
678679 /// room id, as identifier.
679680 pub async fn save_composer_draft ( & self , draft : ComposerDraft ) -> Result < ( ) , ClientError > {
680- Ok ( self . inner . save_composer_draft ( draft) . await ?)
681+ Ok ( self . inner . save_composer_draft ( draft. try_into ( ) ? ) . await ?)
681682 }
682683
683684 /// Retrieve the `ComposerDraft` stored in the state store for this room.
684685 pub async fn load_composer_draft ( & self ) -> Result < Option < ComposerDraft > , ClientError > {
685- Ok ( self . inner . load_composer_draft ( ) . await ?)
686+ Ok ( self . inner . load_composer_draft ( ) . await ?. map ( Into :: into ) )
686687 }
687688
688689 /// Remove the `ComposerDraft` stored in the state store for this room.
@@ -848,3 +849,72 @@ impl From<RtcApplicationType> for notify::ApplicationType {
848849 }
849850 }
850851}
852+
853+ /// Current draft of the composer for the room.
854+ #[ derive( uniffi:: Record ) ]
855+ pub struct ComposerDraft {
856+ /// The draft content in plain text.
857+ pub plain_text : String ,
858+ /// If the message is formatted in HTML, the HTML representation of the
859+ /// message.
860+ pub html_text : Option < String > ,
861+ /// The type of draft.
862+ pub draft_type : ComposerDraftType ,
863+ }
864+
865+ impl From < SdkComposerDraft > for ComposerDraft {
866+ fn from ( value : SdkComposerDraft ) -> Self {
867+ let SdkComposerDraft { plain_text, html_text, draft_type } = value;
868+ Self { plain_text, html_text, draft_type : draft_type. into ( ) }
869+ }
870+ }
871+
872+ impl TryFrom < ComposerDraft > for SdkComposerDraft {
873+ type Error = ruma:: IdParseError ;
874+
875+ fn try_from ( value : ComposerDraft ) -> std:: result:: Result < Self , Self :: Error > {
876+ let ComposerDraft { plain_text, html_text, draft_type } = value;
877+ Ok ( Self { plain_text, html_text, draft_type : draft_type. try_into ( ) ? } )
878+ }
879+ }
880+
881+ /// The type of draft of the composer.
882+ #[ derive( uniffi:: Enum ) ]
883+ pub enum ComposerDraftType {
884+ /// The draft is a new message.
885+ NewMessage ,
886+ /// The draft is a reply to an event.
887+ Reply {
888+ /// The ID of the event being replied to.
889+ event_id : String ,
890+ } ,
891+ /// The draft is an edit of an event.
892+ Edit {
893+ /// The ID of the event being edited.
894+ event_id : String ,
895+ } ,
896+ }
897+
898+ impl From < SdkComposerDraftType > for ComposerDraftType {
899+ fn from ( value : SdkComposerDraftType ) -> Self {
900+ match value {
901+ SdkComposerDraftType :: NewMessage => Self :: NewMessage ,
902+ SdkComposerDraftType :: Reply { event_id } => Self :: Reply { event_id : event_id. into ( ) } ,
903+ SdkComposerDraftType :: Edit { event_id } => Self :: Edit { event_id : event_id. into ( ) } ,
904+ }
905+ }
906+ }
907+
908+ impl TryFrom < ComposerDraftType > for SdkComposerDraftType {
909+ type Error = ruma:: IdParseError ;
910+
911+ fn try_from ( value : ComposerDraftType ) -> std:: result:: Result < Self , Self :: Error > {
912+ let draft_type = match value {
913+ ComposerDraftType :: NewMessage => Self :: NewMessage ,
914+ ComposerDraftType :: Reply { event_id } => Self :: Reply { event_id : event_id. try_into ( ) ? } ,
915+ ComposerDraftType :: Edit { event_id } => Self :: Edit { event_id : event_id. try_into ( ) ? } ,
916+ } ;
917+
918+ Ok ( draft_type)
919+ }
920+ }
0 commit comments