import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { collate } from '../util/format'; import { sortItems } from '../util/arrays'; 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 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 group = groupId && groups[groupId] ? collate(groups[groupId], { clients }) : null; const renderGroup = () => { if (!group) return null; return (
Name
actions.setGroupName(group.id, value)} />
Stream
actions.setGroupStream(group.id, value)} value={group.stream_id} options={streamsArray.map((stream) => ( { key: `group_${group.id}_stream_${stream.id}`, value: stream.id, label: `${stream.id} (${stream.status})`, } ))} />
Volume
actions.setGroupMute(group.id, mute)} /> actions.setGroupVolume(group.id, percent, previousPercent)} />
); } const renderMenuItem = (simpleGroup) => { const group = collate(simpleGroup, { clients }); const anyClients = ( !show_disconnected_clients && ( !group.clients || !group.clients.length || !group.clients.filter((client) => client.connected).length ) ); const icon = () => { const iconWords = [ { icon: 'business', words: ['office', 'work'] }, { icon: 'king_bed', words: ['bed'] }, { icon: 'weekend', words: ['lounge', 'tv', 'sitting room'] }, { icon: 'directions_car', words: ['garage', 'laundry'] }, { icon: 'fitness_center', words: ['gym'] }, { icon: 'kitchen', words: ['kitchen'] }, { icon: 'deck', words: ['deck', 'outside'] }, { icon: 'restaurant_menu', words: ['dining', 'dinner'] }, { icon: 'laptop', words: ['laptop'] }, { icon: 'bug_report', words: ['test', 'debug'] }, { icon: 'child_care', words: ['kids', 'baby'] }, { icon: 'smartphone', words: ['phone', 'mobile'] }, ]; 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} {group.mute && ( )}
); } return (
{sortItems(groupsArray, 'name').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);