import type { ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser, } from '../../../../api/types'; import type { GlobalState, TabState } from '../../../../global/types'; import type { ThemeKey } from '../../../../types'; import type { SearchResultKey } from '../../../../util/keys/searchResultKey'; import { selectChat, selectTabState, selectTheme } from '../../../../global/selectors'; import { selectSharedSettings } from '../../../../global/selectors/sharedState'; export type StateProps = { theme: ThemeKey; isLoading?: boolean; chatsById: Record; usersById: Record; globalMessagesByChatId?: Record }>; foundIds?: SearchResultKey[]; searchChatId?: string; activeDownloads: TabState['activeDownloads']; isChatProtected?: boolean; shouldWarnAboutFiles?: boolean; }; export function createMapStateToProps(type: ApiGlobalMessageSearchType) { return (global: GlobalState, props: any) => { const tabState = selectTabState(global); const { byId: chatsById } = global.chats; const { byId: usersById } = global.users; const { fetchingStatus, resultsByType, chatId, } = tabState.globalSearch; const { shouldWarnAboutFiles } = selectSharedSettings(global); // One component is used for two different types of results. // The differences between them are only in the isVoice property. // The rest of the search results use their own personal components. const currentType = type !== 'audio' ? type : (props?.isVoice ? 'voice' : 'audio'); const { byChatId: globalMessagesByChatId } = global.messages; const foundIds = resultsByType?.[currentType]?.foundIds; const activeDownloads = tabState.activeDownloads; return { theme: selectTheme(global), isLoading: foundIds === undefined || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false), chatsById, usersById, globalMessagesByChatId, foundIds, searchChatId: chatId, activeDownloads, isChatProtected: chatId ? selectChat(global, chatId)?.isProtected : undefined, shouldWarnAboutFiles, }; }; }