2015-07-22 00:00:05 +00:00
"use strict" ;
2015-07-27 11:55:36 +00:00
var VoteButton = React . createClass ( { displayName : "VoteButton" ,
cancelVote : function ( e ) {
socket . emit ( "gather:vote" , {
leader : {
candidate : null
}
} ) ;
2015-07-27 00:09:02 +00:00
} ,
2015-07-27 11:55:36 +00:00
vote : function ( e ) {
e . preventDefault ( ) ;
socket . emit ( "gather:vote" , {
leader : {
candidate : parseInt ( e . target . value , 10 )
}
} ) ;
2015-07-27 00:09:02 +00:00
} ,
render : function ( ) {
2015-07-27 11:55:36 +00:00
if ( this . props . currentGatherer === null ) {
return false ;
}
if ( this . props . currentGatherer . leaderVote === this . props . candidate . id ) {
return (
React . createElement ( "button" , {
onClick : this . cancelVote ,
className : "btn btn-xs btn-success" } , "Voted"
)
) ;
} else {
return (
React . createElement ( "button" , {
onClick : this . vote ,
className : "btn btn-xs btn-default" ,
value : this . props . candidate . id } , "Vote"
)
) ;
}
2015-07-27 00:09:02 +00:00
}
} ) ;
2015-07-28 15:54:29 +00:00
var SelectPlayerButton = React . createClass ( { displayName : "SelectPlayerButton" ,
selectPlayer : function ( e ) {
e . preventDefault ( ) ;
2015-07-28 23:32:50 +00:00
socket . emit ( "gather:select" , {
player : parseInt ( e . target . value , 10 )
} )
2015-07-28 15:54:29 +00:00
} ,
render : function ( ) {
2015-07-28 23:32:50 +00:00
if ( this . props . gatherer . leader ) {
return ( React . createElement ( "button" , {
className : "btn btn-xs btn-default" ,
"data-disabled" : "true" } , "Leader" ) ) ;
2015-07-28 15:54:29 +00:00
} else {
return ( React . createElement ( "button" , {
onClick : this . selectPlayer ,
2015-07-28 23:32:50 +00:00
value : this . props . gatherer . id ,
2015-07-28 15:54:29 +00:00
className : "btn btn-xs btn-primary" } , " Select"
)
) ;
}
}
2015-07-28 23:32:50 +00:00
} ) ;
2015-07-28 15:54:29 +00:00
var GatherTeams = React . createClass ( { displayName : "GatherTeams" ,
alienGatherers : function ( ) {
return this . props . gather . gatherers . filter ( function ( gatherer ) {
return gatherer . team === "alien" ;
} ) . sort ( function ( gatherer ) {
2015-07-28 23:32:50 +00:00
return ( gatherer . leader ) ? 1 : - 1 ;
2015-07-28 15:54:29 +00:00
} ) ;
} ,
marineGatherers : function ( ) {
return this . props . gather . gatherers . filter ( function ( gatherer ) {
return gatherer . team === "marine" ;
} ) . sort ( function ( gatherer ) {
2015-07-28 23:32:50 +00:00
return ( gatherer . leader ) ? 1 : - 1 ;
2015-07-28 15:54:29 +00:00
} ) ;
} ,
render : function ( ) {
var extractGatherer = function ( gatherer ) {
var image ;
if ( gatherer . leader ) {
image = ( React . createElement ( "img" , { src : "/images/commander.png" ,
alt : "Commander" ,
height : "20" ,
width : "20" } ) ) ;
}
return (
React . createElement ( "tr" , { key : gatherer . id } ,
React . createElement ( "td" , { className : "col-md-1" } , image ) ,
React . createElement ( "td" , { className : "col-md-11" } , gatherer . user . username )
)
) ;
}
var marines = this . marineGatherers ( ) . map ( extractGatherer ) ;
var aliens = this . alienGatherers ( ) . map ( extractGatherer ) ;
return (
React . createElement ( "div" , { className : "panel-body" } ,
React . createElement ( "div" , { className : "row" } ,
React . createElement ( "div" , { className : "col-md-6" } ,
React . createElement ( "div" , { className : "panel panel-default" } ,
React . createElement ( "div" , { className : "panel-heading" } ,
"Aliens"
) ,
React . createElement ( "table" , { className : "table" } ,
React . createElement ( "tbody" , null ,
aliens
)
)
)
) ,
React . createElement ( "div" , { className : "col-md-6" } ,
React . createElement ( "div" , { className : "panel panel-default" } ,
React . createElement ( "div" , { className : "panel-heading" } ,
"Marines"
) ,
React . createElement ( "table" , { className : "table" } ,
React . createElement ( "tbody" , null ,
marines
)
)
)
)
)
)
) ;
}
} )
2015-07-26 11:54:35 +00:00
var GatherProgress = React . createClass ( { displayName : "GatherProgress" ,
2015-07-28 15:54:29 +00:00
stateDescription : function ( ) {
switch ( this . props . gather . state ) {
case "gathering" :
return "Waiting for more gatherers." ;
case "election" :
return "Currently voting for team leaders." ;
case "selection" :
return "Waiting for leaders to picking teams." ;
case "done" :
return "Gather completed." ;
default :
return "Initialising gather." ;
}
} ,
2015-07-26 11:54:35 +00:00
gatheringProgress : function ( ) {
var num = this . props . gather . gatherers . length ;
var den = 12 ;
2015-07-28 15:54:29 +00:00
var remaining = den - num ;
var message = ( remaining === 1 ) ? "Waiting for last player" : "Waiting for " + remaining + " more players" ;
2015-07-26 11:54:35 +00:00
return {
num : num ,
den : den ,
2015-07-28 15:54:29 +00:00
message : message
2015-07-26 11:54:35 +00:00
} ;
} ,
electionProgress : function ( ) {
var num = this . props . gather . gatherers . reduce ( function ( acc , gatherer ) {
if ( gatherer . leaderVote ) acc ++ ;
return acc ;
} , 0 ) ;
var den = 12 ;
return {
num : num ,
den : den ,
message : den - num + " more votes required"
} ;
} ,
selectionProgress : function ( ) {
var num = this . props . gather . gatherers . reduce ( function ( acc , gatherer ) {
if ( gatherer . team !== "lobby" ) acc ++ ;
return acc ;
} , 0 ) ;
var den = 12 ;
return {
num : num ,
den : den ,
message : num + " out of " + den + " players assigned"
} ;
} ,
render : function ( ) {
var progress ;
var gatherState = this . props . gather . state ;
if ( gatherState === 'gathering' && this . props . gather . gatherers . length ) {
progress = this . gatheringProgress ( ) ;
} else if ( gatherState === 'election' ) {
progress = this . electionProgress ( ) ;
} else if ( gatherState === 'selection' ) {
progress = this . selectionProgress ( ) ;
}
if ( progress ) {
var style = {
width : Math . round ( ( progress . num / progress . den * 100 ) ) + "%"
} ;
return (
2015-07-29 10:46:30 +00:00
React . createElement ( "div" , { className : "panel-body no-bottom" } ,
2015-07-28 15:54:29 +00:00
React . createElement ( "p" , null , React . createElement ( "strong" , null , this . stateDescription ( ) ) , " " , progress . message ) ,
2015-07-26 11:54:35 +00:00
React . createElement ( "div" , { className : "progress" } ,
React . createElement ( "div" , { className : "progress-bar progress-bar-striped active" ,
"data-role" : "progressbar" ,
"data-aria-valuenow" : progress . num ,
"data-aria-valuemin" : "0" ,
"data-aria-valuemax" : progress . den ,
2015-07-28 15:54:29 +00:00
style : style }
2015-07-26 11:54:35 +00:00
)
)
)
) ;
} else {
return false ;
}
}
} ) ;
2015-07-28 23:32:50 +00:00
var GatherActions = React . createClass ( { displayName : "GatherActions" ,
2015-07-29 14:35:58 +00:00
joinGather : function ( e ) {
e . preventDefault ( ) ;
socket . emit ( "gather:join" ) ;
} ,
2015-07-24 17:05:12 +00:00
leaveGather : function ( e ) {
e . preventDefault ( ) ;
2015-07-28 23:32:50 +00:00
socket . emit ( "gather:leave" ) ;
} ,
confirmTeam : function ( e ) {
e . preventDefault ( ) ;
socket . emit ( "gather:select:confirm" ) ;
2015-07-24 17:05:12 +00:00
} ,
2015-07-26 11:54:35 +00:00
inviteToGather : function ( e ) {
e . preventDefault ( ) ;
2015-07-29 14:35:58 +00:00
alert ( "Boop!" ) ;
2015-07-26 11:54:35 +00:00
} ,
2015-07-22 22:34:57 +00:00
render : function ( ) {
2015-07-24 17:05:12 +00:00
var joinButton ;
2015-07-28 23:32:50 +00:00
if ( this . props . currentGatherer ) {
2015-07-26 11:54:35 +00:00
joinButton = ( React . createElement ( "li" , null , React . createElement ( "button" , {
2015-07-24 17:05:12 +00:00
onClick : this . leaveGather ,
2015-07-26 11:54:35 +00:00
className : "btn btn-danger" } , "Leave Gather" ) ) ) ;
2015-07-29 14:35:58 +00:00
} else if ( this . props . gather . state === 'gathering' ) {
joinButton = (
React . createElement ( "button" , {
onClick : this . joinGather ,
className : "btn btn-success" } , "Join Gather" )
) ;
2015-07-26 11:54:35 +00:00
}
2015-07-28 23:32:50 +00:00
var confirmTeam ;
if ( this . props . currentGatherer &&
this . props . currentGatherer . leader &&
this . props . gather . state === 'selection' &&
this . props . gather . gatherers . every ( function ( gatherer ) {
return gatherer . team !== 'lobby' ;
} ) ) {
if ( this . props . currentGatherer . confirm ) {
confirmTeam = (
React . createElement ( "li" , null ,
React . createElement ( "button" , {
className : "btn btn-default" ,
"data-disabled" : "true"
} ,
"Confirmed"
)
)
) ;
} else {
confirmTeam = (
React . createElement ( "li" , null ,
React . createElement ( "button" , {
2015-07-29 10:46:30 +00:00
className : "btn btn-success" ,
2015-07-28 23:32:50 +00:00
onClick : this . confirmTeam
} ,
"Confirm Team"
)
)
) ;
}
}
2015-07-26 11:54:35 +00:00
var inviteButton ;
if ( this . props . gather . state === 'gathering' ) {
inviteButton = ( React . createElement ( "li" , null , React . createElement ( "button" , {
onClick : this . inviteToGather ,
className : "btn btn-primary" } , "Invite to Gather" ) ) ) ;
2015-07-24 17:05:12 +00:00
}
2015-07-28 23:32:50 +00:00
return (
React . createElement ( "div" , { className : "panel-footer text-right" } ,
2015-07-29 10:46:30 +00:00
React . createElement ( "ul" , { className : "list-inline no-bottom" } ,
2015-07-28 23:32:50 +00:00
confirmTeam ,
inviteButton ,
joinButton
)
)
) ;
}
} ) ;
2015-07-29 13:50:39 +00:00
var ServerVoting = React . createClass ( { displayName : "ServerVoting" ,
handleServerVote : function ( e ) {
e . preventDefault ( ) ;
socket . emit ( "gather:vote" , {
server : {
id : parseInt ( e . target . value , 10 )
}
} ) ;
} ,
votesForServer : function ( server ) {
return this . props . gather . gatherers . reduce ( function ( acc , gatherer ) {
if ( server . id === gatherer . serverVote ) acc ++ ;
return acc ;
} , 0 ) ;
} ,
render : function ( ) {
var self = this ;
var servers = self . props . servers . map ( function ( server ) {
var voteButton ;
if ( self . props . currentGatherer . serverVote === server . id ) {
voteButton = ( React . createElement ( "button" , {
"data-disabled" : "true" ,
className : "btn btn-xs btn-success" } ,
"Voted" ) )
} else {
voteButton = ( React . createElement ( "button" , {
onClick : self . handleServerVote ,
value : server . id ,
className : "btn btn-xs btn-primary" } ,
"Vote" ) ) ;
}
return (
React . createElement ( "tr" , null ,
React . createElement ( "td" , { className : "col-md-6" } , server . name ) ,
React . createElement ( "td" , { className : "col-md-3" } , self . votesForServer ( server ) , " Votes" ) ,
React . createElement ( "td" , { className : "col-md-3 text-right" } ,
voteButton
)
)
) ;
} ) ;
return (
React . createElement ( "div" , { className : "panel panel-default" } ,
React . createElement ( "div" , { className : "panel-heading" } ,
"Server Voting"
) ,
React . createElement ( "table" , { id : "serverVoteTable" , className : "table table-condensed table-hover voting-table" } ,
servers
)
)
) ;
}
} )
var MapVoting = React . createClass ( { displayName : "MapVoting" ,
handleMapVote : function ( e ) {
e . preventDefault ( ) ;
socket . emit ( "gather:vote" , {
map : {
id : parseInt ( e . target . value , 10 )
}
} ) ;
} ,
votesForMap : function ( map ) {
return this . props . gather . gatherers . reduce ( function ( acc , gatherer ) {
if ( map . id === gatherer . mapVote ) acc ++ ;
return acc ;
} , 0 ) ;
} ,
render : function ( ) {
var self = this ;
var maps = self . props . maps . map ( function ( map ) {
var voteButton ;
if ( self . props . currentGatherer . mapVote === map . id ) {
voteButton = ( React . createElement ( "button" , {
"data-disabled" : "true" ,
className : "btn btn-xs btn-success" } ,
"Voted" ) )
} else {
voteButton = ( React . createElement ( "button" , {
onClick : self . handleMapVote ,
value : map . id ,
className : "btn btn-xs btn-primary" } ,
"Vote" ) ) ;
}
return (
React . createElement ( "tr" , null ,
React . createElement ( "td" , { className : "col-md-6" } , map . name ) ,
React . createElement ( "td" , { className : "col-md-3" } , self . votesForMap ( map ) , " Votes" ) ,
React . createElement ( "td" , { className : "col-md-3 text-right" } ,
voteButton
)
)
) ;
} ) ;
return (
React . createElement ( "div" , { className : "panel panel-default" } ,
React . createElement ( "div" , { className : "panel-heading" } ,
"Map Voting"
) ,
React . createElement ( "table" , { className : "table table-condensed table-hover voting-table" } ,
maps
)
)
) ;
}
} )
2015-07-28 23:32:50 +00:00
var Gather = React . createClass ( { displayName : "Gather" ,
getDefaultProps : function ( ) {
return {
gather : {
gatherers : [ ]
}
}
} ,
componentDidMount : function ( ) {
var self = this ;
socket . on ( "gather:refresh" , function ( data ) {
2015-07-29 13:50:39 +00:00
self . setProps ( data ) ;
2015-07-28 23:32:50 +00:00
} ) ;
} ,
render : function ( ) {
if ( this . props . gather . state === 'done' ) {
2015-07-29 14:35:58 +00:00
return ( React . createElement ( CompletedGather , React . _ _spread ( { } , this . props ) ) ) ;
2015-07-28 23:32:50 +00:00
}
2015-07-29 13:50:39 +00:00
var voting ;
if ( this . props . currentGatherer ) {
voting = (
React . createElement ( "div" , { className : "panel-body" } ,
React . createElement ( "div" , { className : "row" } ,
React . createElement ( "div" , { className : "col-md-6" } ,
React . createElement ( MapVoting , React . _ _spread ( { } , this . props ) )
) ,
React . createElement ( "div" , { className : "col-md-6" } ,
React . createElement ( ServerVoting , React . _ _spread ( { } , this . props ) )
)
)
)
) ;
}
2015-07-28 15:54:29 +00:00
var gatherTeams ;
if ( this . props . gather . state === 'selection' ) {
gatherTeams = React . createElement ( GatherTeams , { gather : this . props . gather } )
}
2015-07-22 22:34:57 +00:00
return (
React . createElement ( "div" , { className : "panel panel-default" } ,
React . createElement ( "div" , { className : "panel-heading" } ,
2015-07-26 11:54:35 +00:00
React . createElement ( "strong" , null , "NS2 Gather " ) ,
2015-07-28 15:54:29 +00:00
React . createElement ( "span" , { className : "badge add-left" } , this . props . gather . gatherers . length )
2015-07-24 15:01:56 +00:00
) ,
2015-07-29 10:46:30 +00:00
React . createElement ( GatherProgress , { gather : this . props . gather } ) ,
2015-07-28 15:54:29 +00:00
React . createElement ( Gatherers , { gather : this . props . gather , currentGatherer : this . props . currentGatherer } ) ,
gatherTeams ,
2015-07-29 14:35:58 +00:00
voting ,
2015-07-28 23:32:50 +00:00
React . createElement ( GatherActions , React . _ _spread ( { } , this . props ) )
2015-07-22 22:34:57 +00:00
)
) ;
}
} ) ;
2015-07-24 17:05:12 +00:00
var Gatherers = React . createClass ( { displayName : "Gatherers" ,
2015-07-29 14:35:58 +00:00
joinGather : function ( e ) {
e . preventDefault ( ) ;
socket . emit ( "gather:join" ) ;
} ,
2015-07-24 15:01:56 +00:00
render : function ( ) {
2015-07-27 11:55:36 +00:00
var self = this ;
var gatherers = this . props . gather . gatherers . map ( function ( gatherer ) {
2015-07-28 15:54:29 +00:00
// Switch this to online status
2015-07-28 23:32:50 +00:00
var online = ( React . createElement ( "div" , { className : "dot online" } ) ) ;
2015-07-25 12:00:56 +00:00
2015-07-27 11:55:36 +00:00
var division = ( React . createElement ( "span" , { className : "label label-primary" } , gatherer . user . ability . division ) ) ;
2015-07-28 23:32:50 +00:00
var action ;
if ( self . props . gather . state === 'gathering' ) {
action = (
gatherer . user . ability . lifeforms . map ( function ( lifeform ) {
return ( React . createElement ( "span" , { className : "label label-default" } , lifeform ) ) ;
} )
) ;
}
2015-07-27 11:55:36 +00:00
if ( self . props . gather . state === "election" ) {
var votes = self . props . gather . gatherers . reduce ( function ( acc , voter ) {
if ( voter . leaderVote === gatherer . id ) acc ++ ;
return acc ;
} , 0 )
action = (
2015-07-28 15:54:29 +00:00
React . createElement ( "span" , null ,
React . createElement ( "small" , null , votes + " votes" , " " ) ,
React . createElement ( VoteButton , { currentGatherer : self . props . currentGatherer , candidate : gatherer } )
2015-07-27 11:55:36 +00:00
)
) ;
}
2015-07-28 23:32:50 +00:00
if ( self . props . gather . state === 'selection' ) {
action = (
React . createElement ( "span" , null ,
React . createElement ( SelectPlayerButton , { gatherer : gatherer } )
)
) ;
}
2015-07-24 17:05:12 +00:00
return (
2015-07-26 11:54:35 +00:00
React . createElement ( "tr" , { key : gatherer . user . id } ,
2015-07-29 10:46:30 +00:00
React . createElement ( "td" , { className : "col-md-6" } , online , " " , gatherer . user . username ) ,
2015-07-26 11:54:35 +00:00
React . createElement ( "td" , { className : "col-md-3" } , division , " " ) ,
2015-07-28 23:32:50 +00:00
React . createElement ( "td" , { className : "col-md-3 text-right" } , action , " " )
2015-07-24 17:05:12 +00:00
)
) ;
} )
2015-07-27 11:55:36 +00:00
if ( this . props . gather . gatherers . length ) {
2015-07-26 11:54:35 +00:00
return (
React . createElement ( "div" , { className : "panel-body" } ,
React . createElement ( "div" , { className : "panel panel-default" } ,
React . createElement ( "table" , { className : "table roster-table" } ,
React . createElement ( "tbody" , null ,
gatherers
)
)
2015-07-24 17:05:12 +00:00
)
)
2015-07-26 11:54:35 +00:00
) ;
} else {
2015-07-29 10:46:30 +00:00
return (
React . createElement ( "div" , { className : "panel-body text-center join-hero" } ,
2015-07-29 14:35:58 +00:00
React . createElement ( "button" , {
onClick : this . joinGather ,
className : "btn btn-success btn-lg" } , "Start a Gather" )
2015-07-29 10:46:30 +00:00
)
) ;
2015-07-26 11:54:35 +00:00
}
2015-07-24 15:01:56 +00:00
}
} ) ;
2015-07-29 14:35:58 +00:00
var CompletedGather = React . createClass ( { displayName : "CompletedGather" ,
votedMaps : function ( ) {
2015-07-29 14:54:45 +00:00
2015-07-29 14:35:58 +00:00
} ,
votedServer : function ( ) {
} ,
render : function ( ) {
return (
React . createElement ( "div" , { className : "panel panel-default" } ,
React . createElement ( "div" , { className : "panel-heading" } ,
React . createElement ( "strong" , null , "Gather Completed" )
) ,
React . createElement ( "div" , { className : "panel-body" } ,
React . createElement ( "h3" , null , "Join Up:" ) ,
2015-07-29 14:54:45 +00:00
React . createElement ( "p" , null , "Map Voted: To be completed" ) ,
React . createElement ( "p" , null , "Server Voted: To be completed" )
2015-07-29 14:35:58 +00:00
) ,
React . createElement ( GatherTeams , { gather : this . props . gather } )
)
) ;
}
} ) ;
2015-07-28 15:54:29 +00:00
"use strict" ;
2015-07-22 00:00:05 +00:00
var socket ;
2015-07-29 10:46:30 +00:00
function initialiseVisibilityMonitoring ( socket ) {
var hidden , visibilityChange ;
if ( typeof document . hidden !== "undefined" ) { // Opera 12.10 and Firefox 18 and later support
hidden = "hidden" ;
visibilityChange = "visibilitychange" ;
} else if ( typeof document . mozHidden !== "undefined" ) {
hidden = "mozHidden" ;
visibilityChange = "mozvisibilitychange" ;
} else if ( typeof document . msHidden !== "undefined" ) {
hidden = "msHidden" ;
visibilityChange = "msvisibilitychange" ;
} else if ( typeof document . webkitHidden !== "undefined" ) {
hidden = "webkitHidden" ;
visibilityChange = "webkitvisibilitychange" ;
}
document . addEventListener ( visibilityChange , function ( ) {
if ( document [ hidden ] ) {
socket . emit ( "users:away" ) ;
} else {
socket . emit ( "users:online" ) ;
}
} , false ) ;
}
2015-07-22 00:00:05 +00:00
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" )
} ) ;
2015-07-29 10:56:01 +00:00
initialiseVisibilityMonitoring ( socket ) ;
2015-07-29 10:46:30 +00:00
// Render Page
2015-07-24 15:01:56 +00:00
React . render ( React . createElement ( UserMenu , null ) , document . getElementById ( 'side-menu' ) ) ;
React . render ( React . createElement ( Chatroom , null ) , document . getElementById ( 'chatroom' ) ) ;
React . render ( React . createElement ( Gather , null ) , document . getElementById ( 'gathers' ) ) ;
2015-07-27 00:09:02 +00:00
React . render ( React . createElement ( CurrentUser , null ) , document . getElementById ( 'currentuser' ) ) ;
2015-07-29 14:35:58 +00:00
React . render ( React . createElement ( AdminPanel , null ) , document . getElementById ( 'admin-menu' ) ) ;
2015-07-22 00:00:05 +00:00
} ;
2015-07-29 10:56:01 +00:00
2015-07-28 15:54:29 +00:00
"use strict" ;
var Chatroom = React . createClass ( { displayName : "Chatroom" ,
getDefaultProps : function ( ) {
return {
history : [ ]
} ;
} ,
componentDidMount : function ( ) {
var self = this ;
var TIMER _INTERVAL = 60000 ; // Every minute
socket . on ( "message:new" , function ( data ) {
var history = self . props . history ;
history . push ( data ) ;
self . setProps ( {
history : history
} ) ;
self . scrollToBottom ( ) ;
} ) ;
// Message History Retrieved
socket . on ( "message:refresh" , function ( data ) {
self . setProps ( {
history : data . chatHistory
} ) ;
self . scrollToBottom ( ) ;
} ) ;
socket . emit ( "message:refresh" , { } ) ;
self . timer = setInterval ( function ( ) {
if ( self . refs . messages ) 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 ) ;
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 )
)
)
) ;
}
} ) ;
2015-07-22 00:00:05 +00:00
2015-07-28 15:54:29 +00:00
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" ,
width : "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 )
)
)
) ;
}
} ) ;
2015-07-22 00:00:05 +00:00
2015-07-28 15:54:29 +00:00
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
2015-07-28 15:54:29 +00:00
"use strict" ;
2015-07-22 00:00:05 +00:00
2015-07-28 15:54:29 +00:00
var UserLogin = React . createClass ( { displayName : "UserLogin" ,
authorizeId : function ( id ) {
id = parseInt ( id , 10 ) ;
socket . emit ( "users:authorize" , {
id : id
} ) ;
2015-07-28 23:32:50 +00:00
setTimeout ( function ( ) {
socket . emit ( "gather:refresh" ) ;
} , 5000 ) ;
2015-07-28 15:54:29 +00:00
} ,
handleSubmit : function ( e ) {
e . preventDefault ( ) ;
var id = React . findDOMNode ( this . refs . authorize _id ) . value . trim ( ) ;
if ( ! id ) return ;
React . findDOMNode ( this . refs . authorize _id ) . value = '' ;
this . authorizeId ( id ) ;
} ,
render : function ( ) {
return (
React . createElement ( "form" , { onSubmit : this . handleSubmit } ,
React . createElement ( "div" , { className : "input-group signin" } ,
React . createElement ( "input" , {
id : "btn-input" ,
type : "text" ,
className : "form-control" ,
ref : "authorize_id" ,
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" } )
)
) ,
React . createElement ( "div" , { className : "signin" } ,
React . createElement ( "p" , { className : "text-center" } , React . createElement ( "small" , null , "Just a temporary measure until genuine authentication is implemented" ) )
)
)
) ;
}
} )
var UserMenu = React . createClass ( { displayName : "UserMenu" ,
getDefaultProps : function ( ) {
return {
users : [ ]
} ;
} ,
componentDidMount : function ( ) {
2015-07-31 10:49:59 +00:00
var self = this ;
socket . on ( 'users:update' , function ( data ) {
self . setProps ( {
users : data . users
} ) ;
2015-07-28 15:54:29 +00:00
} ) ;
} ,
render : function ( ) {
var users = this . props . users . map ( function ( user ) {
return (
React . createElement ( "li" , { key : user . id } , React . createElement ( "a" , { href : "#" } , user . username ) )
) ;
} ) ;
return (
React . createElement ( "ul" , { className : "nav" , id : "side-menu" } ,
2015-07-31 10:49:59 +00:00
React . createElement ( "li" , null ,
React . createElement ( "a" , { href : "#" } ,
React . createElement ( "i" , { className : "fa fa-users fa-fw" } ) , " Online" ,
React . createElement ( "span" , { className : "badge add-left" } , " " , this . props . users . length , " " )
)
) ,
2015-07-28 15:54:29 +00:00
users ,
React . createElement ( "li" , null , React . createElement ( "br" , null ) , React . createElement ( UserLogin , null ) , React . createElement ( "br" , null ) )
)
) ;
}
} ) ;
2015-07-22 14:13:08 +00:00
2015-07-29 14:35:58 +00:00
var AdminPanel = React . createClass ( { displayName : "AdminPanel" ,
handleGatherReset : function ( ) {
socket . emit ( "gather:reset" ) ;
} ,
render : function ( ) {
return (
React . createElement ( "ul" , { className : "nav" , id : "admin-menu" } ,
React . createElement ( "li" , null ,
React . createElement ( "div" , { className : "admin-panel" } ,
React . createElement ( "h5" , null , "Admin" ) ,
React . createElement ( "button" , {
className : "btn btn-danger" ,
onClick : this . handleGatherReset } ,
"Reset Gather" ) ,
React . createElement ( "p" , { className : "text-center" } , React . createElement ( "small" , null , "Only responds for admins on staging.ensl.org" ) )
)
)
)
)
}
} ) ;
2015-07-28 15:54:29 +00:00
var CurrentUser = React . createClass ( { displayName : "CurrentUser" ,
componentDidMount : function ( ) {
var self = this ;
socket . on ( "users:update" , function ( data ) {
self . setProps ( {
user : data . currentUser
} ) ;
} ) ;
2015-07-31 10:51:38 +00:00
socket . emit ( "users:refresh" ) ;
2015-07-28 15:54:29 +00:00
} ,
render : function ( ) {
if ( this . props . user ) {
return (
React . createElement ( "a" , { href : "#" } , this . props . user . username , " " , React . createElement ( "img" , { src : this . props . user . avatar ,
alt : "User Avatar" ,
height : "20" ,
width : "20" } ) )
) ;
} else {
return false ;
}
}
} ) ;