Skip to content

feat: Add the @room feature #463

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
50 changes: 25 additions & 25 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

113 changes: 6 additions & 107 deletions src/home/editing_pane.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,11 @@ use matrix_sdk::{
},
};
use matrix_sdk_ui::timeline::{EventTimelineItem, TimelineEventItemId, TimelineItemContent};

use crate::{
shared::popup_list::enqueue_popup_notification,
sliding_sync::{MatrixRequest, submit_async_request},
};

use crate::room::room_member_manager::{RoomMemberSubscriber, RoomMemberSubscription};
use crate::shared::mentionable_text_input::MentionableTextInputWidgetExt;
use std::sync::{Arc, Mutex};

live_design! {
use link::theme::*;
Expand Down Expand Up @@ -167,52 +163,6 @@ struct EditingPaneInfo {
room_id: OwnedRoomId,
}

/// Actions specific to EditingPane for internal use
#[derive(Clone, Debug, DefaultNone)]
enum EditingPaneInternalAction {
/// Room members data has been updated
RoomMembersUpdated(Arc<Vec<matrix_sdk::room::RoomMember>>),
None,
}

/// Subscriber for EditingPane to receive room member updates
struct EditingPaneSubscriber {
widget_uid: WidgetUid,
current_room_id: Option<OwnedRoomId>,
}

/// Implement `RoomMemberSubscriber` trait, receive member update notifications
impl RoomMemberSubscriber for EditingPaneSubscriber {
fn on_room_members_updated(
&mut self,
cx: &mut Cx,
room_id: &OwnedRoomId,
members: Arc<Vec<matrix_sdk::room::RoomMember>>,
) {
if let Some(current_room_id) = &self.current_room_id {
if current_room_id == room_id {
// Log with stable identifier
log!(
"EditingPaneSubscriber({:?}) received members update for room {}",
self.widget_uid,
room_id
);

// cx.action(EditingPaneInternalAction::RoomMembersUpdated(members.clone()));
cx.widget_action(
self.widget_uid,
&Scope::empty().path,
EditingPaneInternalAction::RoomMembersUpdated(members),
);
}else{
log!("Ignoring update for different room {} (current: {})", room_id, current_room_id);
}
}


}
}

/// A view that slides in from the bottom of the screen to allow editing a message.
#[derive(Live, LiveHook, Widget)]
pub struct EditingPane {
Expand All @@ -225,8 +175,6 @@ pub struct EditingPane {
info: Option<EditingPaneInfo>,
#[rust]
is_animating_out: bool,
#[rust]
member_subscription: Option<RoomMemberSubscription>,
}

impl Widget for EditingPane {
Expand Down Expand Up @@ -264,23 +212,6 @@ impl Widget for EditingPane {
if let Event::Actions(actions) = event {
let edit_text_input = self.mentionable_text_input(id!(editing_content.edit_text_input)).text_input(id!(text_input));

// Check for room member update actions
for action in actions {

if let Some(widget_action) = action.as_widget_action().widget_uid_eq(self.widget_uid()) {
log!("Found widget action for my widget_uid: {:?}", self.widget_uid());
log!("Widget action type: {}", std::any::type_name_of_val(&widget_action));

if let Some(update_action) = widget_action.downcast_ref::<EditingPaneInternalAction>() {
if let EditingPaneInternalAction::RoomMembersUpdated(members) = update_action {
log!("EditingPane received EditingPaneInternalAction RoomMembersUpdated action with {} members", members.len());
self.handle_members_updated(members.clone());
}
continue;
}
}
}

// Hide the editing pane if the cancel button was clicked
// or if the `Escape` key was pressed within the edit text input.
if self.button(id!(cancel_button)).clicked(actions)
Expand Down Expand Up @@ -486,13 +417,16 @@ impl EditingPane {
}

/// Shows the editing pane and sets it up to edit the given `event`'s content.
pub fn show(&mut self, cx: &mut Cx, event_tl_item: EventTimelineItem, room_id: OwnedRoomId) {
pub fn show(&mut self, cx: &mut Cx, event_tl_item: EventTimelineItem, room_id: OwnedRoomId, can_notify_room: bool) {
if !event_tl_item.is_editable() {
enqueue_popup_notification("That message cannot be edited.".into());
return;
}

log!("EditingPane show: Opening editing pane for room: {}", room_id);

let edit_text_input = self.mentionable_text_input(id!(editing_content.edit_text_input));

match event_tl_item.content() {
TimelineItemContent::Message(message) => {
edit_text_input.set_text(cx, message.body());
Expand All @@ -508,9 +442,6 @@ impl EditingPane {

self.info = Some(EditingPaneInfo { event_tl_item, room_id: room_id.clone() });

// Create room member subscription
self.create_room_subscription(cx, room_id.clone());

self.visible = true;
self.button(id!(accept_button)).reset_hover(cx);
self.button(id!(cancel_button)).reset_hover(cx);
Expand All @@ -523,38 +454,6 @@ impl EditingPane {
self.animator_play(cx, id!(panel.show));
self.redraw(cx);
}

/// Create room member subscription for the editing pane
fn create_room_subscription(&mut self, cx: &mut Cx, room_id: OwnedRoomId) {
// Cancel previous subscription if any
self.member_subscription = None;

log!("Creating room member subscription for EditingPane, ID: {:?}", self.widget_uid());

// Create new subscriber
let subscriber = Arc::new(Mutex::new(EditingPaneSubscriber {
widget_uid: self.widget_uid(),
current_room_id: Some(room_id.clone()),
}));

// Create and save subscription
self.member_subscription = Some(RoomMemberSubscription::new(cx, room_id.clone(), subscriber));

submit_async_request(MatrixRequest::GetRoomMembers {
room_id,
memberships: matrix_sdk::RoomMemberships::JOIN,
local_only: false,
});
}

/// Handle room members update event
fn handle_members_updated(&mut self, members: Arc<Vec<matrix_sdk::room::RoomMember>>) {
if let Some(_info) = &self.info {
// Pass room member data to MentionableTextInput
let message_input = self.mentionable_text_input(id!(edit_text_input));
message_input.set_room_members(members);
}
}
}

impl EditingPaneRef {
Expand All @@ -580,11 +479,11 @@ impl EditingPaneRef {
}

/// See [`EditingPane::show()`].
pub fn show(&self, cx: &mut Cx, event_tl_item: EventTimelineItem, room_id: OwnedRoomId) {
pub fn show(&self, cx: &mut Cx, event_tl_item: EventTimelineItem, room_id: OwnedRoomId, can_notify_room: bool) {
let Some(mut inner) = self.borrow_mut() else {
return;
};
inner.show(cx, event_tl_item, room_id);
inner.show(cx, event_tl_item, room_id, can_notify_room);
}

/// Returns the event that is currently being edited, if any.
Expand Down
Loading