import type { ComponentType } from 'react'; import type React from 'react'; import type { Gender, MessageInfo, MessageSearchResultItem, GroupSearchInfo, UserProfile, } from 'tuikit-atomicx-react/chat'; export enum SearchType { MESSAGE = 'message', CHAT_MESSAGE = 'chat_message', USER = 'user', GROUP = 'group', } export enum VariantType { MINI = 'mini', STANDARD = 'standard', EMBEDDED = 'embedded', EXACT = 'exact', } export type SearchTabType = SearchType | 'all'; export interface AdvancedProps { variant: VariantType; advancedParams?: Map; onAdvancedParamsChange?: (type: SearchType, params: any) => void; } export interface SearchTabProps { activeTab: SearchTabType; onTabChange?: (tab: SearchTabType) => void; } export type SearchResultItemType = | MessageInfo | MessageSearchResultItem | { profile: UserProfile } | { groupInfo: GroupSearchInfo }; interface ResultItemMap { [SearchType.MESSAGE]: MessageSearchResultItem; [SearchType.CHAT_MESSAGE]: MessageInfo; [SearchType.USER]: { profile: UserProfile }; [SearchType.GROUP]: { groupInfo: GroupSearchInfo }; } export interface ResultItemProps { keyword: string; data: ResultItemMap[T]; type?: T; className?: string; style?: React.CSSProperties; onClick?: (data: SearchResultItemType, type: SearchType) => void; } export interface SearchBarProps { value?: string; onChange?: (e: React.ChangeEvent) => void; onKeyDown?: (e: React.KeyboardEvent) => void; onClear?: () => void; onBack?: () => void; placeholder?: string; SearchIcon?: React.ReactElement | undefined; ClearIcon?: React.ReactElement | undefined; className?: string; style?: React.CSSProperties; onFocus?: (e: React.FocusEvent) => void; onBlur?: (e: React.FocusEvent) => void; autoFocus?: boolean; variant?: VariantType; } export interface SearchAdvancedProps { variant: VariantType; searchType: SearchTabType; advancedParams: Map; onAdvancedParamsChange: (type: SearchType, params: any) => void; onTabChange?: (tab: SearchTabType) => void; } export interface SearchResultsProps { results: Map; isLoading: boolean; error?: Error | null; keyword: string; typeLabels: Record; onLoadMore?: (type: SearchType) => void; onResultItemClick?: (data: SearchResultItemType, type: SearchType) => void; SearchResultsPresearch?: React.ComponentType; SearchResultsLoading?: React.ComponentType; SearchResultsEmpty?: React.ComponentType; SearchResultItem?: React.ComponentType>; variant?: VariantType; searchType?: SearchType | 'all'; } export interface SearchProps { // Search variant. variant?: VariantType; /** * For EMBEDDED variant: scope the message search to this conversation. */ conversationID?: string; // Custom slot components. SearchBar?: ComponentType | undefined; SearchResults?: ComponentType | undefined; SearchAdvanced?: ComponentType | undefined; SearchResultsPresearch?: ComponentType | undefined; SearchResultsLoading?: ComponentType | undefined; SearchResultsEmpty?: ComponentType | undefined; SearchResultItem?: ComponentType> | undefined; // Behavior. debounceTime?: number; autoFocus?: boolean; /** * When true, GROUP search results are filtered to only show groups * the current user has joined. Uses GroupStore.joinedGroupList. */ enableLocalSearch?: boolean; // Style. className?: string; style?: React.CSSProperties; // Callbacks. onKeywordChange?: (keyword: string) => void; onSearchComplete?: (results: Map) => void; onResultItemClick?: (data: SearchResultItemType, type: SearchType) => void; onError?: (error: Error) => void; onBack?: () => void; } export const defaultTypeLabels: Record = { [SearchType.MESSAGE]: 'Search.Messages', [SearchType.CHAT_MESSAGE]: 'Search.Messages', [SearchType.USER]: 'Search.Users', [SearchType.GROUP]: 'Search.Groups', }; interface BaseSearchCloudParams { keyword?: string; keywordList?: string[]; keywordListMatchType?: 'or' | 'and'; cursor?: string; count?: number; } interface SearchCloudMessagesParams extends BaseSearchCloudParams { senderUserIDList?: string[]; messageTypeList?: any[]; conversationID?: string; timePosition?: number; timePeriod?: number; } interface SearchCloudUsersParams extends BaseSearchCloudParams { gender?: Gender; miniBirthday?: number; maxBirthday?: number; } interface SearchCloudGroupsParams extends BaseSearchCloudParams { groupTypeList?: any[]; } export interface SearchParamsMap { [SearchType.MESSAGE]: SearchCloudMessagesParams; [SearchType.CHAT_MESSAGE]: SearchCloudMessagesParams; [SearchType.USER]: SearchCloudUsersParams; [SearchType.GROUP]: SearchCloudGroupsParams; } interface SearchCloudMessagesResultBase { totalCount: number; params: SearchParamsMap[T]; } interface ResultMap { [SearchType.MESSAGE]: MessageSearchResultItem[]; [SearchType.CHAT_MESSAGE]: MessageInfo[]; [SearchType.USER]: { profile: UserProfile }[]; [SearchType.GROUP]: { groupInfo: GroupSearchInfo }[]; } export interface SearchResult extends SearchCloudMessagesResultBase { resultList: ResultMap[T] | []; hasMore: boolean; cursor: string; }