diff --git a/web/sidebar/community-drawer-item-handler.react.js b/web/sidebar/community-drawer-item-handler.react.js new file mode 100644 index 000000000..a72ffed92 --- /dev/null +++ b/web/sidebar/community-drawer-item-handler.react.js @@ -0,0 +1,5 @@ +// @flow + +export type CommunityDrawerItemHandler = { + +onClick: (event: SyntheticEvent) => void, +}; diff --git a/web/sidebar/community-drawer-item-handlers.react.js b/web/sidebar/community-drawer-item-handlers.react.js new file mode 100644 index 000000000..eaeb4cc28 --- /dev/null +++ b/web/sidebar/community-drawer-item-handlers.react.js @@ -0,0 +1,70 @@ +// @flow + +import * as React from 'react'; +import { useDispatch } from 'react-redux'; + +import { + updateCalendarThreadFilter, + calendarThreadFilterTypes, +} from 'lib/types/filter-types.js'; +import type { ThreadInfo } from 'lib/types/thread-types'; + +import type { CommunityDrawerItemHandler } from './community-drawer-item-handler.react.js'; +import { useOnClickThread } from '../selectors/thread-selectors.js'; +import type { NavigationTab } from '../types/nav-types'; + +type HandlerProps = { + +setHandler: (handler: CommunityDrawerItemHandler) => void, + +threadInfo: ThreadInfo, +}; + +function ChatDrawerItemHandler(props: HandlerProps): React.Node { + const { setHandler, threadInfo } = props; + const onClick = useOnClickThread(threadInfo); + const handler = React.useMemo(() => ({ onClick }), [onClick]); + + React.useEffect(() => { + setHandler(handler); + }, [handler, setHandler]); + + return null; +} + +function CalendarDrawerItemHandler(props: HandlerProps): React.Node { + const { setHandler, threadInfo } = props; + const dispatch = useDispatch(); + + const onClick = React.useCallback( + () => + dispatch({ + type: updateCalendarThreadFilter, + payload: { + type: calendarThreadFilterTypes.THREAD_LIST, + threadIDs: [threadInfo.id], + }, + }), + [dispatch, threadInfo.id], + ); + const handler = React.useMemo(() => ({ onClick }), [onClick]); + + React.useEffect(() => { + setHandler(handler); + }, [handler, setHandler]); + + return null; +} + +const communityDrawerItemHandlers: { + +[tab: NavigationTab]: React.ComponentType, +} = Object.freeze({ + chat: ChatDrawerItemHandler, + calendar: CalendarDrawerItemHandler, +}); + +function getCommunityDrawerItemHandler( + tab: NavigationTab, +): React.ComponentType { + return communityDrawerItemHandlers[tab] ?? ChatDrawerItemHandler; +} + +export { getCommunityDrawerItemHandler };