Spaces:
Runtime error
Runtime error
import React, { useState } from "react"; | |
import { BOTTOMTEXT } from "../constants/constants"; | |
import { useMessageFetching } from "../context/MessageFetch"; | |
import { send } from "./Icons"; | |
type InputProps = { | |
askQuestion: (msg: string) => void; | |
input: string; | |
setInput: (value: string) => void; | |
inputRef: React.RefObject<HTMLDivElement>; | |
socket: any; | |
}; | |
export default function Input({ | |
askQuestion, | |
input, | |
setInput, | |
inputRef, | |
socket, | |
}: InputProps) { | |
const { | |
messageFetching, | |
setDisableinput, | |
disableinput, | |
stopFetching, | |
setMessageFetching, | |
} = useMessageFetching(); | |
function handleInputSubmit() { | |
setDisableinput(true); | |
setMessageFetching(true); | |
if (input == "") return; | |
askQuestion(input); | |
setInput(""); | |
if (inputRef.current) { | |
inputRef.current.innerText = ""; | |
} | |
} | |
const onKeyDown = (e: any) => { | |
// if shift and enter are pressed together then add a new line if enter is pressed then submit the message | |
if (e.key == "Enter" && !e.shiftKey && !messageFetching) { | |
e.preventDefault(); | |
handleInputSubmit(); | |
} | |
}; | |
return ( | |
<> | |
<div | |
className="input_wrapper" | |
style={{ | |
display: "flex", | |
flexDirection: "column", | |
alignItems: "center", | |
position: "fixed", | |
width: "50%", | |
paddingBottom: "10px", | |
bottom: 0, | |
}} | |
> | |
<div | |
className="input_box" | |
style={{ | |
width: "100%", | |
backgroundColor: "#40414f", | |
borderRadius: "7px", | |
display: "flex", | |
flexDirection: "row", | |
alignItems: "center", | |
paddingLeft: "5px", | |
padding: "10px 5px", | |
position: "relative", | |
}} | |
> | |
<div | |
ref={inputRef} | |
style={{ | |
width: "97%", | |
minHeight: 26, | |
outline: "none", | |
border: "none", | |
backgroundColor: "#40414f", | |
color: "white", | |
paddingLeft: "8px", | |
fontSize: "16px", | |
bottom: 0, | |
maxHeight: 150, | |
overflowY: "auto", | |
paddingRight: "30px", | |
}} | |
contentEditable={!disableinput} | |
onInput={(e) => { | |
setInput(e.currentTarget.innerText); | |
}} | |
onKeyDownCapture={(e) => { | |
onKeyDown(e); | |
}} | |
/> | |
{disableinput ? ( | |
<div | |
style={{ | |
position: "absolute", | |
right: "10px", | |
bottom: "5px", | |
width: "35px", | |
height: "35px", | |
display: "flex", | |
alignItems: "center", | |
justifyContent: "center", | |
}} | |
> | |
<div | |
style={{ | |
width: "20px", | |
height: "20px", | |
border: "2px solid #fff", | |
borderRadius: "50%", | |
borderTopColor: "transparent", | |
animation: "spin 1s linear infinite", | |
}} | |
></div> | |
</div> | |
) : ( | |
<> | |
<button | |
onClick={() => { | |
handleInputSubmit(); | |
}} | |
style={{ | |
marginRight: "20px", | |
backgroundColor: "transparent", | |
outline: "none", | |
border: "none", | |
color: "white", | |
cursor: "pointer", | |
padding: "5px", | |
position: "absolute", | |
bottom: "5px", | |
right: "0px", | |
borderRadius: "15%", | |
display: "flex", | |
alignItems: "center", | |
justifyContent: "center", | |
width: "35px", | |
height: "35px", | |
}} | |
onMouseOver={(e) => { | |
e.currentTarget.style.backgroundColor = "#000"; | |
}} | |
onMouseLeave={(e) => { | |
e.currentTarget.style.backgroundColor = "transparent"; | |
}} | |
> | |
{send} | |
</button> | |
</> | |
)} | |
</div> | |
<p | |
style={{ | |
fontSize: "12.6px", | |
textAlign: "center", | |
marginTop: "19px", | |
color: "rgb(185 185 185)", | |
maxWidth: "85%", | |
}} | |
> | |
{BOTTOMTEXT} | |
</p> | |
</div> | |
{messageFetching && ( | |
<button | |
onClick={() => { | |
stopFetching(socket); | |
}} | |
style={{ | |
position: "absolute", | |
bottom: "18vh", | |
height: "35px", | |
display: "flex", | |
alignItems: "center", | |
justifyContent: "center", | |
backgroundColor: "transparent", | |
borderRadius: "5px", | |
borderWidth: "2px", | |
borderColor: "white", | |
borderStyle: "solid", | |
color: "white", | |
cursor: "pointer", | |
padding: "5px", | |
left: "50%", | |
transform: "translateX(-50%)", | |
}} | |
onMouseOver={(e) => { | |
e.currentTarget.style.backgroundColor = "#000"; | |
}} | |
onMouseLeave={(e) => { | |
e.currentTarget.style.backgroundColor = "transparent"; | |
e.currentTarget.style.borderColor = "white"; | |
}} | |
> | |
Stop Responding | |
</button> | |
)} | |
</> | |
); | |
} | |