This is a summary of all the work I did for the Zulip Terminal client while participating in the GSoC 2023 program.
- Title: Improving Zulip Terminal
- Organization: Zulip
- Repository: zulip-terminal
- Mentors: Neil Pilgrim and Hari Prashant
- My GitHub profile: theViz343
The main goal of this project was to improve the user experience of Zulip Terminal by porting features from Zulip web which were not already implemented in the terminal client. The features which were worked on include -
- supporting unsubscribed streams
- a revamped direct message side panel
- support for custom profile fields
- improving unread cycle algorithms.
🛠️ Contributions 1
The Zulip webapp supports additional custom user profile field data which can be interesting and fun. This PR introduced support for these fields to the Zulip Terminal client which only showed basic user information until this PR. To achieve this, the model
now stores the custom profile data for each user at startup, and uses event handlers to keep this data up-to-date. The fields are displayed alongside the basic user information in the UserInfo
popup. The PR also refactors the RealmUserEventPerson
to improve typing.
- 0ec7521 model/api_types/helper: Add
_clean_and_order_custom_profile_data
method. - b83384c model/api_types/helper: Include custom profile data in
get_user_info
. - f9a3862 refactor: api_types: Use
Union
to improve type ofRealmUserEventPerson
. - bc6bcbc model/api_types: Include custom profile data in
realm_user
update event. - 1241456 views: Update user info popup to display custom profile fields.
This PR improves the algorithm for the hotkey to cycle to the next unread topic to better suit user expectations. Previously, the algorithm ignores the user's current message state when determining the next topic to narrow to. This PR removes the use of the loosely-defined last_unread_topic
and introduces the use of the current topic
belonging to the current message the user is focused on. The PR also introduces in-stream wrap-around
behavior, similar to the web app. This means that the hotkey keeps cycling in the same stream until all (unmuted) unread topics in that stream have been read.
- b39e674 model: Add method to get stream topic from message id.
- 7fc646d model/views: Fetch next unread topic using current message state.
- 480a96f refactor: model/views: Rename
"get_next_unread_topic"
method. - b738342 model: Change
next_unread_topic
to returnNone
if topic stays same. - 92e43e8 model: Add
in-stream wrap-around
behavior to next unread topic behavior.
Use stream name instead of stream id to order unread topics in the next_unread_topic_from_message_id algorithm.
This PR is the successor to #T1356 and sorts the list of unread topics using stream name instead of stream id. This makes the order of moving between streams similar to that in the left panel. This change is needed since the current ordering, using stream id, does not feel intuitive and hard to keep track of.
- 6d0caba refactor: model/helper: Extract
unread_topics
sorting tohelper.py
. - 1705152 model/helper: Update
sort_unread_topics
method to use stream panel order.
This PR aims to add unsubscribed
and never_subscribed
streams to the Zulip Terminal model
which were previously unsupported. This will resolve the error which pops up when a user subscribes to and receives an unread message from a previously unsubscribed stream (issue #816). This PR is the third in a series of different PRs (#T1408 and #T1419) which aim to perform the stream_dict
refactor with different approaches. This PR creates accessor methods for stream keys name
and color
.
This PR adds event handling for (un)subscribe events. Without event handling, ZT crashes if the user narrows onto a message in a stream which is unsubscribed from. This happens mostly when a user is logged in from multiple clients, but can also occur if an admin unsubscribes the user. This directly builds on #T1408 and needs to be rebased on the newer PR #T1430.
This PR introduces the Hyperlink widget for message links in message information popups. This solves the issue of long urls being force-wrapped which results in them not being clickable from ZT. A followup to this would be to use this widget for displaying links in the messages themselves.
This PR adds a separate new panel for DMs
in the Zulip Terminal client. Navigating to a particular DM
is quite difficult and unordered. Therefore, a side panel similar to that in the web app for DMs
is required. This PR adds a toggleable left side panel view, switching between DMs
and streams
.
There is a lot of work left to do to make the Zulip Terminal client more accessible and feature-rich. Apart from this, issues that I initially planned to work on during GSoC got pushed back due to other work taking a significant portion of effort. I intend to get my open PRs merged, as well as work on adding a UI to un/subscribe to streams, further improve unread cycling by ordering according to topic recency, and work on the topic matching issues.
I am grateful to the Zulip community and Google for giving me the opportunity to work on such an interesting and fun project. I learned a lot during this summer, from writing tests to building terminal UI elements, and improved my programming skills while contributing to zulip-terminal. I would like to thank Neil Pilgrim and Hari Prashant for their mentorship and guidance, which helped me be an effective contributor to the project. Also, the Zulip community has been a wonderful group to be a part of. I've learnt a lot during this summer thanks to them!
I had a lot of fun during my summer at Zulip and I wish to be involved in the project after the program too. I intend to finish up my existing work and then take on new issues and help other new contributors to further improve the project.
Footnotes
-
The list of contributions includes PRs updated/reviewed during the community bonding period (May 4-28) as well as the coding period (May 29-September 25). ↩
-
This pull request was opened before the start of the official coding period, but a significant portion of the work on it was done during my GSoC 2023 project timeline. ↩ ↩2