Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

Prejoin.native.tsx 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /* eslint-disable lines-around-comment */
  2. import React, { useCallback, useEffect, useLayoutEffect, useState } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import {
  5. BackHandler,
  6. View,
  7. TextInput,
  8. Platform,
  9. StyleProp,
  10. TextStyle,
  11. ViewStyle
  12. } from 'react-native';
  13. import { useDispatch, useSelector } from 'react-redux';
  14. // @ts-ignore
  15. import { appNavigate } from '../../app/actions.native';
  16. // @ts-ignore
  17. import { setAudioOnly } from '../../base/audio-only/actions';
  18. // @ts-ignore
  19. import { connect } from '../../base/connection/actions.native';
  20. // @ts-ignore
  21. import { IconClose } from '../../base/icons';
  22. // @ts-ignore
  23. import JitsiScreen from '../../base/modal/components/JitsiScreen';
  24. // @ts-ignore
  25. import { getLocalParticipant } from '../../base/participants';
  26. // @ts-ignore
  27. import { getFieldValue } from '../../base/react';
  28. import Button from '../../base/react/components/native/Button';
  29. // @ts-ignore
  30. import { BUTTON_TYPES } from '../../base/react/constants';
  31. // @ts-ignore
  32. import { ASPECT_RATIO_NARROW } from '../../base/responsive-ui';
  33. // @ts-ignore
  34. import { updateSettings } from '../../base/settings';
  35. // @ts-ignore
  36. import BaseTheme from '../../base/ui/components/BaseTheme.native';
  37. import { BrandingImageBackground } from '../../dynamic-branding';
  38. // @ts-ignore
  39. import { LargeVideo } from '../../large-video/components';
  40. // @ts-ignore
  41. import HeaderNavigationButton from '../../mobile/navigation/components/HeaderNavigationButton';
  42. // @ts-ignore
  43. import { navigateRoot } from '../../mobile/navigation/rootNavigationContainerRef';
  44. // @ts-ignore
  45. import { screen } from '../../mobile/navigation/routes';
  46. // @ts-ignore
  47. import AudioMuteButton from '../../toolbox/components/AudioMuteButton';
  48. // @ts-ignore
  49. import VideoMuteButton from '../../toolbox/components/VideoMuteButton';
  50. // @ts-ignore
  51. import { isDisplayNameRequired } from '../functions';
  52. import { PrejoinProps } from '../types';
  53. // @ts-ignore
  54. import styles from './styles';
  55. const Prejoin: React.FC<PrejoinProps> = ({ navigation }: PrejoinProps) => {
  56. const dispatch = useDispatch();
  57. const { t } = useTranslation();
  58. const aspectRatio = useSelector(
  59. (state: any) => state['features/base/responsive-ui']?.aspectRatio
  60. );
  61. const localParticipant = useSelector(state => getLocalParticipant(state));
  62. const isDisplayNameMandatory = useSelector(state => isDisplayNameRequired(state));
  63. const participantName = localParticipant?.name;
  64. const [ displayName, setDisplayName ]
  65. = useState(participantName || '');
  66. const onChangeDisplayName = useCallback(event => {
  67. const fieldValue = getFieldValue(event);
  68. setDisplayName(fieldValue);
  69. dispatch(updateSettings({
  70. displayName: fieldValue
  71. }));
  72. }, [ displayName ]);
  73. const onJoin = useCallback(() => {
  74. dispatch(connect());
  75. navigateRoot(screen.conference.root);
  76. }, [ dispatch ]);
  77. const onJoinLowBandwidth = useCallback(() => {
  78. dispatch(setAudioOnly(true));
  79. onJoin();
  80. }, [ dispatch ]);
  81. const goBack = useCallback(() => {
  82. dispatch(appNavigate(undefined));
  83. return true;
  84. }, [ dispatch ]);
  85. const headerLeft = useCallback(() => {
  86. if (Platform.OS === 'ios') {
  87. return (
  88. <HeaderNavigationButton
  89. label = { t('dialog.close') }
  90. onPress = { goBack } />
  91. );
  92. }
  93. return (
  94. <HeaderNavigationButton
  95. onPress = { goBack }
  96. src = { IconClose } />
  97. );
  98. }, []);
  99. const { PRIMARY, SECONDARY } = BUTTON_TYPES;
  100. const joinButtonDisabled = !displayName && isDisplayNameMandatory;
  101. useEffect(() => {
  102. BackHandler.addEventListener('hardwareBackPress', goBack);
  103. return () => BackHandler.removeEventListener('hardwareBackPress', goBack);
  104. }, []);
  105. useLayoutEffect(() => {
  106. navigation.setOptions({
  107. headerLeft
  108. });
  109. }, [ navigation ]);
  110. let contentWrapperStyles;
  111. let contentContainerStyles;
  112. let largeVideoContainerStyles;
  113. let toolboxContainerStyles;
  114. if (aspectRatio === ASPECT_RATIO_NARROW) {
  115. contentWrapperStyles = styles.contentWrapper;
  116. contentContainerStyles = styles.contentContainer;
  117. largeVideoContainerStyles = styles.largeVideoContainer;
  118. toolboxContainerStyles = styles.toolboxContainer;
  119. } else {
  120. contentWrapperStyles = styles.contentWrapperWide;
  121. contentContainerStyles = styles.contentContainerWide;
  122. largeVideoContainerStyles = styles.largeVideoContainerWide;
  123. toolboxContainerStyles = styles.toolboxContainerWide;
  124. }
  125. return (
  126. <JitsiScreen
  127. safeAreaInsets = { [ 'left' ] }
  128. style = { contentWrapperStyles }>
  129. <BrandingImageBackground />
  130. <View style = { largeVideoContainerStyles }>
  131. <LargeVideo />
  132. </View>
  133. <View style = { contentContainerStyles }>
  134. <View style = { styles.formWrapper as StyleProp<ViewStyle> }>
  135. <TextInput
  136. onChangeText = { onChangeDisplayName }
  137. placeholder = { t('dialog.enterDisplayName') }
  138. placeholderTextColor = { BaseTheme.palette.text03 }
  139. style = { styles.field as StyleProp<TextStyle> }
  140. value = { displayName } />
  141. <Button
  142. accessibilityLabel = 'prejoin.joinMeeting'
  143. disabled = { joinButtonDisabled }
  144. label = 'prejoin.joinMeeting'
  145. onPress = { onJoin }
  146. style = { styles.prejoinButton }
  147. type = { PRIMARY } />
  148. <Button
  149. accessibilityLabel = 'prejoin.joinMeetingInLowBandwidthMode'
  150. label = 'prejoin.joinMeetingInLowBandwidthMode'
  151. onPress = { onJoinLowBandwidth }
  152. style = { styles.prejoinButton }
  153. type = { SECONDARY } />
  154. </View>
  155. <View style = { toolboxContainerStyles }>
  156. <AudioMuteButton
  157. styles = { styles.buttonStylesBorderless } />
  158. <VideoMuteButton
  159. styles = { styles.buttonStylesBorderless } />
  160. </View>
  161. </View>
  162. </JitsiScreen>
  163. );
  164. };
  165. export default Prejoin;