MCPcopy Create free account
hub / github.com/Jenifer2833/fullstack-chat-app / MessageInput

Function MessageInput

frontend/src/components/MessageInput.jsx:5–115  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

3import { Image, Send, X } from 'lucide-react';
4
5const MessageInput = () => {
6 const [text,setText]=useState("");
7 const [imagePreview,setImagePreview]=useState(null);
8 const fileInputRef=useRef(null);
9
10 const {sendMessage}=useChatStore();
11
12 const handleImageChange=(e)=>{
13 const file=e.target.files[0];
14 if(!file.type.startsWith("image/")){
15 toast.error("Please select an image file");
16 return;
17 }
18
19 const reader=new FileReader();
20 reader.onloadend=()=>{
21 setImagePreview(reader.result);
22 };
23 reader.readAsDataURL(file);
24
25 };
26
27 const removeImage=()=>{
28 setImagePreview(null);
29 if(fileInputRef.current) fileInputRef.current.value="";
30 };
31
32 const handleSendMessage= async(e)=>{
33 e.preventDefault();
34 if(!text.trim() && !imagePreview) return;
35
36 try {
37 await sendMessage({
38 text:text.trim(),
39 image:imagePreview,
40 });
41
42 setText("");
43 setImagePreview(null);
44 if(fileInputRef.current) fileInputRef.current.value="";
45 } catch (error) {
46 console.error("Failed to send message: ",error);
47 }
48 };
49
50 return (
51 <div className='p-4 w-full'>
52 {imagePreview && (
53 <div className="mb-3 flex items-center gap-2">
54 <div className="relative">
55 <img
56 src={imagePreview}
57 alt="Preview"
58 className="w-20 h-20 object-cover rounded-lg border border-zinc-700"
59 />
60 <button
61 onClick={removeImage}
62 className="absolute -top-1.5 -right-1.5 w-5 h-5 rounded-full bg-base-300

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected