-
Notifications
You must be signed in to change notification settings - Fork 37
Searching messages in a room (not encrypted) #483
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
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
Adds support for searching messages via the Matrix Search API and integrates UI hooks for initiating and clearing searches.
- Extends
MatrixRequest
withSearchMessages
and implements async handling, pagination, and UI signaling - Updates the room filter input bar to emit click events and clears the filter when switching rooms
- Introduces a new
room_search_result
module and wires it intolive_design
alongside related minor refactors and generics updates
Reviewed Changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.
Show a summary per file
File | Description |
---|---|
src/sliding_sync.rs | Implements SearchMessages request handling and task management |
src/shared/room_filter_input_bar.rs | Emits Click action and handles Clear in the filter bar |
src/home/rooms_list.rs | Adds is_room_encrypted flag and getters |
src/home/room_read_receipt.rs | Generalizes populate_read_receipts with Eventable |
src/home/new_message_context_menu.rs | Makes from_user_power_and_event generic |
src/home/mod.rs | Registers the new room_search_result module |
src/home/main_desktop_ui.rs | Clears filter input on room tab close |
src/event_preview.rs | Updates text_preview_of_other_state signature |
Cargo.toml | Pins ruma dependency for search API |
Comments suppressed due to low confidence (2)
src/home/new_message_context_menu.rs:249
- [nitpick] The
_generic
suffix on the function name is redundant and may be confusing. Consider renaming it back tofrom_user_power_and_event
now that it’s generic.
pub fn from_user_power_and_event_generic<T: Eventable, M: MsgTypeAble>(
src/sliding_sync.rs:1115
- [nitpick] There are no tests covering the new search workflow (including pagination and error paths). Consider adding unit tests or integration tests for
SearchMessages
handling.
MatrixRequest::SearchMessages { room_id, search_term, include_all_rooms, next_batch, abort_previous_search }
src/sliding_sync.rs
Outdated
} | ||
} | ||
}); | ||
register_core_task(CoreTask::Search, handle.abort_handle()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
handle
is a JoinHandle
, which does not expose an abort_handle()
method. You need to either store the JoinHandle
itself and call abort()
, or wrap the future in a cancelable AbortHandle
.
register_core_task(CoreTask::Search, handle.abort_handle()); | |
}, abort_registration); | |
let handle = Handle::current().spawn(abortable_future); | |
register_core_task(CoreTask::Search, abort_handle); |
Copilot uses AI. Check for mistakes.
src/home/main_desktop_ui.rs
Outdated
dock.close_tab(cx, tab_id); | ||
self.tab_to_close = None; | ||
self.open_rooms.remove(&tab_id); | ||
cx.widget_action(self.widget_uid(), &Scope::empty().path, RoomFilterAction::Clear); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] Using Scope::empty().path
may not target the filter widget correctly. You may need to reference the actual scope path where the RoomFilterInputBar
lives.
cx.widget_action(self.widget_uid(), &Scope::empty().path, RoomFilterAction::Clear); | |
cx.widget_action(self.widget_uid(), &scope.path, RoomFilterAction::Clear); |
Copilot uses AI. Check for mistakes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
May be there is better to use action()
if we dont want an actual Scope
rather than widget_action()
?
d5763a4
to
ca2ca78
Compare
a88c44b
to
4a7d12c
Compare
MUTED_2025-05-22.18-27-24.mp4Hi @alanpoon! This PR looks wonderful! I checked it out after your request to do so on #395 and found a few issues. The attached video walks through them (please skip to 0:19) Firstly, the initial start up sequence looks very different from what the program looks like when cloned from the original repo's main branch. Secondly, several icons seem to be missing too. I checked out the commits ahead of your branch on Third, the search feature itself seems to work! The only problem is that when you attempt to search all rooms while initiating a search in an encrypted room, it does not seem to search in any available unencrypted rooms either and simply tells me that searching unencrypted rooms is currently not supported. Furthermore, the little notification that tells me this seems to never go away, and just stays there in the top right corner. Perhaps that should be tweaked to disappear in a few seconds? One last thing is that the mermaid diagram you attached to the PR here makes sense, but I don't quite understand why there are 4 edges coming out of the For reference, the second video shows what Robrix looks like currently on Please note that in both cases, I gave Robrix my credentials through the CLI when using 2025-05-22.18-30-28.mp4Thank you! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your effort on this feature! I know it's quite complicated so I appreciate the work.
I like the new design that re-uses a lot of the RoomScreen/Message widgets and functions for the search panel. That's the right way of doing things.
I have one general question about a UI/UX design choice:
There is a lot of code scattered everywhere that seemingly exists only to hide the message search view when a room is deselected. Why? I don't think we should do that. You can make the code a lot simpler by always showing the search view, and making it default to searching only the current room (if one is selected/focused) or all rooms if none are selected.
I didn't exhaustively test everything yet. Before I do so, kindly ensure you have tested it thoroughly.
Also, please clean up and polish the UI a bit. The spacing of items looks a little bit messy/unprofessional. Keep in mind that we want Robrix to serve as the flagship example of a complex Makepad app, so it's important to spend the extra time to make the UI as perfect & beautiful as we can.
src/app.rs
Outdated
&Scope::default().path, | ||
StackNavigationAction::Push(live_id!(main_content_view)) | ||
); | ||
self.ui.view(id!(message_search_input_view)).set_visible(cx, true); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
for this (and the other two places where you call set_visible()
on message_search_input_view
), we ideally should not query and access/modify views or states that are far outside of the bounds of the current widget/module. That violates separation of concerns and typical best practices surrounding abstraction layers.
Instead, you should access the message_search_input_view
within the widget/module code where it is defined (or its immediate parent). You can do this in one of two ways:
- By creating a new actions (e.g.,
MessageSearchInputAction::Show
/Hide
) and emitting the appropriate action here. - By directly handling the existing actions (
RoomsListAction::Selected
,AppStateAction::RoomFocused
/FocusNone
) within the other widget or its parent.
In my opinion, #1 is much better because it is much more clear about expressing the intent of the action.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed. Previously Homescreen was just a view and couldn't handle action.
message_search_input_view = <View> { | ||
width: Fill, height: Fit, | ||
visible: false, | ||
align: {x: 1.0}, | ||
<CachedWidget> { | ||
message_search_input_bar = <MessageSearchInputBar> { | ||
width: 300, | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
don't we want the outer message_search_input_view
to be the CachedWidget itself, instead of the inner message_search_input_bar
? That way, the visibility state (whether it is currently visible) will automatically be preserved across changes in AdaptiveView from Mobile <--> Desktop.
I think that would simplify a lot of the code too. If you tried that already and it didn't work, or there is some other reason why that design is not desirable, please let me know.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The cachedWidget also cached the width of the width, causing a singleton for the width. I want the search input bar to display shorter in the mobile mode. So there is an extra view wrapper for that. Also the cached visibility is not useful as the search input bar should always appear at the room screen stack navigation view. While in the desktop, search input bar should not appear in the welcome screen.
src/home/room_screen.rs
Outdated
index.saturating_sub(2), | ||
index.saturating_sub(2).abs_diff(current_first_index) as f64 / SMOOTH_SCROLL_TIME, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unfortunately you cannot do this. I tried to do the same thing in some earlier code, and it breaks the smooth scroll functionality if any of the earlier messages (index-1
or index-2
) are really long. You won't be able to see the target message at index
if those messages are long enough to push it off-screen.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed to index.saturating_sub(1)
src/sliding_sync.rs
Outdated
} | ||
} | ||
items.push_back(right_panel::search_message::SearchResultItem::Event{ event: | ||
Box::new(event), formatted_content: Box::new(message_option)} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why are we boxing up these two states?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Clippy warns of large_enum_variant.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Change to using Arc
src/sliding_sync.rs
Outdated
room_id, | ||
search_term, | ||
include_all_rooms, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this request should just directly accept the v3::Criteria
type. All you're doing here is using 3 separate states (room ID, search keyword, and include all rooms boolean) to act as a worse version of the Criteria
struct.
The UI should be responsible for creating the Criteria
struct and passing it to this request handler background task. That offers two benefits:
- The UI can easily support more advanced criteria (both now, or in the future) without needing to change the backend.
- This task doesn't have to concern itself with configuring the search criteria properly.
You can keep the room_id
for the sake of convenience (for now), since we only support searching either one room or all rooms.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed self created Criteria struct.
Co-authored-by: Kevin Boos <[email protected]>
Co-authored-by: Kevin Boos <[email protected]>
Co-authored-by: Kevin Boos <[email protected]>
Co-authored-by: Kevin Boos <[email protected]>
Co-authored-by: Kevin Boos <[email protected]>
Co-authored-by: Kevin Boos <[email protected]>
130952f
to
da4c301
Compare
4f5552d
to
bef4f9b
Compare
bef4f9b
to
8144a44
Compare
9f40f3c
to
e541b3e
Compare
@smarizvi110 Hi, Could you also help to test this search feature? Search result is now being displayed at the right drawer. |
Screen.Recording.2025-07-26.at.11.24.11.AM.mov