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.
		
		
		
		
		
			
		
			
				
	
	
		
			164 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| import styled, { CSSProperties } from 'styled-components';
 | |
| import { Flex } from '../../basic/Flex';
 | |
| import { SessionIconButton } from '../../icon';
 | |
| import { SubtitleStrings, SubtitleStringsType } from './ConversationHeaderTitle';
 | |
| 
 | |
| function loadDataTestId(currentSubtitle: SubtitleStringsType) {
 | |
|   if (currentSubtitle === 'disappearingMessages') {
 | |
|     return 'disappear-messages-type-and-time';
 | |
|   }
 | |
| 
 | |
|   return 'conversation-header-subtitle';
 | |
| }
 | |
| 
 | |
| export const StyledSubtitleContainer = styled.div`
 | |
|   display: flex;
 | |
|   flex-direction: column;
 | |
|   align-items: center;
 | |
|   justify-content: center;
 | |
|   margin: 0 auto;
 | |
|   min-width: 230px;
 | |
| 
 | |
|   div:first-child {
 | |
|     span:last-child {
 | |
|       margin-bottom: 0;
 | |
|     }
 | |
|   }
 | |
| `;
 | |
| 
 | |
| const StyledSubtitleDot = styled.span<{ active: boolean }>`
 | |
|   border-radius: 50%;
 | |
|   background-color: ${props =>
 | |
|     props.active ? 'var(--text-primary-color)' : 'var(--text-secondary-color)'};
 | |
| 
 | |
|   height: 5px;
 | |
|   width: 5px;
 | |
|   margin: 0 2px;
 | |
| `;
 | |
| 
 | |
| const SubtitleDotMenu = ({
 | |
|   options,
 | |
|   selectedOptionIndex,
 | |
|   style,
 | |
| }: {
 | |
|   options: Array<string | null>;
 | |
|   selectedOptionIndex: number;
 | |
|   style: CSSProperties;
 | |
| }) => (
 | |
|   <Flex container={true} alignItems={'center'} style={style}>
 | |
|     {options.map((option, index) => {
 | |
|       if (!option) {
 | |
|         return null;
 | |
|       }
 | |
| 
 | |
|       return (
 | |
|         <StyledSubtitleDot
 | |
|           key={`subtitleDotMenu-${index}`}
 | |
|           active={selectedOptionIndex === index}
 | |
|         />
 | |
|       );
 | |
|     })}
 | |
|   </Flex>
 | |
| );
 | |
| 
 | |
| type ConversationHeaderSubtitleProps = {
 | |
|   subtitlesArray: Array<SubtitleStringsType>;
 | |
|   subtitleStrings: SubtitleStrings;
 | |
|   currentSubtitle: SubtitleStringsType;
 | |
|   setCurrentSubtitle: (index: SubtitleStringsType) => void;
 | |
|   onClickFunction: () => void;
 | |
|   showDisappearingMessageIcon: boolean;
 | |
| };
 | |
| 
 | |
| export const ConversationHeaderSubtitle = (props: ConversationHeaderSubtitleProps) => {
 | |
|   const {
 | |
|     subtitlesArray,
 | |
|     subtitleStrings,
 | |
|     currentSubtitle,
 | |
|     setCurrentSubtitle,
 | |
|     onClickFunction,
 | |
|     showDisappearingMessageIcon,
 | |
|   } = props;
 | |
| 
 | |
|   const handleTitleCycle = (direction: 1 | -1) => {
 | |
|     let newIndex = subtitlesArray.indexOf(currentSubtitle) + direction;
 | |
|     if (newIndex > subtitlesArray.length - 1) {
 | |
|       newIndex = 0;
 | |
|     }
 | |
| 
 | |
|     if (newIndex < 0) {
 | |
|       newIndex = subtitlesArray.length - 1;
 | |
|     }
 | |
| 
 | |
|     if (subtitlesArray[newIndex]) {
 | |
|       setCurrentSubtitle(subtitlesArray[newIndex]);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   return (
 | |
|     <StyledSubtitleContainer>
 | |
|       <Flex
 | |
|         container={true}
 | |
|         flexDirection={'row'}
 | |
|         justifyContent={subtitlesArray.length < 2 ? 'center' : 'space-between'}
 | |
|         alignItems={'center'}
 | |
|         width={'100%'}
 | |
|       >
 | |
|         <SessionIconButton
 | |
|           iconColor={'var(--button-icon-stroke-selected-color)'}
 | |
|           iconSize={'small'}
 | |
|           iconType="chevron"
 | |
|           iconRotation={90}
 | |
|           margin={'0 3px 0 0'}
 | |
|           onClick={() => {
 | |
|             handleTitleCycle(-1);
 | |
|           }}
 | |
|           isHidden={subtitlesArray.length < 2}
 | |
|           tabIndex={0}
 | |
|         />
 | |
|         {showDisappearingMessageIcon && (
 | |
|           <SessionIconButton
 | |
|             iconColor={'var(--button-icon-stroke-selected-color)'}
 | |
|             iconSize={'tiny'}
 | |
|             iconType="timer50"
 | |
|             margin={'0 var(--margins-xs) 0 0'}
 | |
|           />
 | |
|         )}
 | |
|         <span
 | |
|           role="button"
 | |
|           className="module-conversation-header__title-text"
 | |
|           onClick={onClickFunction}
 | |
|           onKeyPress={(e: any) => {
 | |
|             if (e.key === 'Enter') {
 | |
|               e.preventDefault();
 | |
|               onClickFunction();
 | |
|             }
 | |
|           }}
 | |
|           tabIndex={0}
 | |
|           data-testid={loadDataTestId(currentSubtitle)}
 | |
|         >
 | |
|           {subtitleStrings[currentSubtitle]}
 | |
|         </span>
 | |
|         <SessionIconButton
 | |
|           iconColor={'var(--button-icon-stroke-selected-color)'}
 | |
|           iconSize={'small'}
 | |
|           iconType="chevron"
 | |
|           iconRotation={270}
 | |
|           margin={'0 0 0 3px'}
 | |
|           onClick={() => {
 | |
|             handleTitleCycle(1);
 | |
|           }}
 | |
|           isHidden={subtitlesArray.length < 2}
 | |
|           tabIndex={0}
 | |
|         />
 | |
|       </Flex>
 | |
|       <SubtitleDotMenu
 | |
|         options={subtitlesArray}
 | |
|         selectedOptionIndex={subtitlesArray.indexOf(currentSubtitle)}
 | |
|         style={{ display: subtitlesArray.length < 2 ? 'none' : undefined, margin: '8px 0' }}
 | |
|       />
 | |
|     </StyledSubtitleContainer>
 | |
|   );
 | |
| };
 |