Re-implemented the 'Show more' button
This commit is contained in:
parent
572671a67f
commit
5e9058faa6
|
@ -71,11 +71,19 @@ socket.emit("join", {
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "",
|
name: "",
|
||||||
type: "",
|
type: "",
|
||||||
|
count: 0,
|
||||||
messages: [],
|
messages: [],
|
||||||
users: [],
|
users: [],
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Event: "messages"
|
||||||
|
// Sent after the server receives a "fetch" request from client.
|
||||||
|
socket.emit("messages", {
|
||||||
|
id: 0,
|
||||||
|
msg: []
|
||||||
|
});
|
||||||
|
|
||||||
// Event: "msg"
|
// Event: "msg"
|
||||||
// Sent when receiving a message.
|
// Sent when receiving a message.
|
||||||
socket.emit("msg", {
|
socket.emit("msg", {
|
||||||
|
|
|
@ -209,6 +209,25 @@ button {
|
||||||
right: 180px;
|
right: 180px;
|
||||||
top: 0;
|
top: 0;
|
||||||
}
|
}
|
||||||
|
#chat .show-more {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
color: #bec5d0;
|
||||||
|
font: 12px Lato, sans-serif;
|
||||||
|
line-height: 1.8em;
|
||||||
|
padding: 10px 0;
|
||||||
|
text-align: center;
|
||||||
|
text-transform: uppercase;
|
||||||
|
width: 100%;
|
||||||
|
word-spacing: 2px;
|
||||||
|
}
|
||||||
|
#chat .show-more:hover {
|
||||||
|
color: #33b0f7;
|
||||||
|
}
|
||||||
|
#chat .show-more:disabled {
|
||||||
|
color: #bec5d0;
|
||||||
|
opacity: .4;
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
#chat .messages {
|
#chat .messages {
|
||||||
display: table;
|
display: table;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
|
|
||||||
<script type="text/html" class="windows">
|
<script type="text/html" class="windows">
|
||||||
{{#each windows}}
|
{{#each windows}}
|
||||||
<div id="window-{{id}}" class="window {{type}}">
|
<div id="window-{{id}}" class="window {{type}}" data-id="{{id}}">
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
<h1>
|
<h1>
|
||||||
|
@ -76,6 +76,9 @@
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="chat">
|
<div class="chat">
|
||||||
|
<button class="show-more" data-id="{{id}}">
|
||||||
|
Show more
|
||||||
|
</button>
|
||||||
<div class="messages">
|
<div class="messages">
|
||||||
{{partial "messages"}}
|
{{partial "messages"}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -36,6 +36,7 @@ $(function() {
|
||||||
var socket = io.connect("");
|
var socket = io.connect("");
|
||||||
var events = [
|
var events = [
|
||||||
"join",
|
"join",
|
||||||
|
"messages",
|
||||||
"msg",
|
"msg",
|
||||||
"networks",
|
"networks",
|
||||||
"nick",
|
"nick",
|
||||||
|
@ -72,10 +73,22 @@ $(function() {
|
||||||
.trigger("click");
|
.trigger("click");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "messages":
|
||||||
case "msg":
|
case "msg":
|
||||||
$("#window-" + data.id)
|
var target = $("#window-" + data.id).find(".messages");
|
||||||
.find(".messages")
|
var html = render(
|
||||||
.append(render("messages", {messages: [data.msg]}));
|
"messages",
|
||||||
|
{messages: toArray(data.msg)}
|
||||||
|
);
|
||||||
|
switch (e) {
|
||||||
|
case "messages":
|
||||||
|
target.prepend(html);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "msg":
|
||||||
|
target.append(html);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "networks":
|
case "networks":
|
||||||
|
@ -180,20 +193,29 @@ $(function() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
chat.on("click", ".show-more .btn", function() {
|
chat.on("click", ".show-more", function() {
|
||||||
var target = $(this).parent();
|
var btn = $(this);
|
||||||
var html = $.parseHTML(target.next(".hidden").remove().html());
|
var messages = btn.closest(".chat").find(".messages").children();
|
||||||
target.replaceWith(html);
|
socket.emit("fetch", {
|
||||||
|
id: btn.data("id"),
|
||||||
|
count: messages.length,
|
||||||
|
});
|
||||||
|
btn.attr("disabled", true);
|
||||||
});
|
});
|
||||||
|
|
||||||
chat.on("click", ".user", function(e) {
|
chat.on("click", ".user", function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var user = $(this);
|
var user = $(this);
|
||||||
var id = user.closest(".window").find(".form").data("target");
|
var id = user
|
||||||
|
.closest(".window")
|
||||||
|
.data("id");
|
||||||
|
|
||||||
|
// Remove modes
|
||||||
var name = user.html().replace(/[\s+@]/g, "");
|
var name = user.html().replace(/[\s+@]/g, "");
|
||||||
if (name.match(/[#.]|-!-/) != null) {
|
if (name.match(/[#.]|-!-/) != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.emit("input", {
|
socket.emit("input", {
|
||||||
id: id,
|
id: id,
|
||||||
text: "/whois " + name,
|
text: "/whois " + name,
|
||||||
|
@ -229,6 +251,10 @@ $(function() {
|
||||||
viewport.toggleClass(btn.attr("class"));
|
viewport.toggleClass(btn.attr("class"));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function toArray(val) {
|
||||||
|
return Array.isArray(val) ? val : [val];
|
||||||
|
}
|
||||||
|
|
||||||
function escape(text) {
|
function escape(text) {
|
||||||
var e = {
|
var e = {
|
||||||
"<": "<",
|
"<": "<",
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
port: 9000,
|
port: 9000,
|
||||||
|
messages: 100,
|
||||||
defaults: {
|
defaults: {
|
||||||
nick: "shout_user",
|
nick: "shout_user",
|
||||||
realname: "http://github.com/erming/shout",
|
realname: "http://github.com/erming/shout",
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
var _ = require("lodash");
|
var _ = require("lodash");
|
||||||
|
var config = require("../../config") || {};
|
||||||
|
|
||||||
module.exports = Chan;
|
module.exports = Chan;
|
||||||
|
|
||||||
|
@ -7,6 +8,7 @@ function Chan(attr) {
|
||||||
id: global.id = ++global.id || 1,
|
id: global.id = ++global.id || 1,
|
||||||
name: "",
|
name: "",
|
||||||
type: "channel",
|
type: "channel",
|
||||||
|
count: 0,
|
||||||
messages: [],
|
messages: [],
|
||||||
users: [],
|
users: [],
|
||||||
}, attr));
|
}, attr));
|
||||||
|
@ -25,3 +27,10 @@ Chan.prototype.sortUsers = function() {
|
||||||
).concat(this.users);
|
).concat(this.users);
|
||||||
}, this);
|
}, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Chan.prototype.toJSON = function() {
|
||||||
|
var clone = _.clone(this);
|
||||||
|
clone.count = clone.messages.length;
|
||||||
|
clone.messages = clone.messages.slice(-1 * (config.messages || 0));
|
||||||
|
return clone;
|
||||||
|
};
|
||||||
|
|
|
@ -43,8 +43,11 @@ function listen() {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
sockets = io.listen(app, {log: 0}).sockets.on("connection", function(s) {
|
sockets = io.listen(app, {log: 0}).sockets.on("connection", function(s) {
|
||||||
s.on("input", input);
|
|
||||||
s.emit("networks", {networks: networks});
|
s.emit("networks", {networks: networks});
|
||||||
|
s.on("input", input);
|
||||||
|
s.on("fetch", function(data) {
|
||||||
|
fetch(s, data);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
(config.networks || []).forEach(function(n) {
|
(config.networks || []).forEach(function(n) {
|
||||||
|
@ -334,13 +337,27 @@ function input(data) {
|
||||||
case "raw":
|
case "raw":
|
||||||
case "send":
|
case "send":
|
||||||
if (client) {
|
if (client) {
|
||||||
console.log(args.slice(1).join(" "));
|
|
||||||
client.write(args.slice(1).join(" "));
|
client.write(args.slice(1).join(" "));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function fetch(socket, data) {
|
||||||
|
var target = find(data.id);
|
||||||
|
if (!target) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var chan = target.chan;
|
||||||
|
var messages = chan
|
||||||
|
.messages
|
||||||
|
.slice(0, chan.messages.length - (data.count || 0));
|
||||||
|
socket.emit("messages", {
|
||||||
|
id: data.id,
|
||||||
|
msg: messages,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function event(e, data) {
|
function event(e, data) {
|
||||||
var data = _.last(data);
|
var data = _.last(data);
|
||||||
var channels = this.channels;
|
var channels = this.channels;
|
||||||
|
|
Loading…
Reference in New Issue