diff --git a/client/components/Header/Header.tsx b/client/components/Header/Header.tsx index c4ff170efc411..09e4da968cb10 100644 --- a/client/components/Header/Header.tsx +++ b/client/components/Header/Header.tsx @@ -1,4 +1,4 @@ -import React, { FC } from 'react'; +import React, { FC, isValidElement, ReactElement } from 'react'; import { css } from '@rocket.chat/css-in-js'; import colors from '@rocket.chat/fuselage-tokens/colors'; import { @@ -12,14 +12,19 @@ import { Tag, TagProps, BoxProps, + Skeleton, } from '@rocket.chat/fuselage'; +type HeaderIconProps = {icon: ReactElement | { name: string; color?: string } | null}; + const Title: FC = (props: any) => ; const Subtitle: FC = (props: any) => ; const Row: FC = (props: any) => ; -const HeaderIcon: FC<{ icon: JSX.Element | { name: string; color?: string } | null}> = ({ icon }) => icon && {React.isValidElement(icon) ? icon : }; +const HeaderIcon: FC = ({ icon }) => icon && + {React.isValidElement(icon) ? icon : } +; const ToolBox: FC = (props: any) => ; @@ -41,6 +46,12 @@ const HeaderLink: FC = (props: BoxProps) => {children}; +const HeaderTagIcon: FC = ({ icon }) => (icon ? + {isValidElement(icon) ? icon : } + : null); + +const HeaderTagSkeleton: FC = () => ; + const ToolBoxAction: FC = ({ id, icon, color, title, action, className, tabId, index, ...props }: any) => { return ; }); -const HeaderIcon = ({ room }) => { +const HeaderIconWithRoom = ({ room }) => { const icon = useRoomIcon(room); - return - {icon.name ? : icon} - ; + return ; }; const RoomTitle = ({ room }) => <> - + {room.name} ; @@ -73,7 +70,7 @@ const ParentRoomWithEndpointData = ({ rid }) => { }, [reset, getData, rid, resolve, reject]); if (AsyncStatePhase.LOADING === phase) { - return ; + return ; } if (AsyncStatePhase.ERROR === phase || !value?.room) { @@ -87,7 +84,7 @@ const ParentRoom = ({ room }) => { const href = roomTypes.getRouteLink(room.t, room); return - + {roomTypes.getRoomName(room.t, room)} @@ -95,26 +92,33 @@ const ParentRoom = ({ room }) => { }; const ParentTeam = ({ room }) => { - const query = useMemo(() => ({ teamId: room.teamId }), [room.teamId]); - const userTeamQuery = useMemo(() => ({ userId: Meteor.userId() }), []); + const userId = useUserId(); - const { value, phase } = useEndpointData('teams.info', query); - const { value: userTeams, phase: userTeamsPhase } = useEndpointData('users.listTeams', userTeamQuery); + const { value, phase } = useEndpointData('teams.info', useMemo(() => ({ teamId: room.teamId }), [room.teamId])); + const { value: userTeams, phase: userTeamsPhase } = useEndpointData('users.listTeams', useMemo(() => ({ userId }), [userId])); - const teamLoading = phase === AsyncStatePhase.LOADING; - const userTeamsLoading = userTeamsPhase === AsyncStatePhase.LOADING; const belongsToTeam = userTeams?.teams?.find((team) => team._id === room.teamId); const teamMainRoom = useUserSubscription(value?.teamInfo?.roomId); const teamMainRoomHref = teamMainRoom ? roomTypes.getRouteLink(teamMainRoom.t, teamMainRoom) : null; - return teamLoading || userTeamsLoading || room.teamMain ? null : - - {belongsToTeam - ? {teamMainRoom?.name} - : teamMainRoom?.name - } - ; + if (phase === AsyncStatePhase.LOADING || userTeamsPhase === AsyncStatePhase.LOADING) { + return ; + } + + if (phase === AsyncStatePhase.REJECTED || !value.teamInfo) { + return null; + } + + return ( + + + {belongsToTeam && teamMainRoom + ? {teamMainRoom?.name} + : value.teamInfo.name + } + + ); }; const DirectRoomHeader = ({ room }) => { const userId = useUserId(); @@ -138,7 +142,7 @@ const RoomHeader = ({ room, topic }) => { {room.prid && } - {room.teamId && } + {room.teamId && !room.teamMain && } { showQuickActions &&