Skip to content
Snippets Groups Projects
Unverified Commit a11f41e1 authored by Martin Schoeler's avatar Martin Schoeler Committed by GitHub
Browse files

chore: remove meteor.startup from pin-message (#34019)

parent 90a2c3c3
No related branches found
No related tags found
Loading
import type { IMessage } from '@rocket.chat/core-typings';
import { useToastMessageDispatch } from '@rocket.chat/ui-contexts';
import { useQueryClient, useMutation } from '@tanstack/react-query';
import { useTranslation } from 'react-i18next';
import { sdk } from '../../../../app/utils/client/lib/SDKClient';
import { roomsQueryKeys } from '../../../lib/queryKeys';
export const usePinMessageMutation = () => {
const { t } = useTranslation();
const dispatchToastMessage = useToastMessageDispatch();
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (message: IMessage) => {
await sdk.call('pinMessage', message);
},
onSuccess: (_data) => {
dispatchToastMessage({ type: 'success', message: t('Message_has_been_pinned') });
},
onError: (error) => {
dispatchToastMessage({ type: 'error', message: error });
},
onSettled: (_data, _error, message) => {
queryClient.invalidateQueries(roomsQueryKeys.pinnedMessages(message.rid));
queryClient.invalidateQueries(roomsQueryKeys.messageActions(message.rid, message._id));
},
});
};
...@@ -12,6 +12,7 @@ import MessageActionMenu from './MessageActionMenu'; ...@@ -12,6 +12,7 @@ import MessageActionMenu from './MessageActionMenu';
import MessageToolbarStarsActionMenu from './MessageToolbarStarsActionMenu'; import MessageToolbarStarsActionMenu from './MessageToolbarStarsActionMenu';
import { useNewDiscussionMessageAction } from './useNewDiscussionMessageAction'; import { useNewDiscussionMessageAction } from './useNewDiscussionMessageAction';
import { usePermalinkStar } from './usePermalinkStar'; import { usePermalinkStar } from './usePermalinkStar';
import { usePinMessageAction } from './usePinMessageAction';
import { useStarMessageAction } from './useStarMessageAction'; import { useStarMessageAction } from './useStarMessageAction';
import { useUnstarMessageAction } from './useUnstarMessageAction'; import { useUnstarMessageAction } from './useUnstarMessageAction';
import { useWebDAVMessageAction } from './useWebDAVMessageAction'; import { useWebDAVMessageAction } from './useWebDAVMessageAction';
...@@ -91,6 +92,7 @@ const MessageToolbar = ({ ...@@ -91,6 +92,7 @@ const MessageToolbar = ({
// TODO: move this to another place // TODO: move this to another place
useWebDAVMessageAction(); useWebDAVMessageAction();
useNewDiscussionMessageAction(); useNewDiscussionMessageAction();
usePinMessageAction(message, { room, subscription });
useStarMessageAction(message, { room, user }); useStarMessageAction(message, { room, user });
useUnstarMessageAction(message, { room, user }); useUnstarMessageAction(message, { room, user });
usePermalinkStar(message, { subscription, user }); usePermalinkStar(message, { subscription, user });
......
import type { IMessage, IRoom, ISubscription } from '@rocket.chat/core-typings';
import { isOmnichannelRoom } from '@rocket.chat/core-typings';
import { useSetting, useSetModal, usePermission } from '@rocket.chat/ui-contexts';
import React, { useEffect } from 'react';
import { MessageAction } from '../../../../app/ui-utils/client/lib/MessageAction';
import PinMessageModal from '../../../views/room/modals/PinMessageModal';
import { usePinMessageMutation } from '../hooks/usePinMessageMutation';
export const usePinMessageAction = (
message: IMessage,
{ room, subscription }: { room: IRoom; subscription: ISubscription | undefined },
) => {
const setModal = useSetModal();
const allowPinning = useSetting('Message_AllowPinning');
const hasPermission = usePermission('pin-message', room._id);
const { mutateAsync: pinMessage } = usePinMessageMutation();
useEffect(() => {
if (!allowPinning || isOmnichannelRoom(room) || !hasPermission || message.pinned || !subscription) {
return;
}
const onConfirm = async () => {
pinMessage(message);
setModal(null);
};
MessageAction.addButton({
id: 'pin-message',
icon: 'pin',
label: 'Pin',
type: 'interaction',
context: ['pinned', 'message', 'message-mobile', 'threads', 'direct', 'videoconf', 'videoconf-threads'],
async action() {
setModal(<PinMessageModal message={message} onConfirm={onConfirm} onCancel={() => setModal(null)} />);
},
order: 2,
group: 'menu',
});
return () => {
MessageAction.removeButton('pin-message');
};
}, [allowPinning, hasPermission, message, pinMessage, room, setModal, subscription]);
};
...@@ -4,6 +4,7 @@ export const roomsQueryKeys = { ...@@ -4,6 +4,7 @@ export const roomsQueryKeys = {
all: ['rooms'] as const, all: ['rooms'] as const,
room: (rid: IRoom['_id']) => ['rooms', rid] as const, room: (rid: IRoom['_id']) => ['rooms', rid] as const,
starredMessages: (rid: IRoom['_id']) => [...roomsQueryKeys.room(rid), 'starred-messages'] as const, starredMessages: (rid: IRoom['_id']) => [...roomsQueryKeys.room(rid), 'starred-messages'] as const,
pinnedMessages: (rid: IRoom['_id']) => [...roomsQueryKeys.room(rid), 'pinned-messages'] as const,
messages: (rid: IRoom['_id']) => [...roomsQueryKeys.room(rid), 'messages'] as const, messages: (rid: IRoom['_id']) => [...roomsQueryKeys.room(rid), 'messages'] as const,
message: (rid: IRoom['_id'], mid: IMessage['_id']) => [...roomsQueryKeys.messages(rid), mid] as const, message: (rid: IRoom['_id'], mid: IMessage['_id']) => [...roomsQueryKeys.messages(rid), mid] as const,
messageActions: (rid: IRoom['_id'], mid: IMessage['_id']) => [...roomsQueryKeys.message(rid, mid), 'actions'] as const, messageActions: (rid: IRoom['_id'], mid: IMessage['_id']) => [...roomsQueryKeys.message(rid, mid), 'actions'] as const,
......
...@@ -3,5 +3,4 @@ import './jumpToPinMessage'; ...@@ -3,5 +3,4 @@ import './jumpToPinMessage';
import './jumpToSearchMessage'; import './jumpToSearchMessage';
import './jumpToStarMessage'; import './jumpToStarMessage';
import './permalinkPinned'; import './permalinkPinned';
import './pinMessage';
import './unpinMessage'; import './unpinMessage';
import { Meteor } from 'meteor/meteor';
import { hasAtLeastOnePermission } from '../../../app/authorization/client';
import { settings } from '../../../app/settings/client';
import { MessageAction } from '../../../app/ui-utils/client';
import { sdk } from '../../../app/utils/client/lib/SDKClient';
import { imperativeModal } from '../../lib/imperativeModal';
import { queryClient } from '../../lib/queryClient';
import { roomCoordinator } from '../../lib/rooms/roomCoordinator';
import { dispatchToastMessage } from '../../lib/toast';
import PinMessageModal from '../../views/room/modals/PinMessageModal';
Meteor.startup(() => {
MessageAction.addButton({
id: 'pin-message',
icon: 'pin',
label: 'Pin',
type: 'interaction',
context: ['pinned', 'message', 'message-mobile', 'threads', 'direct', 'videoconf', 'videoconf-threads'],
async action(_, { message }) {
const onConfirm = async () => {
message.pinned = true;
try {
await sdk.call('pinMessage', message);
queryClient.invalidateQueries(['rooms', message.rid, 'pinned-messages']);
} catch (error) {
dispatchToastMessage({ type: 'error', message: error });
}
imperativeModal.close();
};
imperativeModal.open({
component: PinMessageModal,
props: {
message,
onConfirm,
onCancel: () => imperativeModal.close(),
},
});
},
condition({ message, subscription, room }) {
if (!settings.get('Message_AllowPinning') || message.pinned || !subscription) {
return false;
}
const isLivechatRoom = roomCoordinator.isLivechatRoom(room.t);
if (isLivechatRoom) {
return false;
}
return hasAtLeastOnePermission('pin-message', message.rid);
},
order: 2,
group: 'menu',
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment