Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 1 addition & 2 deletions apps/meteor/app/otr/client/OTRRoom.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { IRoom, IMessage, IUser } from '@rocket.chat/core-typings';
import type { IRoom, IMessage, IUser, UserPresence } from '@rocket.chat/core-typings';
import { UserStatus } from '@rocket.chat/core-typings';
import { Random } from '@rocket.chat/random';
import EJSON from 'ejson';
Expand All @@ -8,7 +8,6 @@ import { Tracker } from 'meteor/tracker';

import GenericModal from '../../../client/components/GenericModal';
import { imperativeModal } from '../../../client/lib/imperativeModal';
import type { UserPresence } from '../../../client/lib/presence';
import { Presence } from '../../../client/lib/presence';
import { dispatchToastMessage } from '../../../client/lib/toast';
import { getUidDirectMessage } from '../../../client/lib/utils/getUidDirectMessage';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import type { IUser } from '@rocket.chat/core-typings';
import { UserStatus } from '@rocket.chat/ui-client';
import { useUserPresence } from '@rocket.chat/ui-contexts';
import type { ComponentProps, ReactElement } from 'react';
import { memo } from 'react';

import { usePresence } from '../../hooks/usePresence';

type ReactiveUserStatusProps = {
uid: IUser['_id'];
} & ComponentProps<typeof UserStatus.UserStatus>;

const ReactiveUserStatus = ({ uid, ...props }: ReactiveUserStatusProps): ReactElement => {
const status = usePresence(uid)?.status;
const status = useUserPresence(uid)?.status;
return <UserStatus.UserStatus status={status} {...props} />;
};

Expand Down
5 changes: 2 additions & 3 deletions apps/meteor/client/components/message/MessageHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
MessageNameContainer,
} from '@rocket.chat/fuselage';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import { useUserPresence } from '@rocket.chat/ui-contexts';
import type { KeyboardEvent, ReactElement } from 'react';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';
Expand All @@ -17,8 +18,6 @@ import MessageRoles from './header/MessageRoles';
import { useMessageListShowUsername, useMessageListShowRealName, useMessageListShowRoles } from './list/MessageListContext';
import { useFormatDateAndTime } from '../../hooks/useFormatDateAndTime';
import { useFormatTime } from '../../hooks/useFormatTime';
import { useUserData } from '../../hooks/useUserData';
import type { UserPresence } from '../../lib/presence';
import { useMessageRoles } from './header/hooks/useMessageRoles';
import { useUserCard } from '../../views/room/contexts/UserCardContext';

Expand All @@ -34,7 +33,7 @@ const MessageHeader = ({ message }: MessageHeaderProps): ReactElement => {
const { triggerProps, openUserCard } = useUserCard();

const showRealName = useMessageListShowRealName();
const user: UserPresence = { ...message.u, roles: [], ...useUserData(message.u._id) };
const user = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
const usernameAndRealNameAreSame = !user.name || user.username === user.name;
const showUsername = useMessageListShowUsername() && showRealName && !usernameAndRealNameAreSame;
const displayName = useUserDisplayName(user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,14 @@ import {
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useUserDisplayName } from '@rocket.chat/ui-client';
import type { TranslationKey } from '@rocket.chat/ui-contexts';
import { useUserPresence } from '@rocket.chat/ui-contexts';
import type { ComponentProps, ReactElement, KeyboardEvent } from 'react';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';

import { MessageTypes } from '../../../../app/ui-utils/client';
import { useFormatDateAndTime } from '../../../hooks/useFormatDateAndTime';
import { useFormatTime } from '../../../hooks/useFormatTime';
import { useUserData } from '../../../hooks/useUserData';
import type { UserPresence } from '../../../lib/presence';
import {
useIsSelecting,
useToggleSelect,
Expand All @@ -46,7 +45,7 @@ const SystemMessage = ({ message, showUserAvatar, ...props }: SystemMessageProps
const { triggerProps, openUserCard } = useUserCard();

const showRealName = useMessageListShowRealName();
const user: UserPresence = { ...message.u, roles: [], ...useUserData(message.u._id) };
const user = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
const usernameAndRealNameAreSame = !user.name || user.username === user.name;
const showUsername = useMessageListShowUsername() && showRealName && !usernameAndRealNameAreSame;
const displayName = useUserDisplayName(user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ import type { IMessage } from '@rocket.chat/core-typings';
import { isDiscussionMessage, isThreadMainMessage, isE2EEMessage, isQuoteAttachment } from '@rocket.chat/core-typings';
import { MessageBody } from '@rocket.chat/fuselage';
import type { TranslationKey } from '@rocket.chat/ui-contexts';
import { useSetting, useTranslation, useUserId } from '@rocket.chat/ui-contexts';
import { useSetting, useTranslation, useUserId, useUserPresence } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import { memo } from 'react';

import { useUserData } from '../../../../hooks/useUserData';
import type { UserPresence } from '../../../../lib/presence';
import { useChat } from '../../../../views/room/contexts/ChatContext';
import MessageContentBody from '../../MessageContentBody';
import ReadReceiptIndicator from '../../ReadReceiptIndicator';
Expand Down Expand Up @@ -38,7 +36,7 @@ const RoomMessageContent = ({ message, unread, all, mention, searchText }: RoomM
const subscription = useSubscriptionFromMessageQuery(message).data ?? undefined;
const broadcast = subscription?.broadcast ?? false;
const uid = useUserId();
const messageUser: UserPresence = { ...message.u, roles: [], ...useUserData(message.u._id) };
const messageUser = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
const readReceiptEnabled = useSetting('Message_Read_Receipt_Enabled', false);
const chat = useChat();
const t = useTranslation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ import type { IThreadMainMessage, IThreadMessage } from '@rocket.chat/core-typin
import { isE2EEMessage, isQuoteAttachment } from '@rocket.chat/core-typings';
import { MessageBody } from '@rocket.chat/fuselage';
import type { TranslationKey } from '@rocket.chat/ui-contexts';
import { useSetting, useUserId } from '@rocket.chat/ui-contexts';
import { useSetting, useUserId, useUserPresence } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import { memo } from 'react';
import { useTranslation } from 'react-i18next';

import { useUserData } from '../../../../hooks/useUserData';
import type { UserPresence } from '../../../../lib/presence';
import MessageContentBody from '../../MessageContentBody';
import ReadReceiptIndicator from '../../ReadReceiptIndicator';
import Attachments from '../../content/Attachments';
Expand All @@ -32,7 +30,7 @@ const ThreadMessageContent = ({ message }: ThreadMessageContentProps): ReactElem
const subscription = useSubscriptionFromMessageQuery(message).data ?? undefined;
const broadcast = subscription?.broadcast ?? false;
const uid = useUserId();
const messageUser: UserPresence = { ...message.u, roles: [], ...useUserData(message.u._id) };
const messageUser = { ...message.u, roles: [], ...useUserPresence(message.u._id) };
const readReceiptEnabled = useSetting('Message_Read_Receipt_Enabled', false);

const { t } = useTranslation();
Expand Down
10 changes: 0 additions & 10 deletions apps/meteor/client/contexts/UserPresenceContext.ts

This file was deleted.

28 changes: 0 additions & 28 deletions apps/meteor/client/hooks/usePresence.ts

This file was deleted.

3 changes: 1 addition & 2 deletions apps/meteor/client/lib/chats/ChatAPI.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import type { IMessage, IRoom, ISubscription, IE2EEMessage, IUpload } from '@rocket.chat/core-typings';
import type { IMessage, IRoom, ISubscription, IE2EEMessage, IUpload, Subscribable } from '@rocket.chat/core-typings';
import type { IActionManager } from '@rocket.chat/ui-contexts';

import type { Upload } from './Upload';
import type { ReadStateManager } from './readStateManager';
import type { FormattingButton } from '../../../app/ui-message/client/messageBox/messageBoxFormatting';
import type { Subscribable } from '../../definitions/Subscribable';

export type ComposerAPI = {
release(): void;
Expand Down
6 changes: 1 addition & 5 deletions apps/meteor/client/lib/presence.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { IUser } from '@rocket.chat/core-typings';
import type { IUser, UserPresence } from '@rocket.chat/core-typings';
import { UserStatus } from '@rocket.chat/core-typings';
import type { EventHandlerOf } from '@rocket.chat/emitter';
import { Emitter } from '@rocket.chat/emitter';
Expand All @@ -22,10 +22,6 @@ const emitter = new Emitter<Events>();

const store = new Map<string, UserPresence>();

export type UserPresence = Readonly<
Partial<Pick<IUser, 'name' | 'status' | 'utcOffset' | 'statusText' | 'avatarETag' | 'roles' | 'username'>> & Required<Pick<IUser, '_id'>>
>;

const isUid = (eventType: keyof Events): eventType is UserPresence['_id'] =>
Boolean(eventType) && typeof eventType === 'string' && !['reset', 'restart', 'remove'].includes(eventType);

Expand Down
50 changes: 25 additions & 25 deletions apps/meteor/client/providers/UserPresenceProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { useSetting } from '@rocket.chat/ui-contexts';
import type { UserPresenceContextValue } from '@rocket.chat/ui-contexts';
import { useSetting, UserPresenceContext } from '@rocket.chat/ui-contexts';
import type { ReactElement, ReactNode } from 'react';
import { useMemo, useEffect } from 'react';

import { UserPresenceContext } from '../contexts/UserPresenceContext';
import { Presence } from '../lib/presence';

type UserPresenceProviderProps = {
Expand All @@ -16,30 +16,30 @@ const UserPresenceProvider = ({ children }: UserPresenceProviderProps): ReactEle
Presence.setStatus(usePresenceDisabled ? 'disabled' : 'enabled');
}, [usePresenceDisabled]);

return (
<UserPresenceContext.Provider
value={useMemo(
() => ({
queryUserData: (uid) => {
const subscribe = (callback: () => void) => {
Presence.listen(uid, callback);

return () => {
Presence.stop(uid, callback);
};
};

const get = () => Presence.store.get(uid);

return { subscribe, get };
},
}),
[],
)}
>
{children}
</UserPresenceContext.Provider>
const contextValue: UserPresenceContextValue = useMemo(
() => ({
queryUserData: (uid) => {
if (!uid) {
return { get: () => undefined, subscribe: () => () => undefined };
}

const subscribe = (callback: () => void) => {
Presence.listen(uid, callback);

return () => {
Presence.stop(uid, callback);
};
};

const get = () => Presence.store.get(uid);

return { subscribe, get };
},
}),
[],
);

return <UserPresenceContext.Provider value={contextValue}>{children}</UserPresenceContext.Provider>;
};

export default UserPresenceProvider;
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { DeviceManagementPopulatedSession } from '@rocket.chat/core-typings';
import { Box, Button, ButtonGroup, StatusBullet } from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useRoute } from '@rocket.chat/ui-contexts';
import { useRoute, useUserPresence } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
Expand All @@ -17,7 +17,6 @@ import {
import { InfoPanel, InfoPanelField, InfoPanelLabel, InfoPanelText } from '../../../../components/InfoPanel';
import { useDeviceLogout } from '../../../../hooks/useDeviceLogout';
import { useFormatDateAndTime } from '../../../../hooks/useFormatDateAndTime';
import { usePresence } from '../../../../hooks/usePresence';

type DeviceManagementInfoProps = DeviceManagementPopulatedSession & {
onReload: () => void;
Expand All @@ -32,7 +31,7 @@ const DeviceManagementInfo = ({ device, sessionId, loginAt, ip, userId, _user, o

const { name: clientName, os, version: rcVersion } = device || {};
const { username, name } = _user || {};
const userPresence = usePresence(userId);
const userPresence = useUserPresence(userId);

const handleCloseContextualBar = useCallback((): void => deviceManagementRouter.push({}), [deviceManagementRouter]);

Expand Down
5 changes: 2 additions & 3 deletions apps/meteor/client/views/room/Header/DirectRoomHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { useUserId } from '@rocket.chat/ui-contexts';
import { useUserId, useUserPresence } from '@rocket.chat/ui-contexts';
import type { ReactElement, ReactNode } from 'react';

import RoomHeader from './RoomHeader';
import { usePresence } from '../../../hooks/usePresence';

type DirectRoomHeaderProps = {
room: IRoom;
Expand All @@ -24,7 +23,7 @@ type DirectRoomHeaderProps = {
const DirectRoomHeader = ({ room, slots }: DirectRoomHeaderProps): ReactElement => {
const userId = useUserId();
const directUserId = room.uids?.filter((uid) => uid !== userId).shift();
const directUserData = usePresence(directUserId);
const directUserData = useUserPresence(directUserId);

return <RoomHeader slots={slots} room={room} topic={directUserData?.statusText} />;
};
Expand Down
5 changes: 2 additions & 3 deletions apps/meteor/client/views/room/body/RoomTopic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings';
import { isTeamRoom } from '@rocket.chat/core-typings';
import { Box } from '@rocket.chat/fuselage';
import { RoomBanner, RoomBannerContent } from '@rocket.chat/ui-client';
import { useUserId, useTranslation, useRouter } from '@rocket.chat/ui-contexts';
import { useUserId, useTranslation, useRouter, useUserPresence } from '@rocket.chat/ui-contexts';

import MarkdownText from '../../../components/MarkdownText';
import { usePresence } from '../../../hooks/usePresence';
import { useCanEditRoom } from '../contextualBar/Info/hooks/useCanEditRoom';

type RoomTopicProps = {
Expand All @@ -18,7 +17,7 @@ export const RoomTopic = ({ room }: RoomTopicProps) => {
const canEdit = useCanEditRoom(room);
const userId = useUserId();
const directUserId = room.uids?.filter((uid) => uid !== userId).shift();
const directUserData = usePresence(directUserId);
const directUserData = useUserPresence(directUserId);
const router = useRouter();

const currentRoute = router.getLocationPathname();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { useUserPresence } from '@rocket.chat/ui-contexts';
import type { ReactElement } from 'react';
import { useEffect } from 'react';

import OTRComponent from './OTR';
import { OtrRoomState } from '../../../../../app/otr/lib/OtrRoomState';
import { useOTR } from '../../../../hooks/useOTR';
import { usePresence } from '../../../../hooks/usePresence';
import { useRoomToolbox } from '../../contexts/RoomToolboxContext';

const OTRWithData = (): ReactElement => {
const { otr, otrState } = useOTR();
const { closeTab } = useRoomToolbox();

const peerUserPresence = usePresence(otr?.getPeerId());
const peerUserPresence = useUserPresence(otr?.getPeerId());
const userStatus = peerUserPresence?.status;
const peerUsername = peerUserPresence?.username;
const isOnline = !['offline', 'loading'].includes(userStatus || '');
Expand Down
4 changes: 4 additions & 0 deletions packages/core-typings/src/IUser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,10 @@ export type IUserInRole = Pick<
'_id' | 'name' | 'username' | 'emails' | 'avatarETag' | 'createdAt' | 'roles' | 'type' | 'active' | '_updatedAt'
>;

export type UserPresence = Readonly<
Partial<Pick<IUser, 'name' | 'status' | 'utcOffset' | 'statusText' | 'avatarETag' | 'roles' | 'username'>> & Required<Pick<IUser, '_id'>>
>;

export type AvatarUrlObj = {
avatarUrl: string;
};
Expand Down
1 change: 1 addition & 0 deletions packages/core-typings/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export * from './IRoom';
export * from './IMessage';
export * from './federation';
export * from './Serialized';
export * from './Subscribable';
export * from './ISetting';
export * from './ISubscription';
export * from './ITeam';
Expand Down
1 change: 1 addition & 0 deletions packages/mock-providers/jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ import type { Config } from 'jest';
export default {
preset: client.preset,
modulePathIgnorePatterns: ['<rootDir>/__tests__/helpers'],
testMatch: ['<rootDir>/src/tests/**/**.spec.[jt]s?(x)'],
} satisfies Config;
Loading
Loading