import { url } from "../../App"; import React, { useEffect, useState } from "react" import { Tabs, Tab, TabPanel, Box, Typography, CardHeader, Avatar, Stack, FormControl, InputLabel, OutlinedInput, InputAdornment, IconButton, InputBase, Grid, List, ListItem, ListItemAvatar, ListItemText, Divider, Paper, CircularProgress } from '@mui/material'; import Button from '@mui/material-next/Button'; import PropTypes from 'prop-types'; import { PersonSearchRounded, ForumRounded, CollectionsRounded, SearchRounded, TouchAppRounded } from '@mui/icons-material'; import { useDispatch, useSelector } from "react-redux"; import { actionFullSearch } from "../../redux/thunks"; import { useHistory } from "react-router-dom"; export default function Search() { const dispatch = useDispatch() const searchUserLogin = useSelector(state => state?.search?.userLogin?.payload) const searchUserNick = useSelector(state => state?.search?.userNick?.payload) const searchPostTitle = useSelector(state => state?.search?.postTitle?.payload) const searchPostText = useSelector(state => state?.search?.postText?.payload) const searchCommenttext = useSelector(state => state?.search?.commetText?.payload) const searchUserLoginStatus = useSelector(state => state?.search?.userLogin?.status) const searchUserNickStatus = useSelector(state => state?.search?.userNick?.status) const searchPostTitleStatus = useSelector(state => state?.search?.postTitle?.status) const searchPostTextStatus = useSelector(state => state?.search?.postText?.status) const searchCommenttextStatus = useSelector(state => state?.search?.commetText?.status) // отслеживаем статус загрузки всех промисов const [downloadStatus, setDownloadStatus] = useState(false) console.log('downloadStatus: ', downloadStatus) useEffect(() => { setDownloadStatus( (searchUserLoginStatus === 'FULFILLED') && (searchUserNickStatus === 'FULFILLED') && (searchPostTitleStatus === 'FULFILLED') && (searchPostTextStatus === 'FULFILLED') && (searchCommenttextStatus === 'FULFILLED') ) }, [searchUserLoginStatus, searchUserNickStatus, searchPostTitleStatus, searchPostTextStatus, searchCommenttextStatus]) // собираем все в один массив после завершения поиска const [fullSearchData, setFullSearchData] = useState([]) // console.log('fullSearchData; ', fullSearchData?.length) useEffect(() => { setFullSearchData((searchUserLogin && searchUserNick && searchPostTitle && searchPostText && searchCommenttext) && [...new Map([...searchUserLogin, ...searchUserNick, ...searchPostTitle, ...searchPostText, ...searchCommenttext]?.map(item => [item?._id, item])).values()]) }, [searchUserLogin, searchUserNick, searchPostTitle, searchPostText, searchCommenttext]) // отслеживание состояния для элемента статус-бара const [isProgress, setIsProgress] = useState(downloadStatus) // console.log('isProgress: ', isProgress) // отслеживание текста в поле ввода const [inputText, setInputText] = useState('') // отслеживание нажатия enter на кнопку поиска const searchButtonClick = document.getElementById('searchField'); searchButtonClick && searchButtonClick.addEventListener('keydown', function (e) { if (e.code === 'Enter') { e.preventDefault() onSearching() } }) // отправка запроса на поиск async function onSearching() { // setIsProgress(!isProgress) const newText = (new RegExp(inputText.split(' ').join('|'))).toString() const res = await dispatch(actionFullSearch(newText)) // console.log(22, res) // setIsProgress(!isProgress) } return ( setInputText(e.target.value)} inputProps={{ 'aria-label': 'Найти...', id: 'searchField' }} sx={{ ml: 1, flex: 1 }} startAdornment={ } endAdornment={ {inputText !== '' && } } /> {/* {!downloadStatus ? isProgress && : */} {fullSearchData && fullSearchData?.map(item => )} {/* } */} {fullSearchData && fullSearchData?.length === 0 && нихера не нашло } ) } function SearchCard({ data }) { const history = useHistory() function toPost() { if (data?.title) history.push(`/post/${data?._id}`) if (data?.post) history.push(`/post/${data?.post?._id}`) } function toUser() { history.push(`/user/${data?.owner ? data?.owner?._id : data?._id}`) } return ( {data?.owner ? data?.owner?.nick : data?.nick} } /> {data?.owner && {data?.text} } /> } ) }