refactoring message view (incomplete)

This commit is contained in:
Gene S
2016-01-22 18:00:56 -08:00
parent 22e2be2dc8
commit 10353c9a1d
3 changed files with 396 additions and 30 deletions
+2
View File
@@ -7,3 +7,5 @@ This is work in progress. Bugs are expected.
Try it at http://api.tinode.co/x/example-react-js/
License: [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
Avatar photos from [https://www.pexels.com/] under [CC0 license](https://www.pexels.com/photo-license/).
+143
View File
@@ -210,6 +210,7 @@ html, body {
background-color: #E9E9FF;
}
/*
.chatBox {
list-style: none;
padding: 1.5em 0 1.5em;
@@ -298,3 +299,145 @@ html, body {
.chatBox-body > p + p {
margin-top: 0.5em;
}
*/
/* CSS talk bubble */
.chat-box {
list-style: none;
padding: 0 0 5em 0;
}
.chat-box li {
display: flex;
margin: 0;
padding: 0;
align-items: flex-end;
}
.chat-box li.right {
justify-content: flex-end;
}
.chat-box .bubble {
position: relative;
max-width: 32em;
height: auto;
padding: 1.5em 0 1.5em;
background-color: #ef9a9a;
border: 1px solid #e53935;
margin: 0;
padding: 0.5em;
text-align: left;
}
.chat-box li.single {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.chat-box li.single .bubble {
border-radius: 0.5em;
-webkit-border-radius: 0.5em;
-moz-border-radius: 0.5em;
}
.chat-box li.first {
margin-top: 0.5em;
margin-bottom: 0.05em;
}
.chat-box li.first .bubble {
border-radius: 0.5em 0.5em 0 0;
-webkit-border-radius: 0.5em 0.5em 0 0;
-moz-border-radius: 0.5em 0.5em 0 0;
}
.chat-box li.middle {
margin-top: 0.05em;
margin-bottom: 0.05em;
}
.chat-box li.middle .bubble {
border-radius: 0;
}
.chat-box li.last {
margin-top: 0.05em;
margin-bottom: 0.5em;
}
.chat-box li.last .bubble {
border-radius: 0 0 0.5em 0.5em;
-webkit-border-radius: 0 0 0.5em 0.5em;
-moz-border-radius: 0 0 0.5em 0.5em;
}
/* Left triangle placed bottom left flush. */
.chat-box li.left .tip::before {
content: '';
position: absolute;
width: 0;
height: 0;
right: auto;
left: -11px;
top: auto;
bottom: -1px; /* border-width */
border: 10px solid;
border-color: transparent transparent #e53935 transparent;
}
.chat-box li.left .tip::after{
content: '';
position: absolute;
width: 0;
height: 0;
right: auto;
left: -9px;
top: auto;
bottom: 0;
border: 9px solid;
border-color: transparent transparent #ef9a9a transparent;
}
/* Right triangle placed bottom right flush. */
.chat-box li.right .tip::before {
content: '';
position: absolute;
width: 0;
height: 0;
left: auto;
right: -11px;
top: auto;
bottom: -1px; /* border-width */
border: 10px solid;
border-color: transparent transparent #e53935 transparent;
}
.chat-box li.right .tip::after {
content: '';
position: absolute;
width: 0;
height: 0;
left: auto;
right: -9px;
top: auto;
bottom: 0;
border: 9px solid;
border-color: transparent transparent #ef9a9a transparent;
}
.chat-box .avatar {
width: 40px;
text-align: center;
}
.chat-box .avatar img {
width: 32px;
display: block;
position: relative;
left: 4px;
border-radius: 50%;
}
.chat-box .bubble p {
margin: 0;
}
+251 -30
View File
@@ -23,14 +23,18 @@
<div id="mountPoint"></div>
<script type="text/babel">
// Host name and posrt to connect to
//var HOST = "api.tinode.co";
var HOST = "localhost:6060";
var HOST = "api.tinode.co";
//var HOST = "localhost:6060";
// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own
var API_KEY = "AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K";
// Minimum time between two keypress notifications, milliseconds.
var KEYPRESS_DELAY = 5*1000;
// Delay before sending a {note} for reciving a message, milliseconds.
var RECEIVED_DELAY = 500;
// Delay before sending a read notification, milliseconds.
var READ_DELAY = 3*1000;
@@ -219,24 +223,7 @@
);
}
})
/*
SideNavbar.MenuStart = React.createClass({
render: function() {
return (
<li className="dropdown">
<a href="#" className="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">
<big><span className="glyphicon glyphicon-option-vertical"></span></big>
</a>
<ul className="dropdown-menu">
<li><a href="#" onClick={this.props.onSignUp}><span className="glyphicon glyphicon-user"></span> Sign Up</a></li>
<li><a href="#" onClick={this.props.onSettings}><span className="glyphicon glyphicon-cog"></span> Settings</a></li>
</ul>
</li>
);
}
});
*/
SideNavbar.MenuStart = React.createClass({
render: function() {
return (
@@ -528,15 +515,14 @@ dignissim a diam a hendrerit. Nulla vel est ut quam rhoncus pulvinar. In hac hab
};
var Message = React.createClass({
render: function() {
var liClass = (this.props.response ? "left" : "right") + " " + this.props.sequence;
return (
<li className={this.props.response ? 'chatBox-inverted' : null}>
<div className="chatBox-panel">
<div className="chatBox-body">
<p>{this.props.content}
<Message.ReceivedMarker response={this.props.response}
<li className={liClass}>
<div className="bubble tip">
<p>{this.props.content}
<Message.ReceivedMarker response={this.props.response}
timestamp={this.props.timestamp} received={this.props.received} />
</p>
</div>
</p>
</div>
</li>
);
@@ -689,6 +675,7 @@ dignissim a diam a hendrerit. Nulla vel est ut quam rhoncus pulvinar. In hac hab
render: function() {
var me = Tinode.getCurrentUserID();
var topic = Tinode.getTopic(this.state.topic);
var previousFrom = null;
var messageNodes = this.state.messages.map(function(msg) {
var isReply = !(msg.from === me);
var msgReceived = Received.UNDEF;
@@ -703,7 +690,7 @@ dignissim a diam a hendrerit. Nulla vel est ut quam rhoncus pulvinar. In hac hab
}
return (
<Message content={msg.content} timestamp={msg.ts} response={isReply}
received={msgReceived} key={msg.seq} />
sequence = {sequence} received={msgReceived} key={msg.seq} />
);
});
return (
@@ -712,7 +699,7 @@ dignissim a diam a hendrerit. Nulla vel est ut quam rhoncus pulvinar. In hac hab
<h3 className="panel-title">{this.state.title}</h3>
</div>
<div className="panel-body" id="messagesView">
<ul className="chatBox">
<ul className="chat-box">
{messageNodes}
</ul>
</div>
@@ -877,6 +864,240 @@ dignissim a diam a hendrerit. Nulla vel est ut quam rhoncus pulvinar. In hac hab
document.getElementById('mountPoint')
);
</script>
<script type="text/javascript">
var materialColorIndex = ["red", "pink", "purple", "deep-purple", "indigo", "blue", "light-blue", "cyan", "teal",
"green","light-green","lime","yellow", "amber", "orange", "deep-orange", "brown", "grey", "blue-grey"];
var materialShadeIndex = ["50", "100", "200", "300", "400", "500", "600", "700", "800", "900"];
var materialColors = {
"red": {
"50": "#ffebee",
"100": "#ffcdd2",
"200": "#ef9a9a",
"300": "#e57373",
"400": "#ef5350",
"500": "#f44336",
"600": "#e53935",
"700": "#d32f2f",
"800": "#c62828",
"900": "#b71c1c"
},
"pink": {
"50": "#fce4ec",
"100": "#f8bbd0",
"200": "#f48fb1",
"300": "#f06292",
"400": "#ec407a",
"500": "#e91e63",
"600": "#d81b60",
"700": "#c2185b",
"800": "#ad1457",
"900": "#880e4f"
},
"purple": {
"50": "#f3e5f5",
"100": "#e1bee7",
"200": "#ce93d8",
"300": "#ba68c8",
"400": "#ab47bc",
"500": "#9c27b0",
"600": "#8e24aa",
"700": "#7b1fa2",
"800": "#6a1b9a",
"900": "#4a148c"
},
"deep-purple": {
"50": "#ede7f6",
"100": "#d1c4e9",
"200": "#b39ddb",
"300": "#9575cd",
"400": "#7e57c2",
"500": "#673ab7",
"600": "#5e35b1",
"700": "#512da8",
"800": "#4527a0",
"900": "#311b92"
},
"indigo": {
"50": "#e8eaf6",
"100": "#c5cae9",
"200": "#9fa8da",
"300": "#7986cb",
"400": "#5c6bc0",
"500": "#3f51b5",
"600": "#3949ab",
"700": "#303f9f",
"800": "#283593",
"900": "#1a237e"
},
"blue": {
"50": "#e3f2fd",
"100": "#bbdefb",
"200": "#90caf9",
"300": "#64b5f6",
"400": "#42a5f5",
"500": "#2196f3",
"600": "#1e88e5",
"700": "#1976d2",
"800": "#1565c0",
"900": "#0d47a1"
},
"light-blue": {
"50": "#e1f5fe",
"100": "#b3e5fc",
"200": "#81d4fa",
"300": "#4fc3f7",
"400": "#29b6f6",
"500": "#03a9f4",
"600": "#039be5",
"700": "#0288d1",
"800": "#0277bd",
"900": "#01579b"
},
"cyan": {
"50": "#e0f7fa",
"100": "#b2ebf2",
"200": "#80deea",
"300": "#4dd0e1",
"400": "#26c6da",
"500": "#00bcd4",
"600": "#00acc1",
"700": "#0097a7",
"800": "#00838f",
"900": "#006064"
},
"teal": {
"50": "#e0f2f1",
"100": "#b2dfdb",
"200": "#80cbc4",
"300": "#4db6ac",
"400": "#26a69a",
"500": "#009688",
"600": "#00897b",
"700": "#00796b",
"800": "#00695c",
"900": "#004d40"
},
"green": {
"50": "#e8f5e9",
"100": "#c8e6c9",
"200": "#a5d6a7",
"300": "#81c784",
"400": "#66bb6a",
"500": "#4caf50",
"600": "#43a047",
"700": "#388e3c",
"800": "#2e7d32",
"900": "#1b5e20"
},
"light-green": {
"50": "#f1f8e9",
"100": "#dcedc8",
"200": "#c5e1a5",
"300": "#aed581",
"400": "#9ccc65",
"500": "#8bc34a",
"600": "#7cb342",
"700": "#689f38",
"800": "#558b2f",
"900": "#33691e"
},
"lime": {
"50": "#f9fbe7",
"100": "#f0f4c3",
"200": "#e6ee9c",
"300": "#dce775",
"400": "#d4e157",
"500": "#cddc39",
"600": "#c0ca33",
"700": "#afb42b",
"800": "#9e9d24",
"900": "#827717"
},
"yellow": {
"50": "#fffde7",
"100": "#fff9c4",
"200": "#fff59d",
"300": "#fff176",
"400": "#ffee58",
"500": "#ffeb3b",
"600": "#fdd835",
"700": "#fbc02d",
"800": "#f9a825",
"900": "#f57f17"
},
"amber": {
"50": "#fff8e1",
"100": "#ffecb3",
"200": "#ffe082",
"300": "#ffd54f",
"400": "#ffca28",
"500": "#ffc107",
"600": "#ffb300",
"700": "#ffa000",
"800": "#ff8f00",
"900": "#ff6f00"
},
"orange": {
"50": "#fff3e0",
"100": "#ffe0b2",
"200": "#ffcc80",
"300": "#ffb74d",
"400": "#ffa726",
"500": "#ff9800",
"600": "#fb8c00",
"700": "#f57c00",
"800": "#ef6c00",
"900": "#e65100"
},
"deep-orange": {
"50": "#fbe9e7",
"100": "#ffccbc",
"200": "#ffab91",
"300": "#ff8a65",
"400": "#ff7043",
"500": "#ff5722",
"600": "#f4511e",
"700": "#e64a19",
"800": "#d84315",
"900": "#bf360c"
},
"brown": {
"50": "#efebe9",
"100": "#d7ccc8",
"200": "#bcaaa4",
"300": "#a1887f",
"400": "#8d6e63",
"500": "#795548",
"600": "#6d4c41",
"700": "#5d4037",
"800": "#4e342e",
"900": "#3e2723"
},
"grey": {
"50": "#fafafa",
"100": "#f5f5f5",
"200": "#eeeeee",
"300": "#e0e0e0",
"400": "#bdbdbd",
"500": "#9e9e9e",
"600": "#757575",
"700": "#616161",
"800": "#424242",
"900": "#212121"
},
"blue-grey": {
"50": "#eceff1",
"100": "#cfd8dc",
"200": "#b0bec5",
"300": "#90a4ae",
"400": "#78909c",
"500": "#607d8b",
"600": "#546e7a",
"700": "#455a64",
"800": "#37474f",
"900": "#263238"
}
};
</script>
</body>
</html>