import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import styled from 'styled-components'; import { setDisappearingMessagesByConvoId } from '../../../../interactions/conversationInteractions'; import { closeRightPanel } from '../../../../state/ducks/conversations'; import { resetRightOverlayMode } from '../../../../state/ducks/section'; import { Flex } from '../../../basic/Flex'; import { SessionButton } from '../../../basic/SessionButton'; import { SpacerLG, SpacerXL } from '../../../basic/Text'; import { PanelButtonGroup } from '../../../buttons'; import { PanelLabel } from '../../../buttons/PanelButton'; import { PanelRadioButton } from '../../../buttons/PanelRadioButton'; import { SessionIconButton } from '../../../icon'; import { getSelectedConversationExpirationModes, getSelectedConversationExpirationModesLocked, getSelectedConversationExpirationSettings, getSelectedConversationKey, } from '../../../../state/selectors/conversations'; import { DisappearingMessageConversationSetting, DisappearingMessageConversationType, } from '../../../../util/expiringMessages'; import { TimerOptionsArray } from '../../../../state/ducks/timerOptions'; import { useTimerOptionsByMode } from '../../../../hooks/useParamSelector'; import { isEmpty } from 'lodash'; 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 StyledTitle = styled.h2` font-family: var(--font-default); text-align: center; margin-top: 0px; margin-bottom: 0px; `; const StyledSubTitle = styled.h3` font-family: var(--font-default); font-size: 11px; font-weight: 400; text-align: center; padding-top: 0px; margin-top: 0; `; type HeaderProps = { title: string; subtitle: string; }; const Header = (props: HeaderProps) => { const { title, subtitle } = props; const dispatch = useDispatch(); return ( { dispatch(resetRightOverlayMode()); }} /> {title} {subtitle} { dispatch(closeRightPanel()); dispatch(resetRightOverlayMode()); }} /> ); }; type DisappearingModesProps = { options: Record; selected?: DisappearingMessageConversationType; setSelected: (value: string) => void; }; const DisappearingModes = (props: DisappearingModesProps) => { const { options, selected, setSelected } = props; return ( <> {window.i18n('disappearingMessagesModeLabel')} {Object.keys(options).map((mode: DisappearingMessageConversationType) => { const optionI18n = mode === 'legacy' ? window.i18n('disappearingMessagesModeLegacy') : mode === 'deleteAfterRead' ? window.i18n('disappearingMessagesModeAfterRead') : mode === 'deleteAfterSend' ? window.i18n('disappearingMessagesModeAfterSend') : window.i18n('disappearingMessagesModeOff'); const subtitleI18n = mode === 'legacy' ? window.i18n('disappearingMessagesModeLegacySubtitle') : mode === 'deleteAfterRead' ? window.i18n('disappearingMessagesModeAfterReadSubtitle') : mode === 'deleteAfterSend' ? window.i18n('disappearingMessagesModeAfterSendSubtitle') : undefined; return ( { setSelected(mode); }} disabled={options[mode]} noBackgroundColor={true} /> ); })} ); }; type TimerOptionsProps = { options: TimerOptionsArray | null; selected?: number; setSelected: (value: number) => void; }; const TimeOptions = (props: TimerOptionsProps) => { const { options, selected, setSelected } = props; if (!options || isEmpty(options)) { return null; } return ( <> {window.i18n('timer')} {options.map((option: any) => ( { setSelected(option.value); }} noBackgroundColor={true} /> ))} ); }; type OverlayDisappearingMessagesProps = { unlockAllModes: boolean }; export const OverlayDisappearingMessages = (props: OverlayDisappearingMessagesProps) => { const { unlockAllModes } = props; const dispatch = useDispatch(); const selectedConversationKey = useSelector(getSelectedConversationKey); const disappearingModeOptions = useSelector( unlockAllModes ? getSelectedConversationExpirationModes : getSelectedConversationExpirationModesLocked ); const convoProps = useSelector(getSelectedConversationExpirationSettings); if (!convoProps) { return null; } const { isGroup } = convoProps; const [modeSelected, setModeSelected] = useState(convoProps.expirationType); const [timeSelected, setTimeSelected] = useState(convoProps.expireTimer); // Legacy mode uses the default timer options depending on the conversation type // TODO verify that this if fine compared to updating in the useEffect const timerOptions = useTimerOptionsByMode( modeSelected === 'legacy' ? isGroup ? DisappearingMessageConversationSetting[2] : DisappearingMessageConversationSetting[1] : modeSelected ); useEffect(() => { if (modeSelected !== convoProps.expirationType) { setModeSelected(convoProps.expirationType); } if (timeSelected !== convoProps.expireTimer) { setTimeSelected(convoProps.expireTimer); } }, [convoProps.expirationType, convoProps.expireTimer]); return (
{modeSelected !== 'off' && ( <> )} { if (selectedConversationKey && modeSelected && timeSelected) { await setDisappearingMessagesByConvoId( selectedConversationKey, modeSelected, timeSelected ); dispatch(closeRightPanel()); dispatch(resetRightOverlayMode()); } }} > {window.i18n('set')} ); };