Skip to content

Instantly share code, notes, and snippets.

@theViz343
Last active September 28, 2023 02:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save theViz343/dcfe54ffaafdcb0f637200b77958df41 to your computer and use it in GitHub Desktop.
Save theViz343/dcfe54ffaafdcb0f637200b77958df41 to your computer and use it in GitHub Desktop.
Final work product for my summer at Zulip participating in Google Summer Of Code '23.

Google Summer of Code 2023 with Zulip - Work Product

This is a summary of all the work I did for the Zulip Terminal client while participating in the GSoC 2023 program.

🗒️ Project Information

🎯 Goals

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

Merged Pull Requests

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 of RealmUserEventPerson.
  • 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 return None if topic stays same.
  • 92e43e8 model: Add in-stream wrap-around behavior to next unread topic behavior.

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 to helper.py.
  • 1705152 model/helper: Update sort_unread_topics method to use stream panel order.

Open Pull Requests

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.

🕛 Future Work

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.

🌠 Acknowledgements

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!

🌅 Post GSoC

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

  1. 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).

  2. 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment