import React, { useCallback } from 'react'; import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import I18n from '../../i18n'; import sharedStyles from '../../views/Styles'; import { themes } from '../../lib/constants'; import { MarkdownPreview } from '../markdown'; import RoomTypeIcon from '../RoomTypeIcon'; import { TUserStatus, IOmnichannelSource } from '../../definitions'; import { useTheme } from '../../theme'; const HIT_SLOP = { top: 5, right: 5, bottom: 5, left: 5 }; const TITLE_SIZE = 16; const SUBTITLE_SIZE = 12; const getSubTitleSize = (scale: number) => SUBTITLE_SIZE * scale; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center' }, titleContainer: { alignItems: 'center', flexDirection: 'row' }, title: { flexShrink: 1, ...sharedStyles.textSemibold }, subtitle: { flexShrink: 1, ...sharedStyles.textRegular }, typingUsers: { ...sharedStyles.textSemibold } }); type TRoomHeaderSubTitle = { usersTyping: []; subtitle: string; renderFunc?: () => React.ReactElement; scale: number; }; type TRoomHeaderHeaderTitle = { title: string; tmid: string; prid: string; scale: number; testID: string; }; interface IRoomHeader { title: string; subtitle: string; type: string; width: number; height: number; prid: string; tmid: string; teamMain: boolean; status: TUserStatus; usersTyping: []; isGroupChat: boolean; parentTitle: string; onPress: () => void; testID: string; sourceType?: IOmnichannelSource; } const SubTitle = React.memo(({ usersTyping, subtitle, renderFunc, scale }: TRoomHeaderSubTitle) => { const { theme } = useTheme(); const fontSize = getSubTitleSize(scale); // typing if (usersTyping.length) { let usersText; if (usersTyping.length === 2) { usersText = usersTyping.join(` ${I18n.t('and')} `); } else { usersText = usersTyping.join(', '); } return ( {usersText} {usersTyping.length > 1 ? I18n.t('are_typing') : I18n.t('is_typing')}... ); } // renderFunc if (renderFunc) { return renderFunc(); } // subtitle if (subtitle) { return ; } return null; }); const HeaderTitle = React.memo(({ title, tmid, prid, scale, testID }: TRoomHeaderHeaderTitle) => { const { theme } = useTheme(); const titleStyle = { fontSize: TITLE_SIZE * scale, color: themes[theme].headerTitleColor }; if (!tmid && !prid) { return ( {title} ); } return ; }); const Header = React.memo( ({ title, subtitle, parentTitle, type, status, width, height, prid, tmid, onPress, isGroupChat, teamMain, testID, usersTyping = [], sourceType }: IRoomHeader) => { const { theme } = useTheme(); const portrait = height > width; let scale = 1; if (!portrait && !tmid) { if (usersTyping.length > 0 || subtitle) { scale = 0.8; } } let renderFunc; if (tmid) { renderFunc = () => ( {parentTitle} ); } const handleOnPress = useCallback(() => onPress(), []); return ( {tmid ? null : ( )} ); } ); export default Header;