Calendar: Fix closing after rescheduling time (#2168)

This commit is contained in:
Alexander Zinchuk 2022-12-06 13:29:39 +01:00
parent 8e37f81ed6
commit 007f507e64
2 changed files with 21 additions and 30 deletions

View File

@ -13,6 +13,7 @@ import type { IAlbum, IAnchorPosition } from '../../../types';
import { import {
selectActiveDownloadIds, selectActiveDownloadIds,
selectAllowedMessageActions, selectAllowedMessageActions,
selectCanScheduleUntilOnline,
selectChat, selectChat,
selectCurrentMessageList, selectIsChatProtected, selectIsCurrentUserPremium, selectCurrentMessageList, selectIsChatProtected, selectIsCurrentUserPremium,
selectIsMessageProtected, selectIsMessageProtected,
@ -25,7 +26,6 @@ import {
isChatGroup, isOwnMessage, areReactionsEmpty, isUserId, isMessageLocal, getMessageVideo, isChatGroup, isOwnMessage, areReactionsEmpty, isUserId, isMessageLocal, getMessageVideo,
} from '../../../global/helpers'; } from '../../../global/helpers';
import { SERVICE_NOTIFICATIONS_USER_ID, TME_LINK_PREFIX } from '../../../config'; import { SERVICE_NOTIFICATIONS_USER_ID, TME_LINK_PREFIX } from '../../../config';
import { getDayStartAt } from '../../../util/dateFormat';
import buildClassName from '../../../util/buildClassName'; import buildClassName from '../../../util/buildClassName';
import { REM } from '../../common/helpers/mediaDimensions'; import { REM } from '../../common/helpers/mediaDimensions';
import { copyTextToClipboard } from '../../../util/clipboard'; import { copyTextToClipboard } from '../../../util/clipboard';
@ -33,12 +33,12 @@ import { copyTextToClipboard } from '../../../util/clipboard';
import useShowTransition from '../../../hooks/useShowTransition'; import useShowTransition from '../../../hooks/useShowTransition';
import useFlag from '../../../hooks/useFlag'; import useFlag from '../../../hooks/useFlag';
import useLang from '../../../hooks/useLang'; import useLang from '../../../hooks/useLang';
import useSchedule from '../../../hooks/useSchedule';
import DeleteMessageModal from '../../common/DeleteMessageModal'; import DeleteMessageModal from '../../common/DeleteMessageModal';
import ReportModal from '../../common/ReportModal'; import ReportModal from '../../common/ReportModal';
import PinMessageModal from '../../common/PinMessageModal'; import PinMessageModal from '../../common/PinMessageModal';
import MessageContextMenu from './MessageContextMenu'; import MessageContextMenu from './MessageContextMenu';
import CalendarModal from '../../common/CalendarModal';
import ConfirmDialog from '../../ui/ConfirmDialog'; import ConfirmDialog from '../../ui/ConfirmDialog';
const START_SIZE = 2 * REM; const START_SIZE = 2 * REM;
@ -87,6 +87,7 @@ type StateProps = {
activeDownloads: number[]; activeDownloads: number[];
canShowSeenBy?: boolean; canShowSeenBy?: boolean;
enabledReactions?: string[]; enabledReactions?: string[];
canScheduleUntilOnline?: boolean;
}; };
const ContextMenuContainer: FC<OwnProps & StateProps> = ({ const ContextMenuContainer: FC<OwnProps & StateProps> = ({
@ -130,6 +131,7 @@ const ContextMenuContainer: FC<OwnProps & StateProps> = ({
canClosePoll, canClosePoll,
activeDownloads, activeDownloads,
canShowSeenBy, canShowSeenBy,
canScheduleUntilOnline,
}) => { }) => {
const { const {
setReplyingToId, setReplyingToId,
@ -162,9 +164,10 @@ const ContextMenuContainer: FC<OwnProps & StateProps> = ({
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const [isReportModalOpen, setIsReportModalOpen] = useState(false); const [isReportModalOpen, setIsReportModalOpen] = useState(false);
const [isPinModalOpen, setIsPinModalOpen] = useState(false); const [isPinModalOpen, setIsPinModalOpen] = useState(false);
const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();
const [isClosePollDialogOpen, openClosePollDialog, closeClosePollDialog] = useFlag(); const [isClosePollDialogOpen, openClosePollDialog, closeClosePollDialog] = useFlag();
const [requestCalendar, calendar] = useSchedule(canScheduleUntilOnline, onClose, message.date);
// `undefined` indicates that emoji are present and loading // `undefined` indicates that emoji are present and loading
const hasCustomEmoji = customEmojiSetsInfo === undefined || Boolean(customEmojiSetsInfo.length); const hasCustomEmoji = customEmojiSetsInfo === undefined || Boolean(customEmojiSetsInfo.length);
@ -244,11 +247,6 @@ const ContextMenuContainer: FC<OwnProps & StateProps> = ({
onClose(); onClose();
}, [onClose]); }, [onClose]);
const handleCloseCalendar = useCallback(() => {
closeCalendar();
onClose();
}, [closeCalendar, onClose]);
const handleReply = useCallback(() => { const handleReply = useCallback(() => {
setReplyingToId({ messageId: message.id }); setReplyingToId({ messageId: message.id });
closeMenu(); closeMenu();
@ -317,10 +315,19 @@ const ContextMenuContainer: FC<OwnProps & StateProps> = ({
closeMenu(); closeMenu();
}, [closeMenu, message.chatId, message.id, sendScheduledMessages]); }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);
const handleRescheduleMessage = useCallback((scheduledAt: number) => {
rescheduleMessage({
chatId: message.chatId,
messageId: message.id,
scheduledAt,
});
onClose();
}, [message.chatId, message.id, onClose, rescheduleMessage]);
const handleOpenCalendar = useCallback(() => { const handleOpenCalendar = useCallback(() => {
setIsMenuOpen(false); setIsMenuOpen(false);
openCalendar(); requestCalendar(handleRescheduleMessage);
}, [openCalendar]); }, [handleRescheduleMessage, requestCalendar]);
const handleOpenSeenByModal = useCallback(() => { const handleOpenSeenByModal = useCallback(() => {
closeMenu(); closeMenu();
@ -332,14 +339,6 @@ const ContextMenuContainer: FC<OwnProps & StateProps> = ({
openReactorListModal({ chatId: message.chatId, messageId: message.id }); openReactorListModal({ chatId: message.chatId, messageId: message.id });
}, [closeMenu, openReactorListModal, message.chatId, message.id]); }, [closeMenu, openReactorListModal, message.chatId, message.id]);
const handleRescheduleMessage = useCallback((date: Date) => {
rescheduleMessage({
chatId: message.chatId,
messageId: message.id,
scheduledAt: Math.round(date.getTime() / 1000),
});
}, [message.chatId, message.id, rescheduleMessage]);
const handleCopyMessages = useCallback((messageIds: number[]) => { const handleCopyMessages = useCallback((messageIds: number[]) => {
copyMessagesByIds({ messageIds }); copyMessagesByIds({ messageIds });
closeMenu(); closeMenu();
@ -476,17 +475,7 @@ const ContextMenuContainer: FC<OwnProps & StateProps> = ({
confirmLabel={lang('lng_polls_stop_sure')} confirmLabel={lang('lng_polls_stop_sure')}
confirmHandler={handlePollClose} confirmHandler={handlePollClose}
/> />
{canReschedule && ( {canReschedule && calendar}
<CalendarModal
isOpen={isCalendarOpen}
withTimePicker
selectedAt={message.date * 1000}
maxAt={getDayStartAt(scheduledMaxDate)}
isFutureMode
onClose={handleCloseCalendar}
onSubmit={handleRescheduleMessage}
/>
)}
</div> </div>
); );
}; };
@ -577,6 +566,7 @@ export default memo(withGlobal<OwnProps>(
canBuyPremium: !isCurrentUserPremium && !selectIsPremiumPurchaseBlocked(global), canBuyPremium: !isCurrentUserPremium && !selectIsPremiumPurchaseBlocked(global),
customEmojiSetsInfo, customEmojiSetsInfo,
customEmojiSets, customEmojiSets,
canScheduleUntilOnline: selectCanScheduleUntilOnline(global, message.chatId),
}; };
}, },
)(ContextMenuContainer)); )(ContextMenuContainer));

View File

@ -12,6 +12,7 @@ type OnScheduledCallback = (scheduledAt: number) => void;
const useSchedule = ( const useSchedule = (
canScheduleUntilOnline?: boolean, canScheduleUntilOnline?: boolean,
onCancel?: () => void, onCancel?: () => void,
openAt?: number,
) => { ) => {
const lang = useLang(); const lang = useLang();
const [onScheduled, setOnScheduled] = useState<OnScheduledCallback | undefined>(); const [onScheduled, setOnScheduled] = useState<OnScheduledCallback | undefined>();
@ -38,7 +39,7 @@ const useSchedule = (
setOnScheduled(() => whenScheduled); setOnScheduled(() => whenScheduled);
}, []); }, []);
const scheduledDefaultDate = new Date(); const scheduledDefaultDate = openAt ? new Date(openAt * 1000) : new Date();
scheduledDefaultDate.setSeconds(0); scheduledDefaultDate.setSeconds(0);
scheduledDefaultDate.setMilliseconds(0); scheduledDefaultDate.setMilliseconds(0);