Linear issue: https://linear.app/comm/issue/ENG-2650/make-the-calendar-change-on-community-drawer-action
Pressing an item in the community drawer on web should result in different behaviour depending on the app the user has currently open. In chat it is supposed to open the corresponding chat. In calendar it is supposed to update the filters so that only the events of the corresponding chat are displayed. In Apps it is supposed to navigate back to the Chat tab and open the corresponding chat.
We took the following approach: we have a "map" from tab names to Handler components. The component takes a 'setHandler' function from its parent. The component performs some operations - like calling hooks, and creates a handler object. It then puts the handler object via setHandler in the parent component's state. This handler object is of CommunityDrawerItemHandlerSpec type, so it implements all functions that are needed by the drawer in each tab (that are specific to the tab).
Lastly - the access to this "map" of Handlers is gated by the getCommunityDrawerItemSpec function, because we assume there might be more apps in the future, and some of them (like Apps tab for now) might not want to have any custom behaviour defined for pressing a drawer item, but use the default - navigating to Chat tab and opening the corresponding chat.
getCommunityDrawerItemSpec function takes care of that "fallback", so that the calling code doesn't have to consider this.