Skip to content

Commit c2383d5

Browse files
authored
Merge pull request #143 from codeforpdx/issue-142/change-input-field-to-textarea
Enhancement: Changing input field into textarea
2 parents d00250a + fbde76a commit c2383d5

File tree

3 files changed

+33
-17
lines changed

3 files changed

+33
-17
lines changed

frontend/src/pages/Chat/components/InputField.tsx

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
import { useCallback, useEffect } from "react";
12
import useMessages, { type IMessage } from "../../../hooks/useMessages";
23

34
interface Props {
45
setMessages: React.Dispatch<React.SetStateAction<IMessage[]>>;
56
isLoading: boolean;
67
setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;
78
value: string;
8-
inputRef: React.RefObject<HTMLInputElement | null>;
9-
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
9+
inputRef: React.RefObject<HTMLTextAreaElement | null>;
10+
onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
1011
}
1112

1213
export default function InputField({
@@ -26,7 +27,9 @@ export default function InputField({
2627
const userMessageId = Date.now().toString();
2728
const botMessageId = (Date.now() + 1).toString();
2829

29-
onChange({ target: { value: "" } } as React.ChangeEvent<HTMLInputElement>);
30+
onChange({
31+
target: { value: "" },
32+
} as React.ChangeEvent<HTMLTextAreaElement>);
3033
setIsLoading(true);
3134

3235
// Add user message
@@ -83,25 +86,38 @@ export default function InputField({
8386
}
8487
};
8588

89+
const resizeTextArea = useCallback(() => {
90+
const inputElement = inputRef.current;
91+
if (inputElement !== null) {
92+
inputElement.style.height = "auto";
93+
inputElement.style.height = `${inputElement.scrollHeight}px`;
94+
}
95+
}, [inputRef]);
96+
97+
useEffect(() => {
98+
resizeTextArea();
99+
}, [value, resizeTextArea]);
100+
86101
return (
87-
<div className="flex gap-2 mt-4 h-11 items-stretch mx-auto max-w-[700px]">
88-
<input
89-
type="text"
102+
<div className="flex gap-2 mt-4 justify-center items-center mx-auto max-w-[700px]">
103+
<textarea
90104
value={value}
91105
onChange={onChange}
106+
onInput={resizeTextArea}
92107
onKeyDown={(e) => {
93108
if (e.key === "Enter") {
94109
e.preventDefault();
95110
handleSend();
96111
}
97112
}}
98-
className="w-full p-3 border-1 border-[#ddd] rounded-md box-border transition-colors duration-300 focus:outline-0 focus:border-[#4a90e2] focus:shadow-[0_0_0_2px_rgba(74,144,226,0.2)]"
113+
rows={1}
114+
className="overflow-auto resize-none max-h-22 w-full px-3 py-2 border-1 border-[#ddd] rounded-md box-border transition-colors duration-300 focus:outline-0 focus:border-[#4a90e2] focus:shadow-[0_0_0_2px_rgba(74,144,226,0.2)]"
99115
placeholder="Type your message here..."
100116
disabled={isLoading}
101117
ref={inputRef}
102118
/>
103119
<button
104-
className="px-6 bg-[#1F584F] hover:bg-[#4F8B82] text-white rounded-md cursor-pointer transition-color duration-300"
120+
className="px-6 h-10 bg-[#1F584F] hover:bg-[#4F8B82] text-white rounded-md cursor-pointer transition-color duration-300"
105121
onClick={handleSend}
106122
disabled={isLoading || !value.trim()}
107123
>

frontend/src/pages/Chat/components/MessageWindow.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default function MessageWindow({
2525
const [isLoading, setIsLoading] = useState(false);
2626
const [inputValue, setInputValue] = useState("");
2727
const { handleNewSession } = useSession();
28-
const inputRef = useRef<HTMLInputElement | null>(null);
28+
const inputRef = useRef<HTMLTextAreaElement | null>(null);
2929
const messagesRef = useRef<HTMLDivElement | null>(null);
3030

3131
const handleClearSession = () => {
@@ -56,18 +56,18 @@ export default function MessageWindow({
5656

5757
return (
5858
<>
59-
<div className="flex-1">
59+
<div
60+
className={`flex-1 ${
61+
isOngoing ? "overflow-y-scroll" : "overflow-y-none"
62+
}`}
63+
ref={messagesRef}
64+
>
6065
{isError ? (
6166
<div className="flex items-center justify-center h-full text-center">
6267
Error fetching chat history. Try refreshing...
6368
</div>
6469
) : (
65-
<div
66-
className={`max-h-[calc(100dvh-240px)] sm:max-h-[calc(100dvh-20rem)] mx-auto max-w-[700px] ${
67-
isOngoing ? "overflow-y-scroll" : "overflow-y-none"
68-
}`}
69-
ref={messagesRef}
70-
>
70+
<div className="max-h-[calc(100dvh-240px)] sm:max-h-[calc(100dvh-20rem)] mx-auto max-w-[700px]">
7171
{isOngoing ? (
7272
<div className="flex flex-col gap-4">
7373
{messages.map((message) => (

frontend/src/pages/Chat/components/SuggestedPrompts.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default function SuggestedPrompts({
1313
onPromptClick,
1414
}: SuggestedPromptsProps) {
1515
return (
16-
<div className="items-center m-auto">
16+
<div className="items-center m-auto max-w-[650px]">
1717
<div className="flex flex-col gap-4 fade-in-up items-center">
1818
{prompts.map((prompt, idx) => (
1919
<button

0 commit comments

Comments
 (0)