import { useEffect, useMemo } from 'react'; import { ContactOnlineStatus, ContactStore, ConversationType, useChatContext } from 'tuikit-atomicx-react/chat'; import type { ConversationInfo } from 'tuikit-atomicx-react/chat'; interface UseChatHeaderStoreReturn { /** im avatar can't be undefined */ avatar: string; /** whether is group conversation */ isGroup: boolean; /** im title */ title: string | undefined; /** current conversation */ conversation: ConversationInfo | undefined; /** whether the C2C peer is a friend */ isC2CFriend: boolean; /** whether the C2C friend is online */ isOnline: boolean; } function getC2CUserID(conversation: ConversationInfo | undefined) { if (!conversation || conversation.type !== ConversationType.C2C) { return undefined; } return conversation.conversationID.replace(/^C2C/, ''); } function useChatHeader(): UseChatHeaderStoreReturn { const { activeConversation } = useChatContext(); const { friendList, loadFriends } = ContactStore(); useEffect(() => { if (friendList.length === 0) { loadFriends(); } }, [friendList.length, loadFriends]); const { isC2CFriend, isOnline } = useMemo(() => { const userID = getC2CUserID(activeConversation); const friend = userID ? friendList.find(item => item.userID === userID) : undefined; const isFriend = Boolean(friend?.isFriend); return { isC2CFriend: isFriend, isOnline: isFriend && friend?.onlineStatus === ContactOnlineStatus.Online, }; }, [activeConversation, friendList]); const title = useMemo(() => { if (!activeConversation) { return undefined; } return activeConversation.title || activeConversation.conversationID || ''; }, [activeConversation]); const avatar = useMemo(() => { if (!activeConversation) { return ''; } return activeConversation.avatarURL || ''; }, [activeConversation]); const isGroup = useMemo(() => activeConversation?.type === ConversationType.Group, [activeConversation]); return { title, avatar, isGroup, conversation: activeConversation, isC2CFriend, isOnline, }; } export { useChatHeader, };