import React from 'react'; // tslint:disable: no-submodule-imports use-simple-attributes import { SpacerLG } from '../../basic/Text'; import { useDispatch, useSelector } from 'react-redux'; import { getConversationRequests, getSelectedConversation, } from '../../../state/selectors/conversations'; import { MemoConversationListItemWithDetails } from '../conversation-list-item/ConversationListItem'; import styled from 'styled-components'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../../basic/SessionButton'; import { resetOverlayMode, SectionType, showLeftPaneSection } from '../../../state/ducks/section'; import { getConversationController } from '../../../session/conversations'; import { forceSyncConfigurationNowIfNeeded } from '../../../session/utils/syncUtils'; import { BlockedNumberController } from '../../../util'; import useKey from 'react-use/lib/useKey'; import { ReduxConversationType, resetConversationExternal, } from '../../../state/ducks/conversations'; import { updateConfirmModal } from '../../../state/ducks/modalDialog'; export const OverlayMessageRequest = () => { useKey('Escape', closeOverlay); const dispatch = useDispatch(); function closeOverlay() { dispatch(resetOverlayMode()); } const convoRequestCount = useSelector(getConversationRequests).length; const messageRequests = useSelector(getConversationRequests); const selectedConversation = useSelector(getSelectedConversation); const buttonText = window.i18n('clearAll'); /** * Blocks all message request conversations and synchronizes across linked devices * @returns void */ function handleClearAllRequestsClick(convoRequests: Array) { const { i18n } = window; const title = i18n('clearAllConfirmationTitle'); const message = i18n('clearAllConfirmationBody'); const onClose = dispatch(updateConfirmModal(null)); dispatch( updateConfirmModal({ title, message, onClose, onClickOk: async () => { window?.log?.info('Blocking all conversations'); if (!convoRequests) { window?.log?.info('No conversation requests to block.'); return; } let newConvosBlocked = []; const convoController = getConversationController(); await Promise.all( (newConvosBlocked = convoRequests.filter(async convo => { const { id } = convo; const convoModel = convoController.get(id); if (!convoModel.isBlocked()) { await BlockedNumberController.block(id); await convoModel.commit(); } await convoModel.setIsApproved(false); // if we're looking at the convo to decline, close the convo if (selectedConversation?.id === id) { dispatch(resetConversationExternal()); } return true; })) ); if (newConvosBlocked) { await forceSyncConfigurationNowIfNeeded(); } // if no more requests, return to placeholder screen if (convoRequestCount === newConvosBlocked.length) { dispatch(resetOverlayMode()); dispatch(showLeftPaneSection(SectionType.Message)); dispatch(resetConversationExternal()); } }, }) ); } return (
{convoRequestCount ? ( <> { handleClearAllRequestsClick(messageRequests); }} /> ) : ( <> {window.i18n('noMessageRequestsPending')} )}
); }; const MessageRequestListPlaceholder = styled.div` color: var(--color-text); margin-bottom: auto; `; const MessageRequestListContainer = styled.div` width: 100%; overflow-y: auto; border: var(--border-session); margin-bottom: auto; `; /** * A request needs to be be unapproved and not blocked to be valid. * @returns List of message request items */ const MessageRequestList = () => { const conversationRequests = useSelector(getConversationRequests); return ( {conversationRequests.map(conversation => { return ( ); })} ); };