Spaces:
Running
Running
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; | |