askchosmky / frontend /components /QuestionInput.tsx
mmoise00's picture
Add mode selection for query submission and update streaming logic
bbab1dd
"use client";
import { useState, useRef, type KeyboardEvent } from "react";
interface QuestionInputProps {
onSubmit: (question: string) => void;
disabled?: boolean;
}
const EXAMPLES = [
"What is Universal Grammar?",
"How did Chomsky critique behaviorism?",
"Compare Principles and Parameters with Minimalism.",
"How did Chomsky's views on language acquisition evolve over time?",
"What is Chomsky's theory of propaganda?",
];
export default function QuestionInput({ onSubmit, disabled }: QuestionInputProps) {
const [value, setValue] = useState("");
const textareaRef = useRef<HTMLTextAreaElement>(null);
const handleSubmit = () => {
const trimmed = value.trim();
if (!trimmed || disabled) return;
onSubmit(trimmed);
};
const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {
if (e.key === "Enter" && !e.shiftKey) {
e.preventDefault();
handleSubmit();
}
};
const handleExample = (q: string) => {
setValue(q);
textareaRef.current?.focus();
};
return (
<div className="flex flex-col gap-3 w-full">
{/* Input box */}
<div className="flex gap-2 items-end">
<textarea
ref={textareaRef}
value={value}
onChange={(e) => setValue(e.target.value)}
onKeyDown={handleKeyDown}
placeholder="Ask something about Noam Chomsky's work…"
rows={2}
disabled={disabled}
className="
flex-1 resize-none rounded-xl border border-zinc-700 bg-zinc-900
px-4 py-3 text-sm text-zinc-100 placeholder-zinc-500
focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500
disabled:opacity-50 disabled:cursor-not-allowed
transition-colors
"
/>
<button
onClick={handleSubmit}
disabled={disabled}
className="
flex-shrink-0 h-12 px-5 rounded-xl text-sm font-semibold
bg-indigo-600 hover:bg-indigo-500 active:bg-indigo-700
text-white transition-colors
disabled:opacity-40 disabled:cursor-not-allowed
flex items-center gap-2
"
>
{disabled ? (
<>
<span className="w-3 h-3 rounded-full border-2 border-white/40 border-t-white animate-spin" />
Running
</>
) : (
"Ask →"
)}
</button>
</div>
{/* Example questions */}
<div className="flex flex-wrap gap-2">
<span className="text-[11px] text-zinc-600 self-center">Try:</span>
{EXAMPLES.map((q) => (
<button
key={q}
onClick={() => handleExample(q)}
disabled={disabled}
className="
text-[11px] px-2.5 py-1 rounded-lg border border-zinc-700
text-zinc-400 hover:text-zinc-200 hover:border-zinc-500
bg-zinc-900 transition-colors disabled:opacity-40 disabled:cursor-not-allowed
"
>
{q}
</button>
))}
</div>
</div>
);
}