generated from Codaisseur/react-redux-jwt-bootstrap-template
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathChat.js
118 lines (110 loc) · 3.23 KB
/
Chat.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import React, { useEffect, useState } from "react";
import io from "socket.io-client";
import { TextField, Button, Paper } from "@material-ui/core";
import { apiUrl } from "../../config/constants";
import { selectUser } from "../../store/user/selectors";
import { useSelector } from "react-redux";
import ScrollToBottom from "react-scroll-to-bottom";
import AccountCircleIcon from "@material-ui/icons/AccountCircle";
import { Link } from "react-router-dom";
import "./Chat.css";
import logo from "../../images/codefolio_chat_wit.png";
import reactEmoji from "react-emoji";
const socket = io.connect(apiUrl);
export default function Chat(props) {
const user = useSelector(selectUser);
const { chat, setChat, state, setState } = props;
const onTextChange = (e) => {
setState({ ...state, [e.target.name]: e.target.value });
};
const onMessageSubmit = (e) => {
e.preventDefault();
if (!state || !state.message) {
return;
}
const { name, message, image } = state;
socket.emit("message", { name: user.name, message, image: user.userImg });
setState({ message: "", name, image });
};
useEffect(() => {
setState({ ...state, name: user.name });
}, []);
useEffect(() => {
socket.on("message", ({ name, message, image }) => {
console.log("got message!", message, name, image);
setChat([...chat, { name, message, image }]);
});
});
const renderChat = () => {
return chat.map(({ name, message, image }, index) => (
<div key={index}>
<div className="chat-popup">
<img
style={{
padding: "2px",
marginBottom: "0px",
display: "block",
width: "36px",
height: "36px",
overflow: "hidden",
objectFit: "cover",
borderRadius: "50%",
}}
src={image}
></img>
<span style={{ color: "blue" }}>{name}</span> :
<span>{reactEmoji.emojify(message)}</span>
</div>
</div>
));
};
return !user.token ? (
<div style={{ zIndex: "300" }}>
<p>
<AccountCircleIcon />
You need to be logged in to chat!
</p>
<Link to={"/#"}>
<Button>Log in</Button>
</Link>
</div>
) : (
<div className="chat">
<img
src={logo}
style={{
display: "block",
width: "208px",
height: "auto",
marginLeft: "auto",
marginRight: "auto",
color: "white",
}}
/>
<ScrollToBottom>
<div className="render-chat">{renderChat()}</div>
</ScrollToBottom>
<form className="chat-form" onSubmit={onMessageSubmit}>
<div style={{ margin: "5px", marginLeft: "12px", padding: "1rem" }}>
<TextField
name="message"
onChange={(e) => onTextChange(e)}
value={state.message}
id="outlined-multiline-static"
variant="outlined"
lable="Message"
/>
</div>
<div
style={{
justifyContent: "center",
display: "flex",
alignItems: "center",
}}
>
<button>Send Message</button>
</div>
</form>
</div>
);
}