// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); var utils = require('../utils/utils.jsx'); var client = require('../utils/client.jsx'); var AsyncClient = require('../utils/async_client.jsx'); var Sidebar = require('./sidebar.jsx'); var UserStore = require('../stores/user_store.jsx'); var SocketStore = require('../stores/socket_store.jsx'); var ChannelStore = require('../stores/channel_store.jsx'); var Constants = require('../utils/constants.jsx'); var UserProfile = require('./user_profile.jsx'); var MessageWrapper = require('./message_wrapper.jsx'); var ActionTypes = Constants.ActionTypes; function getCountsStateFromStores() { var count = 0; var channels = ChannelStore.getAll(); var members = ChannelStore.getAllMembers(); channels.forEach(function(channel) { var channelMember = members[channel.id]; if (channel.type === 'D') { count += channel.total_msg_count - channelMember.msg_count; } else { if (channelMember.mention_count > 0) { count += channelMember.mention_count; } else if (channel.total_msg_count - channelMember.msg_count > 0) { count += 1; } } }); return { count: count } } var NotifyCounts = React.createClass({ componentDidMount: function() { ChannelStore.addChangeListener(this._onChange); }, componentWillUnmount: function() { ChannelStore.removeChangeListener(this._onChange); }, _onChange: function() { var newState = getCountsStateFromStores(); if (!utils.areStatesEqual(newState, this.state)) { this.setState(newState); } }, getInitialState: function() { return getCountsStateFromStores(); }, render: function() { if (this.state.count == 0) { return (); } else { return ({ this.state.count }); } } }); var NavbarLoginForm = React.createClass({ handleSubmit: function(e) { e.preventDefault(); var state = { } var domain = this.refs.domain.getDOMNode().value.trim(); if (!domain) { state.server_error = "A domain is required" this.setState(state); return; } var email = this.refs.email.getDOMNode().value.trim(); if (!email) { state.server_error = "An email is required" this.setState(state); return; } var password = this.refs.password.getDOMNode().value.trim(); if (!password) { state.server_error = "A password is required" this.setState(state); return; } state.server_error = ""; this.setState(state); client.loginByEmail(domain, email, password, function(data) { UserStore.setLastDomain(domain); UserStore.setLastEmail(email); UserStore.setCurrentUser(data); var redirect = utils.getUrlParameter("redirect"); if (redirect) { window.location.href = decodeURI(redirect); } else { window.location.href = '/channels/town-square'; } }.bind(this), function(err) { if (err.message == "Login failed because email address has not been verified") { window.location.href = '/verify?domain=' + encodeURIComponent(domain) + '&email=' + encodeURIComponent(email); return; } state.server_error = err.message; this.valid = false; this.setState(state); }.bind(this) ); }, getInitialState: function() { return { }; }, render: function() { var server_error = this.state.server_error ? : null; var subDomain = utils.getSubDomain(); var subDomainClass = "form-control hidden"; if (subDomain == "") { subDomain = UserStore.getLastDomain(); subDomainClass = "form-control"; } return (
); } }); function getStateFromStores() { return { channel: ChannelStore.getCurrent(), member: ChannelStore.getCurrentMember(), users: ChannelStore.getCurrentExtraInfo().members }; } module.exports = React.createClass({ componentDidMount: function() { ChannelStore.addChangeListener(this._onChange); ChannelStore.addExtraInfoChangeListener(this._onChange); var self = this; $('.inner__wrap').click(self.hideSidebars); $('body').on('click.infopopover', function(e){ if ($(e.target).attr('data-toggle') !== 'popover' && $(e.target).parents('.popover.in').length === 0) { $('.info-popover').popover('hide'); } }); }, componentWillUnmount: function() { ChannelStore.removeChangeListener(this._onChange); }, handleSubmit: function(e) { e.preventDefault(); }, handleLeave: function(e) { client.leaveChannel(this.state.channel.id, function(data) { AsyncClient.getChannels(true); window.location.href = '/channels/town-square'; }.bind(this), function(err) { AsyncClient.dispatchError(err, "handleLeave"); }.bind(this) ); }, hideSidebars: function(e) { var windowWidth = $(window).outerWidth(); if(windowWidth <= 768) { AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_SEARCH, results: null }); AppDispatcher.handleServerAction({ type: ActionTypes.RECIEVED_POST_SELECTED, results: null }); if (e.target.className != 'navbar-toggle' && e.target.className != 'icon-bar') { $('.inner__wrap').removeClass('move--right').removeClass('move--left').removeClass('move--left-small'); $('.sidebar--left').removeClass('move--right'); $('.sidebar--right').removeClass('move--left'); $('.sidebar--menu').removeClass('move--left'); } } }, toggleLeftSidebar: function() { $('.inner__wrap').toggleClass('move--right'); $('.sidebar--left').toggleClass('move--right'); }, toggleRightSidebar: function() { $('.inner__wrap').toggleClass('move--left-small'); $('.sidebar--menu').toggleClass('move--left'); }, _onChange: function() { this.setState(getStateFromStores()); $("#navbar .navbar-brand .description").popover({placement : 'bottom', trigger: 'click', html: true}); }, getInitialState: function() { return getStateFromStores(); }, render: function() { var currentId = UserStore.getCurrentId(); var channelName = ""; var popoverContent = ""; var channelTitle = this.props.teamName; var isAdmin = false; var isDirect = false; var description = "" if (this.state.channel) { var channel = this.state.channel; description = utils.textToJsx(this.state.channel.description, {"singleline": true, "noMentionHighlight": true}); popoverContent = React.renderToString(