import { useDispatch, useSelector } from 'react-redux'; import useKey from 'react-use/lib/useKey'; import { deleteMessagesForX } from '../../../interactions/conversations/unsendingInteractions'; import { resetSelectedMessageIds } from '../../../state/ducks/conversations'; import { getSelectedMessageIds } from '../../../state/selectors/conversations'; import { useSelectedConversationKey, useSelectedIsPublic, } from '../../../state/selectors/selectedConversation'; import { SessionButton, SessionButtonColor, SessionButtonShape, SessionButtonType, } from '../../basic/SessionButton'; import { SessionIconButton } from '../../icon'; import { SessionFocusTrap } from '../../SessionFocusTrap'; export const SelectionOverlay = () => { const selectedMessageIds = useSelector(getSelectedMessageIds); const selectedConversationKey = useSelectedConversationKey(); const isPublic = useSelectedIsPublic(); const dispatch = useDispatch(); function onCloseOverlay() { dispatch(resetSelectedMessageIds()); } /** * This is a duplicate with the onKeyDown of SessionConversation. * At some point we'll make a global handler to deal with the key presses * and handle them depending on what is visible, but that's not part of this PR */ useKey( shouldProcess => { return ( shouldProcess.code === 'Escape' || shouldProcess.code === 'Backspace' || shouldProcess.code === 'Delete' ); }, event => { const selectionMode = !!selectedMessageIds.length; switch (event.key) { case 'Escape': if (selectionMode) { onCloseOverlay(); } return true; case 'Backspace': case 'Delete': if (selectionMode && selectedConversationKey) { void deleteMessagesForX(selectedMessageIds, selectedConversationKey, isPublic); } return true; default: } return false; } ); // `enforceDeleteServerSide` should check for message statuses too, but when we have multiple selected, // some might be sent and some in an error state. We default to trying to delete all of them server side first, // which might fail. If that fails, the user will need to do a delete for all the ones sent already, and a manual delete // for each ones which is in an error state. const enforceDeleteServerSide = isPublic; const classNameAndId = 'message-selection-overlay'; return (
{ if (selectedConversationKey) { await deleteMessagesForX( selectedMessageIds, selectedConversationKey, enforceDeleteServerSide ); } }} />
); };