import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import VolumeControl from './Fields/VolumeControl'; import MuteControl from './Fields/MuteControl'; import TextField from './Fields/TextField'; import SnapcastClients from './SnapcastClients'; import Icon from './Icon'; import Link from './Link'; import * as helpers from '../helpers'; import * as actions from '../services/snapcast/actions'; import SelectField from './Fields/SelectField'; const SnapcastGroups = (props) => { const { actions, show_disconnected_clients, streams, groups, clients, history, match: { params: { id: groupId } }, } = props; const streamsArray = Object.keys(streams).map((id) => streams[id]); const groupsArray = Object.keys(groups).map((id) => groups[id]); if (!groups || groupsArray.length <= 0) { return null; } const renderGroup = () => { if (!groupId || !groups[groupId]) { return null; } const group = helpers.collate(groups[groupId], { clients }); // Average our clients' volume for an overall group volume let group_volume = 0; for (let i = 0; i < group.clients.length; i++) { const client = group.clients[i]; group_volume += client.volume; } group_volume /= group.clients.length; return (
Name
actions.setGroupName(group.id, value)} />
Stream
actions.setGroupStream(group.id, value)} value={group.stream_id} options={streamsArray.map((stream) => ( { value: stream.id, label: `${stream.id} (${stream.status})` } ))} />
Volume
actions.setGroupMute(group.id, mute)} /> actions.setGroupVolume(group.id, percent, previousPercent)} />
Clients
); } const renderMenuItem = (group) => { const icon = () => { const iconWords = [ { icon: 'business', words: ['office', 'work'] }, { icon: 'king_bed', words: ['bed'] }, { icon: 'tv', words: ['lounge', 'tv'] }, { icon: 'directions_car', words: ['garage', 'laundry'] }, { icon: 'fitness_center', words: ['gym'] }, { icon: 'emoji_food_beverage', words: ['kitchen'] }, { icon: 'deck', words: ['deck', 'outside'] }, { icon: 'restaurant_menu', words: ['dining', 'dinner'] }, { icon: 'laptop', words: ['laptop'] }, { icon: 'bug_report', words: ['test', 'debug'] }, ]; const name = group.name.toLowerCase(); for (let item of iconWords) { for (let word of item.words) { if (name.match(new RegExp(`(${word})`, 'gi'))) { return item.icon; } } }; return 'speaker_group'; } return (
{group.name}
); } return (
{groupsArray.map((group) => renderMenuItem(group))}
{renderGroup()}
); } const mapStateToProps = (state, ownProps) => ({ show_disconnected_clients: ( state.ui.snapcast_show_disconnected_clients !== undefined ? state.ui.snapcast_show_disconnected_clients : false ), streams: (state.snapcast.streams ? state.snapcast.streams : null), groups: (state.snapcast.groups ? state.snapcast.groups : null), clients: (state.snapcast.clients ? state.snapcast.clients : null), }); const mapDispatchToProps = (dispatch) => ({ actions: bindActionCreators(actions, dispatch), }); export default connect(mapStateToProps, mapDispatchToProps)(SnapcastGroups);