You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ContextMenuMeetingParticipantDetails.js 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // @flow
  2. import React, { useCallback } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import { TouchableOpacity, View } from 'react-native';
  5. import { Text } from 'react-native-paper';
  6. import { useDispatch } from 'react-redux';
  7. import { Avatar } from '../../../base/avatar';
  8. import { hideDialog } from '../../../base/dialog';
  9. import BottomSheet from '../../../base/dialog/components/native/BottomSheet';
  10. import {
  11. Icon, IconCloseCircle, IconConnectionActive, IconMessage,
  12. IconMicrophoneEmptySlash,
  13. IconMuteEveryoneElse, IconVideoOff
  14. } from '../../../base/icons';
  15. import { MEDIA_TYPE } from '../../../base/media';
  16. import { muteRemote } from '../../../video-menu/actions.any';
  17. import styles from './styles';
  18. type Props = {
  19. /**
  20. * Participant reference
  21. */
  22. participant: Object
  23. };
  24. export const ContextMenuMeetingParticipantDetails = ({ participant: p }: Props) => {
  25. const dispatch = useDispatch();
  26. const cancel = useCallback(() => dispatch(hideDialog()), [ dispatch ]);
  27. const displayName = p.name;
  28. const muteAudio = useCallback(() => dispatch(muteRemote(p.id, MEDIA_TYPE.AUDIO)), [ dispatch ]);
  29. const { t } = useTranslation();
  30. return (
  31. <BottomSheet
  32. onCancel = { cancel }
  33. style = { styles.contextMenuMore }>
  34. <View
  35. style = { styles.contextMenuItemSection }>
  36. <Avatar
  37. className = 'participant-avatar'
  38. participantId = { p.id }
  39. size = { 32 } />
  40. <View style = { styles.contextMenuItemText }>
  41. <Text style = { styles.contextMenuItemName }>
  42. { displayName }
  43. </Text>
  44. </View>
  45. </View>
  46. <TouchableOpacity
  47. onPress = { muteAudio }
  48. style = { styles.contextMenuItem }>
  49. <Icon
  50. size = { 24 }
  51. src = { IconMicrophoneEmptySlash }
  52. style = { styles.contextMenuItemIcon } />
  53. <Text style = { styles.contextMenuItemText }>{ t('participantsPane.actions.mute') }</Text>
  54. </TouchableOpacity>
  55. <TouchableOpacity
  56. onPress = { muteAudio }
  57. style = { styles.contextMenuItem }>
  58. <Icon
  59. size = { 24 }
  60. src = { IconMuteEveryoneElse }
  61. style = { styles.contextMenuItemIcon } />
  62. <Text style = { styles.contextMenuItemText }>{ t('participantsPane.actions.muteEveryoneElse') }</Text>
  63. </TouchableOpacity>
  64. <TouchableOpacity
  65. style = { styles.contextMenuItemSection }>
  66. <Icon
  67. size = { 24 }
  68. src = { IconVideoOff }
  69. style = { styles.contextMenuItemIcon } />
  70. <Text style = { styles.contextMenuItemText }>{ t('participantsPane.actions.stopVideo') }</Text>
  71. </TouchableOpacity>
  72. <TouchableOpacity
  73. style = { styles.contextMenuItem }>
  74. <Icon
  75. size = { 24 }
  76. src = { IconCloseCircle }
  77. style = { styles.contextMenuItemIcon } />
  78. <Text style = { styles.contextMenuItemText }>{ t('videothumbnail.kick') }</Text>
  79. </TouchableOpacity>
  80. <TouchableOpacity
  81. style = { styles.contextMenuItem }>
  82. <Icon
  83. size = { 24 }
  84. src = { IconMessage }
  85. style = { styles.contextMenuItemIcon } />
  86. <Text style = { styles.contextMenuItemText }>{ t('toolbar.accessibilityLabel.privateMessage') }</Text>
  87. </TouchableOpacity>
  88. <TouchableOpacity
  89. style = { styles.contextMenuItemSection }>
  90. <Icon
  91. size = { 24 }
  92. src = { IconConnectionActive }
  93. style = { styles.contextMenuItemIcon } />
  94. <Text style = { styles.contextMenuItemText }>{ t('participantsPane.actions.networkStats') }</Text>
  95. </TouchableOpacity>
  96. </BottomSheet>
  97. );
  98. };