UNPKG

react-native-chating-ui-kit

Version:

CometChat React Native UI Kit is a collection of custom UI Components designed to build text , chat and calling features in your application. The UI Kit is developed to keep developers in mind and aims to reduce development efforts significantly

137 lines 6.6 kB
import React, { useEffect, useRef, useState } from 'react'; import { View, TouchableOpacity, Image, Text, SectionList } from 'react-native'; import { CometChat } from '@cometchat-pro/react-native-chat'; import { AvatarStyle, CometChatContext, CometChatListItem, ListItemStyle, localize } from '../../shared'; import { StatusIndicatorStyle } from '../../shared/views/CometChatStatusIndicator/StatusIndicatorStyle'; import { Style } from './style'; import { CloseIcon } from './resources'; import { useContext } from 'react'; import { CallDetailsStyle } from './CallDetailsStyle'; import { CallingDetailsUtils } from '../CallingDetailsUtils'; import { PASSWORD_GROUP_COLOR, PRIVATE_GROUP_COLOR } from '../../shared/constants/UIKitConstants'; const listenerId = "userListener_" + new Date().getTime(); const CometChatCallDetails = (props) => { const { onBack, onError, CustomProfileView, SubtitleView, data, disableUsersPresence, hideProfile, call, closeButtonIconImage, showCloseButton = true, title = localize("CALL_DETAILS"), avatarStyle, callDetailsStyle, listItemStyle, statusIndicatorStyle, } = props; const { theme } = useContext(CometChatContext); const [tempates, setTemplates] = useState([]); const [group, setGroup] = useState(undefined); const [user, setUser] = useState(undefined); const [error, setError] = useState(undefined); const loggedInUser = useRef(null); const _avatarStyle = new AvatarStyle({ nameTextColor: theme.palette.getAccent(), backgroundColor: theme.palette.getBackgroundColor(), nameTextFont: theme.typography.heading, ...avatarStyle }); const _listStyle = new ListItemStyle({ backgroundColor: theme.palette.getBackgroundColor(), titleColor: theme.palette.getAccent(), titleFont: theme.typography.body, ...listItemStyle }); const _statusStyle = new StatusIndicatorStyle({ ...statusIndicatorStyle }); const _callDetailsStyle = new CallDetailsStyle({ backIconTint: theme.palette.getPrimary(), titleColor: theme.palette.getAccent(), titleFont: theme.typography.heading, closeIconTint: theme.palette.getPrimary(), backgroundColor: theme.palette.getBackgroundColor(), ...callDetailsStyle }); useEffect(() => { CometChat.getLoggedinUser().then((loggedUser) => { let tmpList; loggedInUser.current = loggedUser; let user = call?.getReceiverType() == "user" ? call.getReceiver() : undefined; let group = call?.getReceiverType() == "group" ? call['receiver'] : undefined; if (data) { tmpList = data({ message: call, user, group }); } else { tmpList = CallingDetailsUtils.getDefaultDetailsTemplates(call, loggedUser, user, group); } setTemplates(tmpList.map(item => { item['data'] = item.options; return item; })); setUser(user); setGroup(group); }, (error) => { setError(localize("SOMETHING_WRONG")); onError && onError(error); }); CometChat.addUserListener(listenerId, new CometChat.UserListener({ onUserOnline: (user) => { setUser(user); }, onUserOffline: (user) => { setUser(user); }, })); return () => { CometChat.removeUserListener(listenerId); }; }, []); const getStatusColor = () => { if (disableUsersPresence) return "transparent"; if (user && user['status'] == "online") return theme.palette.getSuccess(); if (group) { if (group['type'] == "password") return PASSWORD_GROUP_COLOR; if (group['type'] == "private") return PRIVATE_GROUP_COLOR; } return "transparent"; }; const subtitleView = () => { if (SubtitleView) return <SubtitleView group={group} user={user}/>; return <Text style={{ color: theme.palette.getAccent() }}> {user ? user['status'] : group ? `${group['membersCount']} ${localize("MEMBERS")}` : undefined} </Text>; }; const _render = ({ item }) => { return item.CustomView && item.CustomView(); }; return (<View style={{ flex: 1, backgroundColor: theme.palette.getBackgroundColor() }}> {!hideProfile && <View style={[Style.row, { height: 60, alignItems: "center" }]}> {CustomProfileView && <CustomProfileView user={user}/>} {showCloseButton && <TouchableOpacity onPress={onBack}> <Image style={[Style.imageStyle, { tintColor: _callDetailsStyle.backIconTint }]} source={closeButtonIconImage || CloseIcon}/> </TouchableOpacity>} <Text style={[theme.typography.heading, Style.heading, { color: theme.palette.getAccent() }]}>{title}</Text> </View>} {error && <View style={{ justifyContent: "center", alignItems: "center" }}> <Text style={{ color: theme.palette.getError() }}>{error}</Text> </View> || <> <CometChatListItem id={user ? user['uid'] : group ? group['guid'] : undefined} statusIndicatorColor={getStatusColor()} avatarURL={user && user['avatar'] ? { uri: user['avatar'] } : group && group['icon'] ? { uri: group['icon'] } : undefined} SubtitleView={() => subtitleView()} avatarName={user ? user['name'] : group ? group['name'] : undefined} title={user ? user['name'] : group ? group['name'] : undefined} avatarStyle={_avatarStyle} statusIndicatorStyle={_statusStyle} listItemStyle={_listStyle}/> <SectionList sections={tempates} keyExtractor={(item, index) => item + index} renderItem={_render} renderSectionHeader={({ section }) => { const { title, titleColor, titleFont, titleStyle } = section; if (!title) return null; return (<Text style={[ { color: titleColor ?? theme.palette.getAccent500() }, titleFont ? titleFont : theme.typography.text2, titleStyle ? titleStyle : {}, ]}> {title} </Text>); }}/> </>} </View>); }; //# sourceMappingURL=CometChatCallDetails.js.map