import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import VolumeControl from './VolumeControl'; import MuteControl from './MuteControl'; import Icon from '../Icon'; import * as coreActions from '../../services/core/actions'; import * as pusherActions from '../../services/pusher/actions'; import * as snapcastActions from '../../services/snapcast/actions'; class OutputControl extends React.Component{ constructor(props){ super(props); this.state = { expanded: false } this.handleClick = this.handleClick.bind(this); } handleClick(e){ if (!this.props.force_expanded && $(e.target).closest('.output-control').length <= 0){ this.setExpanded(false); } } componentWillReceiveProps(nextProps){ // When force expanded triggered if (!this.props.force_expanded && nextProps.force_expanded){ this.setExpanded(true, nextProps); } } setExpanded(expanded = !this.state.expanded, props = this.props){ if (expanded){ this.setState({expanded: expanded}); window.addEventListener("click", this.handleClick, false); // Re-check our snapcast clients // TODO: Once we have push events, remove this as it'll (marginally) // slow down the reveal/render if (props.pusher_connected && props.snapcast_enabled){ this.props.snapcastActions.getServer(); } } else { this.setState({expanded: expanded}); window.removeEventListener("click", this.handleClick, false); } } renderOutputs(){ var has_outputs = false; var clients = []; for (var key in this.props.snapcast_clients){ if (this.props.snapcast_clients.hasOwnProperty(key)){ var client = this.props.snapcast_clients[key]; if (client.connected || this.props.show_disconnected_clients){ clients.push(client); } } } var snapcast_clients = null; if (clients.length > 0){ has_outputs = true; snapcast_clients = (
{ clients.map(client => { return (
{client.name}
this.props.snapcastActions.setClientMute(client.id, mute)} /> this.props.snapcastActions.setClientVolume(client.id, percent)} />
); }) }
); } var local_streaming = null; if (this.props.http_streaming_enabled){ has_outputs = true; local_streaming = (
this.props.coreActions.cachebustHttpStream()}>
Local browser
this.props.coreActions.set({http_streaming_volume: percent})} onMuteChange={mute => this.props.coreActions.set({http_streaming_mute: mute})} />
); } var commands = null; if (this.props.pusher_commands){ var commands_items = []; for (var key in this.props.pusher_commands){ if (this.props.pusher_commands.hasOwnProperty(key)){ commands_items.push(this.props.pusher_commands[key]); } } if (commands_items.length > 0){ has_outputs = true; commands = (
{ commands_items.map(command => { return (
this.props.pusherActions.runCommand(command.id)}>
); }) }
); } } if (!has_outputs){ return (

No outputs

); } else { return (
{commands} {local_streaming} {snapcast_clients}
); } } render(){ if (this.state.expanded){ return ( this.setExpanded()}> {this.renderOutputs()} ); } else { // No customisable outputs if (!this.props.http_streaming_enabled && !this.props.snapcast_enabled && !this.props.pusher_commands){ return ( ); } else { return ( this.setExpanded()}> ); } } } } const mapStateToProps = (state, ownProps) => { return { http_streaming_enabled: state.core.http_streaming_enabled, http_streaming_volume: state.core.http_streaming_volume, http_streaming_mute: state.core.http_streaming_mute, pusher_connected: state.pusher.connected, snapcast_enabled: (state.pusher.config ? state.pusher.config.snapcast_enabled : null), show_disconnected_clients: (state.ui.snapcast_show_disconnected_clients !== undefined ? state.ui.snapcast_show_disconnected_clients : false), snapcast_clients: state.snapcast.clients, pusher_commands: (state.pusher.commands ? state.pusher.commands : {}) } } const mapDispatchToProps = (dispatch) => { return { coreActions: bindActionCreators(coreActions, dispatch), snapcastActions: bindActionCreators(snapcastActions, dispatch), pusherActions: bindActionCreators(pusherActions, dispatch) } } export default connect(mapStateToProps, mapDispatchToProps)(OutputControl)