265 lines
7.3 KiB
TypeScript
265 lines
7.3 KiB
TypeScript
import type { FC } from '../../lib/teact/teact';
|
|
import { memo } from '../../lib/teact/teact';
|
|
import { getActions, withGlobal } from '../../global';
|
|
|
|
import type { ApiChat } from '../../api/types';
|
|
|
|
import {
|
|
getChatTitle,
|
|
getPrivateChatUserId,
|
|
getUserFirstOrLastName,
|
|
isChatBasicGroup,
|
|
isChatChannel,
|
|
isChatSuperGroup,
|
|
isUserBot,
|
|
} from '../../global/helpers';
|
|
import { selectIsChatWithSelf, selectUser } from '../../global/selectors';
|
|
import { isUserId } from '../../util/entities/ids';
|
|
import renderText from './helpers/renderText';
|
|
|
|
import useLastCallback from '../../hooks/useLastCallback';
|
|
import useOldLang from '../../hooks/useOldLang';
|
|
|
|
import Button from '../ui/Button';
|
|
import Modal from '../ui/Modal';
|
|
import Avatar from './Avatar';
|
|
|
|
import './DeleteChatModal.scss';
|
|
|
|
export type OwnProps = {
|
|
isOpen: boolean;
|
|
chat: ApiChat;
|
|
isSavedDialog?: boolean;
|
|
onClose: () => void;
|
|
onCloseAnimationEnd?: () => void;
|
|
};
|
|
|
|
type StateProps = {
|
|
isChannel: boolean;
|
|
isChatWithSelf?: boolean;
|
|
isBot?: boolean;
|
|
isPrivateChat: boolean;
|
|
isBasicGroup: boolean;
|
|
isSuperGroup: boolean;
|
|
currentUserId: string | undefined;
|
|
canDeleteForAll?: boolean;
|
|
contactName?: string;
|
|
};
|
|
|
|
const DeleteChatModal: FC<OwnProps & StateProps> = ({
|
|
isOpen,
|
|
chat,
|
|
isSavedDialog,
|
|
isChannel,
|
|
isPrivateChat,
|
|
isChatWithSelf,
|
|
isBot,
|
|
isBasicGroup,
|
|
isSuperGroup,
|
|
currentUserId,
|
|
canDeleteForAll,
|
|
contactName,
|
|
onClose,
|
|
onCloseAnimationEnd,
|
|
}) => {
|
|
const {
|
|
leaveChannel,
|
|
deleteHistory,
|
|
deleteSavedHistory,
|
|
deleteChannel,
|
|
deleteChatUser,
|
|
blockUser,
|
|
deleteChat,
|
|
} = getActions();
|
|
|
|
const lang = useOldLang();
|
|
const chatTitle = getChatTitle(lang, chat);
|
|
|
|
const handleDeleteForAll = useLastCallback(() => {
|
|
deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });
|
|
|
|
onClose();
|
|
});
|
|
|
|
const handleDeleteAndStop = useLastCallback(() => {
|
|
deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });
|
|
blockUser({ userId: chat.id });
|
|
|
|
onClose();
|
|
});
|
|
|
|
const handleDeleteChat = useLastCallback(() => {
|
|
if (isSavedDialog) {
|
|
deleteSavedHistory({ chatId: chat.id });
|
|
} else if (isPrivateChat) {
|
|
deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });
|
|
} else if (isBasicGroup) {
|
|
if (chat.isCreator) {
|
|
deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });
|
|
deleteChat({ chatId: chat.id });
|
|
} else {
|
|
deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });
|
|
deleteChatUser({ chatId: chat.id, userId: currentUserId! });
|
|
}
|
|
} else if ((isChannel || isSuperGroup) && !chat.isCreator) {
|
|
leaveChannel({ chatId: chat.id });
|
|
} else if ((isChannel || isSuperGroup) && chat.isCreator) {
|
|
deleteChannel({ chatId: chat.id });
|
|
}
|
|
onClose();
|
|
});
|
|
|
|
const handleLeaveChat = useLastCallback(() => {
|
|
if (isChannel || isSuperGroup) {
|
|
leaveChannel({ chatId: chat.id });
|
|
onClose();
|
|
} else if (isBasicGroup && chat.isCreator) {
|
|
deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });
|
|
deleteChatUser({ chatId: chat.id, userId: currentUserId! });
|
|
} else {
|
|
handleDeleteChat();
|
|
}
|
|
});
|
|
|
|
function renderHeader() {
|
|
return (
|
|
<div className="modal-header" dir={lang.isRtl ? 'rtl' : undefined}>
|
|
<Avatar
|
|
size="tiny"
|
|
peer={chat}
|
|
isSavedMessages={isChatWithSelf}
|
|
/>
|
|
<h3 className="modal-title">{lang(renderTitle())}</h3>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function renderTitle() {
|
|
if (isSavedDialog) {
|
|
return isChatWithSelf ? 'ClearHistoryMyNotesTitle' : 'ClearHistoryTitleSingle2';
|
|
}
|
|
|
|
if (isChannel && !chat.isCreator) {
|
|
return 'LeaveChannel';
|
|
}
|
|
|
|
if (isChannel && chat.isCreator) {
|
|
return 'ChannelDelete';
|
|
}
|
|
|
|
if (isBasicGroup || isSuperGroup) {
|
|
return 'Group.LeaveGroup';
|
|
}
|
|
|
|
return 'DeleteChatUser';
|
|
}
|
|
|
|
function renderContent() {
|
|
if (isSavedDialog) {
|
|
return (
|
|
<p>
|
|
{renderText(
|
|
isChatWithSelf ? lang('ClearHistoryMyNotesMessage') : lang('ClearHistoryMessageSingle', chatTitle),
|
|
['simple_markdown', 'emoji'],
|
|
)}
|
|
</p>
|
|
);
|
|
}
|
|
if (isChannel && chat.isCreator) {
|
|
return (
|
|
<p>
|
|
{renderText(lang('ChatList.DeleteAndLeaveGroupConfirmation', chatTitle), ['simple_markdown', 'emoji'])}
|
|
</p>
|
|
);
|
|
}
|
|
|
|
if ((isChannel && !chat.isCreator) || isBasicGroup || isSuperGroup) {
|
|
return <p>{renderText(lang('ChannelLeaveAlertWithName', chatTitle), ['simple_markdown', 'emoji'])}</p>;
|
|
}
|
|
|
|
return <p>{renderText(lang('ChatList.DeleteChatConfirmation', contactName), ['simple_markdown', 'emoji'])}</p>;
|
|
}
|
|
|
|
function renderActionText() {
|
|
if (isSavedDialog) {
|
|
return 'Delete';
|
|
}
|
|
|
|
if (isChannel && !chat.isCreator) {
|
|
return 'LeaveChannel';
|
|
}
|
|
if (isChannel && chat.isCreator) {
|
|
return 'Chat.Input.Delete';
|
|
}
|
|
|
|
if (isBasicGroup || isSuperGroup) {
|
|
return 'Group.LeaveGroup';
|
|
}
|
|
|
|
return canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete';
|
|
}
|
|
|
|
return (
|
|
<Modal
|
|
isOpen={isOpen}
|
|
className="DeleteChatModal"
|
|
header={renderHeader()}
|
|
onClose={onClose}
|
|
onCloseAnimationEnd={onCloseAnimationEnd}
|
|
>
|
|
{renderContent()}
|
|
<div className="dialog-buttons-column">
|
|
{isBot && !isSavedDialog && (
|
|
<Button color="danger" className="confirm-dialog-button" isText onClick={handleDeleteAndStop}>
|
|
{lang('DeleteAndStop')}
|
|
</Button>
|
|
)}
|
|
{canDeleteForAll && (
|
|
<Button color="danger" className="confirm-dialog-button" isText onClick={handleDeleteForAll}>
|
|
{contactName ? renderText(lang('ChatList.DeleteForEveryone', contactName)) : lang('DeleteForAll')}
|
|
</Button>
|
|
)}
|
|
{!isPrivateChat && chat.isCreator && !isSavedDialog && (
|
|
<Button color="danger" className="confirm-dialog-button" isText onClick={handleDeleteChat}>
|
|
{lang('DeleteForAll')}
|
|
</Button>
|
|
)}
|
|
<Button
|
|
color="danger"
|
|
className="confirm-dialog-button"
|
|
isText
|
|
onClick={(isPrivateChat || isSavedDialog) ? handleDeleteChat : handleLeaveChat}
|
|
>
|
|
{lang(renderActionText())}
|
|
</Button>
|
|
<Button className="confirm-dialog-button" isText onClick={onClose}>{lang('Cancel')}</Button>
|
|
</div>
|
|
</Modal>
|
|
);
|
|
};
|
|
|
|
export default memo(withGlobal<OwnProps>(
|
|
(global, { chat, isSavedDialog }): StateProps => {
|
|
const isPrivateChat = isUserId(chat.id);
|
|
const isChatWithSelf = selectIsChatWithSelf(global, chat.id);
|
|
const user = isPrivateChat && selectUser(global, getPrivateChatUserId(chat)!);
|
|
const isBot = user && isUserBot(user) && !chat.isSupport;
|
|
const canDeleteForAll = (isPrivateChat && !isChatWithSelf && !isBot && !isSavedDialog);
|
|
const contactName = isPrivateChat
|
|
? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))
|
|
: undefined;
|
|
|
|
return {
|
|
isPrivateChat,
|
|
isChatWithSelf,
|
|
isBot,
|
|
isChannel: isChatChannel(chat),
|
|
isBasicGroup: isChatBasicGroup(chat),
|
|
isSuperGroup: isChatSuperGroup(chat),
|
|
currentUserId: global.currentUserId,
|
|
canDeleteForAll,
|
|
contactName,
|
|
};
|
|
},
|
|
)(DeleteChatModal));
|