scroll all the way to bottom when a new message arrives

This commit is contained in:
hippoz 2021-01-12 01:08:35 +02:00
parent 68b8568174
commit b638422e35
No known key found for this signature in database
GPG key ID: 7C52899193467641
2 changed files with 16 additions and 5 deletions

View file

@ -5,19 +5,22 @@ import gatewayConnection from '../../Gateway/globalGatewayConnection';
import { useParams } from 'react-router-dom';
import { connect } from 'react-redux';
import { useState, useRef } from 'react';
import { useState, useRef, useEffect } from 'react';
function CategoryView({ categories, messages }) {
const { id } = useParams();
const [ textInput, setTextInput ] = useState('');
const textInputRef = useRef(null);
const invisibleBottomMessageRef = useRef(null);
let category;
if (categories) {
category = categories.find(x => x._id === id);
const scrollToBottom = () => {
if (invisibleBottomMessageRef && invisibleBottomMessageRef.current) {
invisibleBottomMessageRef.current.scrollIntoView({ behaviour: 'smooth' });
}
}
const handleTextboxKeydown = (e) => {
if (e.key === 'Enter') {
// Send message written in textbox
@ -27,6 +30,12 @@ function CategoryView({ categories, messages }) {
}
}
useEffect(scrollToBottom, [messages]);
if (categories) {
category = categories.find(x => x._id === id);
}
if (category) {
return (
<div className="card main-card main-content-card">
@ -35,6 +44,7 @@ function CategoryView({ categories, messages }) {
</div>
<div className="card message-list-card">
{ messages.map(m => <Message key={ m._id } message={ m } />) }
<div ref={ invisibleBottomMessageRef }></div>
</div>
<div className="card bar-card-bottom">
<input className="text-input" type="text" placeholder="Go on, type something interesting!" ref={ textInputRef } onKeyDown={ handleTextboxKeydown } onChange={ ({ target }) => setTextInput(target.value) }></input>

View file

@ -207,7 +207,8 @@ body {
display: flex;
flex-direction: column;
margin-top: 15px;
margin-top: 12px;
margin-bottom: 12px;
margin-left: 5px;
margin-right: 5px;
padding: 5px;