You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages...

223 lines
7.4 KiB
TypeScript

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/selectedConversation';
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<DisappearingMessageConversationType | undefined>(
expirationType
);
const [timeSelected, setTimeSelected] = useState<number>(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 (
<StyledScrollContainer>
<StyledContainer container={true} flexDirection={'column'} alignItems={'center'}>
<Header
title={window.i18n('disappearingMessages')}
subtitle={
singleMode === 'deleteAfterRead'
? window.i18n('disappearingMessagesModeAfterReadSubtitle')
: singleMode === 'deleteAfterSend'
? window.i18n('disappearingMessagesModeAfterSendSubtitle')
: window.i18n('settingAppliesToEveryone')
}
/>
<DisappearingModes
options={disappearingModeOptions}
selected={modeSelected}
setSelected={setModeSelected}
hasOnlyOneMode={hasOnlyOneMode}
/>
{(hasOnlyOneMode || modeSelected !== 'off') && (
<>
{!hasOnlyOneMode && <SpacerLG />}
<TimeOptions
options={timerOptions}
selected={timeSelected}
setSelected={handleSetTime}
hasOnlyOneMode={hasOnlyOneMode}
disabled={
singleMode
? disappearingModeOptions[singleMode]
: modeSelected
? disappearingModeOptions[modeSelected]
: undefined
}
/>
</>
)}
{isGroup && !weAreAdmin && (
<>
<SpacerLG />
<StyledNonAdminDescription>
{window.i18n('settingAppliesToEveryone')}
<br />
{window.i18n('onlyGroupAdminsCanChange')}
</StyledNonAdminDescription>
</>
)}
<SessionButton
onClick={handleSetMode}
disabled={
singleMode
? disappearingModeOptions[singleMode]
: modeSelected
? disappearingModeOptions[modeSelected]
: undefined
}
dataTestId={'disappear-set-button'}
>
{window.i18n('set')}
</SessionButton>
<SpacerLG />
<SpacerXL />
</StyledContainer>
</StyledScrollContainer>
);
};