import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import styled from 'styled-components'; import { useTimerOptionsByMode } from '../../../../../hooks/useParamSelector'; import { setDisappearingMessagesByConvoId } from '../../../../../interactions/conversationInteractions'; import { getConversationController } from '../../../../../session/conversations'; import { closeRightPanel } from '../../../../../state/ducks/conversations'; import { resetRightOverlayMode } from '../../../../../state/ducks/section'; import { getSelectedConversationExpirationModes, getSelectedConversationExpirationModesWithLegacy, useSelectedConversationKey, useSelectedExpirationType, useSelectedExpireTimer, useSelectedIsGroup, useSelectedWeAreAdmin, } from '../../../../../state/selectors/conversations'; import { DEFAULT_TIMER_OPTION, DisappearingMessageConversationType, } from '../../../../../util/expiringMessages'; import { Flex } from '../../../../basic/Flex'; import { SessionButton } from '../../../../basic/SessionButton'; import { SpacerLG, SpacerXL } from '../../../../basic/Text'; import { DisappearingModes } from './DisappearingModes'; import { Header } from './Header'; import { TimeOptions } from './TimeOptions'; const StyledScrollContainer = styled.div` width: 100%; height: 100%; overflow: hidden auto; `; const StyledContainer = styled(Flex)` .session-button { font-weight: 500; min-width: 90px; width: fit-content; margin: 35px auto 0; } `; const StyledNonAdminDescription = styled.div` display: flex; justify-content: center; align-items: center; margin: 0 var(--margins-lg); color: var(--text-secondary-color); font-size: var(--font-size-xs); text-align: center; line-height: 15px; `; // TODO legacy messages support will be removed in a future release function loadDefaultTimeValue(modeSelected: DisappearingMessageConversationType | undefined) { return modeSelected !== 'off' ? modeSelected !== 'legacy' ? modeSelected === 'deleteAfterSend' ? DEFAULT_TIMER_OPTION.DELETE_AFTER_SEND : DEFAULT_TIMER_OPTION.DELETE_AFTER_READ : DEFAULT_TIMER_OPTION.LEGACY : 0; } export type PropsForExpirationSettings = { expirationType: string | undefined; expireTimer: number | undefined; isGroup: boolean | undefined; weAreAdmin: boolean | undefined; }; export const OverlayDisappearingMessages = ({ unlockNewModes }: { unlockNewModes: boolean }) => { const dispatch = useDispatch(); const selectedConversationKey = useSelectedConversationKey(); const disappearingModeOptions = useSelector( unlockNewModes ? getSelectedConversationExpirationModes : getSelectedConversationExpirationModesWithLegacy ); // NOTE if there is only 'off' and one disappearing message mode then we trigger single mode const singleMode = disappearingModeOptions && disappearingModeOptions.off !== undefined && Object.keys(disappearingModeOptions).length === 2 ? Object.keys(disappearingModeOptions)[1] : undefined; const hasOnlyOneMode = Boolean(singleMode && singleMode.length > 0); const isGroup = useSelectedIsGroup(); const expirationType = useSelectedExpirationType(); const expireTimer = useSelectedExpireTimer(); const weAreAdmin = useSelectedWeAreAdmin(); const [modeSelected, setModeSelected] = useState( expirationType ); const [timeSelected, setTimeSelected] = useState(0); const timerOptions = useTimerOptionsByMode(modeSelected, hasOnlyOneMode); const handleSetMode = async () => { if (hasOnlyOneMode) { if (selectedConversationKey && singleMode) { await setDisappearingMessagesByConvoId( selectedConversationKey, timeSelected === 0 ? 'off' : singleMode, timeSelected ); dispatch(closeRightPanel()); dispatch(resetRightOverlayMode()); } } else { if (selectedConversationKey && modeSelected) { await setDisappearingMessagesByConvoId(selectedConversationKey, modeSelected, timeSelected); dispatch(closeRightPanel()); dispatch(resetRightOverlayMode()); } } }; const handleSetTime = (value: number) => { setTimeSelected(value); }; useEffect(() => { // NOTE loads a time value from the conversation model or the default handleSetTime( modeSelected === expirationType && expireTimer && expireTimer > -1 ? expireTimer : loadDefaultTimeValue(modeSelected) ); }, [expirationType, expireTimer, modeSelected]); // TODO legacy messages support will be removed in a future useEffect(() => { if (unlockNewModes && modeSelected === 'legacy' && selectedConversationKey) { const convo = getConversationController().get(selectedConversationKey); if (convo) { let defaultExpirationType: DisappearingMessageConversationType = 'deleteAfterRead'; if (convo.isMe() || convo.isClosedGroup()) { defaultExpirationType = 'deleteAfterSend'; } convo.set('expirationType', defaultExpirationType); setModeSelected(defaultExpirationType); } } }, [unlockNewModes, selectedConversationKey, modeSelected]); if (!disappearingModeOptions) { return null; } if (!selectedConversationKey) { return null; } return (
{(hasOnlyOneMode || modeSelected !== 'off') && ( <> {!hasOnlyOneMode && } )} {isGroup && !weAreAdmin && ( <> {window.i18n('settingAppliesToEveryone')}
{window.i18n('onlyGroupAdminsCanChange')}
)} {window.i18n('set')} ); };