snapshot of https://github.com/RocketChat/Rocket.Chat.git (develop, 2026-09-16; blobs > 131072B omitted)
Some checks failed
Create issues from TODOs / todos (push) Failing after 3s
Close inactive issues / close-issues (push) Has been cancelled
Deploy GitHub Pages / deploy-preview (push) Has been cancelled
CI / ⚙️ Variables Setup (push) Has been cancelled
CI / ⚙️ Test Guard (push) Has been cancelled
CI / 🚀 Notify external services - draft (push) Has been cancelled
CI / 📦 Build Packages (push) Has been cancelled
CI / 📦 Meteor Build (coverage) (push) Has been cancelled
CI / 📦 Meteor Build (production) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], fips) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Publish Docker Images (ghcr.io) (push) Has been cancelled
CI / 📦 Track Image Sizes (push) Has been cancelled
CI / 🔎 Code Check - Action Lint (push) Has been cancelled
CI / 🔎 Code Check (push) Has been cancelled
CI / 🔨 Test Storybook (push) Has been cancelled
CI / 🔨 Test Unit (push) Has been cancelled
CI / 🔨 Test API (CE) (push) Has been cancelled
CI / 🔨 Test API Livechat (CE) (push) Has been cancelled
CI / 🔨 Test UI (CE) (push) Has been cancelled
CI / 🔨 Test API (EE) (push) Has been cancelled
CI / 🔨 Test API Livechat (EE) (push) Has been cancelled
CI / 🔨 Test API Apps (deno-runtime - EE) (push) Has been cancelled
CI / 🔨 Test UI (EE) (push) Has been cancelled
CI / 🔨 Test API (FIPS) (push) Has been cancelled
CI / 🔨 Test API Livechat (FIPS) (push) Has been cancelled
CI / 🔨 Test UI (FIPS) (push) Has been cancelled
CI / 🔨 Test Federation Matrix (push) Has been cancelled
CI / 📊 Report Coverage (push) Has been cancelled
CI / ✅ Tests Done (push) Has been cancelled
CI / 🚀 Publish build assets (push) Has been cancelled
CI / 🚀 Publish Docker Images (DockerHub) (push) Has been cancelled
CI / 🚀 Notify external services (push) Has been cancelled
CI / Update Version Durability (push) Has been cancelled
Release / Release (push) Has been cancelled
Auto-close duplicate issues / auto-close-duplicates (push) Failing after 1s
Code scanning - action / CodeQL-Build (push) Failing after 1s

This commit is contained in:
upstream-mirror
2026-09-16 01:21:02 +05:00
commit 30810eecd7
10161 changed files with 987110 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { isRoomFederated } from '@rocket.chat/core-typings';
import { useRoomRoute, useUserDisplayName } from '@rocket.chat/ui-client';
import { useSetting } from '@rocket.chat/ui-contexts';
import { useTranslation } from 'react-i18next';
import ParentRoomButton from '../ParentRoomButton';
export type ParentDiscussionProps = {
loading?: boolean;
room: Pick<IRoom, '_id' | 't' | 'name' | 'fname' | 'prid' | 'u' | 'federated'>;
};
const getChannelRoomName = (room: ParentDiscussionProps['room'], allowSpecialChars: boolean): string => {
if (room.prid || isRoomFederated(room)) {
return room.fname || '';
}
return (allowSpecialChars ? room.fname || room.name : room.name) || '';
};
const ParentDiscussion = ({ loading = false, room }: ParentDiscussionProps) => {
const { t } = useTranslation();
const goToRoom = useRoomRoute();
const allowSpecialChars = useSetting('UI_Allow_room_names_with_special_chars', false);
const userDisplayName = useUserDisplayName({ name: room.fname, username: room.name });
const roomName = room.t === 'c' || room.t === 'p' ? getChannelRoomName(room, allowSpecialChars) : (userDisplayName ?? '');
const handleRedirect = (): void => {
goToRoom({ rid: room._id, t: room.t, name: room.name });
};
return <ParentRoomButton loading={loading} onClick={handleRedirect} title={t('Back_to__roomName__channel', { roomName })} />;
};
export default ParentDiscussion;

View File

@@ -0,0 +1,42 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { useUserSubscription } from '@rocket.chat/ui-contexts';
import { useMemo } from 'react';
import ParentDiscussion from './ParentDiscussion';
import ParentDiscussionWithData from './ParentDiscussionWithData';
export type ParentDiscussionRouteProps = {
room: Pick<IRoom, '_id' | 't' | 'name' | 'fname' | 'prid' | 'u'>;
};
const ParentDiscussionRoute = ({ room }: ParentDiscussionRouteProps) => {
const { prid } = room;
if (!prid) {
throw new Error('Parent room ID is missing');
}
const subscription = useUserSubscription(prid);
const parentRoomProps = useMemo(
() =>
subscription
? {
_id: subscription.rid,
t: subscription.t,
name: subscription.name,
fname: subscription.fname,
u: subscription.u,
federated: (subscription as any).federated as IRoom['federated'],
}
: undefined,
[subscription],
);
if (subscription && parentRoomProps) {
return <ParentDiscussion room={parentRoomProps} />;
}
return <ParentDiscussionWithData rid={prid} />;
};
export default ParentDiscussionRoute;

View File

@@ -0,0 +1,18 @@
import type { IRoom } from '@rocket.chat/core-typings';
import ParentDiscussion from './ParentDiscussion';
import { useRoomInfoEndpoint } from '../../../../../hooks/useRoomInfoEndpoint';
export type ParentDiscussionWithDataProps = { rid: IRoom['_id'] };
const ParentDiscussionWithData = ({ rid }: ParentDiscussionWithDataProps) => {
const { data, isPending, isError } = useRoomInfoEndpoint(rid);
if (isError || !data?.room) {
return null;
}
return <ParentDiscussion loading={isPending} room={data.room} />;
};
export default ParentDiscussionWithData;

View File

@@ -0,0 +1 @@
export { default } from './ParentDiscussionRoute';

View File

@@ -0,0 +1,20 @@
import type { IRoom } from '@rocket.chat/core-typings';
import ParentDiscussion from './ParentDiscussion';
import ParentTeam from './ParentTeam';
export type ParentRoomProps = { room: IRoom };
const ParentRoom = ({ room }: ParentRoomProps) => {
if (room.prid) {
return <ParentDiscussion room={room} />;
}
if (room.teamId && !room.teamMain) {
return <ParentTeam room={room} />;
}
return null;
};
export default ParentRoom;

View File

@@ -0,0 +1,14 @@
import { IconButton, Skeleton } from '@rocket.chat/fuselage';
import type { ComponentProps } from 'react';
export type ParentRoomButtonProps = Omit<ComponentProps<typeof IconButton>, 'icon'> & { loading: boolean };
const ParentRoomButton = ({ loading, ...props }: ParentRoomButtonProps) => {
if (loading) {
return <Skeleton variant='rect' size={28} />;
}
return <IconButton small icon='arrow-back-up' {...props} />;
};
export default ParentRoomButton;

View File

@@ -0,0 +1,67 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { TeamType } from '@rocket.chat/core-typings';
import { useUserId } from '@rocket.chat/ui-contexts';
import { useTranslation } from 'react-i18next';
import ParentRoomButton from './ParentRoomButton';
import { useTeamInfoQuery } from '../../../../hooks/useTeamInfoQuery';
import { useGoToRoom } from '../../hooks/useGoToRoom';
import { useUserTeamsQuery } from '../../hooks/useUserTeamsQuery';
type APIErrorResult = { success: boolean; error: string };
export type ParentTeamProps = {
room: IRoom;
};
const ParentTeam = ({ room }: ParentTeamProps) => {
const { t } = useTranslation();
const { teamId } = room;
const userId = useUserId();
if (!teamId) {
throw new Error('invalid rid');
}
if (!userId) {
throw new Error('invalid uid');
}
const {
data: teamInfo,
isLoading: teamInfoLoading,
isError: teamInfoError,
} = useTeamInfoQuery(teamId, { retry: (_, error) => (error as unknown as APIErrorResult)?.error !== 'unauthorized' });
const { data: userTeams, isLoading: userTeamsLoading } = useUserTeamsQuery(userId);
const userBelongsToTeam = Boolean(userTeams?.find((team) => team._id === teamId)) || false;
const isPublicTeam = teamInfo?.type === TeamType.PUBLIC;
const shouldDisplayTeam = isPublicTeam || userBelongsToTeam;
const goToRoom = useGoToRoom();
const redirectToMainRoom = (): void => {
const rid = teamInfo?.roomId;
if (!rid) {
return;
}
goToRoom(rid);
};
if (teamInfoError || !shouldDisplayTeam) {
return null;
}
return (
<ParentRoomButton
loading={teamInfoLoading || userTeamsLoading}
onClick={redirectToMainRoom}
title={t('Back_to__roomName__team', { roomName: teamInfo?.name })}
/>
);
};
export default ParentTeam;

View File

@@ -0,0 +1 @@
export { default } from './ParentRoom';