diff --git a/packages/hms_room_kit/lib/src/meeting/meeting_store.dart b/packages/hms_room_kit/lib/src/meeting/meeting_store.dart index e3e56b04f..151fc3255 100644 --- a/packages/hms_room_kit/lib/src/meeting/meeting_store.dart +++ b/packages/hms_room_kit/lib/src/meeting/meeting_store.dart @@ -1027,8 +1027,10 @@ class MeetingStore extends ChangeNotifier @override void onRoleChangeRequest({required HMSRoleChangeRequest roleChangeRequest}) { log("onRoleChangeRequest-> sender: ${roleChangeRequest.suggestedBy} role: ${roleChangeRequest.suggestedRole}"); - currentRoleChangeRequest = roleChangeRequest; - previewForRole(roleChangeRequest.suggestedRole.name); + if (currentRoleChangeRequest == null) { + currentRoleChangeRequest = roleChangeRequest; + previewForRole(roleChangeRequest.suggestedRole.name); + } } void setCurrentPage(int newPage) { diff --git a/packages/hms_room_kit/lib/src/widgets/bottom_sheets/remote_peer_bottom_sheet.dart b/packages/hms_room_kit/lib/src/widgets/bottom_sheets/remote_peer_bottom_sheet.dart index e0f134fe2..709b7a608 100644 --- a/packages/hms_room_kit/lib/src/widgets/bottom_sheets/remote_peer_bottom_sheet.dart +++ b/packages/hms_room_kit/lib/src/widgets/bottom_sheets/remote_peer_bottom_sheet.dart @@ -142,62 +142,67 @@ class _RemotePeerBottomSheetState extends State { // text: "Spotlight Tile for Everyone", // textColor: HMSThemeColors.onSurfaceHighEmphasis)), - ListTile( - horizontalTitleGap: 2, - onTap: () async { - Navigator.pop(context); - if (widget.peerTrackNode.audioTrack != null) { - widget.meetingStore.changeTrackState( - widget.peerTrackNode.audioTrack!, - !(widget.peerTrackNode.audioTrack!.isMute)); - } - }, - contentPadding: EdgeInsets.zero, - leading: SvgPicture.asset( - "packages/hms_room_kit/lib/src/assets/icons/${(widget.peerTrackNode.audioTrack?.isMute ?? true) ? "mic_state_on" : "mic_state_off"}.svg", - semanticsLabel: "fl_mic_toggle", - height: 20, - width: 20, - colorFilter: ColorFilter.mode( - widget.peerTrackNode.audioTrack == null + if (widget.meetingStore.localPeer?.role.permissions.mute ?? + false) + ListTile( + horizontalTitleGap: 2, + onTap: () async { + Navigator.pop(context); + if (widget.peerTrackNode.audioTrack != null) { + widget.meetingStore.changeTrackState( + widget.peerTrackNode.audioTrack!, + !(widget.peerTrackNode.audioTrack!.isMute)); + } + }, + contentPadding: EdgeInsets.zero, + leading: SvgPicture.asset( + "packages/hms_room_kit/lib/src/assets/icons/${(widget.peerTrackNode.audioTrack?.isMute ?? true) ? "mic_state_on" : "mic_state_off"}.svg", + semanticsLabel: "fl_mic_toggle", + height: 20, + width: 20, + colorFilter: ColorFilter.mode( + widget.peerTrackNode.audioTrack == null + ? HMSThemeColors.onSurfaceLowEmphasis + : HMSThemeColors.onSurfaceHighEmphasis, + BlendMode.srcIn), + ), + title: HMSSubheadingText( + text: + "${(widget.peerTrackNode.audioTrack?.isMute ?? true) ? "Unmute" : "Mute"} Audio", + textColor: widget.peerTrackNode.audioTrack == null ? HMSThemeColors.onSurfaceLowEmphasis - : HMSThemeColors.onSurfaceHighEmphasis, - BlendMode.srcIn), - ), - title: HMSSubheadingText( - text: - "${(widget.peerTrackNode.audioTrack?.isMute ?? true) ? "Unmute" : "Mute"} Audio", - textColor: widget.peerTrackNode.audioTrack == null - ? HMSThemeColors.onSurfaceLowEmphasis - : HMSThemeColors.onSurfaceHighEmphasis)), - ListTile( - horizontalTitleGap: 2, - onTap: () async { - Navigator.pop(context); - if (widget.peerTrackNode.track != null) { - widget.meetingStore.changeTrackState( - widget.peerTrackNode.track!, - !(widget.peerTrackNode.track!.isMute)); - } - }, - contentPadding: EdgeInsets.zero, - leading: SvgPicture.asset( - "packages/hms_room_kit/lib/src/assets/icons/${(widget.peerTrackNode.track?.isMute ?? true) ? "cam_state_on" : "cam_state_off"}.svg", - semanticsLabel: "fl_camera_toggle", - height: 20, - width: 20, - colorFilter: ColorFilter.mode( - widget.peerTrackNode.track == null + : HMSThemeColors.onSurfaceHighEmphasis)), + + if (widget.meetingStore.localPeer?.role.permissions.mute ?? + false) + ListTile( + horizontalTitleGap: 2, + onTap: () async { + Navigator.pop(context); + if (widget.peerTrackNode.track != null) { + widget.meetingStore.changeTrackState( + widget.peerTrackNode.track!, + !(widget.peerTrackNode.track!.isMute)); + } + }, + contentPadding: EdgeInsets.zero, + leading: SvgPicture.asset( + "packages/hms_room_kit/lib/src/assets/icons/${(widget.peerTrackNode.track?.isMute ?? true) ? "cam_state_on" : "cam_state_off"}.svg", + semanticsLabel: "fl_camera_toggle", + height: 20, + width: 20, + colorFilter: ColorFilter.mode( + widget.peerTrackNode.track == null + ? HMSThemeColors.onSurfaceLowEmphasis + : HMSThemeColors.onSurfaceHighEmphasis, + BlendMode.srcIn), + ), + title: HMSSubheadingText( + text: + "${(widget.peerTrackNode.track?.isMute ?? true) ? "Unmute" : "Mute"} Video", + textColor: widget.peerTrackNode.track == null ? HMSThemeColors.onSurfaceLowEmphasis - : HMSThemeColors.onSurfaceHighEmphasis, - BlendMode.srcIn), - ), - title: HMSSubheadingText( - text: - "${(widget.peerTrackNode.track?.isMute ?? true) ? "Unmute" : "Mute"} Video", - textColor: widget.peerTrackNode.track == null - ? HMSThemeColors.onSurfaceLowEmphasis - : HMSThemeColors.onSurfaceHighEmphasis)), + : HMSThemeColors.onSurfaceHighEmphasis)), // ListTile( // horizontalTitleGap: 2, // onTap: () async { @@ -216,25 +221,29 @@ class _RemotePeerBottomSheetState extends State { // title: HMSSubheadingText( // text: "Volume", // textColor: HMSThemeColors.onSurfaceHighEmphasis)), - ListTile( - horizontalTitleGap: 2, - onTap: () async { - Navigator.pop(context); - widget.meetingStore - .removePeerFromRoom(widget.peerTrackNode.peer); - }, - contentPadding: EdgeInsets.zero, - leading: SvgPicture.asset( - "packages/hms_room_kit/lib/src/assets/icons/peer_remove.svg", - semanticsLabel: "fl_remove_peer", - height: 20, - width: 20, - colorFilter: ColorFilter.mode( - HMSThemeColors.alertErrorDefault, BlendMode.srcIn), - ), - title: HMSSubheadingText( - text: "Remove Participant", - textColor: HMSThemeColors.alertErrorDefault)), + if (widget.meetingStore.localPeer?.role.permissions + .removeOthers ?? + false) + ListTile( + horizontalTitleGap: 2, + onTap: () async { + Navigator.pop(context); + widget.meetingStore + .removePeerFromRoom(widget.peerTrackNode.peer); + }, + contentPadding: EdgeInsets.zero, + leading: SvgPicture.asset( + "packages/hms_room_kit/lib/src/assets/icons/peer_remove.svg", + semanticsLabel: "fl_remove_peer", + height: 20, + width: 20, + colorFilter: ColorFilter.mode( + HMSThemeColors.alertErrorDefault, + BlendMode.srcIn), + ), + title: HMSSubheadingText( + text: "Remove Participant", + textColor: HMSThemeColors.alertErrorDefault)), ], ), ), diff --git a/packages/hms_room_kit/lib/src/widgets/peer_widgets/more_option.dart b/packages/hms_room_kit/lib/src/widgets/peer_widgets/more_option.dart index 3bdce2dfe..41b70925c 100644 --- a/packages/hms_room_kit/lib/src/widgets/peer_widgets/more_option.dart +++ b/packages/hms_room_kit/lib/src/widgets/peer_widgets/more_option.dart @@ -22,53 +22,61 @@ class _MoreOptionState extends State { @override Widget build(BuildContext context) { MeetingStore meetingStore = context.read(); + bool mutePermission = + meetingStore.localPeer?.role.permissions.mute ?? false; + bool removeOthers = + meetingStore.localPeer?.role.permissions.removeOthers ?? false; - return Positioned( - bottom: 5, - right: 5, - child: GestureDetector( - onTap: () { - ///[peerTrackNode] is the peerTrackNode of the peer whose more option is clicked - ///We only show the modal bottom sheet if the peer is not the local peer - var peerTrackNode = context.read(); - if (peerTrackNode.peer.peerId != meetingStore.localPeer!.peerId) { - showModalBottomSheet( - isScrollControlled: true, - backgroundColor: HMSThemeColors.surfaceDim, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(16), - topRight: Radius.circular(16)), + return (mutePermission || removeOthers) + ? Positioned( + bottom: 5, + right: 5, + child: GestureDetector( + onTap: () { + ///[peerTrackNode] is the peerTrackNode of the peer whose more option is clicked + ///We only show the modal bottom sheet if the peer is not the local peer + var peerTrackNode = context.read(); + if (peerTrackNode.peer.peerId != + meetingStore.localPeer!.peerId) { + showModalBottomSheet( + isScrollControlled: true, + backgroundColor: HMSThemeColors.surfaceDim, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16)), + ), + context: context, + builder: (ctx) => ChangeNotifierProvider.value( + value: context.read(), + child: RemotePeerBottomSheet( + meetingStore: meetingStore, + peerTrackNode: peerTrackNode, + )), + ); + } + }, + child: Semantics( + label: + "fl_${context.read().peer.name}more_option", + child: Container( + height: 28, + width: 28, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: HMSThemeColors.backgroundDim.withOpacity(0.64), + ), + child: Center( + child: Icon( + Icons.more_vert, + color: HMSThemeColors.onSurfaceHighEmphasis, + size: 20, + ), + ), + ), ), - context: context, - builder: (ctx) => ChangeNotifierProvider.value( - value: context.read(), - child: RemotePeerBottomSheet( - meetingStore: meetingStore, - peerTrackNode: peerTrackNode, - )), - ); - } - }, - child: Semantics( - label: "fl_${context.read().peer.name}more_option", - child: Container( - height: 28, - width: 28, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: HMSThemeColors.backgroundDim.withOpacity(0.64), ), - child: Center( - child: Icon( - Icons.more_vert, - color: HMSThemeColors.onSurfaceHighEmphasis, - size: 20, - ), - ), - ), - ), - ), - ); + ) + : Container(); } }