Property Name | Type | Description |
userList | UserProfile[] | List of user search results. |
userTotalCount | number | Total number of user search results. |
hasMoreUsers | boolean | Indicates whether additional pages of user search results are available. |
groupList | GroupSearchInfo[] | List of group search results. |
groupTotalCount | number | Total number of group search results. |
hasMoreGroups | boolean | Indicates whether additional pages of group search results are available. |
groupMemberList | Record | Group member search results, grouped by groupID. |
groupMemberTotalCount | number | Total number of group member search results. |
hasMoreGroupMembers | boolean | Indicates whether additional pages of group member search results are available. |
messageResults | MessageSearchResultItem[] | List of message search results. Each result is grouped by conversation and includes conversation ID, display information, the number of matched messages, and the message list. |
messageResultTotalCount | number | Total number of message search results. |
hasMoreMessageResults | boolean | Indicates whether additional pages of message search results are available. |
Method Name | Type | Description |
search | (keywordList: string[], option?: SearchOption) => Promise | Performs a search. By default, users, groups, group members, and messages are queried simultaneously. Use option.searchScope to limit the search scope. Calling this method resets the current results and pagination cursor. |
searchMore | (searchType: SearchType) => Promise | Retrieves the next page of results for the specified search type. searchType can be User, Group, GroupMember, or Message. |
destroy | () => void | Destroys the current SearchStore instance and clears subscriptions and state. Typically managed automatically by React/Vue3 wrapper layers. |
Field Name | Type | Description |
keywordListMatchMode | KeywordListMatchMode | Multi-keyword match mode: Or or And. The default is Or. |
searchScope | SearchType[] | Defines the search scope. By default, users, groups, group members, and messages are included. |
pageSize | number | Number of results per page. Default is 20. |
userFilter | UserSearchFilter | User search filter conditions. |
messageFilter | MessageSearchFilter | Message search filter conditions. |
groupMemberFilter | GroupMemberSearchFilter | Group member search filter conditions. |
import { useState } from 'react';import {SearchType,SearchStore,} from '@tencentcloud/chat-uikit-react';import './styles.css';function SearchStoreBasicDemo() {const {hasMoreUsers,search,searchMore,userList,userTotalCount,} = SearchStore.create();const [keyword, setKeyword] = useState('');const [hasSearched, setHasSearched] = useState(false);const [isLoading, setIsLoading] = useState(false);const handleSearch = async () => {const nextKeyword = keyword.trim();if (!nextKeyword) {return;}setIsLoading(true);setHasSearched(true);try {await search([nextKeyword], {pageSize: 20,searchScope: [SearchType.User],});} finally {setIsLoading(false);}};const handleLoadMore = async () => {setIsLoading(true);try {await searchMore(SearchType.User);} finally {setIsLoading(false);}};return (<div className="search-store-basic-demo"><div className="search-store-basic-demo__header"><h2>Search Store Basic</h2><p>Very simple user search powered by SearchStore.</p></div><div className="search-store-basic-demo__toolbar"><inputonChange={event => setKeyword(event.target.value)}onKeyDown={event => {if (event.key === 'Enter') {handleSearch();}}}placeholder="Enter user keyword"value={keyword}/><button disabled={isLoading || !keyword.trim()} onClick={handleSearch} type="button">{isLoading ? 'Searching...' : 'Search'}</button></div><div className="search-store-basic-demo__panel"><h3>Users ({userTotalCount})</h3>{userList.length > 0 ? (<ul className="search-store-basic-demo__list">{userList.map(user => (<li className="search-store-basic-demo__item" key={user.userID}><span className="search-store-basic-demo__avatar">{(user.nickname || user.userID).slice(0, 1).toUpperCase()}</span><span><strong>{user.nickname || user.userID}</strong><small>{user.userID}</small></span></li>))}</ul>) : (<div className="search-store-basic-demo__empty">{hasSearched ? 'No users found.' : 'Enter a keyword and search.'}</div>)}</div>{hasMoreUsers && (<buttonclassName="search-store-basic-demo__more"disabled={isLoading}onClick={handleLoadMore}type="button">Load More</button>)}</div>);}
.search-store-basic-demo {display: flex;height: 100%;flex-direction: column;gap: 16px;padding: 24px;overflow: hidden;}.search-store-basic-demo__header h2 {margin: 0 0 8px;color: #111827;font-size: 22px;}.search-store-basic-demo__header p {margin: 0;color: #6b7280;font-size: 14px;}.search-store-basic-demo__toolbar {display: flex;gap: 8px;}.search-store-basic-demo__toolbar input {width: 260px;padding: 8px 10px;border: 1px solid #d7dce5;border-radius: 8px;}.search-store-basic-demo__toolbar button,.search-store-basic-demo__more {padding: 8px 12px;border: 1px solid #667eea;border-radius: 8px;background: #667eea;color: #fff;cursor: pointer;}.search-store-basic-demo__toolbar button:disabled,.search-store-basic-demo__more:disabled {opacity: 0.6;cursor: not-allowed;}.search-store-basic-demo__panel {display: flex;width: min(560px, 100%);min-height: 0;flex: 1;flex-direction: column;overflow: hidden;border: 1px solid #edf0f5;border-radius: 12px;background: #fff;}.search-store-basic-demo__panel h3 {margin: 0;padding: 14px 16px;border-bottom: 1px solid #edf0f5;color: #111827;font-size: 15px;}.search-store-basic-demo__list {display: flex;flex-direction: column;gap: 8px;margin: 0;padding: 12px;overflow: auto;list-style: none;}.search-store-basic-demo__item {display: flex;align-items: center;gap: 10px;padding: 10px;border-radius: 10px;background: #f9fafb;}.search-store-basic-demo__avatar {display: inline-flex;width: 32px;height: 32px;align-items: center;justify-content: center;border-radius: 50%;background: #eef2ff;color: #4f46e5;font-size: 13px;font-weight: 700;}.search-store-basic-demo__item strong,.search-store-basic-demo__item small {display: block;}.search-store-basic-demo__item strong {color: #111827;font-size: 14px;}.search-store-basic-demo__item small {margin-top: 2px;color: #6b7280;font-size: 12px;}.search-store-basic-demo__empty {padding: 24px;color: #6b7280;text-align: center;}.search-store-basic-demo__more {width: fit-content;}
피드백