2015-07-22 00:00:05 +00:00
|
|
|
$(function () {
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
2015-07-21 00:24:14 +00:00
|
|
|
var GatherCounter = React.createClass({displayName: "GatherCounter",
|
2015-07-21 14:10:24 +00:00
|
|
|
render: function () {
|
|
|
|
return (
|
|
|
|
React.createElement("li", null,
|
|
|
|
React.createElement("a", {href: "#"},
|
|
|
|
React.createElement("i", {className: "fa fa-users fa-fw"}), " Gatherers",
|
|
|
|
React.createElement("span", {className: "badge add-left"}, " ", this.props.count, " ")
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
2015-07-21 00:24:14 +00:00
|
|
|
});
|
|
|
|
|
2015-07-22 00:00:05 +00:00
|
|
|
var UserLogin = React.createClass({displayName: "UserLogin",
|
|
|
|
handleSubmit: function () {
|
|
|
|
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
return (
|
|
|
|
React.createElement("form", {onSubmit: this.handleSubmit},
|
|
|
|
React.createElement("div", {className: "input-group"},
|
|
|
|
React.createElement("input", {
|
|
|
|
id: "btn-input",
|
|
|
|
type: "text",
|
|
|
|
className: "form-control",
|
|
|
|
placeholder: "Choose an ID..."}),
|
|
|
|
React.createElement("span", {className: "input-group-btn"},
|
|
|
|
React.createElement("input", {
|
|
|
|
type: "submit",
|
|
|
|
className: "btn btn-primary",
|
|
|
|
id: "btn-chat",
|
|
|
|
value: "Login"})
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2015-07-21 00:24:14 +00:00
|
|
|
var Gatherer = React.createClass({displayName: "Gatherer",
|
2015-07-21 14:10:24 +00:00
|
|
|
render: function () {
|
|
|
|
return (
|
|
|
|
React.createElement("li", null,
|
|
|
|
React.createElement("a", {href: "#"}, this.props.gatherer.username)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
2015-07-21 00:24:14 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
var GathererMenu = React.createClass({displayName: "GathererMenu",
|
2015-07-21 14:10:24 +00:00
|
|
|
componentDidMount: function () {
|
|
|
|
socket.on('gatherCount', this.updateGatherers);
|
|
|
|
},
|
|
|
|
updateGatherers: function (data) {
|
|
|
|
this.setProps({
|
|
|
|
count: data.count,
|
|
|
|
gatherers: data.gatherers
|
|
|
|
});
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
var gatherers = this.props.gatherers.map(function (gatherer) {
|
|
|
|
return (
|
|
|
|
React.createElement(Gatherer, {gatherer: gatherer})
|
|
|
|
);
|
|
|
|
});
|
|
|
|
return (
|
|
|
|
React.createElement("ul", {className: "nav", id: "side-menu"},
|
2015-07-22 00:00:05 +00:00
|
|
|
React.createElement("li", null,
|
|
|
|
React.createElement(UserLogin, null)
|
|
|
|
),
|
2015-07-21 14:10:24 +00:00
|
|
|
React.createElement(GatherCounter, React.__spread({}, this.props)),
|
|
|
|
gatherers
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
2015-07-20 22:47:18 +00:00
|
|
|
});
|
|
|
|
|
2015-07-21 14:10:24 +00:00
|
|
|
var Chatroom = React.createClass({displayName: "Chatroom",
|
|
|
|
componentDidMount: function () {
|
|
|
|
var self = this;
|
|
|
|
var TIMER_INTERVAL = 60000; // Every minute
|
2015-07-21 00:24:14 +00:00
|
|
|
|
2015-07-21 14:10:24 +00:00
|
|
|
socket.on("message:new", function (data) {
|
|
|
|
var history = self.props.history;
|
|
|
|
history.push(data);
|
|
|
|
self.setProps({
|
|
|
|
history: history
|
|
|
|
});
|
|
|
|
self.scrollToBottom();
|
|
|
|
});
|
2015-07-21 00:24:14 +00:00
|
|
|
|
2015-07-21 14:10:24 +00:00
|
|
|
// Message History Retrieved
|
|
|
|
socket.on("message:refresh", function (data) {
|
|
|
|
self.setProps({
|
|
|
|
history: data.chatHistory
|
|
|
|
});
|
|
|
|
self.scrollToBottom();
|
|
|
|
});
|
|
|
|
|
|
|
|
socket.emit("message:refresh", {});
|
|
|
|
|
|
|
|
self.timer = setInterval(function () {
|
|
|
|
self.refs.messages.refreshTime();
|
|
|
|
}, TIMER_INTERVAL);
|
|
|
|
},
|
|
|
|
|
|
|
|
componentDidUnmount: function () {
|
|
|
|
clearInterval(this.timer);
|
|
|
|
},
|
|
|
|
sendMessage: function (message) {
|
|
|
|
socket.emit("newMessage", {message: message});
|
|
|
|
},
|
|
|
|
scrollToBottom: function () {
|
|
|
|
var node = React.findDOMNode(this.refs.messageContainer);
|
|
|
|
console.log(node)
|
|
|
|
node.scrollTop = node.scrollHeight;
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
var messages = this.props.history.map(function (message) {
|
|
|
|
return (
|
|
|
|
React.createElement(ChatMessage, {
|
|
|
|
avatar: message.author.avatar,
|
|
|
|
username: message.author.username,
|
|
|
|
content: message.content,
|
|
|
|
ref: "messages",
|
|
|
|
createdAt: message.createdAt})
|
|
|
|
);
|
|
|
|
});
|
|
|
|
return (
|
|
|
|
React.createElement("div", {className: "panel panel-default"},
|
|
|
|
React.createElement("div", {className: "panel-heading"}, "Gather Chat"),
|
|
|
|
React.createElement("div", {className: "panel-body"},
|
|
|
|
React.createElement("ul", {className: "chat", id: "chatmessages", ref: "messageContainer"},
|
|
|
|
messages
|
|
|
|
)
|
|
|
|
),
|
|
|
|
React.createElement("div", {className: "panel-footer"},
|
|
|
|
React.createElement(MessageBar, null)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var ChatMessage = React.createClass({displayName: "ChatMessage",
|
|
|
|
getInitialState: function () {
|
|
|
|
return {
|
|
|
|
timeAgo: $.timeago(this.props.createdAt)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
refreshTime: function () {
|
|
|
|
var self = this;
|
|
|
|
self.setState({
|
|
|
|
timeAgo: $.timeago(self.props.createdAt)
|
|
|
|
});
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
return (
|
|
|
|
React.createElement("li", {className: "left clearfix"},
|
|
|
|
React.createElement("span", {className: "chat-img pull-left"},
|
|
|
|
React.createElement("img", {
|
|
|
|
src: this.props.avatar,
|
|
|
|
alt: "User Avatar",
|
|
|
|
height: "40",
|
|
|
|
className: "img-circle"})
|
|
|
|
),
|
|
|
|
React.createElement("div", {className: "chat-body clearfix"},
|
|
|
|
React.createElement("div", {className: "header"},
|
|
|
|
React.createElement("strong", {className: "primary-font"}, this.props.username),
|
|
|
|
React.createElement("small", {className: "pull-right text-muted"},
|
|
|
|
React.createElement("i", {className: "fa fa-clock-o fa-fw"}), " ", this.state.timeAgo
|
|
|
|
)
|
|
|
|
),
|
|
|
|
React.createElement("p", null, this.props.content)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var MessageBar = React.createClass({displayName: "MessageBar",
|
|
|
|
sendMessage: function (content) {
|
|
|
|
socket.emit("message:new", {
|
|
|
|
content: content
|
|
|
|
});
|
|
|
|
},
|
|
|
|
handleSubmit: function (e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var content = React.findDOMNode(this.refs.content).value.trim();
|
|
|
|
if (!content) return;
|
|
|
|
React.findDOMNode(this.refs.content).value = '';
|
|
|
|
this.sendMessage(content);
|
|
|
|
return;
|
|
|
|
},
|
|
|
|
render: function () {
|
|
|
|
return (
|
|
|
|
React.createElement("form", {onSubmit: this.handleSubmit},
|
|
|
|
React.createElement("div", {className: "input-group"},
|
|
|
|
React.createElement("input", {
|
|
|
|
id: "btn-input",
|
|
|
|
type: "text",
|
|
|
|
className: "form-control",
|
|
|
|
ref: "content",
|
|
|
|
placeholder: "Be polite please..."}),
|
|
|
|
React.createElement("span", {className: "input-group-btn"},
|
|
|
|
React.createElement("input", {
|
|
|
|
type: "submit",
|
|
|
|
className: "btn btn-primary",
|
|
|
|
id: "btn-chat",
|
|
|
|
value: "Send"})
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-07-22 00:00:05 +00:00
|
|
|
var socket;
|
|
|
|
|
|
|
|
function initialiseComponents () {
|
2015-07-22 14:13:08 +00:00
|
|
|
var socketUrl = window.location.protocol + "//" + window.location.host;
|
|
|
|
socket = io(socketUrl)
|
2015-07-22 00:00:05 +00:00
|
|
|
.on("connect", function () {
|
|
|
|
console.log("Connected");
|
|
|
|
})
|
|
|
|
.on("reconnect", function () {
|
|
|
|
console.log("Reconnected");
|
|
|
|
})
|
|
|
|
.on("disconnect", function () {
|
|
|
|
console.log("Disconnected")
|
|
|
|
});
|
|
|
|
|
|
|
|
React.render(React.createElement(GathererMenu, {count: 0, gatherers: []}), document.getElementById('side-menu'));
|
|
|
|
React.render(React.createElement(Chatroom, {history: []}), document.getElementById('chatroom'));
|
|
|
|
};
|
|
|
|
|
|
|
|
initialiseComponents();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2015-07-22 14:13:08 +00:00
|
|
|
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZWQuanMiLCJzb3VyY2VzIjpbbnVsbF0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsQ0FBQyxZQUFZOztBQUVkLFlBQVksQ0FBQzs7QUFFYixJQUFJLG1DQUFtQyw2QkFBQTtDQUN0QyxNQUFNLEVBQUUsWUFBWTtFQUNuQjtHQUNDLG9CQUFBLElBQUcsRUFBQSxJQUFDLEVBQUE7SUFDSCxvQkFBQSxHQUFFLEVBQUEsQ0FBQSxDQUFDLElBQUEsRUFBSSxDQUFDLEdBQUksQ0FBQSxFQUFBO0tBQ1gsb0JBQUEsR0FBRSxFQUFBLENBQUEsQ0FBQyxTQUFBLEVBQVMsQ0FBQyxtQkFBb0IsQ0FBSSxDQUFBLEVBQUEsWUFBQSxFQUFBLENBQUE7QUFBQSxLQUNyQyxvQkFBQSxNQUFLLEVBQUEsQ0FBQSxDQUFDLFNBQUEsRUFBUyxDQUFDLGdCQUFpQixDQUFBLEVBQUEsR0FBQSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLEdBQVEsQ0FBQTtJQUN6RCxDQUFBO0dBQ0EsQ0FBQTtJQUNKO0VBQ0Y7QUFDRixDQUFDLENBQUMsQ0FBQzs7QUFFSCxJQUFJLCtCQUErQix5QkFBQTtBQUNuQyxDQUFDLFlBQVksRUFBRSxZQUFZOztFQUV6QjtDQUNELE1BQU0sRUFBRSxZQUFZO0VBQ25CO0dBQ0Msb0JBQUEsTUFBSyxFQUFBLENBQUEsQ0FBQyxRQUFBLEVBQVEsQ0FBRSxJQUFJLENBQUMsWUFBYSxDQUFFLENBQUEsRUFBQTtJQUNuQyxvQkFBQSxLQUFJLEVBQUEsQ0FBQSxDQUFDLFNBQUEsRUFBUyxDQUFDLGFBQWMsQ0FBQSxFQUFBO0tBQzVCLG9CQUFBLE9BQU0sRUFBQSxDQUFBO01BQ0wsRUFBQSxFQUFFLENBQUMsV0FBQSxFQUFXO01BQ2QsSUFBQSxFQUFJLENBQUMsTUFBQSxFQUFNO01BQ1gsU0FBQSxFQUFTLENBQUMsY0FBQSxFQUFjO01BQ3hCLFdBQUEsRUFBVyxDQUFDLGlCQUFpQixDQUFBLENBQUcsQ0FBQSxFQUFBO0tBQ2pD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
|