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.
		
		
		
		
		
			
		
			
				
	
	
		
			223 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			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>
 | |
|   );
 | |
| };
 |