160 lines
4.8 KiB
TypeScript

import React, { useCallback } from '../../../../lib/teact/teact';
import { getDispatch } from '../../../../lib/teact/teactn';
import { isChatPrivate } from '../../../../modules/helpers';
import { IAlbum, MediaViewerOrigin } from '../../../../types';
import {
ApiChat, ApiMessage, ApiUser, MAIN_THREAD_ID,
} from '../../../../api/types';
import { LangFn } from '../../../../hooks/useLang';
export default function useInnerHandlers(
lang: LangFn,
selectMessage: (e: React.MouseEvent<HTMLDivElement, MouseEvent>, groupedId?: string) => void,
message: ApiMessage,
chatId: number,
threadId: number,
isInDocumentGroup: boolean,
isScheduled?: boolean,
album?: IAlbum,
avatarPeer?: ApiUser | ApiChat,
senderPeer?: ApiUser | ApiChat,
botSender?: ApiUser,
) {
const {
openUserInfo, openChat, showNotification, focusMessage, openMediaViewer, openAudioPlayer,
markMessagesRead, cancelSendingMessage, sendPollVote, openForwardMenu,
} = getDispatch();
const {
id: messageId, forwardInfo, replyToMessageId, groupedId,
} = message;
const handleAvatarClick = useCallback(() => {
if (!avatarPeer) {
return;
}
if (isChatPrivate(avatarPeer.id)) {
openUserInfo({ id: avatarPeer.id });
} else {
openChat({ id: avatarPeer.id });
}
}, [avatarPeer, openUserInfo, openChat]);
const handleSenderClick = useCallback(() => {
if (!senderPeer) {
showNotification({ message: lang('HidAccount') });
return;
}
if (isChatPrivate(senderPeer.id)) {
openUserInfo({ id: senderPeer.id });
} else {
openChat({ id: senderPeer.id });
}
}, [senderPeer, showNotification, lang, openUserInfo, openChat]);
const handleViaBotClick = useCallback(() => {
if (!botSender) {
return;
}
openUserInfo({ id: botSender.id });
}, [botSender, openUserInfo]);
const handleReplyClick = useCallback((): void => {
focusMessage({
chatId, threadId, messageId: replyToMessageId, replyMessageId: messageId,
});
}, [focusMessage, chatId, threadId, replyToMessageId, messageId]);
const handleMediaClick = useCallback((): void => {
openMediaViewer({
chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline,
});
}, [chatId, threadId, messageId, openMediaViewer, isScheduled]);
const handleAudioPlay = useCallback((): void => {
openAudioPlayer({ chatId, messageId });
}, [chatId, messageId, openAudioPlayer]);
const handleAlbumMediaClick = useCallback((albumMessageId: number): void => {
openMediaViewer({
chatId,
threadId,
messageId: albumMessageId,
origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album,
});
}, [chatId, threadId, openMediaViewer, isScheduled]);
const handleReadMedia = useCallback((): void => {
markMessagesRead({ messageIds: [messageId] });
}, [messageId, markMessagesRead]);
const handleCancelUpload = useCallback(() => {
cancelSendingMessage({ chatId, messageId });
}, [cancelSendingMessage, chatId, messageId]);
const handleVoteSend = useCallback((options: string[]) => {
sendPollVote({ chatId, messageId, options });
}, [chatId, messageId, sendPollVote]);
const handleGroupForward = useCallback(() => {
openForwardMenu({ fromChatId: chatId, groupedId });
}, [openForwardMenu, chatId, groupedId]);
const handleForward = useCallback(() => {
if (album && album.messages) {
const messageIds = album.messages.map(({ id }) => id);
openForwardMenu({ fromChatId: chatId, messageIds });
} else {
openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });
}
}, [album, openForwardMenu, chatId, messageId]);
const handleFocus = useCallback(() => {
focusMessage({
chatId, threadId: MAIN_THREAD_ID, messageId,
});
}, [focusMessage, chatId, messageId]);
const handleFocusForwarded = useCallback(() => {
if (isInDocumentGroup) {
focusMessage({
chatId: forwardInfo!.fromChatId, groupedId, groupedChatId: chatId,
});
return;
}
focusMessage({
chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,
});
}, [isInDocumentGroup, focusMessage, forwardInfo, groupedId, chatId]);
const selectWithGroupedId = useCallback((e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
e.stopPropagation();
selectMessage(e, groupedId);
}, [selectMessage, groupedId]);
return {
handleAvatarClick,
handleSenderClick,
handleViaBotClick,
handleReplyClick,
handleMediaClick,
handleAudioPlay,
handleAlbumMediaClick,
handleMetaClick: selectWithGroupedId,
handleReadMedia,
handleCancelUpload,
handleVoteSend,
handleGroupForward,
handleForward,
handleFocus,
handleFocusForwarded,
handleDocumentGroupSelectAll: selectWithGroupedId,
};
}