diff --git a/web/chat/thread-menu.react.js b/web/chat/thread-menu.react.js
index 6712379b1..64c815b8e 100644
--- a/web/chat/thread-menu.react.js
+++ b/web/chat/thread-menu.react.js
@@ -1,105 +1,156 @@
// @flow
import {
faArrowRight,
faBell,
faCog,
+ faCommentAlt,
+ faPlusCircle,
faUserFriends,
} from '@fortawesome/free-solid-svg-icons';
import * as React from 'react';
import { childThreadInfos } from 'lib/selectors/thread-selectors';
-import { type ThreadInfo, threadTypes } from 'lib/types/thread-types';
+import { threadHasPermission } from 'lib/shared/thread-utils';
+import {
+ type ThreadInfo,
+ threadTypes,
+ threadPermissions,
+} from 'lib/types/thread-types';
import { useSelector } from '../redux/redux-utils';
import SWMansionIcon from '../SWMansionIcon.react';
import ThreadMenuItem from './thread-menu-item.react';
import css from './thread-menu.css';
type ThreadMenuProps = {
+threadInfo: ThreadInfo,
};
function ThreadMenu(props: ThreadMenuProps): React.Node {
const [isOpen, setIsOpen] = React.useState(false);
const { threadInfo } = props;
const membersItem = React.useMemo(() => {
if (threadInfo.type === threadTypes.PERSONAL) {
return null;
}
return ;
}, [threadInfo.type]);
const childThreads = useSelector(
state => childThreadInfos(state)[threadInfo.id],
);
const hasSidebars = React.useMemo(() => {
return childThreads?.some(
childThreadInfo => childThreadInfo.type === threadTypes.SIDEBAR,
);
}, [childThreads]);
const sidebarItem = React.useMemo(() => {
if (!hasSidebars) {
return null;
}
return (
);
}, [hasSidebars]);
+ const canCreateSubchannels = React.useMemo(
+ () => threadHasPermission(threadInfo, threadPermissions.CREATE_SUBCHANNELS),
+ [threadInfo],
+ );
+
+ const hasSubchannels = React.useMemo(() => {
+ return childThreads?.some(
+ childThreadInfo => childThreadInfo.type !== threadTypes.SIDEBAR,
+ );
+ }, [childThreads]);
+
+ const viewSubchannelsItem = React.useMemo(() => {
+ if (!hasSubchannels && !canCreateSubchannels) {
+ return null;
+ }
+ return (
+
+ );
+ }, [canCreateSubchannels, hasSubchannels]);
+
+ const createSubchannelsItem = React.useMemo(() => {
+ if (!canCreateSubchannels) {
+ return null;
+ }
+ return (
+
+ );
+ }, [canCreateSubchannels]);
+
const menuItems = React.useMemo(() => {
const settingsItem = (
);
const notificationsItem = (
);
- const items = [settingsItem, notificationsItem, membersItem, sidebarItem];
+ const items = [
+ settingsItem,
+ notificationsItem,
+ membersItem,
+ sidebarItem,
+ viewSubchannelsItem,
+ createSubchannelsItem,
+ ];
return items.filter(Boolean);
- }, [membersItem, sidebarItem]);
+ }, [membersItem, sidebarItem, viewSubchannelsItem, createSubchannelsItem]);
const closeMenuCallback = React.useCallback(() => {
document.removeEventListener('click', closeMenuCallback);
if (isOpen) {
setIsOpen(false);
}
}, [isOpen]);
React.useEffect(() => {
if (!document || !isOpen) {
return undefined;
}
document.addEventListener('click', closeMenuCallback);
return () => document.removeEventListener('click', closeMenuCallback);
}, [closeMenuCallback, isOpen]);
const switchMenuCallback = React.useCallback(() => {
setIsOpen(isMenuOpen => !isMenuOpen);
}, []);
if (menuItems.length === 0) {
return null;
}
let menuActionList = null;
if (isOpen) {
menuActionList = (
{menuItems}
);
}
return (
{menuActionList}
);
}
export default ThreadMenu;