diff --git a/web/modals/search/message-search-modal.react.js b/web/modals/search/message-search-modal.react.js --- a/web/modals/search/message-search-modal.react.js +++ b/web/modals/search/message-search-modal.react.js @@ -26,66 +26,72 @@ function MessageSearchModal(props: ContentProps): React.Node { const { threadInfo } = props; - const [lastID, setLastID] = React.useState(); - const [searchResults, setSearchResults] = React.useState([]); - const [endReached, setEndReached] = React.useState(false); - - const { getQuery, setQuery, clearQuery } = useMessageSearchContext(); + const { + getQuery, + setQuery, + clearQuery, + getSearchResults, + appendSearchResult, + getEndReached, + setEndReached, + } = useMessageSearchContext(); + + const loading = React.useRef(false); + + const searchResults = React.useMemo( + () => getSearchResults(threadInfo.id), + [getSearchResults, threadInfo.id], + ); - const query = React.useMemo( - () => getQuery(threadInfo.id), - [getQuery, threadInfo.id], + const endReached = React.useMemo( + () => getEndReached(threadInfo.id), + [getEndReached, threadInfo.id], ); - const appendSearchResults = React.useCallback( + const appendResults = React.useCallback( (newMessages: $ReadOnlyArray, end: boolean) => { - setSearchResults(oldMessages => [...oldMessages, ...newMessages]); - setEndReached(end); + appendSearchResult(newMessages, threadInfo.id); + if (end) { + setEndReached(threadInfo.id); + } + loading.current = false; }, - [], + [appendSearchResult, setEndReached, threadInfo.id], ); - React.useEffect(() => { - setSearchResults([]); - setLastID(undefined); - setEndReached(false); - }, [query]); - const searchMessages = useSearchMessages(); - React.useEffect( - () => searchMessages(query, threadInfo.id, appendSearchResults, lastID), - [appendSearchResults, lastID, query, searchMessages, threadInfo.id], - ); + const [input, setInput] = React.useState(getQuery(threadInfo.id)); - const modifiedItems = useParseSearchResults(threadInfo, searchResults); + const onPressSearch = React.useCallback(() => { + setQuery(input, threadInfo.id); + loading.current = true; + searchMessages( + getQuery(threadInfo.id), + threadInfo.id, + appendResults, + undefined, + ); + }, [setQuery, input, searchMessages, getQuery, threadInfo.id, appendResults]); - const renderItem = React.useCallback( - item => ( - - ), - [threadInfo], + const onKeyDown = React.useCallback( + event => { + if (event.key === 'Enter') { + onPressSearch(); + } + }, + [onPressSearch], ); - const messages = React.useMemo( - () => modifiedItems.map(item => renderItem(item)), - [modifiedItems, renderItem], - ); + const modifiedItems = useParseSearchResults(threadInfo, searchResults); - const messageContainer = React.useRef(null); + const { clearTooltip } = useTooltipContext(); + const messageContainer = React.useRef(null); const messageContainerRef = (msgContainer: ?HTMLDivElement) => { messageContainer.current = msgContainer; - messageContainer.current?.addEventListener('scroll', onScroll); }; - const { clearTooltip } = useTooltipContext(); - const possiblyLoadMoreMessages = React.useCallback(() => { if (!messageContainer.current) { return; @@ -95,23 +101,52 @@ const { scrollTop, scrollHeight, clientHeight } = messageContainer.current; if ( endReached || + loading.current || Math.abs(scrollTop) + clientHeight + loaderTopOffset < scrollHeight ) { return; } - setLastID(modifiedItems ? oldestMessageID(modifiedItems) : undefined); - }, [endReached, modifiedItems]); + loading.current = true; + const lastID = modifiedItems ? oldestMessageID(modifiedItems) : undefined; + searchMessages( + getQuery(threadInfo.id), + threadInfo.id, + appendResults, + lastID, + ); + }, [ + appendResults, + endReached, + getQuery, + modifiedItems, + searchMessages, + threadInfo.id, + ]); const onScroll = React.useCallback(() => { - if (!messageContainer.current) { - return; - } clearTooltip(); possiblyLoadMoreMessages(); }, [clearTooltip, possiblyLoadMoreMessages]); + const renderItem = React.useCallback( + item => ( + + ), + [threadInfo], + ); + + const messages = React.useMemo( + () => modifiedItems.map(item => renderItem(item)), + [modifiedItems, renderItem], + ); + const footer = React.useMemo(() => { - if (query === '') { + if (getQuery(threadInfo.id) === '') { return (
Your search results will appear here
); @@ -131,33 +166,17 @@ No results. Please try using different keywords to refine your search ); - }, [query, endReached, modifiedItems.length]); + }, [getQuery, threadInfo.id, endReached, modifiedItems.length]); - const [input, setInput] = React.useState(query); - - const onPressSearch = React.useCallback( - () => setQuery(input, threadInfo.id), - [setQuery, input, threadInfo.id], - ); + const { uiName } = useResolvedThreadInfo(threadInfo); + const searchPlaceholder = `Searching in ${uiName}`; + const { popModal } = useModalContext(); const clearQueryWrapper = React.useCallback( () => clearQuery(threadInfo.id), [clearQuery, threadInfo.id], ); - const onKeyDown = React.useCallback( - event => { - if (event.key === 'Enter') { - onPressSearch(); - } - }, - [onPressSearch], - ); - - const { uiName } = useResolvedThreadInfo(threadInfo); - const searchPlaceholder = `Searching in ${uiName}`; - const { popModal } = useModalContext(); - return (
@@ -177,7 +196,11 @@ Search
-
+
{messages} {footer}