import { useState, useEffect, useCallback } from 'react'; import { ConversationType } from 'tuikit-atomicx-react/chat'; import type { ContactInfo, ConversationInfo } from 'tuikit-atomicx-react/chat'; import { strChineseFirstPy } from '../static/word'; export interface ConversationCreateUsers { [key: string]: ContactInfo[]; } interface FrequentUser { userID: string; nickname?: string; avatarURL?: string; } const useConversationCreate = ( conversationList: ConversationInfo[] | undefined, friendList: ContactInfo[], ) => { const [ friendListSortResult, setFriendListSortResult, ] = useState({}); const getFirstLetter = (str: string) => { const temp = str.trim(); const uni = temp.charCodeAt(0); if (uni > 40869 || uni < 19968) { return temp.charAt(0); } return strChineseFirstPy.charAt(uni - 19968); }; const getCategoryKey = (firstLetter: string): string => { const upper = firstLetter.toUpperCase(); if (firstLetter >= 'a' && firstLetter <= 'z') { return upper; } if (firstLetter >= 'A' && firstLetter <= 'Z') { return firstLetter; } return '#'; }; const addProfileToCategory = ( sortResult: Record, profile: ContactInfo, category: string, ) => { const categoryList = sortResult[category]; if (!categoryList.find(item => item.userID === profile.userID)) { categoryList.push(profile); } }; const handleData = ( profileList: ContactInfo[], frequentlyConversationProfile?: FrequentUser[], ) => { const sortResult: Record = { '#': (frequentlyConversationProfile as ContactInfo[]) || [], }; // Initialize A-Z categories for (let i = 65; i <= 90; i += 1) { sortResult[String.fromCharCode(i)] = []; } profileList?.forEach((profile) => { const { nickname, userID } = profile; const firstLetter = getFirstLetter(nickname || userID); const categoryKey = getCategoryKey(firstLetter); addProfileToCategory(sortResult, profile, categoryKey); }); // Sort each category Object.keys(sortResult).forEach((key) => { sortResult[key].sort((a, b) => { const nameA = (a.nickname || a.userID).toLowerCase(); const nameB = (b.nickname || b.userID).toLowerCase(); return nameA.localeCompare(nameB); }); }); return sortResult; }; const queryFriendList = useCallback(( list: ContactInfo[], frequentlyConversationProfile?: FrequentUser[], ) => { const sortResult = handleData( list, frequentlyConversationProfile, ); setFriendListSortResult(sortResult); }, []); const getFriendListSortSearchResult = async (searchValue: string) => { if (!searchValue) { return friendListSortResult; } const result: Record = {}; Object.keys(friendListSortResult).forEach((key) => { result[key] = friendListSortResult[key].filter( (item) => { const tempNick = item.nickname?.toLocaleLowerCase() || ''; const tempSearchValue = searchValue.toLocaleLowerCase(); const userIDValue = item.userID.toLocaleLowerCase(); return tempNick.includes(tempSearchValue) || userIDValue.includes(tempSearchValue); }, ); }); return result; }; useEffect(() => { let frequentlyConversationProfile: FrequentUser[] = []; if (conversationList && conversationList.length > 0) { frequentlyConversationProfile = conversationList .filter((item: ConversationInfo) => item?.type === ConversationType.C2C) .slice(0, 5) .map((item: ConversationInfo) => ({ userID: item.conversationID.replace('C2C', ''), nickname: item.title, avatarURL: item.avatarURL, })); } queryFriendList(friendList, frequentlyConversationProfile); }, [friendList, conversationList, queryFriendList]); return { getFirstLetter, queryFriendList, getFriendListSortSearchResult, friendListSortResult, }; }; export default useConversationCreate;