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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /* eslint-disable lines-around-comment, no-undef, no-unused-vars */
  2. import 'react-native-gesture-handler';
  3. // Apply all necessary polyfills as early as possible
  4. // to make sure anything imported henceforth sees them.
  5. import 'react-native-get-random-values';
  6. import './react/features/mobile/polyfills';
  7. import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';
  8. import { View, ViewStyle } from 'react-native';
  9. import { appNavigate } from './react/features/app/actions.native';
  10. import { App } from './react/features/app/components/App.native';
  11. import { setAudioMuted, setVideoMuted } from './react/features/base/media/actions';
  12. import JitsiThemePaperProvider from './react/features/base/ui/components/JitsiThemeProvider.native';
  13. interface IEventListeners {
  14. onConferenceJoined?: Function;
  15. onConferenceLeft?: Function;
  16. onConferenceWillJoin?: Function;
  17. onParticipantJoined?: Function;
  18. onReadyToClose?: Function;
  19. }
  20. interface IUserInfo {
  21. avatarURL: string;
  22. displayName: string;
  23. email: string;
  24. }
  25. interface IAppProps {
  26. config: object;
  27. flags: object;
  28. eventListeners: IEventListeners;
  29. room: string;
  30. serverURL?: string;
  31. style?: Object;
  32. token?: string;
  33. userInfo?: IUserInfo;
  34. }
  35. /**
  36. * Main React Native SDK component that displays a Jitsi Meet conference and gets all required params as props
  37. */
  38. export const JitsiMeeting = forwardRef((props: IAppProps, ref) => {
  39. const [ appProps, setAppProps ] = useState({});
  40. const app = useRef(null);
  41. const {
  42. config,
  43. eventListeners,
  44. flags,
  45. room,
  46. serverURL,
  47. style,
  48. token,
  49. userInfo
  50. } = props;
  51. // eslint-disable-next-line arrow-body-style
  52. useImperativeHandle(ref, () => ({
  53. close: () => {
  54. const dispatch = app.current.state.store.dispatch;
  55. dispatch(appNavigate(undefined));
  56. },
  57. setAudioMuted: muted => {
  58. const dispatch = app.current.state.store.dispatch;
  59. dispatch(setAudioMuted(muted));
  60. },
  61. setVideoMuted: muted => {
  62. const dispatch = app.current.state.store.dispatch;
  63. dispatch(setVideoMuted(muted));
  64. }
  65. }));
  66. useEffect(
  67. () => {
  68. const urlObj = {
  69. config,
  70. jwt: token
  71. };
  72. let urlProps;
  73. if (room.includes('://')) {
  74. urlProps = {
  75. ...urlObj,
  76. url: room
  77. };
  78. } else {
  79. urlProps = {
  80. ...urlObj,
  81. room,
  82. serverURL
  83. };
  84. }
  85. setAppProps({
  86. 'flags': flags,
  87. 'rnSdkHandlers': {
  88. onReadyToClose: eventListeners.onReadyToClose,
  89. onConferenceJoined: eventListeners.onConferenceJoined,
  90. onConferenceWillJoin: eventListeners.onConferenceWillJoin,
  91. onConferenceLeft: eventListeners.onConferenceLeft,
  92. onParticipantJoined: eventListeners.onParticipantJoined
  93. },
  94. 'url': urlProps,
  95. 'userInfo': userInfo
  96. });
  97. }, []
  98. );
  99. return (
  100. <View style = { style as ViewStyle }>
  101. <JitsiThemePaperProvider>
  102. <App
  103. { ...appProps }
  104. ref = { app } />
  105. </JitsiThemePaperProvider>
  106. </View>
  107. );
  108. });