I am having difficulties locking the send message object at the bottom of the screen, so that the scroll effect doesn't go beyond ( downwards past )the send message object, as indicated in the below image. I used React and tailwindcss
Here is the Chat.jsx:
import React, { useState, useEffect, useRef } from 'react';
import Message from './Message';
import SendMessage from './SendMessage';
import { db } from '../firebase';
import { query, collection, orderBy, onSnapshot } from 'firebase/firestore';
const style = {
main: `flex flex-col p-[10px]`,
};
const Chat = () => {
const [messages, setMessages] = useState([]);
const scroll = useRef();
useEffect(() => {
const q = query(collection(db, 'messages'), orderBy('timestamp'));
const unsubscribe = onSnapshot(q, (querySnapshot) => {
let messages = [];
querySnapshot.forEach((doc) => {
messages.push({ ...doc.data(), id: doc.id });
});
setMessages(messages);
});
return () => unsubscribe();
}, []);
return (
<>
<main className={style.main}>
{messages &&
messages.map((message) => (
<Message key={message.id} message={message} />
))}
</main>
{/* Send Message Compoenent */}
<SendMessage scroll={scroll} />
<span ref={scroll}></span>
</>
);
};
export default Chat;
And here is a SendMessage.jsx code:
import React, { useState } from 'react';
import {auth, db} from '../firebase'
import {addDoc, collection, serverTimestamp} from 'firebase/firestore'
const style = {
form: `h-14 w-full max-w-[728px] flex text-xl absolute bottom-0`,
input: `w-full text-xl p-3 bg-gray-900 text-white outline-none border-none`,
button: `w-[20%] bg-green-500`,
};
const SendMessage = ({scroll}) => {
const [input, setInput] = useState('');
const sendMessage = async (e) => {
e.preventDefault()
if (input === '') {
alert('Please enter a valid message')
return
}
const {uid, displayName} = auth.currentUser
await addDoc(collection(db, 'messages'), {
text: input,
name: displayName,
uid,
timestamp: serverTimestamp()
})
setInput('')
scroll.current.scrollIntoView({behavior: 'smooth'})
}
return (
<form onSubmit={sendMessage} className={style.form}>
<input
value={input}
onChange={(e) => setInput(e.target.value)}
className={style.input}
type='text'
placeholder='Message'
/>
<button className={style.button} type='submit'>
Send
</button>
</form>
);
};
export default SendMessage;