Files
Iris/src/js/components/Fields/OutputControl.js

228 lines
6.7 KiB
JavaScript
Raw Normal View History

2019-04-11 09:35:59 +12:00
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
2019-04-11 09:35:59 +12:00
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
}
2018-05-31 21:34:50 +12:00
this.handleClick = this.handleClick.bind(this);
}
2018-05-31 21:34:50 +12:00
handleClick(e){
2018-10-02 21:36:22 +13:00
if (!this.props.force_expanded && $(e.target).closest('.output-control').length <= 0){
2018-05-31 21:34:50 +12:00
this.setExpanded(false);
}
}
2018-10-02 21:36:22 +13:00
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){
2018-05-31 21:34:50 +12:00
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
2018-10-02 21:36:22 +13:00
if (props.pusher_connected && props.snapcast_enabled){
this.props.snapcastActions.getServer();
}
2018-05-31 21:34:50 +12:00
} else {
this.setState({expanded: expanded});
window.removeEventListener("click", this.handleClick, false);
}
}
renderOutputs(){
2018-10-13 14:28:46 +13:00
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){
2018-10-13 14:28:46 +13:00
has_outputs = true;
snapcast_clients = (
<div>
{
clients.map(client => {
return (
2018-10-09 21:39:38 +13:00
<div className="output-control__item outputs__item--snapcast" key={client.id}>
<div className="output-control__item__name">
{client.name}
</div>
<div className="output-control__item__controls">
<MuteControl
className="output-control__item__mute"
noTooltip={true}
mute={client.mute}
onMuteChange={mute => this.props.snapcastActions.setClientMute(client.id, mute)}
/>
<VolumeControl
className="output-control__item__volume"
volume={client.volume}
mute={client.mute}
onVolumeChange={percent => this.props.snapcastActions.setClientVolume(client.id, percent)}
/>
</div>
</div>
);
})
}
</div>
);
}
var local_streaming = null;
if (this.props.http_streaming_enabled){
2018-10-13 14:28:46 +13:00
has_outputs = true;
local_streaming = (
<div className="output-control__item outputs__item--icecast">
<div className="output-control__item__actions">
<span className="output-control__item__action" onClick={e => this.props.coreActions.cachebustHttpStream()}>
2018-07-04 21:10:51 +12:00
<Icon name="refresh" />
</span>
</div>
<div className="output-control__item__name">
Local browser
2018-07-04 21:10:51 +12:00
</div>
<div className="output-control__item__details">
<VolumeControl
className="output-control__item__volume"
volume={this.props.http_streaming_volume}
mute={this.props.http_streaming_mute}
onVolumeChange={percent => this.props.coreActions.set({http_streaming_volume: percent})}
onMuteChange={mute => this.props.coreActions.set({http_streaming_mute: mute})}
/>
</div>
</div>
);
}
2018-10-13 14:28:46 +13:00
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 = (
<div className="output-control__item output-control__item--commands commands">
{
commands_items.map(command => {
return (
<div
key={command.id}
className="commands__item commands__item--interactive"
onClick={e => this.props.pusherActions.runCommand(command.id)}>
2018-10-13 14:28:46 +13:00
<Icon className="commands__item__icon" name={command.icon} />
<span className={command.colour+'-background commands__item__background'}></span>
</div>
);
})
}
</div>
);
}
}
if (!has_outputs){
return (
2018-10-02 21:36:22 +13:00
<div className="output-control__items output-control__items--no-results">
<p className="no-results">No outputs</p>
</div>
);
} else {
return (
<div className="output-control__items">
2018-10-13 14:28:46 +13:00
{commands}
{local_streaming}
{snapcast_clients}
</div>
);
}
}
render(){
2018-10-02 21:36:22 +13:00
if (this.state.expanded){
return (
<span className="output-control">
2018-05-31 21:34:50 +12:00
<a className="control speakers active" onClick={e => this.setExpanded()}><Icon name="speaker" /></a>
{this.renderOutputs()}
</span>
);
} else {
// No customisable outputs
if (!this.props.http_streaming_enabled && !this.props.snapcast_enabled && !this.props.pusher_commands){
return (
<span className="output-control disabled">
<a className="control speakers"><Icon name="speaker" /></a>
</span>
);
} else {
return (
<span className="output-control">
<a className="control speakers" onClick={e => this.setExpanded()}><Icon name="speaker" /></a>
</span>
);
}
}
}
}
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,
2018-09-28 16:02:53 +12:00
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),
2018-09-28 16:02:53 +12:00
snapcast_clients: state.snapcast.clients,
2018-10-13 14:28:46 +13:00
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)