diff --git a/client/components/Breadcrumbs/Breadcrumbs.stories.js b/client/components/Breadcrumbs/Breadcrumbs.stories.js
new file mode 100644
index 0000000000000..01e0c93962d4e
--- /dev/null
+++ b/client/components/Breadcrumbs/Breadcrumbs.stories.js
@@ -0,0 +1,54 @@
+import React from 'react';
+
+import Breadcrumbs from '.';
+
+export default {
+ title: 'components/Breadcrumbs',
+ component: Breadcrumbs,
+};
+
+const { Item, Icon, Text, Link, Separator } = Breadcrumbs;
+
+export const Default = () =>
+
+ -
+
+ design
+
+
+ -
+
+ rc-design
+
+ ;
+
+export const AsTeamMember = () =>
+
+ -
+
+ design
+
+
+ -
+
+ rc-design
+
+ ;
+
+export const WithDiscussion = () =>
+
+ -
+
+ design
+
+
+ -
+
+ rc-design
+
+
+ -
+
+ storybook
+
+ ;
diff --git a/client/components/Breadcrumbs/index.js b/client/components/Breadcrumbs/index.js
new file mode 100644
index 0000000000000..3c46d5773d43c
--- /dev/null
+++ b/client/components/Breadcrumbs/index.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Box, Icon } from '@rocket.chat/fuselage';
+import colors from '@rocket.chat/fuselage-tokens/colors';
+import { css } from '@rocket.chat/css-in-js';
+
+const BreadcrumbsSeparator = () => /;
+const BreadcrumbsIcon = ({ name, color, children }) => {name ? : children};
+
+const BreadcrumbsLink = (props) => ;
+
+const BreadcrumbsText = (props) => ;
+
+const BreadcrumbsItem = (props) => ;
+
+const Breadcrumbs = ({ children }) => {children};
+
+Object.assign(Breadcrumbs, {
+ Text: BreadcrumbsText,
+ Link: BreadcrumbsLink,
+ Icon: BreadcrumbsIcon,
+ Separator: BreadcrumbsSeparator,
+ Item: BreadcrumbsItem,
+});
+
+export default Breadcrumbs;
diff --git a/client/hooks/useRoomIcon.tsx b/client/hooks/useRoomIcon.tsx
index f3ba9fa166c00..dd3df78be422e 100644
--- a/client/hooks/useRoomIcon.tsx
+++ b/client/hooks/useRoomIcon.tsx
@@ -11,10 +11,14 @@ export const colors = {
offline: 'neutral-600',
};
-export const useRoomIcon = (room: IRoom): JSX.Element | { name: string; color?: string } | null => {
+export const useRoomIcon = (room: IRoom, small = true): JSX.Element | { name: string; color?: string } | null => {
+ if (room.prid) {
+ return { name: 'baloons' };
+ }
+
switch (room.t) {
case 'p':
- return { name: 'lock' };
+ return { name: 'hashtag-lock' };
case 'c':
return { name: 'hash' };
case 'l':
@@ -22,10 +26,10 @@ export const useRoomIcon = (room: IRoom): JSX.Element | { name: string; color?:
case 'd':
const direct = room as unknown as IDirectMessageRoom;
if (direct.uids && direct.uids.length > 2) {
- return { name: 'team' };
+ return { name: 'baloon-arrow-left' };
}
if (direct.uids && direct.uids.length > 0) {
- return uid !== room.u._id)[0] || room.u._id } as any } />;
+ return uid !== room.u._id)[0] || room.u._id } as any } />;
}
return { name: 'at' };
default:
diff --git a/client/sidebar/RoomList.js b/client/sidebar/RoomList.js
index 7c7159a404956..b8d5e28d25f7d 100644
--- a/client/sidebar/RoomList.js
+++ b/client/sidebar/RoomList.js
@@ -6,7 +6,6 @@ import memoize from 'memoize-one';
import { usePreventDefault } from './hooks/usePreventDefault';
import { filterMarkdown } from '../../app/markdown/lib/markdown';
-import { ReactiveUserStatus, colors } from '../components/UserStatus';
import { useTranslation } from '../contexts/TranslationContext';
import { roomTypes } from '../../app/utils';
import { useUserPreference, useUserId } from '../contexts/UserContext';
@@ -17,6 +16,7 @@ import { useTemplateByViewMode } from './hooks/useTemplateByViewMode';
import { useShortcutOpenMenu } from './hooks/useShortcutOpenMenu';
import { useAvatarTemplate } from './hooks/useAvatarTemplate';
import { useRoomList } from './hooks/useRoomList';
+import { useRoomIcon } from '../hooks/useRoomIcon';
import { useSidebarPaletteColor } from './hooks/useSidebarPaletteColor';
import { escapeHTML } from '../../lib/escapeHTML';
import ScrollableContentWrapper from '../components/ScrollableContentWrapper';
@@ -38,24 +38,11 @@ export const itemSizeMap = (sidebarViewMode) => {
};
const SidebarIcon = ({ room, small }) => {
- switch (room.t) {
- case 'p':
- case 'c':
- return ;
- case 'l':
- return ;
- case 'd':
- if (room.uids && room.uids.length > 2) {
- return ;
- }
- if (room.uids && room.uids.length > 0) {
- // If the filter fn removes all ids, it's own direct message
- return room.uids && room.uids.length && uid !== room.u._id)[0] || room.u._id} />;
- }
- return ;
- default:
- return null;
- }
+ const icon = useRoomIcon(room, small);
+
+ return
+ {!icon.name && icon}
+ ;
};
export const createItemData = memoize((extended, t, SideBarItemTemplate, AvatarTemplate, openedRoom, sidebarViewMode, isAnonymous) => ({
diff --git a/client/views/room/Header/Header.js b/client/views/room/Header/Header.js
index b155496289014..7cdd6c1001d4a 100644
--- a/client/views/room/Header/Header.js
+++ b/client/views/room/Header/Header.js
@@ -1,9 +1,7 @@
import React from 'react';
-import { FlowRouter } from 'meteor/kadira:flow-router';
-import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
-import { ActionButton } from '@rocket.chat/fuselage';
import Header from '../../../components/Header';
+import Breadcrumbs from '../../../components/Breadcrumbs';
import { useRoomIcon } from '../../../hooks/useRoomIcon';
import Encrypted from './icons/Encrypted';
import Favorite from './icons/Favorite';
@@ -12,8 +10,9 @@ import ToolBox from './ToolBox';
import RoomAvatar from '../../../components/avatar/RoomAvatar';
import { useLayout } from '../../../contexts/LayoutContext';
import Burger from './Burger';
-import { useTranslation } from '../../../contexts/TranslationContext';
import MarkdownText from '../../../components/MarkdownText';
+import { roomTypes } from '../../../../app/utils';
+import { useUserRoom } from '../../../contexts/UserContext';
export default React.memo(({ room }) => {
const { isEmbedded, showTopNavbarEmbeddedLayout } = useLayout();
@@ -23,29 +22,44 @@ export default React.memo(({ room }) => {
return ;
});
-const BackToRoom = React.memo(({ small, prid }) => {
- const t = useTranslation();
- const onClick = useMutableCallback(() => {
- FlowRouter.goToRoomById(prid);
- });
- return ;
-});
+const HeaderIcon = ({ room }) => {
+ const icon = useRoomIcon(room);
+
+ return {!icon.name && icon};
+};
+
+const RoomTitle = ({ room }) => {
+ const prevRoom = useUserRoom(room.prid);
+ const prevRoomHref = prevRoom ? roomTypes.getRouteLink(prevRoom.t, prevRoom) : null;
+
+ return
+ {room.prid && prevRoom && <>
+
+
+ {prevRoom.name}
+
+
+ >}
+
+
+ {room.name}
+
+ ;
+};
const RoomHeader = ({ room }) => {
- const icon = useRoomIcon(room);
const { isMobile } = useLayout();
const avatar = ;
+
return
{ (isMobile || room.prid) &&
{ isMobile && }
- { room.prid && }
}
{ avatar && {avatar} }
- { icon && }
- {room.name}
+
diff --git a/package-lock.json b/package-lock.json
index 396b5194d2a5c..281c1d343b9b0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5920,9 +5920,9 @@
}
},
"@rocket.chat/css-in-js": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/css-in-js/-/css-in-js-0.21.0.tgz",
- "integrity": "sha512-jV1VY5nmUEy1gFtu9ygW1H0qMlyZYBRBTlFn/qT20Ynhqj5FUTlRO0iva7bZf689j8ljdhNTVMEE/OiCF3xK2w==",
+ "version": "0.6.3-dev.178",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/css-in-js/-/css-in-js-0.6.3-dev.178.tgz",
+ "integrity": "sha512-4cnyJx8TbZ8zKWfl1gYGfWZBtf9RWWbaDQpKClkN5myCAXE07QG/tP0z/A0nnGCiU0qSZDrsl/wcdxYwG47tEA==",
"requires": {
"@emotion/hash": "^0.8.0",
"stylis": "^4.0.6"
@@ -5936,9 +5936,9 @@
}
},
"@rocket.chat/emitter": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/emitter/-/emitter-0.21.0.tgz",
- "integrity": "sha512-yEvQYAQhYzbjlqUu3uckXZP3bxL046s2pW41mdptKhDIn6d5Zb6DEN1F7Gmm8myXxibUAIqclEoPK/T8mZGZhw=="
+ "version": "0.6.3-dev.178",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/emitter/-/emitter-0.6.3-dev.178.tgz",
+ "integrity": "sha512-wgmr7Yg6Hx7hPVpFhlOoQha8I/mLpSUb273y1MYQOItBBF58VOYwdC2r6gvBZRRbziGOZL95eOmP1N6odP4RCg=="
},
"@rocket.chat/eslint-config": {
"version": "0.3.0",
@@ -5950,9 +5950,9 @@
}
},
"@rocket.chat/fuselage": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage/-/fuselage-0.21.0.tgz",
- "integrity": "sha512-CT0FyBsjsu0wNuI41CiUd9dldWk8qUdjn9iwxv7oL+TjrtbSpO0AFDpA6g9v1AE3GUNWEneko0OPqUXITDK1FA==",
+ "version": "0.6.3-dev.179",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage/-/fuselage-0.6.3-dev.179.tgz",
+ "integrity": "sha512-z4Wgk8J34NfriXuh00cJ+J3M7h1fxFtG9ily3cKhYIVNPHyhUR4o3h2MbvPKKE+mBPzuLsOV2kbcb49y4gm76g==",
"requires": {
"@rocket.chat/css-in-js": "^0.21.0",
"@rocket.chat/fuselage-tokens": "^0.21.0",
@@ -5960,33 +5960,42 @@
"react-keyed-flatten-children": "^1.2.0"
},
"dependencies": {
- "@rocket.chat/fuselage-tokens": {
+ "@rocket.chat/css-in-js": {
"version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-tokens/-/fuselage-tokens-0.21.0.tgz",
- "integrity": "sha512-gVzQHhUsZSLbIkwGi8f1KpsTepkmtwHs7hl1gGr0HrnI4eYhBWpMOEjdiH3czhPuoF/O4C8QjdpDrktIuwkVNQ=="
+ "resolved": "https://registry.npmjs.org/@rocket.chat/css-in-js/-/css-in-js-0.21.0.tgz",
+ "integrity": "sha512-jV1VY5nmUEy1gFtu9ygW1H0qMlyZYBRBTlFn/qT20Ynhqj5FUTlRO0iva7bZf689j8ljdhNTVMEE/OiCF3xK2w==",
+ "requires": {
+ "@emotion/hash": "^0.8.0",
+ "stylis": "^4.0.6"
+ }
+ },
+ "stylis": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz",
+ "integrity": "sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA=="
}
}
},
"@rocket.chat/fuselage-hooks": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-hooks/-/fuselage-hooks-0.21.0.tgz",
- "integrity": "sha512-oExYakP1FlqK97mFXMAQwquTRYrFiU5k273zQhav28FHMYq7bdHCqSJ79SncHkWhUwj0TZVRcXH8wMRBzf0igQ==",
+ "version": "0.6.3-dev.178",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-hooks/-/fuselage-hooks-0.6.3-dev.178.tgz",
+ "integrity": "sha512-IBIs1zuMal2QT7AoWvAuhcYmq4J4KWazwjBx9Q0WudUQjLa/ipqwQmLEYVYEysfYI1OG4S1gPg9XDBY7TGvOsw==",
"requires": {
- "@rocket.chat/fuselage-tokens": "^0.21.0",
+ "@rocket.chat/fuselage-tokens": "^0.6.3-dev.178+dbd5b908",
"use-subscription": "^1.4.1"
},
"dependencies": {
"@rocket.chat/fuselage-tokens": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-tokens/-/fuselage-tokens-0.21.0.tgz",
- "integrity": "sha512-gVzQHhUsZSLbIkwGi8f1KpsTepkmtwHs7hl1gGr0HrnI4eYhBWpMOEjdiH3czhPuoF/O4C8QjdpDrktIuwkVNQ=="
+ "version": "0.6.3-dev.178",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-tokens/-/fuselage-tokens-0.6.3-dev.178.tgz",
+ "integrity": "sha512-P5NOTCDd4BVNX+CnaQXLJLTJDLbGZKFttjzNOVc7mlWqDxPZsDRPv/pnSP6RP38mWe2HwHVkQi2CDLcaJnGCcA=="
}
}
},
"@rocket.chat/fuselage-polyfills": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-polyfills/-/fuselage-polyfills-0.21.0.tgz",
- "integrity": "sha512-B27f5PSlIaRJbieyh0i+BpWN5mrouE9Jhetg7FD+F8/S/azqAmXZNzgDLh8QFF0qy6ne72Y6w3Hw9PfXCsVjag==",
+ "version": "0.6.3-dev.178",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-polyfills/-/fuselage-polyfills-0.6.3-dev.178.tgz",
+ "integrity": "sha512-6Pl5bitTl66s6ZecKxI8pJzNZdZdJ0g2xOGP6WMDwJnLs1AtdfVuTR/tITiWRcg8WTFiOK19kMZvKgM2OKJi5Q==",
"requires": {
"@juggle/resize-observer": "^3.2.0",
"clipboard-polyfill": "^3.0.1",
@@ -6001,17 +6010,31 @@
"integrity": "sha512-gVzQHhUsZSLbIkwGi8f1KpsTepkmtwHs7hl1gGr0HrnI4eYhBWpMOEjdiH3czhPuoF/O4C8QjdpDrktIuwkVNQ=="
},
"@rocket.chat/fuselage-ui-kit": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-ui-kit/-/fuselage-ui-kit-0.21.0.tgz",
- "integrity": "sha512-DYUit8hK8M0q2zP5WnQ6JkHD4yryaI705QgG4nXqPJE7mBftmhvGI3BBFAJo0BXwsnKApMuZCy+jhxPIGZCP2A==",
+ "version": "0.6.3-dev.179",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-ui-kit/-/fuselage-ui-kit-0.6.3-dev.179.tgz",
+ "integrity": "sha512-xQpxwvpiZwTnANdNkaxRASsCZuP0yftHtz/Lq/K0CW9VQc3Ml+mkOp+FV1XImZlyv31bwfxW78SsdaQNmDkTAQ==",
"requires": {
"@rocket.chat/fuselage-polyfills": "^0.21.0"
+ },
+ "dependencies": {
+ "@rocket.chat/fuselage-polyfills": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/fuselage-polyfills/-/fuselage-polyfills-0.21.0.tgz",
+ "integrity": "sha512-B27f5PSlIaRJbieyh0i+BpWN5mrouE9Jhetg7FD+F8/S/azqAmXZNzgDLh8QFF0qy6ne72Y6w3Hw9PfXCsVjag==",
+ "requires": {
+ "@juggle/resize-observer": "^3.2.0",
+ "clipboard-polyfill": "^3.0.1",
+ "element-closest-polyfill": "^1.0.2",
+ "focus-visible": "^5.2.0",
+ "focus-within-polyfill": "^5.1.0"
+ }
+ }
}
},
"@rocket.chat/icons": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/icons/-/icons-0.21.0.tgz",
- "integrity": "sha512-Q6llwucmJX5f9+GfjrUW+bR/XVtxxpF0RrUaxaL1n+IRjUPl19GdQ5ycyzSuzI96UMzLqeV4fZxIUmxnN/GY+Q=="
+ "version": "0.6.3-dev.179",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/icons/-/icons-0.6.3-dev.179.tgz",
+ "integrity": "sha512-5NsrdR3C90Z0lR7OkgzHGqjDVPxho+LUjrv15F1L/uONp/WdQBo+Z3cGFXUgnLZf5ohX1BgTRRtzHtJPPr7QyQ=="
},
"@rocket.chat/livechat": {
"version": "1.7.6",
@@ -6064,9 +6087,9 @@
}
},
"@rocket.chat/mp3-encoder": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/mp3-encoder/-/mp3-encoder-0.21.0.tgz",
- "integrity": "sha512-+VnGBjI4LaWh0481oQrssnQUUnhNh1mGpvMWzxDQLBJmPx5M79y/b9Mo+9LEws6vJ/lDSSeRfsIlvtCaA6Y3cA==",
+ "version": "0.6.3-dev.178",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/mp3-encoder/-/mp3-encoder-0.6.3-dev.178.tgz",
+ "integrity": "sha512-UKKHgaWUsmNKqGrYhkDbCoMJVEIVBYhkCKdajwGt+kpfO/G6SrJc4IlKH2fnYuMkUMzuBEMWvoq9kwSbWzTUrA==",
"requires": {
"lamejs": "git+https://github.com/zhuker/lamejs.git"
}
@@ -6114,9 +6137,9 @@
}
},
"@rocket.chat/ui-kit": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@rocket.chat/ui-kit/-/ui-kit-0.21.0.tgz",
- "integrity": "sha512-vh3eRPXw8/yBSNCuDDzvNDb7fmylNCR1yxAjJQTGG/k0hR1Ji+gfn134WXyNxzGneHycr+/yrFxtt4lqsca1IQ=="
+ "version": "0.6.3-dev.178",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/ui-kit/-/ui-kit-0.6.3-dev.178.tgz",
+ "integrity": "sha512-T1grAJi+aCicKQMzDQ3r2zG1CB7FE9idY2QkXQoIjI0Vj4sTqPtzq57yE3AFkgzWxrzsMU/xHPhiEhPDqbsgOw=="
},
"@samverschueren/stream-to-observable": {
"version": "0.3.1",
diff --git a/package.json b/package.json
index d278b8e4ebc75..cb2869dea0eb1 100644
--- a/package.json
+++ b/package.json
@@ -136,16 +136,16 @@
"@nivo/line": "^0.61.1",
"@nivo/pie": "^0.61.1",
"@rocket.chat/apps-engine": "1.22.1",
- "@rocket.chat/css-in-js": "^0.21.0",
- "@rocket.chat/emitter": "^0.21.0",
- "@rocket.chat/fuselage": "^0.21.0",
- "@rocket.chat/fuselage-hooks": "^0.21.0",
- "@rocket.chat/fuselage-polyfills": "^0.21.0",
+ "@rocket.chat/css-in-js": "^0.6.3-dev.178",
+ "@rocket.chat/emitter": "^0.6.3-dev.178",
+ "@rocket.chat/fuselage": "^0.6.3-dev.179",
+ "@rocket.chat/fuselage-hooks": "^0.6.3-dev.178",
+ "@rocket.chat/fuselage-polyfills": "^0.6.3-dev.178",
"@rocket.chat/fuselage-tokens": "^0.21.0",
- "@rocket.chat/fuselage-ui-kit": "^0.21.0",
- "@rocket.chat/icons": "^0.21.0",
- "@rocket.chat/mp3-encoder": "^0.21.0",
- "@rocket.chat/ui-kit": "^0.21.0",
+ "@rocket.chat/fuselage-ui-kit": "^0.6.3-dev.179",
+ "@rocket.chat/icons": "^0.6.3-dev.179",
+ "@rocket.chat/mp3-encoder": "^0.6.3-dev.178",
+ "@rocket.chat/ui-kit": "^0.6.3-dev.178",
"@slack/client": "^4.12.0",
"@types/fibers": "^3.1.0",
"@types/imap": "^0.8.33",