Spaces:
Running
Running
import TextArea from "@/components/generics/textArea/TextArea"; | |
import { GoStarFill } from "react-icons/go"; | |
import Button from "@/components/generics/button/Button"; | |
import { useMemo, useState } from "react"; | |
import { CommentProps } from "./CommentProps"; | |
import { UserScore } from "@/api/predictions/types"; | |
import Input from "@/components/generics/input/Input"; | |
import "./Comment.scss"; | |
const Comment = ({ onSubmit, loading, log_id }: CommentProps) => { | |
const [score, setScore] = useState<UserScore | null>(null); | |
const [hover, setHover] = useState<number>(0); | |
const [commentText, setCommentText] = useState<string>(""); | |
const [showMessage, setShowMessage] = useState(false); | |
const [manualEstimate, setManualEstimate] = useState<string>(""); | |
const [llmEstimate, setLlmEstimate] = useState<string>(""); | |
// eslint-disable-next-line @typescript-eslint/no-explicit-any | |
const handleInput = (event: any) => { | |
setCommentText(event.target.value); | |
}; | |
const handleFeedback = () => { | |
setShowMessage(true); | |
setTimeout(() => { | |
setShowMessage(false); | |
}, 2000); | |
}; | |
const handleSubmit = async () => { | |
if (score !== null && log_id != null) { | |
onSubmit( | |
{ | |
log_id: log_id, | |
userComment: commentText, | |
userScore: score, | |
llmEstimate: Number(llmEstimate), | |
manualEstimate: Number(manualEstimate), | |
}, | |
() => { | |
handleFeedback(); | |
setCommentText(""); | |
setScore(null); | |
setLlmEstimate(""); | |
setManualEstimate(""); | |
} | |
); | |
} | |
}; | |
const ratingView = useMemo(() => { | |
return Array.from({ length: 5 }, (_, i) => ( | |
<button | |
key={i} | |
type="button" | |
className="icon_btn" | |
onClick={() => (score !== i + 1 ? setScore((i + 1) as UserScore) : setScore(null))} | |
onMouseEnter={() => setHover(i + 1)} | |
onMouseLeave={() => setHover(0)} | |
> | |
<GoStarFill | |
style={{ | |
cursor: "pointer", | |
fontSize: "20px", | |
color: hover > i || (score != null && score > i) ? "gold" : "lightgray ", | |
}} | |
/> | |
</button> | |
)); | |
}, [hover, score]); | |
return ( | |
<div className="comment"> | |
<div className="reaction"> | |
<span className="required_field">Оцените ответ:</span> | |
{ratingView} | |
</div> | |
<TextArea value={commentText} onInput={handleInput} onKeyDown={() => {}} rows={0} placeholder={"Комментарий"} /> | |
<div> | |
<label className="reaction reaction_input"> | |
<span className="required_field">Время с ИИ (минут):</span> | |
<Input | |
name={"llmSearchTime"} | |
placeholder={""} | |
value={llmEstimate} | |
onSetValue={(value) => setLlmEstimate(value)} | |
type="number" | |
max="300" | |
min="0" | |
step="1" | |
/> | |
</label> | |
<label className="reaction reaction_input"> | |
<span className="required_field">Время без ИИ (минут):</span> | |
<Input | |
name={"ownSearchTime"} | |
placeholder={""} | |
value={manualEstimate} | |
onSetValue={(value) => setManualEstimate(value)} | |
type="number" | |
max="300" | |
min="0" | |
step="1" | |
/> | |
</label> | |
</div> | |
<div className="submit_btn"> | |
<Button | |
name="Отправить" | |
onClick={() => { | |
handleSubmit(); | |
}} | |
disabled={ | |
score === null || | |
manualEstimate == null || | |
llmEstimate == null || | |
manualEstimate == "" || | |
llmEstimate == "" || | |
Number(manualEstimate) == 0 || | |
Number(llmEstimate) == 0 | |
} | |
loading={loading} | |
/> | |
</div> | |
<div className="feedback_container"> | |
<div className={`feedback_message ${showMessage ? "show" : ""}`}>Спасибо за обратную связь!</div> | |
</div> | |
</div> | |
); | |
}; | |
export default Comment; | |