import React, { useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Conversation } from '@tencentcloud/chat'; import { useTUIKitContext } from '../../context'; import useConversationList from './hooks/useConversationList'; import './index.scss'; import { ConversationPreview, ConversationPreviewUIComponentProps } from '../ConversationPreview'; import { ConversationListContainer, ConversationListContainerProps, } from '../ConversationPreview/ConversationListContainer'; import { ConversationSearchInput, ConversationSearchResult } from '../ConversationSearch'; import { ConversationCreate } from '../ConversationCreate'; import { Icon, IconTypes } from '../Icon'; import { getDisplayTitle } from '../ConversationPreview/utils'; import { useConversationUpdate } from './hooks/useConversationUpdate'; import { useTUIConversationContext } from '../../context/TUIConversationContext'; interface Props { filters?: object, sort?: object, options?: object, Preview?: React.ComponentType, Container?: React.ComponentType, onConversationListUpdated?: ( setConversationList: React.Dispatch>>, event: () => void ) => void, filterConversation?:(conversationList: Array) => Array, } export function UnMemoTUIConversationList(props: T):React.ReactElement { const { Preview, Container = ConversationListContainer, onConversationListUpdated, filterConversation: propsFilterConversation, } = props; const { t } = useTranslation(); const { chat, customClasses, conversation, setActiveConversation, setTUIProfileShow, } = useTUIKitContext('TUIConversationList'); const { filterConversation: contextFilterConversation, } = useTUIConversationContext('TUIConversationList'); const filterConversation = propsFilterConversation || contextFilterConversation; const [conversationUpdateCount, setConversationUpdateCount] = useState(0); const forceUpdate = () => setConversationUpdateCount((count) => count + 1); const activeConversationHandler = ( conversationList: Array, setConversationList: React.Dispatch>>, ) => { if (!conversationList.length) { return; } setActiveConversation(conversation); }; const { conversationList, setConversationList, } = useConversationList(chat, activeConversationHandler, filterConversation); useConversationUpdate( setConversationList, onConversationListUpdated, forceUpdate, filterConversation, ); const [searchValue, setSearchValue] = useState(''); const [searchResult, setSearchResult] = useState(conversationList); const [conversationCreated, setConversationCreated] = useState(false); const handleSearchValueChange = (e) => { setSearchValue(e.target?.value); if (e.target?.value) { const result = conversationList.filter( // eslint-disable-next-line max-len (item) => (getDisplayTitle(item) as string).toLocaleLowerCase().includes(e.target?.value.toLocaleLowerCase()), ); setSearchResult(result); } else { setSearchResult([]); } }; const handleConversationCreate = () => { setSearchValue(''); setConversationCreated(true); }; const conversationListRef = useRef(null); return (
{ conversationCreated ? ( ) : ( <>
{/* eslint-disable-next-line no-nested-ternary */} {conversationList.length === 0 ? (
{t('TUIConversation.No conversation')}
) : searchValue ? ( ) : conversationList.map((item) => { const previewProps = { activeConversation: conversation, conversation: item, setActiveConversation, Preview, conversationUpdateCount, }; return ( ); })}
) }
); } export const TUIConversationList = React.memo(UnMemoTUIConversationList);