import { useMutation } from '@tanstack/react-query'; import { AxiosError } from 'axios'; import React, { useState } from 'react'; import { useHistory } from 'react-router-dom'; import { Icon, Input, Stack } from 'soapbox/components/ui'; import { ChatWidgetScreens, useChatContext } from 'soapbox/contexts/chat-context'; import { useDebounce } from 'soapbox/hooks'; import { useChats } from 'soapbox/queries/chats'; import { queryClient } from 'soapbox/queries/client'; import useAccountSearch from 'soapbox/queries/search'; import toast from 'soapbox/toast'; import { ChatKeys } from '../../../../queries/chats'; import Blankslate from './blankslate'; import EmptyResultsBlankslate from './empty-results-blankslate'; import Results from './results'; interface IChatSearch { isMainPage?: boolean } const ChatSearch = (props: IChatSearch) => { const { isMainPage = false } = props; const debounce = useDebounce; const history = useHistory(); const { changeScreen } = useChatContext(); const { getOrCreateChatByAccountId } = useChats(); const [value, setValue] = useState(''); const debouncedValue = debounce(value as string, 300); const accountSearchResult = useAccountSearch(debouncedValue); const { data: accounts, isFetching } = accountSearchResult; const hasSearchValue = debouncedValue && debouncedValue.length > 0; const hasSearchResults = (accounts || []).length > 0; const handleClickOnSearchResult = useMutation((accountId: string) => { return getOrCreateChatByAccountId(accountId); }, { onError: (error: AxiosError) => { const data = error.response?.data as any; toast.error(data?.error); }, onSuccess: (response) => { if (isMainPage) { history.push(`/chats/${response.data.id}`); } else { changeScreen(ChatWidgetScreens.CHAT, response.data.id); } queryClient.invalidateQueries(ChatKeys.chatSearch()); }, }); const renderBody = () => { if (hasSearchResults) { return ( { handleClickOnSearchResult.mutate(id); clearValue(); }} /> ); } else if (hasSearchValue && !hasSearchResults && !isFetching) { return ; } else { return ; } }; const clearValue = () => { if (hasSearchValue) { setValue(''); } }; return (
setValue(event.target.value)} outerClassName='mt-0' theme='search' append={ } />
{renderBody()}
); }; export default ChatSearch;