159 lines
4.9 KiB
TypeScript

import type { FC } from '../../../lib/teact/teact';
import React, {
memo, useCallback, useMemo, useRef,
useState,
} from '../../../lib/teact/teact';
import { getActions, withGlobal } from '../../../global';
import { GlobalSearchContent } from '../../../types';
import { selectTabState } from '../../../global/selectors';
import { parseDateString } from '../../../util/dateFormat';
import useHistoryBack from '../../../hooks/useHistoryBack';
import useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';
import useLang from '../../../hooks/useLang';
import TabList from '../../ui/TabList';
import Transition from '../../ui/Transition';
import AudioResults from './AudioResults';
import ChatMessageResults from './ChatMessageResults';
import ChatResults from './ChatResults';
import FileResults from './FileResults';
import LinkResults from './LinkResults';
import MediaResults from './MediaResults';
import './LeftSearch.scss';
export type OwnProps = {
searchQuery?: string;
searchDate?: number;
isActive: boolean;
onReset: () => void;
};
type StateProps = {
currentContent?: GlobalSearchContent;
chatId?: string;
};
const TABS = [
{ type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },
{ type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },
{ type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },
{ type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },
{ type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },
{ type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },
];
const CHAT_TABS = [
{ type: GlobalSearchContent.ChatList, title: 'All Messages' },
...TABS.slice(1),
];
const TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;
const LeftSearch: FC<OwnProps & StateProps> = ({
searchQuery,
searchDate,
isActive,
currentContent = GlobalSearchContent.ChatList,
chatId,
onReset,
}) => {
const {
setGlobalSearchContent,
setGlobalSearchDate,
} = getActions();
const lang = useLang();
const [activeTab, setActiveTab] = useState(currentContent);
const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);
const handleSwitchTab = useCallback((index: number) => {
const tab = TABS[index];
setGlobalSearchContent({ content: tab.type });
setActiveTab(index);
}, [setGlobalSearchContent]);
const handleSearchDateSelect = useCallback((value: Date) => {
setGlobalSearchDate({ date: value.getTime() / 1000 });
}, [setGlobalSearchDate]);
useHistoryBack({
isActive,
onBack: onReset,
});
// eslint-disable-next-line no-null/no-null
const containerRef = useRef<HTMLDivElement>(null);
const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);
return (
<div className="LeftSearch" ref={containerRef} onKeyDown={handleKeyDown}>
<TabList activeTab={activeTab} tabs={chatId ? CHAT_TABS : TABS} onSwitchTab={handleSwitchTab} />
<Transition
name={lang.isRtl ? 'slideOptimizedRtl' : 'slideOptimized'}
renderCount={TRANSITION_RENDER_COUNT}
activeKey={currentContent}
>
{(() => {
switch (currentContent) {
case GlobalSearchContent.ChatList:
if (chatId) {
return (
<ChatMessageResults
searchQuery={searchQuery}
dateSearchQuery={dateSearchQuery}
onReset={onReset}
onSearchDateSelect={handleSearchDateSelect}
/>
);
}
return (
<ChatResults
searchQuery={searchQuery}
searchDate={searchDate}
dateSearchQuery={dateSearchQuery}
onReset={onReset}
onSearchDateSelect={handleSearchDateSelect}
/>
);
case GlobalSearchContent.Media:
return <MediaResults searchQuery={searchQuery} />;
case GlobalSearchContent.Links:
return <LinkResults searchQuery={searchQuery} />;
case GlobalSearchContent.Files:
return <FileResults searchQuery={searchQuery} />;
case GlobalSearchContent.Music:
return (
<AudioResults
key="audio"
searchQuery={searchQuery}
/>
);
case GlobalSearchContent.Voice:
return (
<AudioResults
key="voice"
isVoice
searchQuery={searchQuery}
/>
);
default:
return undefined;
}
})()}
</Transition>
</div>
);
};
export default memo(withGlobal<OwnProps>(
(global): StateProps => {
const { currentContent, chatId } = selectTabState(global).globalSearch;
return { currentContent, chatId };
},
)(LeftSearch));