Skip to content

Commit

Permalink
fix: stop blinking Room not found before dm creation (#30157)
Browse files Browse the repository at this point in the history
  • Loading branch information
ggazzo committed Aug 25, 2023
1 parent 3b37fe5 commit 5d857f4
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 25 deletions.
5 changes: 5 additions & 0 deletions .changeset/rotten-turtles-agree.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@rocket.chat/meteor": patch
---

fix: stop blinking "Room not found" before dm creation
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,7 @@ type MessageListSkeletonProps = {

const MessageListSkeleton = ({ messageCount = 2 }: MessageListSkeletonProps): ReactElement => {
const widths = useMemo(
() =>
Array.from(
{ length: messageCount },
() => `${availablePercentualWidths[Math.floor(Math.random() * availablePercentualWidths.length)]}%`,
),
() => Array.from({ length: messageCount }, (_, index) => `${availablePercentualWidths[index % availablePercentualWidths.length]}%`),
[messageCount],
);

Expand Down
16 changes: 16 additions & 0 deletions apps/meteor/client/lib/errors/OldUrlRoomError.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { IRoom, RoomType } from '@rocket.chat/core-typings';

import { RocketChatError } from './RocketChatError';

type OldUrlRoomErrorDetails =
| { rid: IRoom['_id'] }
| {
type: RoomType;
reference: string;
};

export class OldUrlRoomError extends RocketChatError<'old-url-format', OldUrlRoomErrorDetails> {
constructor(message = 'Old Url Format', details: OldUrlRoomErrorDetails) {
super('old-url-format', message, details);
}
}
5 changes: 5 additions & 0 deletions apps/meteor/client/views/room/RoomOpener.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { useTranslation } from 'react-i18next';

import { getErrorMessage } from '../../lib/errorHandling';
import { NotAuthorizedError } from '../../lib/errors/NotAuthorizedError';
import { OldUrlRoomError } from '../../lib/errors/OldUrlRoomError';
import { RoomNotFoundError } from '../../lib/errors/RoomNotFoundError';
import RoomSkeleton from './RoomSkeleton';
import { useOpenRoom } from './hooks/useOpenRoom';
Expand Down Expand Up @@ -36,6 +37,10 @@ const RoomOpener = ({ type, reference }: RoomOpenerProps): ReactElement => {
)}
{isError &&
(() => {
if (error instanceof OldUrlRoomError) {
return <RoomSkeleton />;
}

if (error instanceof RoomNotFoundError) {
return <RoomNotFound />;
}
Expand Down
4 changes: 2 additions & 2 deletions apps/meteor/client/views/room/RoomRoute.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { RoomType } from '@rocket.chat/core-typings';
import { useRouter } from '@rocket.chat/ui-contexts';
import React, { useEffect, useState } from 'react';
import React, { useLayoutEffect, useState } from 'react';

import RoomOpener from './RoomOpener';

Expand All @@ -15,7 +15,7 @@ const RoomRoute = ({ extractOpenRoomParams }: RoomRouteProps) => {
const router = useRouter();
const [params, setParams] = useState(() => extractOpenRoomParams(router.getRouteParameters()));

useEffect(
useLayoutEffect(
() =>
router.subscribeToRouteChange(() => {
setParams(extractOpenRoomParams(router.getRouteParameters()));
Expand Down
36 changes: 18 additions & 18 deletions apps/meteor/client/views/room/hooks/useOpenRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useRef } from 'react';
import { roomFields } from '../../../../lib/publishFields';
import { omit } from '../../../../lib/utils/omit';
import { NotAuthorizedError } from '../../../lib/errors/NotAuthorizedError';
import { OldUrlRoomError } from '../../../lib/errors/OldUrlRoomError';
import { RoomNotFoundError } from '../../../lib/errors/RoomNotFoundError';

export function useOpenRoom({ type, reference }: { type: RoomType; reference: string }) {
Expand All @@ -30,7 +31,21 @@ export function useOpenRoom({ type, reference }: { type: RoomType; reference: st
try {
roomData = await getRoomByTypeAndName(type, reference);
} catch (error) {
throw new RoomNotFoundError(undefined, { type, reference });
if (type !== 'd') {
throw new RoomNotFoundError(undefined, { type, reference });
}

try {
const { rid } = await createDirectMessage(...reference.split(', '));
const { ChatSubscription } = await import('../../../../app/models/client');
const { waitUntilFind } = await import('../../../lib/utils/waitUntilFind');
await waitUntilFind(() => ChatSubscription.findOne({ rid }));
directRoute.push({ rid }, (prev) => prev);
} catch (error) {
throw new RoomNotFoundError(undefined, { type, reference });
}

throw new OldUrlRoomError(undefined, { type, reference });
}

if (!roomData._id) {
Expand Down Expand Up @@ -62,7 +77,8 @@ export function useOpenRoom({ type, reference }: { type: RoomType; reference: st
if (room._id !== reference && type === 'd') {
// Redirect old url using username to rid
await LegacyRoomManager.close(type + reference);
throw new RoomNotFoundError(undefined, { rid: room._id });
directRoute.push({ rid: room._id }, (prev) => prev);
throw new OldUrlRoomError(undefined, { rid: room._id });
}

const { RoomManager } = await import('../../../lib/RoomManager');
Expand All @@ -86,22 +102,6 @@ export function useOpenRoom({ type, reference }: { type: RoomType; reference: st
},
{
retry: 0,
onError: async (error) => {
if (type !== 'd') {
return;
}

if (error instanceof RoomNotFoundError && error.details !== undefined && 'rid' in error.details) {
directRoute.push({ rid: error.details.rid }, (prev) => prev);
return;
}

const { rid } = await createDirectMessage(...reference.split(', '));
const { ChatSubscription } = await import('../../../../app/models/client');
const { waitUntilFind } = await import('../../../lib/utils/waitUntilFind');
await waitUntilFind(() => ChatSubscription.findOne({ rid }));
directRoute.push({ rid }, (prev) => prev);
},
},
);
}

0 comments on commit 5d857f4

Please sign in to comment.