import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { collate } from '../util/format'; import { sortItems, applyFilter } from '../util/arrays'; import { iconFromKeyword } from '../util/helpers'; 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; let { clients: groupClients = [] } = group; if (!show_disconnected_clients) { groupClients = applyFilter('connected', true, groupClients); } let volume = 0; if (groupClients.length) { volume = groupClients.reduce( (acc, client) => acc + (client.volume || 0), 0, ) / groupClients.length; }; return (
Name
actions.setGroupName(group.id, value)} autosave />
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})`, } ))} autosave />
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 ) ); 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);