import React, { useCallback } from 'react'; import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import I18n from '../../i18n'; import sharedStyles from '../../views/Styles'; import { MarkdownPreview } from '../markdown'; import RoomTypeIcon from '../RoomTypeIcon'; import { TUserStatus, IOmnichannelSource } from '../../definitions'; import { useTheme } from '../../theme'; import { useAppSelector } from '../../lib/hooks'; 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; roomUserId?: string | null; prid?: string; tmid?: string; teamMain?: boolean; status?: TUserStatus; usersTyping: []; isGroupChat?: boolean; parentTitle?: string; onPress: Function; testID?: string; sourceType?: IOmnichannelSource; } const SubTitle = React.memo(({ usersTyping, subtitle, renderFunc, scale }: TRoomHeaderSubTitle) => { const { colors } = 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 { colors } = useTheme(); const titleStyle = { fontSize: TITLE_SIZE * scale, color: colors.headerTitleColor }; if (!tmid && !prid) { return ( {title} ); } return ; }); const Header = React.memo( ({ title, subtitle, parentTitle, type, status, width, height, roomUserId, prid, tmid, onPress, isGroupChat, teamMain, testID, usersTyping = [], sourceType }: IRoomHeader) => { const { colors } = useTheme(); const portrait = height > width; let scale = 1; const isMasterDetail = useAppSelector(state => state.app.isMasterDetail); if (!portrait && !tmid && !isMasterDetail) { if (usersTyping.length > 0 || subtitle) { scale = 0.8; } } let renderFunc; if (tmid) { renderFunc = () => ( {parentTitle} ); } const handleOnPress = useCallback(() => onPress(), []); return ( {tmid ? null : ( )} ); } ); export default Header;