import { useStableCallback } from '@rocket.chat/fuselage-hooks'; import { useGoToDirectMessage } from '@rocket.chat/ui-client'; import { useRouter, useUserAvatarPath } from '@rocket.chat/ui-contexts'; import { useWidgetExternalControls, usePeekMediaSessionState, type CallHistoryInternalContact } from '@rocket.chat/ui-voip'; import { useMemo } from 'react'; type UseMediaCallInternalHistoryActionsBaseOptions = { contact: CallHistoryInternalContact; messageId?: string; openRoomId?: string; messageRoomId?: string; openUserInfo?: (userId: string) => void; }; export const useMediaCallInternalHistoryActions = ({ contact, messageId, openRoomId, messageRoomId, openUserInfo, }: UseMediaCallInternalHistoryActionsBaseOptions) => { const state = usePeekMediaSessionState(); const { toggleWidget } = useWidgetExternalControls(); const router = useRouter(); const getAvatarUrl = useUserAvatarPath(); const voiceCall = useStableCallback(() => { if (state !== 'available') { return; } toggleWidget({ userId: contact._id, displayName: contact.displayName ?? '', username: contact.username, avatarUrl: getAvatarUrl({ username: contact.username }), callerId: contact.voiceCallExtension, }); }); const goToDirectMessage = useGoToDirectMessage({ username: contact.username }, openRoomId ?? ''); const jumpToMessage = useStableCallback(() => { const rid = messageRoomId || openRoomId; if (!messageId || !rid) { return; } const { msg: _, ...searchParams } = router.getSearchParameters(); router.navigate({ name: 'direct', params: { rid }, search: { ...searchParams, msg: messageId }, }); }); const userInfo = useStableCallback(() => { if (!openUserInfo) { return; } openUserInfo(contact._id); }); return useMemo( () => ({ voiceCall, directMessage: goToDirectMessage, jumpToMessage: messageId && messageRoomId ? jumpToMessage : undefined, userInfo: openUserInfo ? () => userInfo() : undefined, }), [voiceCall, goToDirectMessage, messageId, messageRoomId, jumpToMessage, openUserInfo, userInfo], ); };