Skip to content

Commit e9ff6b4

Browse files
authored
Merge pull request #51 from CS3219-AY2425S1/improve-chat-interface
add usernames, fix chat to bottom
2 parents 242866a + c99e300 commit e9ff6b4

File tree

1 file changed

+57
-20
lines changed

1 file changed

+57
-20
lines changed

Frontend/src/components/collab/Chat.jsx

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import React, { useState } from 'react';
2-
import { Accordion, ListGroup, ListGroupItem, Form, Button } from 'react-bootstrap';
1+
import React, {useState, useRef, useEffect} from 'react';
2+
import {Accordion, ListGroup, ListGroupItem, Form, Button, Badge} from 'react-bootstrap';
33

44
const Chat = ({ currentUser, messages, sendMessage }) => {
55
const [text, setText] = useState('');
6+
const chatContainerRef = useRef(null);
7+
const [isAccordionOpen, setIsAccordionOpen] = useState(true);
68

79
const handleSend = () => {
810
console.log("I am sending")
@@ -12,27 +14,61 @@ const Chat = ({ currentUser, messages, sendMessage }) => {
1214
}
1315
};
1416

17+
useEffect(() => {
18+
if (chatContainerRef.current) {
19+
chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight;
20+
}
21+
}, [messages]);
22+
1523
return (
16-
<Accordion defaultActiveKey="0" className='mt-3'>
17-
<Accordion.Item eventKey="0">
18-
<Accordion.Header>
19-
Chat
20-
</Accordion.Header>
21-
<Accordion.Body className="scrollable-accordion-body">
24+
<Accordion defaultActiveKey="0" className='mt-3' onSelect={(eventKey) => setIsAccordionOpen(eventKey === "0")}>
25+
<Accordion.Item eventKey="0">
26+
<Accordion.Header>
27+
Chat
28+
</Accordion.Header>
29+
<Accordion.Body>
30+
<div
31+
ref={chatContainerRef}
32+
style={{
33+
maxHeight: '300px',
34+
overflowY: 'auto',
35+
marginBottom: '1rem',
36+
}}
37+
>
2238
<ListGroup>
2339
{messages.map((msg, idx) => (
24-
<ListGroupItem
25-
key={idx}
26-
style={{
27-
backgroundColor: msg.sender === currentUser ? "#d1e7dd" : "#50d7da",
28-
textAlign: msg.sender === currentUser ? "right" : "left"
29-
}}
30-
>
31-
{msg.text}
32-
</ListGroupItem>
40+
<>
41+
<ListGroupItem
42+
key={idx}
43+
style={{
44+
backgroundColor: msg.sender === currentUser ? "#d1e7dd" : "#50d7da",
45+
textAlign: msg.sender === currentUser ? "right" : "left"
46+
}}
47+
>
48+
{/* alternative: keep badge within same line*/}
49+
{/*{msg.sender !== currentUser && <><Badge bg="secondary">{msg.sender}</Badge> {msg.text}</>}*/}
50+
{/*{msg.sender === currentUser && <>{msg.text} <Badge bg="secondary">{msg.sender}</Badge></>}*/}
51+
52+
{msg.text}
53+
</ListGroupItem>
54+
<ListGroupItem
55+
key={idx}
56+
style={{
57+
backgroundColor: "white",
58+
textAlign: msg.sender === currentUser ? "right" : "left",
59+
border: "none",
60+
padding: "0",
61+
}}>
62+
<Badge bg="secondary">{msg.sender}</Badge>
63+
</ListGroupItem>
64+
{/* spacer */}
65+
<div style={{ height: '10px' }}></div>
66+
</>
3367
))}
3468
</ListGroup>
35-
<Form className="mt-3" onSubmit={(e) => { e.preventDefault(); handleSend(); }}>
69+
</div>
70+
{isAccordionOpen && ( // Only show message input when accordion is open
71+
<Form onSubmit={(e) => { e.preventDefault(); handleSend(); }}>
3672
<Form.Group controlId="messageInput">
3773
<Form.Control
3874
type="text"
@@ -45,8 +81,9 @@ const Chat = ({ currentUser, messages, sendMessage }) => {
4581
Send
4682
</Button>
4783
</Form>
48-
</Accordion.Body>
49-
</Accordion.Item>
84+
)}
85+
</Accordion.Body>
86+
</Accordion.Item>
5087
</Accordion>
5188
);
5289
};

0 commit comments

Comments
 (0)