diff --git a/apps/meteor/client/views/room/RoomInvite.tsx b/apps/meteor/client/views/room/RoomInvite.tsx index 476609770a5c0..936fc7cd02905 100644 --- a/apps/meteor/client/views/room/RoomInvite.tsx +++ b/apps/meteor/client/views/room/RoomInvite.tsx @@ -1,6 +1,8 @@ import { isRoomFederated } from '@rocket.chat/core-typings'; import type { IUser, IInviteSubscription } from '@rocket.chat/core-typings'; -import type { ComponentProps } from 'react'; +import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; +import { useQueryClient } from '@tanstack/react-query'; +import { useEffect, type ComponentProps } from 'react'; import { useTranslation } from 'react-i18next'; import Header from './Header'; @@ -10,6 +12,7 @@ import type { IRoomWithFederationOriginalName } from './contexts/RoomContext'; import { useRoomInvitation } from './hooks/useRoomInvitation'; import RoomLayout from './layout/RoomLayout'; import { links } from '../../lib/links'; +import { roomsQueryKeys, subscriptionsQueryKeys } from '../../lib/queryKeys'; type RoomInviteProps = Omit, 'header' | 'body' | 'aside'> & { userId?: IUser['_id']; @@ -19,12 +22,25 @@ type RoomInviteProps = Omit, 'header' | 'body' const RoomInvite = ({ room, subscription, userId, ...props }: RoomInviteProps) => { const { t } = useTranslation(); + const queryClient = useQueryClient(); const { acceptInvite, rejectInvite, isPending } = useRoomInvitation(room); const infoLink = isRoomFederated(room) ? { label: t('Learn_more_about_Federation'), href: links.go.matrixFederation } : undefined; useGoToHomeOnRemoved(room, userId); + const invalidateQueries = useEffectEvent(() => { + const reference = room.federationOriginalName ?? room.name ?? room._id; + void queryClient.invalidateQueries({ queryKey: roomsQueryKeys.room(room._id) }); + void queryClient.invalidateQueries({ queryKey: subscriptionsQueryKeys.subscription(room._id) }); + void queryClient.invalidateQueries({ queryKey: roomsQueryKeys.roomReference(reference, room.t, userId) }); + }); + + useEffect(() => { + // Invalidate room and subscription queries when unmounting (invite accepted or rejected) + return () => invalidateQueries(); + }, [invalidateQueries]); + return ( { await waitFor(() => expect(mockInviteEndpoint).not.toHaveBeenCalled()); }); - - it('should redirect to /home after rejecting an invite', async () => { - const { result } = renderHook(() => useRoomInvitation(mockedRoom), { wrapper: appRoot }); - - act(() => void result.current.rejectInvite()); - - await waitFor(() => expect(mockedNavigate).toHaveBeenCalledWith('/home')); - }); - - it('should not redirect to /home after accepting an invite', async () => { - const { result } = renderHook(() => useRoomInvitation(mockedRoom), { wrapper: appRoot }); - - act(() => void result.current.acceptInvite()); - - await waitFor(() => expect(mockedNavigate).not.toHaveBeenCalled()); - }); }); diff --git a/apps/meteor/client/views/room/hooks/useRoomInvitation.tsx b/apps/meteor/client/views/room/hooks/useRoomInvitation.tsx index 0920a7416d327..7e7c036fb125f 100644 --- a/apps/meteor/client/views/room/hooks/useRoomInvitation.tsx +++ b/apps/meteor/client/views/room/hooks/useRoomInvitation.tsx @@ -1,36 +1,10 @@ -import { useRouter, useUser } from '@rocket.chat/ui-contexts'; -import { useQueryClient } from '@tanstack/react-query'; - import { useRoomRejectInvitationModal } from './useRoomRejectInvitationModal'; import { useEndpointMutation } from '../../../hooks/useEndpointMutation'; -import { roomsQueryKeys, subscriptionsQueryKeys } from '../../../lib/queryKeys'; import type { IRoomWithFederationOriginalName } from '../contexts/RoomContext'; export const useRoomInvitation = (room: IRoomWithFederationOriginalName) => { - const queryClient = useQueryClient(); - const user = useUser(); - const router = useRouter(); - const { open: openConfirmationModal } = useRoomRejectInvitationModal(room); - - const replyInvite = useEndpointMutation('POST', '/v1/rooms.invite', { - onSuccess: async (_, { action }) => { - const reference = room.federationOriginalName ?? room.name; - - if (reference) { - await queryClient.refetchQueries({ - queryKey: roomsQueryKeys.roomReference(reference, room.t, user?._id, user?.username), - }); - } - - await queryClient.invalidateQueries({ queryKey: roomsQueryKeys.room(room._id) }); - await queryClient.invalidateQueries({ queryKey: subscriptionsQueryKeys.subscription(room._id) }); - - if (action === 'reject') { - router.navigate('/home'); - } - }, - }); + const replyInvite = useEndpointMutation('POST', '/v1/rooms.invite'); return { ...replyInvite,