|
import { useCallback, useMemo } from "react"; |
|
import "./RequestTextArea.scss"; |
|
import Editable from "@/components/generics/editable/Editable"; |
|
import Spinner from "@/components/generics/spinner/Spinner"; |
|
import { filterMatches, getAllMatches, highlightMatches } from "@/shared/utils/highlightMatches"; |
|
import { AbbreviationsBlock } from "../abbreviationBlock/AbbreviationsBlock"; |
|
import RequestTextAreaProps from "./RequestTextAreaProps"; |
|
import { useAppSelector } from "@/store/hooks"; |
|
import { useGetAbbreviations } from "@/api/predictions/hooks"; |
|
|
|
const RequestTextArea = ({ |
|
openAbbreviations, |
|
content, |
|
setContent, |
|
abbreviationArray, |
|
handleEditRequest, |
|
}: RequestTextAreaProps) => { |
|
const { hasAbbreviations } = useAppSelector((state) => state.request); |
|
const { data: abbreviationsData, isLoading } = useGetAbbreviations(); |
|
|
|
const sortedAbbreviations = useMemo( |
|
() => Object.keys(abbreviationsData ?? {}).sort((a, b) => b.length - a.length), |
|
[abbreviationsData] |
|
); |
|
|
|
const onContentChange = useCallback( |
|
(divContent: string) => { |
|
const initialRequest = divContent; |
|
const newContent = initialRequest.toString().replace(/\s+/g, " "); |
|
|
|
const allMatches: { match: string; index: number; element: string }[] = getAllMatches( |
|
sortedAbbreviations, |
|
newContent |
|
); |
|
const resultString = highlightMatches(newContent, filterMatches(allMatches)); |
|
|
|
if (newContent !== content) { |
|
setContent(resultString === "<br>" ? "" : resultString); |
|
} |
|
|
|
handleEditRequest(); |
|
}, |
|
[content, handleEditRequest, setContent, sortedAbbreviations] |
|
); |
|
|
|
return ( |
|
<div className="request_block"> |
|
<div className="label"> |
|
<span>Строка запроса</span> |
|
</div> |
|
<div className="request_container"> |
|
<Editable |
|
content={content} |
|
handleClick={!openAbbreviations && hasAbbreviations ? handleEditRequest : undefined} |
|
onContentChange={onContentChange} |
|
className={!openAbbreviations && hasAbbreviations ? "clickable" : ""} |
|
placeholder="Введите запрос поиска. Например, какие действия являются первоочередными в момент обнаружения происшествия?" |
|
/> |
|
{openAbbreviations && hasAbbreviations ? ( |
|
<> |
|
<hr /> |
|
{[...new Set(abbreviationArray)].map((abbr, index) => ( |
|
<AbbreviationsBlock key={abbr + index} abbreviation={abbr} values={abbreviationsData?.[abbr] ?? []} /> |
|
))} |
|
</> |
|
) : null} |
|
</div> |
|
<div className="abbr_message"> |
|
{isLoading ? ( |
|
<> |
|
<Spinner /> |
|
<span>Загрузка аббревиатур</span> |
|
</> |
|
) : null} |
|
</div> |
|
</div> |
|
); |
|
}; |
|
export default RequestTextArea; |
|
|