import { 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 { TimerOptions } from '../../../../../session/disappearing_messages/timerOptions'; import { DisappearingMessageConversationModeType } from '../../../../../session/disappearing_messages/types'; import { closeRightPanel } from '../../../../../state/ducks/conversations'; import { resetRightOverlayMode } from '../../../../../state/ducks/section'; import { getSelectedConversationExpirationModes, useSelectedConversationDisappearingMode, useSelectedConversationKey, useSelectedExpireTimer, useSelectedIsGroupOrCommunity, useSelectedWeAreAdmin } from '../../../../../state/selectors/selectedConversation'; import { ReleasedFeatures } from '../../../../../util/releaseFeature'; import { Flex } from '../../../../basic/Flex'; import { SessionButton } from '../../../../basic/SessionButton'; import { SpacerLG } from '../../../../basic/Text'; import { Header, HeaderSubtitle, HeaderTitle, StyledScrollContainer } from '../components'; import { DisappearingModes } from './DisappearingModes'; import { TimeOptions } from './TimeOptions'; const ButtonSpacer = styled.div` height: 80px; `; const StyledButtonContainer = styled.div` background: linear-gradient(0deg, var(--background-primary-color), transparent); position: absolute; width: 100%; bottom: 0px; .session-button { font-weight: 500; min-width: 90px; width: fit-content; margin: 35px auto 10px; } `; 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: DisappearingMessageConversationModeType | undefined, hasOnlyOneMode: boolean ) { // NOTE if there is only 1 disappearing message mode available the default state is that it is turned off if (hasOnlyOneMode) { return 0; } return modeSelected !== 'off' ? modeSelected !== 'legacy' ? modeSelected === 'deleteAfterSend' ? TimerOptions.DEFAULT_OPTIONS.DELETE_AFTER_SEND : TimerOptions.DEFAULT_OPTIONS.DELETE_AFTER_READ : TimerOptions.DEFAULT_OPTIONS.LEGACY : 0; } /** if there is only one disappearing message mode and 'off' enabled then we trigger single mode UI */ function useSingleMode(disappearingModeOptions: any) { const singleMode: DisappearingMessageConversationModeType | undefined = disappearingModeOptions && disappearingModeOptions.off !== undefined && Object.keys(disappearingModeOptions).length === 2 ? (Object.keys(disappearingModeOptions)[1] as DisappearingMessageConversationModeType) : undefined; const hasOnlyOneMode = Boolean(singleMode && singleMode.length > 0); return { singleMode, hasOnlyOneMode }; } // TODO legacy messages support will be removed in a future release function useLegacyModeBeforeV2Release( isV2Released: boolean, expirationMode: DisappearingMessageConversationModeType | undefined, setModeSelected: (mode: DisappearingMessageConversationModeType | undefined) => void ) { useEffect(() => { if (!isV2Released) { setModeSelected( expirationMode === 'deleteAfterRead' || expirationMode === 'deleteAfterSend' ? 'legacy' : expirationMode ); } }, [expirationMode, isV2Released, setModeSelected]); } export type PropsForExpirationSettings = { expirationMode: DisappearingMessageConversationModeType | undefined; expireTimer: number | undefined; isGroup: boolean | undefined; weAreAdmin: boolean | undefined; }; export const OverlayDisappearingMessages = () => { const dispatch = useDispatch(); const selectedConversationKey = useSelectedConversationKey(); const disappearingModeOptions = useSelector(getSelectedConversationExpirationModes); const { singleMode, hasOnlyOneMode } = useSingleMode(disappearingModeOptions); const isGroup = useSelectedIsGroupOrCommunity(); const expirationMode = useSelectedConversationDisappearingMode(); const expireTimer = useSelectedExpireTimer(); const weAreAdmin = useSelectedWeAreAdmin(); const [modeSelected, setModeSelected] = useState< DisappearingMessageConversationModeType | undefined >(hasOnlyOneMode ? singleMode : expirationMode); const [timeSelected, setTimeSelected] = useState(expireTimer || 0); const timerOptions = useTimerOptionsByMode(modeSelected, hasOnlyOneMode); const isV2Released = ReleasedFeatures.isDisappearMessageV2FeatureReleasedCached(); const handleSetMode = async () => { if (hasOnlyOneMode) { if (selectedConversationKey && singleMode) { await setDisappearingMessagesByConvoId( selectedConversationKey, timeSelected === 0 ? 'off' : singleMode, timeSelected ); dispatch(closeRightPanel()); dispatch(resetRightOverlayMode()); } return; } if (selectedConversationKey && modeSelected) { await setDisappearingMessagesByConvoId(selectedConversationKey, modeSelected, timeSelected); dispatch(closeRightPanel()); dispatch(resetRightOverlayMode()); } }; useLegacyModeBeforeV2Release(isV2Released, expirationMode, setModeSelected); useEffect(() => { // NOTE loads a time value from the conversation model or the default setTimeSelected( expireTimer !== undefined && expireTimer > -1 ? expireTimer : loadDefaultTimeValue(modeSelected, hasOnlyOneMode) ); }, [expireTimer, hasOnlyOneMode, modeSelected]); if (!disappearingModeOptions) { return null; } if (!selectedConversationKey) { return null; } return (
{window.i18n('disappearingMessages')} {singleMode === 'deleteAfterRead' ? window.i18n('disappearingMessagesModeAfterReadSubtitle') : singleMode === 'deleteAfterSend' ? window.i18n('disappearingMessagesModeAfterSendSubtitle') : window.i18n('settingAppliesToYourMessages')}
{(hasOnlyOneMode || modeSelected !== 'off') && ( <> {!hasOnlyOneMode && } )} {isGroup && isV2Released && !weAreAdmin && ( <> {window.i18n('settingAppliesToEveryone')}
{window.i18n('onlyGroupAdminsCanChange')}
)} {window.i18n('set')}
); };