Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add sections to room header and user infos menus with menuV2 #29780

Merged
merged 78 commits into from
Aug 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
4780318
add sections to sidebar header menuV2 items
guijun13 Jul 5, 2023
9a6fbde
start the changes on user card menu
guijun13 Jul 6, 2023
750a7a4
add key for user card menu
guijun13 Jul 6, 2023
4323b4f
fix header menu types
guijun13 Jul 7, 2023
30f9031
complete user card menu changes
guijun13 Jul 7, 2023
90e9b22
start changes on useActionSpread hook
guijun13 Jul 10, 2023
3cb8442
refactoring useUserInfoActions
guijun13 Jul 11, 2023
e3f06e3
more changes on useuserInfoAction hook
guijun13 Jul 11, 2023
732356e
fix onClick for actions on usercard
guijun13 Jul 12, 2023
8089455
revert useActionSpread
guijun13 Jul 12, 2023
efc1f09
refactor actions on useUserInfoActions
guijun13 Jul 12, 2023
09e6f8c
add danger variant to remove room item
guijun13 Jul 13, 2023
d20ebe4
change to menuv2 on roomMembers user menu
guijun13 Jul 13, 2023
8c15b30
update userCard menu type and small changes
guijun13 Jul 13, 2023
dad258e
Merge branch 'develop' of https://github.com/RocketChat/Rocket.Chat i…
guijun13 Jul 13, 2023
d534e08
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 13, 2023
80d8aca
add type apps to header menu
guijun13 Jul 13, 2023
cb21fb2
change userInfoActions to menuV2
guijun13 Jul 14, 2023
09c22dc
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 14, 2023
97d32c6
add changeset
guijun13 Jul 14, 2023
a72d9b5
remove unused
guijun13 Jul 15, 2023
9fcea44
Merge branch 'feat/room-usercard-menus' of https://github.com/RocketC…
guijun13 Jul 15, 2023
c87015c
fix missing size for useUserInfoActions hook
guijun13 Jul 17, 2023
33efd1d
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 17, 2023
5985264
revert file
guijun13 Jul 17, 2023
36dd07c
fix e2e tests
guijun13 Jul 17, 2023
030fac4
add button prop to userInfoActions
guijun13 Jul 18, 2023
b2a0614
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 18, 2023
7ad1d13
update
guijun13 Jul 19, 2023
fab2c1c
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 19, 2023
035ed52
fix tests
guijun13 Jul 20, 2023
1989189
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 20, 2023
87730f7
fix tests again
guijun13 Jul 20, 2023
9704ffa
Merge branch 'feat/room-usercard-menus' of https://github.com/RocketC…
guijun13 Jul 20, 2023
7a16c95
fix tests
guijun13 Jul 20, 2023
6b1dcee
fix tests
guijun13 Jul 21, 2023
b3b5bc3
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 21, 2023
f6539f8
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 24, 2023
b287ea6
fix tests
guijun13 Jul 24, 2023
2c05e71
fix test
guijun13 Jul 24, 2023
41a30df
fix missing type on e2e
guijun13 Jul 24, 2023
1555071
Merge branch 'develop' into feat/room-usercard-menus
juliajforesti Jul 24, 2023
a13cd84
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 25, 2023
a54427c
Merge branch 'develop' into feat/room-usercard-menus
yash-rajpal Jul 26, 2023
5e8c566
fix room header toolbox menu filter
guijun13 Jul 28, 2023
18fe32d
fix userCard menu content prop
guijun13 Jul 28, 2023
9af3304
specify the types for item type prop
guijun13 Jul 28, 2023
3034deb
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 28, 2023
9ca1da4
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 31, 2023
31c1d8b
fix types
guijun13 Jul 31, 2023
8d293e5
merge develop
guijun13 Jul 31, 2023
ea86dcb
fix types
guijun13 Jul 31, 2023
4fe7b68
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Jul 31, 2023
f694d67
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 3, 2023
a270bac
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 3, 2023
e7fa9a5
fix apps items
guijun13 Aug 3, 2023
28a2b92
re-ordering room header items
guijun13 Aug 4, 2023
ec01ed4
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 4, 2023
b899146
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 4, 2023
3e49279
Merge branch 'feat/room-usercard-menus' of https://github.com/RocketC…
guijun13 Aug 4, 2023
654f4e9
fix type
guijun13 Aug 7, 2023
a672ade
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 7, 2023
6435378
fix type again
guijun13 Aug 7, 2023
f34c641
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 7, 2023
8236703
fix conflicts
guijun13 Aug 8, 2023
143943e
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 8, 2023
2df86cb
Merge branch 'develop' into feat/room-usercard-menus
gabriellsh Aug 10, 2023
e160db5
Fix e2e tests
gabriellsh Aug 10, 2023
4453b6c
Merge branch 'feat/room-usercard-menus' of github.com:RocketChat/Rock…
gabriellsh Aug 10, 2023
cb5f9f7
Merge branch 'develop' into feat/room-usercard-menus
gabriellsh Aug 14, 2023
6bd72f4
refactor
gabriellsh Aug 14, 2023
50dfbce
reset useAppActionButtons file
gabriellsh Aug 14, 2023
576efff
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 15, 2023
592cc3c
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 17, 2023
ad083c1
Merge branch 'develop' into feat/room-usercard-menus
guijun13 Aug 17, 2023
e9ebcf9
Merge branch 'develop' into feat/room-usercard-menus
kodiakhq[bot] Aug 18, 2023
e7645c2
Merge branch 'develop' into feat/room-usercard-menus
kodiakhq[bot] Aug 18, 2023
794b904
Merge branch 'develop' into feat/room-usercard-menus
scuciatto Aug 18, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/chilled-flies-fold.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@rocket.chat/meteor": patch
---

feat: add sections to room header and user infos menus with menuV2
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export const useAutotranslateRoomAction = () => {
tabComponent: AutoTranslate,
order: 20,
full: true,
type: 'customization',
};
}, [enabled, permitted]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export const useCleanHistoryRoomAction = () => {
}),
tabComponent: PruneMessages,
order: 250,
type: 'customization',
};
}, [federated, permitted, t]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export const useE2EERoomAction = () => {
icon: 'key',
order: 13,
action,
type: 'organization',
...(federated && {
tooltip: t('core.E2E_unavailable_for_federation'),
disabled: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export const useExportMessagesRoomAction = () => {
tabComponent: ExportMessages,
full: true,
order: 12,
type: 'communication',
};
}, [permitted]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const useKeyboardShortcutListRoomAction = () => {
icon: 'keyboard',
tabComponent: KeyboardShortcuts,
order: 99,
type: 'customization',
}),
[],
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const useMembersListRoomAction = () => {
title: team ? 'Teams_members' : 'Members',
icon: 'members',
tabComponent: MemberListRouter,
order: 5,
order: 7,
};
}, [broadcast, permittedToViewBroadcastMemberList, team]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ export const useMentionsRoomAction = () => {
title: 'Mentions',
icon: 'at',
tabComponent: MentionsTab,
order: 9,
order: 6,
type: 'organization',
}),
[],
);
Expand Down
1 change: 1 addition & 0 deletions apps/meteor/client/hooks/roomActions/useOTRRoomAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export const useOTRRoomAction = () => {
tabComponent: OTR,
order: 13,
full: true,
type: 'communication',
...(federated && {
tooltip: t('core.OTR_unavailable_for_federation'),
disabled: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ export const usePinnedMessagesRoomAction = () => {
tooltip: t('core.Pinned_messages_unavailable_for_federation'),
disabled: true,
}),
order: 11,
order: 9,
type: 'organization',
};
}, [enabled, federated, t]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ export const usePushNotificationsRoomAction = () => {
title: 'Notifications_Preferences',
icon: 'bell',
tabComponent: NotificationPreferences,
order: 8,
order: 11,
type: 'customization',
};
}, [capable]);
};
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const useRocketSearchRoomAction = () => {
title: 'Search_Messages',
icon: 'magnifier',
tabComponent: MessageSearchTab,
order: 6,
order: 5,
}),
[],
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const useStarredMessagesRoomAction = () => {
icon: 'star',
tabComponent: StarredMessagesTab,
order: 10,
type: 'organization',
}),
[],
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ export const useUploadedFilesListRoomAction = () => {
title: 'Files',
icon: 'clip',
tabComponent: RoomFiles,
order: 7,
order: 8,
type: 'organization',
};
}, []);
};
67 changes: 36 additions & 31 deletions apps/meteor/client/views/room/Header/RoomToolbox/RoomToolbox.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
import type { Box } from '@rocket.chat/fuselage';
import { Menu, Option } from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import { HeaderToolboxAction, HeaderToolboxDivider } from '@rocket.chat/ui-client';
import { useLayout, useTranslation } from '@rocket.chat/ui-contexts';
import type { ComponentProps } from 'react';
import React, { memo } from 'react';

import GenericMenu from '../../../../components/GenericMenu/GenericMenu';
import type { GenericMenuItemProps } from '../../../../components/GenericMenu/GenericMenuItem';
import { useRoomToolbox } from '../../contexts/RoomToolboxContext';
import type { RoomToolboxActionConfig } from '../../contexts/RoomToolboxContext';

type RoomToolboxProps = {
className?: ComponentProps<typeof Box>['className'];
};

type MenuActionsProps = {
id: string;
items: GenericMenuItemProps[];
}[];

const RoomToolbox = ({ className }: RoomToolboxProps) => {
const t = useTranslation();
const { roomToolboxExpanded } = useLayout();
Expand All @@ -23,22 +29,33 @@ const RoomToolbox = ({ className }: RoomToolboxProps) => {
const featuredActions = actions.filter((action) => action.featured);
const normalActions = actions.filter((action) => !action.featured);
const visibleActions = !roomToolboxExpanded ? [] : normalActions.slice(0, 6);
const hiddenActions: Record<string, RoomToolboxActionConfig> = Object.fromEntries(
(!roomToolboxExpanded ? actions : normalActions.slice(6))
.filter((item) => !item.disabled)
.map((item) => {
return [
item.id,
{
label: { title: t(item.title), icon: item.icon },
action: (): void => {
openTab(item.id);
},
...item,
},
];
}),
);

const hiddenActions = (!roomToolboxExpanded ? actions : normalActions.slice(6))
.filter((item) => !item.disabled && !item.featured)
.map((item) => ({
'key': item.id,
'content': t(item.title),
'onClick':
item.action ??
((): void => {
openTab(item.id);
}),
'data-qa-id': `ToolBoxAction-${item.icon}`,
...item,
}))
.reduce((acc, item) => {
const group = item.type ? item.type : '';
const section = acc.find((section: { id: string }) => section.id === group);
if (section) {
section.items.push(item);
return acc;
}

const newSection = { id: group, key: item.key, title: group === 'apps' ? t('Apps') : '', items: [item] };
acc.push(newSection);

return acc;
}, [] as MenuActionsProps);

const renderDefaultToolboxItem: RoomToolboxActionConfig['renderToolboxItem'] = useMutableCallback(
({ id, className, index, icon, title, toolbox: { tab }, action, disabled, tooltip }) => {
Expand Down Expand Up @@ -74,20 +91,8 @@ const RoomToolbox = ({ className }: RoomToolboxProps) => {
{featuredActions.map(mapToToolboxItem)}
{featuredActions.length > 0 && <HeaderToolboxDivider />}
{visibleActions.map(mapToToolboxItem)}
{(normalActions.length > 6 || !roomToolboxExpanded) && (
<Menu
data-qa-id='ToolBox-Menu'
tiny={roomToolboxExpanded}
title={t('Options')}
maxHeight='initial'
className={className}
aria-keyshortcuts='alt'
tabIndex={-1}
options={hiddenActions}
renderItem={({ label: { title, icon }, ...props }) => (
<Option label={title} icon={icon} data-qa-id={`ToolBoxAction-${icon}`} gap={!icon} {...props} />
)}
/>
{(normalActions.length > 6 || roomToolboxExpanded) && (
<GenericMenu title={t('Options')} data-qa-id='ToolBox-Menu' sections={hiddenActions} placement='bottom-end' />
)}
</>
);
Expand Down
30 changes: 12 additions & 18 deletions apps/meteor/client/views/room/UserCard/UserCardWithData.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { PositionAnimated, AnimatedVisibility, Menu, Option } from '@rocket.chat/fuselage';
import { PositionAnimated, AnimatedVisibility } from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import { useSetting, useRolesDescription } from '@rocket.chat/ui-contexts';
import { useSetting, useRolesDescription, useTranslation } from '@rocket.chat/ui-contexts';
import type { ReactElement, UIEvent } from 'react';
import React, { useMemo, useRef } from 'react';

import { getUserDisplayName } from '../../../../lib/getUserDisplayName';
import { Backdrop } from '../../../components/Backdrop';
import GenericMenu from '../../../components/GenericMenu/GenericMenu';
import LocalTime from '../../../components/LocalTime';
import UserCard from '../../../components/UserCard';
import { ReactiveUserStatus } from '../../../components/UserStatus';
import { useUserInfoQuery } from '../../../hooks/useUserInfoQuery';
import { useActionSpread } from '../../hooks/useActionSpread';
import { useUserInfoActions } from '../hooks/useUserInfoActions';

type UserCardWithDataProps = {
Expand All @@ -23,6 +23,7 @@ type UserCardWithDataProps = {
};

const UserCardWithData = ({ username, target, rid, open, onClose }: UserCardWithDataProps): ReactElement => {
const t = useTranslation();
const ref = useRef(target);
const getRoles = useRolesDescription();
const showRealNames = Boolean(useSetting('UI_Use_Real_Name'));
Expand Down Expand Up @@ -64,29 +65,22 @@ const UserCardWithData = ({ username, target, rid, open, onClose }: UserCardWith
onClose?.();
});

const userActions = useUserInfoActions({ _id: user._id ?? '', username: user.username }, rid);
const { actions: actionsDefinition, menu: menuOptions } = useActionSpread(userActions);
const { actions: actionsDefinition, menuActions: menuOptions } = useUserInfoActions(
{ _id: user._id ?? '', username: user.username },
rid,
);

const menu = useMemo(() => {
if (!menuOptions) {
return null;
}

return (
<Menu
flexShrink={0}
maxHeight='initial'
mi={2}
key='menu'
renderItem={({ label: { label, icon }, ...props }): ReactElement => <Option {...props} label={label} icon={icon} />}
options={menuOptions}
/>
);
}, [menuOptions]);
return <GenericMenu title={t('More')} key='menu' data-qa-id='menu' sections={menuOptions} placement='bottom-start' />;
}, [menuOptions, t]);

const actions = useMemo(() => {
const mapAction = ([key, { label, icon, action }]: any): ReactElement => (
<UserCard.Action key={key} label={label} aria-label={label} onClick={action} icon={icon} />
const mapAction = ([key, { content, icon, onClick }]: any): ReactElement => (
<UserCard.Action key={key} label={content} aria-label={content} onClick={onClick} icon={icon} />
);

return [...actionsDefinition.map(mapAction), menu].filter(Boolean);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export type RoomToolboxActionConfig = {
tabComponent?: ComponentType<{
onClickBack?: () => void;
}>;
type?: 'organization' | 'communication' | 'customization' | 'apps';
};

export type RoomToolboxContextValue = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { IUser, IRoom } from '@rocket.chat/core-typings';
import { Option, Menu } from '@rocket.chat/fuselage';
import { useTranslation } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import React from 'react';

import { useActionSpread } from '../../../hooks/useActionSpread';
import GenericMenu from '../../../../components/GenericMenu/GenericMenu';
import { useUserInfoActions } from '../../hooks/useUserInfoActions';

type RoomMembersActionsProps = {
Expand All @@ -14,21 +14,12 @@ type RoomMembersActionsProps = {
};

const RoomMembersActions = ({ username, _id, rid, reload }: RoomMembersActionsProps): ReactElement | null => {
const { menu: menuOptions } = useActionSpread(useUserInfoActions({ _id, username }, rid, reload), 0);
const t = useTranslation();
const { menuActions: menuOptions } = useUserInfoActions({ _id, username }, rid, reload, 0);
if (!menuOptions) {
return null;
}

return (
<Menu
flexShrink={0}
maxHeight='initial'
key='menu'
tiny
renderItem={({ label: { label, icon }, ...props }): ReactElement => <Option {...props} label={label} icon={icon} />}
options={menuOptions}
/>
);
return <GenericMenu title={t('More')} key='menu' data-qa-id='UserUserInfo-menu' sections={menuOptions} placement='bottom-end' />;
};

export default RoomMembersActions;
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
/* eslint-disable react/display-name, react/no-multi-comp */
import type { IRoom, IUser } from '@rocket.chat/core-typings';
import { ButtonGroup, Menu, Option } from '@rocket.chat/fuselage';
import { ButtonGroup, IconButton } from '@rocket.chat/fuselage';
import { useTranslation } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import React, { useMemo } from 'react';

import GenericMenu from '../../../../components/GenericMenu/GenericMenu';
import UserInfo from '../../../../components/UserInfo';
import { useActionSpread } from '../../../hooks/useActionSpread';
import { useUserInfoActions } from '../../hooks/useUserInfoActions';

type UserInfoActionsProps = {
Expand All @@ -14,8 +16,11 @@ type UserInfoActionsProps = {
};

const UserInfoActions = ({ user, rid, backToList }: UserInfoActionsProps): ReactElement => {
const { actions: actionsDefinition, menu: menuOptions } = useActionSpread(
useUserInfoActions({ _id: user._id, username: user.username }, rid, backToList),
const t = useTranslation();
const { actions: actionsDefinition, menuActions: menuOptions } = useUserInfoActions(
{ _id: user._id, username: user.username },
rid,
backToList,
);

const menu = useMemo(() => {
Expand All @@ -24,24 +29,23 @@ const UserInfoActions = ({ user, rid, backToList }: UserInfoActionsProps): React
}

return (
<Menu
<GenericMenu
button={<IconButton icon='kebab' secondary />}
title={t('More')}
key='menu'
mi={4}
secondary
data-qa-id='UserUserInfo-menu'
sections={menuOptions}
placement='bottom-end'
small={false}
maxHeight='initial'
renderItem={({ label: { label, icon }, ...props }): ReactElement => <Option {...props} label={label} icon={icon} />}
flexShrink={0}
options={menuOptions}
data-qa='UserUserInfo-menu'
/>
);
}, [menuOptions]);
}, [menuOptions, t]);

// TODO: sanitize Action type to avoid any
const actions = useMemo(() => {
const mapAction = ([key, { label, icon, action }]: any): ReactElement => (
<UserInfo.Action key={key} title={label} label={label} onClick={action} icon={icon} />
const mapAction = ([key, { content, icon, onClick }]: any): ReactElement => (
<UserInfo.Action key={key} title={content} label={content} onClick={onClick} icon={icon} />
);

return [...actionsDefinition.map(mapAction), menu].filter(Boolean);
Expand Down
Loading
Loading