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.
166 lines
4.4 KiB
TypeScript
166 lines
4.4 KiB
TypeScript
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;
|
|
}
|
|
}
|
|
`;
|
|
|
|
export const StyledSubtitleDotMenu = styled(Flex)``;
|
|
|
|
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;
|
|
`;
|
|
|
|
export const SubtitleDotMenu = ({
|
|
id,
|
|
selectedOptionIndex,
|
|
optionsCount,
|
|
style,
|
|
}: {
|
|
id: string;
|
|
selectedOptionIndex: number;
|
|
optionsCount: number;
|
|
style: CSSProperties;
|
|
}) => (
|
|
<StyledSubtitleDotMenu id={id} container={true} alignItems={'center'} style={style}>
|
|
{Array(optionsCount)
|
|
.fill(0)
|
|
.map((_, index) => {
|
|
return (
|
|
<StyledSubtitleDot
|
|
key={`subtitleDotMenu-${id}-${index}`}
|
|
active={selectedOptionIndex === index}
|
|
/>
|
|
);
|
|
})}
|
|
</StyledSubtitleDotMenu>
|
|
);
|
|
|
|
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="timerFixed"
|
|
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
|
|
id={'conversation-header-subtitle-dots'}
|
|
selectedOptionIndex={subtitlesArray.indexOf(currentSubtitle)}
|
|
optionsCount={subtitlesArray.length}
|
|
style={{ display: subtitlesArray.length < 2 ? 'none' : undefined, margin: '8px 0' }}
|
|
/>
|
|
</StyledSubtitleContainer>
|
|
);
|
|
};
|