feat(rn,app) unified navigators

This commit is contained in:
Calinteodor 2022-01-25 14:55:57 +02:00 committed by GitHub
parent 49dd007167
commit b9433368ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 229 additions and 318 deletions

View File

@ -34,7 +34,6 @@ import {
} from './functions'; } from './functions';
import logger from './logger'; import logger from './logger';
declare var APP: Object;
declare var interfaceConfig: Object; declare var interfaceConfig: Object;

View File

@ -1,41 +1,17 @@
import { isRoomValid } from '../base/conference'; import RootNavigationContainer from '../mobile/navigation/components/RootNavigationContainer';
import { toState } from '../base/redux';
import { ConferenceNavigationContainer } from '../conference'; const route = {
import RootNavigationContainer from '../welcome/components/RootNavigationContainer'; component: RootNavigationContainer,
href: undefined
};
/** /**
* Determines which route is to be rendered in order to depict a specific Redux * Determines which route is to be rendered in order to depict a specific Redux
* store. * store.
* *
* @param {(Function|Object)} stateful - THe redux store, state, or
* {@code getState} function.
* @returns {Promise<Object>} * @returns {Promise<Object>}
*/ */
export function _getRouteToRender(stateful) { export function _getRouteToRender() {
const state = toState(stateful);
return _getMobileRoute(state);
}
/**
* Returns the {@code Route} to display on the React Native app.
*
* @param {Object} state - The redux state.
* @returns {Promise}
*/
function _getMobileRoute(state) {
const route = {
component: null,
href: undefined
};
if (isRoomValid(state['features/base/conference'].room)) {
route.component = ConferenceNavigationContainer;
} else {
route.component = RootNavigationContainer;
}
return Promise.resolve(route); return Promise.resolve(route);
} }

View File

@ -50,7 +50,7 @@ function _connectionEstablished(store, next, action) {
// In the Web app we explicitly do not want to display the hash and // In the Web app we explicitly do not want to display the hash and
// query/search URL params. Unfortunately, window.location and, more // query/search URL params. Unfortunately, window.location and, more
// importantly, its params are used not only in jitsi-meet but also in // importantly, its params are used not only in jitsi-meet but also in
// lib-jitsi-meet. Consequenlty, the time to remove the params is // lib-jitsi-meet. Consequently, the time to remove the params is
// determined by when no one needs them anymore. // determined by when no one needs them anymore.
const { history, location } = window; const { history, location } = window;

View File

@ -8,6 +8,7 @@ import '../mobile/call-integration/middleware';
import '../mobile/external-api/middleware'; import '../mobile/external-api/middleware';
import '../mobile/full-screen/middleware'; import '../mobile/full-screen/middleware';
import '../mobile/incoming-call/middleware'; import '../mobile/incoming-call/middleware';
import '../mobile/navigation/middleware';
import '../mobile/permissions/middleware'; import '../mobile/permissions/middleware';
import '../mobile/proximity/middleware'; import '../mobile/proximity/middleware';
import '../mobile/wake-lock/middleware'; import '../mobile/wake-lock/middleware';

View File

@ -7,8 +7,8 @@ import {
AbstractButton, AbstractButton,
type AbstractButtonProps type AbstractButtonProps
} from '../../../base/toolbox/components'; } from '../../../base/toolbox/components';
import { navigate } from '../../../conference/components/native/ConferenceNavigationContainerRef'; import { navigate } from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../../conference/components/native/routes'; import { screen } from '../../../mobile/navigation/routes';
import { getUnreadCount } from '../../functions'; import { getUnreadCount } from '../../functions';

View File

@ -10,7 +10,7 @@ import { connect } from '../../../base/redux';
import { type StyleType } from '../../../base/styles'; import { type StyleType } from '../../../base/styles';
import { import {
setParams setParams
} from '../../../conference/components/native/ConferenceNavigationContainerRef'; } from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { setPrivateMessageRecipient } from '../../actions.any'; import { setPrivateMessageRecipient } from '../../actions.any';
import AbstractMessageRecipient, { import AbstractMessageRecipient, {
type Props as AbstractProps type Props as AbstractProps

View File

@ -6,8 +6,8 @@ import { IconMessage, IconReply } from '../../../base/icons';
import { getParticipantById } from '../../../base/participants'; import { getParticipantById } from '../../../base/participants';
import { connect } from '../../../base/redux'; import { connect } from '../../../base/redux';
import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components'; import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components';
import { navigate } from '../../../conference/components/native/ConferenceNavigationContainerRef'; import { navigate } from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../../conference/components/native/routes'; import { screen } from '../../../mobile/navigation/routes';
export type Props = AbstractButtonProps & { export type Props = AbstractButtonProps & {

View File

@ -1,6 +1,5 @@
// @flow // @flow
export { default as Chat } from './Chat'; export { default as Chat } from './Chat';
export { default as ChatAndPolls } from './ChatAndPolls';
export { default as ChatButton } from './ChatButton'; export { default as ChatButton } from './ChatButton';
export { default as ChatPrivacyDialog } from './ChatPrivacyDialog'; export { default as ChatPrivacyDialog } from './ChatPrivacyDialog';

View File

@ -23,6 +23,9 @@ import { LargeVideo } from '../../../large-video';
import { KnockingParticipantList } from '../../../lobby/components/native'; import { KnockingParticipantList } from '../../../lobby/components/native';
import { getIsLobbyVisible } from '../../../lobby/functions'; import { getIsLobbyVisible } from '../../../lobby/functions';
import { BackButtonRegistry } from '../../../mobile/back-button'; import { BackButtonRegistry } from '../../../mobile/back-button';
import { navigate }
from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../../mobile/navigation/routes';
import { Captions } from '../../../subtitles'; import { Captions } from '../../../subtitles';
import { setToolboxVisible } from '../../../toolbox/actions'; import { setToolboxVisible } from '../../../toolbox/actions';
import { Toolbox } from '../../../toolbox/components/native'; import { Toolbox } from '../../../toolbox/components/native';
@ -34,12 +37,10 @@ import {
import type { AbstractProps } from '../AbstractConference'; import type { AbstractProps } from '../AbstractConference';
import AlwaysOnLabels from './AlwaysOnLabels'; import AlwaysOnLabels from './AlwaysOnLabels';
import { navigate } from './ConferenceNavigationContainerRef';
import ExpandedLabelPopup from './ExpandedLabelPopup'; import ExpandedLabelPopup from './ExpandedLabelPopup';
import LonelyMeetingExperience from './LonelyMeetingExperience'; import LonelyMeetingExperience from './LonelyMeetingExperience';
import TitleBar from './TitleBar'; import TitleBar from './TitleBar';
import { EXPANDED_LABEL_TIMEOUT } from './constants'; import { EXPANDED_LABEL_TIMEOUT } from './constants';
import { screen } from './routes';
import styles from './styles'; import styles from './styles';

View File

@ -1,6 +1,5 @@
// @flow // @flow
export { default as Conference } from './Conference'; export { default as Conference } from './Conference';
export { default as ConferenceNavigationContainer } from './ConferenceNavigationContainer';
export { default as renderConferenceTimer } from './ConferenceTimerDisplay'; export { default as renderConferenceTimer } from './ConferenceTimerDisplay';
export { default as InsecureRoomNameLabel } from './InsecureRoomNameLabel'; export { default as InsecureRoomNameLabel } from './InsecureRoomNameLabel';

View File

@ -5,8 +5,8 @@ import { translate } from '../../base/i18n';
import { IconShareDoc } from '../../base/icons'; import { IconShareDoc } from '../../base/icons';
import { connect } from '../../base/redux'; import { connect } from '../../base/redux';
import { AbstractButton, type AbstractButtonProps } from '../../base/toolbox/components'; import { AbstractButton, type AbstractButtonProps } from '../../base/toolbox/components';
import { navigate } from '../../conference/components/native/ConferenceNavigationContainerRef'; import { navigate } from '../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../conference/components/native/routes'; import { screen } from '../../mobile/navigation/routes';
type Props = AbstractButtonProps; type Props = AbstractButtonProps;

View File

@ -10,9 +10,9 @@ import { IconArrowBack } from '../../../base/icons';
import JitsiScreen from '../../../base/modal/components/JitsiScreen'; import JitsiScreen from '../../../base/modal/components/JitsiScreen';
import { LoadingIndicator } from '../../../base/react'; import { LoadingIndicator } from '../../../base/react';
import { connect } from '../../../base/redux'; import { connect } from '../../../base/redux';
import { goBack } from '../../../conference/components/native/ConferenceNavigationContainerRef';
import HeaderNavigationButton import HeaderNavigationButton
from '../../../conference/components/native/HeaderNavigationButton'; from '../../../mobile/navigation/components/HeaderNavigationButton';
import { goBack } from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { getSharedDocumentUrl } from '../../functions'; import { getSharedDocumentUrl } from '../../functions';
import styles, { INDICATOR_COLOR } from './styles'; import styles, { INDICATOR_COLOR } from './styles';

View File

@ -3,8 +3,8 @@
import type { Dispatch } from 'redux'; import type { Dispatch } from 'redux';
import { getFeatureFlag, ADD_PEOPLE_ENABLED } from '../base/flags'; import { getFeatureFlag, ADD_PEOPLE_ENABLED } from '../base/flags';
import { navigate } from '../conference/components/native/ConferenceNavigationContainerRef'; import { navigate } from '../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../conference/components/native/routes'; import { screen } from '../mobile/navigation/routes';
import { beginShareRoom } from '../share-room'; import { beginShareRoom } from '../share-room';
import { isAddPeopleEnabled, isDialOutEnabled } from './functions'; import { isAddPeopleEnabled, isDialOutEnabled } from './functions';

View File

@ -10,8 +10,9 @@ import { translate } from '../../../../base/i18n';
import JitsiScreen from '../../../../base/modal/components/JitsiScreen'; import JitsiScreen from '../../../../base/modal/components/JitsiScreen';
import { LoadingIndicator } from '../../../../base/react'; import { LoadingIndicator } from '../../../../base/react';
import { connect } from '../../../../base/redux'; import { connect } from '../../../../base/redux';
import { screen } from '../../../../conference/components/native/routes'; import { renderArrowBackButton }
import { renderArrowBackButton } from '../../../../welcome/functions.native'; from '../../../../mobile/navigation/components/welcome/functions';
import { screen } from '../../../../mobile/navigation/routes';
import { getDialInfoPageURLForURIString } from '../../../functions'; import { getDialInfoPageURLForURIString } from '../../../functions';
import DialInSummaryErrorDialog from './DialInSummaryErrorDialog'; import DialInSummaryErrorDialog from './DialInSummaryErrorDialog';

View File

@ -4,8 +4,7 @@ import React from 'react';
import { TouchableOpacity } from 'react-native-gesture-handler'; import { TouchableOpacity } from 'react-native-gesture-handler';
import { Icon } from '../../../base/icons'; import { Icon } from '../../../base/icons';
import styles from '../../../conference/components/native/styles';
import styles from './styles';
type Props = { type Props = {

View File

@ -5,19 +5,21 @@ import { createStackNavigator } from '@react-navigation/stack';
import React from 'react'; import React from 'react';
import { SafeAreaProvider } from 'react-native-safe-area-context'; import { SafeAreaProvider } from 'react-native-safe-area-context';
import { connect } from '../../base/redux'; import { connect } from '../../../base/redux';
import { DialInSummary } from '../../../invite';
import BlankPage from '../../../welcome/components/BlankPage';
import { rootNavigationRef } from '../rootNavigationContainerRef';
import { screen } from '../routes';
import { import {
dialInSummaryScreenOptions, dialInSummaryScreenOptions,
drawerNavigatorScreenOptions, drawerNavigatorScreenOptions,
navigationContainerTheme navigationContainerTheme
} from '../../conference/components/native/ConferenceNavigatorScreenOptions'; } from '../screenOptions';
import { screen } from '../../conference/components/native/routes';
import { DialInSummary } from '../../invite';
import { isWelcomePageAppEnabled } from '../functions.native';
import BlankPage from './BlankPage'; import ConferenceNavigationContainer
import { rootNavigationRef } from './RootNavigationContainerRef'; from './conference/components/ConferenceNavigationContainer';
import WelcomePageNavigationContainer from './WelcomePageNavigationContainer'; import WelcomePageNavigationContainer from './welcome/components/WelcomePageNavigationContainer';
import { isWelcomePageAppEnabled } from './welcome/functions';
const RootStack = createStackNavigator(); const RootStack = createStackNavigator();
@ -53,6 +55,13 @@ const RootNavigationContainer = ({ isWelcomePageAvailable }: Props) => (
component = { DialInSummary } component = { DialInSummary }
name = { screen.dialInSummary } name = { screen.dialInSummary }
options = { dialInSummaryScreenOptions } /> options = { dialInSummaryScreenOptions } />
<RootStack.Screen
component = { ConferenceNavigationContainer }
name = { screen.conference.root }
options = {{
gestureEnabled: false,
headerShown: false
}} />
</RootStack.Navigator> </RootStack.Navigator>
</NavigationContainer> </NavigationContainer>
</SafeAreaProvider> </SafeAreaProvider>

View File

@ -7,16 +7,16 @@ import { useSelector } from 'react-redux';
import { import {
getClientHeight, getClientHeight,
getClientWidth getClientWidth
} from '../../../base/modal/components/functions.native'; } from '../../../../../base/modal/components/functions.native';
import { Chat } from '../../../chat'; import { Chat } from '../../../../../chat';
import { chatTabBarOptions } from '../../../conference/components/native/ConferenceNavigatorScreenOptions'; import { PollsPane } from '../../../../../polls/components';
import { screen } from '../../../conference/components/native/routes'; import { screen } from '../../../routes';
import { PollsPane } from '../../../polls/components'; import { chatTabBarOptions } from '../../../screenOptions';
const ChatTab = createMaterialTopTabNavigator(); const ChatTab = createMaterialTopTabNavigator();
const ChatAndPolls = () => { const ChatAndPollsNavigationContainer = () => {
const clientHeight = useSelector(getClientHeight); const clientHeight = useSelector(getClientHeight);
const clientWidth = useSelector(getClientWidth); const clientWidth = useSelector(getClientWidth);
@ -40,4 +40,4 @@ const ChatAndPolls = () => {
); );
}; };
export default ChatAndPolls; export default ChatAndPollsNavigationContainer;

View File

@ -7,22 +7,19 @@ import { useTranslation } from 'react-i18next';
import { SafeAreaProvider } from 'react-native-safe-area-context'; import { SafeAreaProvider } from 'react-native-safe-area-context';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { Chat, ChatAndPolls } from '../../../chat'; import { Chat } from '../../../../../chat';
import { SharedDocument } from '../../../etherpad'; import Conference from '../../../../../conference/components/native/Conference';
import { getDisablePolls } from '../../../../../conference/functions';
import { SharedDocument } from '../../../../../etherpad';
import AddPeopleDialog import AddPeopleDialog
from '../../../invite/components/add-people-dialog/native/AddPeopleDialog'; from '../../../../../invite/components/add-people-dialog/native/AddPeopleDialog';
import LobbyScreen from '../../../lobby/components/native/LobbyScreen'; import LobbyScreen from '../../../../../lobby/components/native/LobbyScreen';
import { ParticipantsPane } from '../../../participants-pane/components/native'; import { ParticipantsPane } from '../../../../../participants-pane/components/native';
import SecurityDialog import SecurityDialog
from '../../../security/components/security-dialog/native/SecurityDialog'; from '../../../../../security/components/security-dialog/native/SecurityDialog';
import SpeakerStats import SpeakerStats
from '../../../speaker-stats/components/native/SpeakerStats'; from '../../../../../speaker-stats/components/native/SpeakerStats';
import { getDisablePolls } from '../../functions'; import { screen } from '../../../routes';
import Conference from './Conference';
import {
conferenceNavigationRef
} from './ConferenceNavigationContainerRef';
import { import {
chatScreenOptions, chatScreenOptions,
conferenceScreenOptions, conferenceScreenOptions,
@ -33,8 +30,12 @@ import {
securityScreenOptions, securityScreenOptions,
sharedDocumentScreenOptions, sharedDocumentScreenOptions,
speakerStatsScreenOptions speakerStatsScreenOptions
} from './ConferenceNavigatorScreenOptions'; } from '../../../screenOptions';
import { screen } from './routes'; import ChatAndPollsNavigationContainer
from '../../chat/components/ChatAndPollsNavigationContainer';
import {
conferenceNavigationRef
} from '../ConferenceNavigationContainerRef';
const ConferenceStack = createStackNavigator(); const ConferenceStack = createStackNavigator();
@ -50,7 +51,7 @@ const ConferenceNavigationContainer = () => {
chatScreenName = screen.conference.chat; chatScreenName = screen.conference.chat;
chatTitleString = 'chat.title'; chatTitleString = 'chat.title';
} else { } else {
ChatScreen = ChatAndPolls; ChatScreen = ChatAndPollsNavigationContainer;
chatScreenName = screen.conference.chatandpolls.main; chatScreenName = screen.conference.chatandpolls.main;
chatTitleString = 'chat.titleWithPolls'; chatTitleString = 'chat.titleWithPolls';
} }

View File

@ -5,13 +5,12 @@ import React from 'react';
import { ScrollView, Text, View } from 'react-native'; import { ScrollView, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { Avatar } from '../../base/avatar'; import { Avatar } from '../../../../../base/avatar';
import { import {
getLocalParticipant, getParticipantDisplayName getLocalParticipant, getParticipantDisplayName
} from '../../base/participants'; } from '../../../../../base/participants';
import { connect } from '../../base/redux'; import { connect } from '../../../../../base/redux';
import styles, { DRAWER_AVATAR_SIZE } from '../../../../../welcome/components/styles';
import styles, { DRAWER_AVATAR_SIZE } from './styles';
type Props = { type Props = {

View File

@ -4,21 +4,22 @@ import { createDrawerNavigator } from '@react-navigation/drawer';
import React from 'react'; import React from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import WelcomePage from '../../../../../welcome/components/WelcomePage';
import HelpView from '../../../../../welcome/components/native/HelpView';
import PrivacyView from '../../../../../welcome/components/native/PrivacyView';
import TermsView from '../../../../../welcome/components/native/TermsView';
import SettingsView
from '../../../../../welcome/components/native/settings/components/SettingsView';
import { screen } from '../../../routes';
import { import {
drawerContentOptions,
helpScreenOptions, helpScreenOptions,
settingsScreenOptions, settingsScreenOptions,
termsAndPrivacyScreenOptions, termsAndPrivacyScreenOptions,
welcomeScreenOptions welcomeScreenOptions
} from '../../conference/components/native/ConferenceNavigatorScreenOptions'; } from '../../../screenOptions';
import { screen } from '../../conference/components/native/routes';
import HelpView from '../components/help/components/HelpView';
import PrivacyView from '../components/privacy/components/PrivacyView';
import SettingsView from '../components/settings/components/SettingsView';
import TermsView from '../components/terms/components/TermsView';
import CustomDrawerContent from './CustomDrawerContent'; import CustomDrawerContent from './CustomDrawerContent';
import WelcomePage from './WelcomePage.native';
import { drawerContentOptions } from './constants';
const DrawerStack = createDrawerNavigator(); const DrawerStack = createDrawerNavigator();

View File

@ -4,14 +4,14 @@ import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { CalendarList, isCalendarEnabled } from '../../calendar-sync'; import { CalendarList, isCalendarEnabled } from '../../../../../calendar-sync';
import { screen } from '../../conference/components/native/routes'; import { RecentList } from '../../../../../recent-list';
import { RecentList } from '../../recent-list';
import { import {
calendarListTabBarOptions, calendarListTabBarOptions,
recentListTabBarOptions, recentListTabBarOptions,
tabBarOptions tabBarOptions
} from '../constants'; } from '../../../../../welcome/constants';
import { screen } from '../../../routes';
const WelcomePage = createBottomTabNavigator(); const WelcomePage = createBottomTabNavigator();

View File

@ -2,10 +2,10 @@
import React from 'react'; import React from 'react';
import { getFeatureFlag, WELCOME_PAGE_ENABLED } from '../base/flags'; import { getFeatureFlag, WELCOME_PAGE_ENABLED } from '../../../../base/flags';
import { IconArrowBack } from '../base/icons'; import { IconArrowBack } from '../../../../base/icons';
import HeaderNavigationButton import HeaderNavigationButton
from '../conference/components/native/HeaderNavigationButton'; from '../HeaderNavigationButton';
/** /**
* Determines whether the {@code WelcomePage} is enabled by the app itself * Determines whether the {@code WelcomePage} is enabled by the app itself

View File

@ -0,0 +1,46 @@
// @flow
import { SET_ROOM } from '../../base/conference/actionTypes';
import { MiddlewareRegistry } from '../../base/redux';
import { navigateRoot } from './rootNavigationContainerRef';
import { screen } from './routes';
MiddlewareRegistry.register(store => next => action => {
switch (action.type) {
case SET_ROOM:
return _setRoom(store, next, action);
}
return next(action);
});
/**
* Notifies the feature base/conference that the action
* {@code SET_ROOM} is being dispatched within a specific
* redux store.
*
* @param {Store} store - The redux store in which the specified {@code action}
* is being dispatched.
* @param {Dispatch} next - The redux {@code dispatch} function to dispatch the
* specified {@code action} to the specified {@code store}.
* @param {Action} action - The redux action {@code SET_ROOM}
* which is being dispatched in the specified {@code store}.
* @private
* @returns {Object} The value returned by {@code next(action)}.
*/
function _setRoom(store, next, action) {
const { room: oldRoom } = store.getState()['features/base/conference'];
const result = next(action);
const { room: newRoom } = store.getState()['features/base/conference'];
if (!oldRoom && newRoom) {
navigateRoot(screen.conference.root);
} else if (oldRoom && !newRoom) {
navigateRoot(screen.root);
}
return result;
}

View File

@ -12,7 +12,7 @@ export const rootNavigationRef = React.createRef();
* @param {Object} params - Params to pass to the destination route. * @param {Object} params - Params to pass to the destination route.
* @returns {Function} * @returns {Function}
*/ */
export function navigate(name: string, params: Object) { export function navigateRoot(name: string, params: Object) {
// $FlowExpectedError // $FlowExpectedError
return rootNavigationRef.current?.navigate(name, params); return rootNavigationRef.current?.navigate(name, params);
} }

View File

@ -1,5 +1,5 @@
export const screen = { export const screen = {
root: 'Root', root: 'Main root',
welcome: { welcome: {
main: 'Home', main: 'Home',
tabs: { tabs: {
@ -13,6 +13,7 @@ export const screen = {
}, },
dialInSummary: 'Dial-In Info', dialInSummary: 'Dial-In Info',
conference: { conference: {
root: 'Conference root',
main: 'Conference', main: 'Conference',
chat: 'Chat', chat: 'Chat',
chatandpolls: { chatandpolls: {

View File

@ -12,11 +12,11 @@ import {
IconHome, IconHome,
IconInfo, IconInfo,
IconSettings IconSettings
} from '../../../base/icons'; } from '../../base/icons';
import BaseTheme from '../../../base/ui/components/BaseTheme'; import BaseTheme from '../../base/ui/components/BaseTheme';
import { goBack } from './ConferenceNavigationContainerRef'; import HeaderNavigationButton from './components/HeaderNavigationButton';
import HeaderNavigationButton from './HeaderNavigationButton'; import { goBack } from './components/conference/ConferenceNavigationContainerRef';
/** /**
* Navigation container theme. * Navigation container theme.
@ -82,6 +82,21 @@ export const drawerScreenOptions = {
} }
}; };
/**
* Drawer content options.
*/
export const drawerContentOptions = {
drawerActiveBackgroundColor: BaseTheme.palette.ui12,
drawerActiveTintColor: BaseTheme.palette.screen01Header,
drawerLabelStyle: {
marginLeft: BaseTheme.spacing[2]
},
drawerStyle: {
backgroundColor: BaseTheme.palette.ui12,
width: '54%'
}
};
/** /**
* Screen options for welcome page. * Screen options for welcome page.
*/ */

View File

@ -7,8 +7,8 @@ import { IconParticipants } from '../../../base/icons';
import { connect } from '../../../base/redux'; import { connect } from '../../../base/redux';
import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components'; import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components';
import { navigate } import { navigate }
from '../../../conference/components/native/ConferenceNavigationContainerRef'; from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../../conference/components/native/routes'; import { screen } from '../../../mobile/navigation/routes';
type Props = AbstractButtonProps & { type Props = AbstractButtonProps & {

View File

@ -4,8 +4,8 @@ import { translate } from '../../base/i18n';
import { IconInfo } from '../../base/icons'; import { IconInfo } from '../../base/icons';
import { connect } from '../../base/redux'; import { connect } from '../../base/redux';
import { AbstractButton, type AbstractButtonProps } from '../../base/toolbox/components'; import { AbstractButton, type AbstractButtonProps } from '../../base/toolbox/components';
import { screen } from '../../conference/components/native/routes'; import { navigateRoot } from '../../mobile/navigation/rootNavigationContainerRef';
import { navigate } from '../../welcome/components/RootNavigationContainerRef'; import { screen } from '../../mobile/navigation/routes';
export type Props = AbstractButtonProps & { export type Props = AbstractButtonProps & {
@ -42,7 +42,7 @@ class ShowDialInInfoButton extends AbstractButton<Props, *> {
_handleClick() { _handleClick() {
const { itemId } = this.props; const { itemId } = this.props;
navigate(screen.dialInSummary, { navigateRoot(screen.dialInSummary, {
summaryUrl: itemId.url summaryUrl: itemId.url
}); });
} }

View File

@ -21,12 +21,13 @@ import { connect } from '../../../../base/redux';
import { StyleType } from '../../../../base/styles'; import { StyleType } from '../../../../base/styles';
import BaseTheme from '../../../../base/ui/components/BaseTheme'; import BaseTheme from '../../../../base/ui/components/BaseTheme';
import { isInBreakoutRoom } from '../../../../breakout-rooms/functions'; import { isInBreakoutRoom } from '../../../../breakout-rooms/functions';
import { goBack } from '../../../../conference/components/native/ConferenceNavigationContainerRef';
import HeaderNavigationButton
from '../../../../conference/components/native/HeaderNavigationButton';
import { toggleLobbyMode } from '../../../../lobby/actions.any'; import { toggleLobbyMode } from '../../../../lobby/actions.any';
import LobbyModeSwitch import LobbyModeSwitch
from '../../../../lobby/components/native/LobbyModeSwitch'; from '../../../../lobby/components/native/LobbyModeSwitch';
import HeaderNavigationButton
from '../../../../mobile/navigation/components/HeaderNavigationButton';
import { goBack }
from '../../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { LOCKED_LOCALLY, LOCKED_REMOTELY } from '../../../../room-lock'; import { LOCKED_LOCALLY, LOCKED_REMOTELY } from '../../../../room-lock';
import { import {
endRoomLockRequest, endRoomLockRequest,

View File

@ -2,8 +2,8 @@
import { translate } from '../../../../base/i18n'; import { translate } from '../../../../base/i18n';
import { connect } from '../../../../base/redux'; import { connect } from '../../../../base/redux';
import { navigate } from '../../../../conference/components/native/ConferenceNavigationContainerRef'; import { navigate } from '../../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../../../conference/components/native/routes'; import { screen } from '../../../../mobile/navigation/routes';
import AbstractSecurityDialogButton, { import AbstractSecurityDialogButton, {
_mapStateToProps as _abstractMapStateToProps, _mapStateToProps as _abstractMapStateToProps,
type Props as AbstractSecurityDialogButtonProps type Props as AbstractSecurityDialogButtonProps

View File

@ -4,8 +4,8 @@ import { createToolbarEvent, sendAnalytics } from '../../../analytics';
import { getFeatureFlag, SPEAKERSTATS_ENABLED } from '../../../base/flags'; import { getFeatureFlag, SPEAKERSTATS_ENABLED } from '../../../base/flags';
import { translate } from '../../../base/i18n'; import { translate } from '../../../base/i18n';
import { connect } from '../../../base/redux'; import { connect } from '../../../base/redux';
import { navigate } from '../../../conference/components/native/ConferenceNavigationContainerRef'; import { navigate } from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../../conference/components/native/routes'; import { screen } from '../../../mobile/navigation/routes';
import AbstractSpeakerStatsButton from '../AbstractSpeakerStatsButton'; import AbstractSpeakerStatsButton from '../AbstractSpeakerStatsButton';
/** /**

View File

@ -59,17 +59,6 @@ export type Props = {
export class AbstractWelcomePage<P: Props> extends Component<P, *> { export class AbstractWelcomePage<P: Props> extends Component<P, *> {
_mounted: ?boolean; _mounted: ?boolean;
/**
* Implements React's {@link Component#getDerivedStateFromProps()}.
*
* @inheritdoc
*/
static getDerivedStateFromProps(props: P, state: Object) {
return {
room: props._room || state.room
};
}
/** /**
* Save room name into component's local state. * Save room name into component's local state.
* *

View File

@ -1,80 +0,0 @@
// @flow
import React, { Component } from 'react';
import { View } from 'react-native';
import { VideoTrack } from '../../base/media';
import { TintedView } from '../../base/react';
import { connect } from '../../base/redux';
import { getLocalVideoTrack } from '../../base/tracks';
import styles from './styles';
/**
* The type of the React {@code Component} props of
* {@link LocalVideoTrackUnderlay}.
*/
type Props = {
/**
* The redux representation of the local participant's video track.
*/
_localVideoTrack: Object,
/**
* React Elements to display within the component.
*/
children: React$Node,
/**
* The style, if any, to apply to {@link LocalVideoTrackUnderlay} in
* addition to its default style.
*/
style: Object
};
/**
* Implements a React {@code Component} which underlays the local video track,
* if any, underneath its children.
*/
class LocalVideoTrackUnderlay extends Component<Props> {
/**
* Implements React's {@link Component#render()}.
*
* @inheritdoc
* @override
* @returns {ReactElement}
*/
render() {
return (
<View
style = { [
styles.localVideoTrackUnderlay,
this.props.style
] }>
<VideoTrack videoTrack = { this.props._localVideoTrack } />
<TintedView>
{ this.props.children }
</TintedView>
</View>
);
}
}
/**
* Maps (parts of) the redux state to the React {@code Component} props of
* {@code LocalVideoTrackUnderlay}.
*
* @param {Object} state - The redux state.
* @private
* @returns {{
* _localVideoTrack: (Track|undefined)
* }}
*/
function _mapStateToProps(state) {
return {
_localVideoTrack: getLocalVideoTrack(state['features/base/tracks'])
};
}
export default connect(_mapStateToProps)(LocalVideoTrackUnderlay);

View File

@ -18,7 +18,9 @@ import { Icon, IconMenu, IconWarning } from '../../base/icons';
import JitsiStatusBar from '../../base/modal/components/JitsiStatusBar'; import JitsiStatusBar from '../../base/modal/components/JitsiStatusBar';
import { LoadingIndicator, Text } from '../../base/react'; import { LoadingIndicator, Text } from '../../base/react';
import { connect } from '../../base/redux'; import { connect } from '../../base/redux';
import BaseTheme from '../../base/ui/components/BaseTheme.native'; import BaseTheme from '../../base/ui/components/BaseTheme';
import WelcomePageTabs
from '../../mobile/navigation/components/welcome/components/WelcomePageTabs';
import { import {
AbstractWelcomePage, AbstractWelcomePage,
@ -26,7 +28,6 @@ import {
type Props as AbstractProps type Props as AbstractProps
} from './AbstractWelcomePage'; } from './AbstractWelcomePage';
import VideoSwitch from './VideoSwitch'; import VideoSwitch from './VideoSwitch';
import WelcomePageTabs from './WelcomePageTabs';
import styles, { PLACEHOLDER_TEXT_COLOR } from './styles'; import styles, { PLACEHOLDER_TEXT_COLOR } from './styles';
@ -42,11 +43,6 @@ type Props = AbstractProps & {
*/ */
navigation: Object, navigation: Object,
/**
* Default prop for navigating between screen components(React Navigation).
*/
route: Object,
/** /**
* The translate function. * The translate function.
*/ */
@ -103,8 +99,6 @@ class WelcomePage extends AbstractWelcomePage<*> {
componentDidMount() { componentDidMount() {
super.componentDidMount(); super.componentDidMount();
this._updateRoomname();
const { const {
_headerStyles, _headerStyles,
navigation navigation
@ -115,7 +109,8 @@ class WelcomePage extends AbstractWelcomePage<*> {
<TouchableOpacity <TouchableOpacity
/* eslint-disable-next-line react/jsx-no-bind */ /* eslint-disable-next-line react/jsx-no-bind */
onPress = { () => onPress = { () =>
navigation.dispatch(DrawerActions.openDrawer()) } navigation.dispatch(DrawerActions.openDrawer())
}
style = { styles.drawerNavigationIcon }> style = { styles.drawerNavigationIcon }>
<Icon <Icon
size = { 20 } size = { 20 }
@ -127,6 +122,20 @@ class WelcomePage extends AbstractWelcomePage<*> {
headerRight: () => headerRight: () =>
<VideoSwitch /> <VideoSwitch />
}); });
navigation.addListener('focus', () => {
this._updateRoomname();
});
navigation.addListener('blur', () => {
this._clearTimeouts();
this.setState({
generatedRoomname: '',
insecureRoomName: false,
room: ''
});
});
} }
/** /**

View File

@ -1,16 +0,0 @@
// @flow
import BaseTheme from '../../base/ui/components/BaseTheme';
export const drawerContentOptions = {
drawerActiveBackgroundColor: BaseTheme.palette.ui12,
drawerActiveTintColor: BaseTheme.palette.screen01Header,
drawerLabelStyle: {
marginLeft: BaseTheme.spacing[2]
},
drawerStyle: {
backgroundColor: BaseTheme.palette.ui12,
width: '54%'
}
};

View File

@ -1,12 +0,0 @@
/**
* The styles of the native components of the feature {@code settings}.
*/
export default {
/**
* Style for screen container.
*/
helpViewContainer: {
flex: 1
}
};

View File

@ -2,14 +2,13 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import JitsiScreenWebView from '../../../../base/modal/components/JitsiScreenWebView'; import JitsiScreenWebView from '../../../base/modal/components/JitsiScreenWebView';
import JitsiStatusBar from '../../../../base/modal/components/JitsiStatusBar'; import JitsiStatusBar from '../../../base/modal/components/JitsiStatusBar';
import { connect } from '../../../../base/redux'; import { connect } from '../../../base/redux';
import { screen } from '../../../../conference/components/native/routes'; import { renderArrowBackButton }
import { renderArrowBackButton } from '../../../../welcome/functions.native'; from '../../../mobile/navigation/components/welcome/functions';
import { screen } from '../../../mobile/navigation/routes';
import styles from '../styles';
import styles from './styles';
const DEFAULT_HELP_CENTRE_URL = 'https://web-cdn.jitsi.net/faq/meet-faq.html'; const DEFAULT_HELP_CENTRE_URL = 'https://web-cdn.jitsi.net/faq/meet-faq.html';
@ -62,7 +61,7 @@ class HelpView extends PureComponent<Props> {
<JitsiStatusBar /> <JitsiStatusBar />
<JitsiScreenWebView <JitsiScreenWebView
source = { this.props._url } source = { this.props._url }
style = { styles.helpViewContainer } /> style = { styles.screenContainer } />
</> </>
); );
} }

View File

@ -2,12 +2,12 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import JitsiScreenWebView from '../../../../base/modal/components/JitsiScreenWebView'; import JitsiScreenWebView from '../../../base/modal/components/JitsiScreenWebView';
import JitsiStatusBar from '../../../../base/modal/components/JitsiStatusBar'; import JitsiStatusBar from '../../../base/modal/components/JitsiStatusBar';
import { screen } from '../../../../conference/components/native/routes'; import { renderArrowBackButton }
import { renderArrowBackButton } from '../../../../welcome/functions.native'; from '../../../mobile/navigation/components/welcome/functions';
import { screen } from '../../../mobile/navigation/routes';
import styles from './styles'; import styles from '../styles';
type Props = { type Props = {
@ -38,7 +38,7 @@ const PrivacyView = ({ navigation }: Props) => {
<JitsiStatusBar /> <JitsiStatusBar />
<JitsiScreenWebView <JitsiScreenWebView
source = { PRIVACY_URL } source = { PRIVACY_URL }
style = { styles.privacyViewContainer } /> style = { styles.screenContainer } />
</> </>
); );
}; };

View File

@ -2,12 +2,12 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import JitsiScreenWebView from '../../../../base/modal/components/JitsiScreenWebView'; import JitsiScreenWebView from '../../../base/modal/components/JitsiScreenWebView';
import JitsiStatusBar from '../../../../base/modal/components/JitsiStatusBar'; import JitsiStatusBar from '../../../base/modal/components/JitsiStatusBar';
import { screen } from '../../../../conference/components/native/routes'; import { renderArrowBackButton }
import { renderArrowBackButton } from '../../../../welcome/functions.native'; from '../../../mobile/navigation/components/welcome/functions';
import { screen } from '../../../mobile/navigation/routes';
import styles from './styles'; import styles from '../styles';
type Props = { type Props = {
@ -38,7 +38,7 @@ const TermsView = ({ navigation }: Props) => {
<JitsiStatusBar /> <JitsiStatusBar />
<JitsiScreenWebView <JitsiScreenWebView
source = { TERMS_URL } source = { TERMS_URL }
style = { styles.termsViewContainer } /> style = { styles.screenContainer } />
</> </>
); );
}; };

View File

@ -3,7 +3,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Text, View } from 'react-native'; import { Text, View } from 'react-native';
import { translate } from '../../../../base/i18n'; import { translate } from '../../../../../base/i18n';
import styles, { ANDROID_UNDERLINE_COLOR, PLACEHOLDER_COLOR } from './styles'; import styles, { ANDROID_UNDERLINE_COLOR, PLACEHOLDER_COLOR } from './styles';

View File

@ -3,8 +3,8 @@
import React, { useCallback, useState } from 'react'; import React, { useCallback, useState } from 'react';
import { List } from 'react-native-paper'; import { List } from 'react-native-paper';
import { translate } from '../../../../base/i18n'; import { translate } from '../../../../../base/i18n';
import { Icon, IconArrowDown, IconArrowUp } from '../../../../base/icons'; import { Icon, IconArrowDown, IconArrowUp } from '../../../../../base/icons';
import styles from './styles'; import styles from './styles';

View File

@ -10,17 +10,18 @@ import {
} from 'react-native'; } from 'react-native';
import { Divider, Switch, TextInput, withTheme } from 'react-native-paper'; import { Divider, Switch, TextInput, withTheme } from 'react-native-paper';
import { translate } from '../../../../base/i18n'; import { translate } from '../../../../../base/i18n';
import JitsiScreen from '../../../../base/modal/components/JitsiScreen'; import JitsiScreen from '../../../../../base/modal/components/JitsiScreen';
import { connect } from '../../../../base/redux'; import { connect } from '../../../../../base/redux';
import { screen } from '../../../../conference/components/native/routes'; import { renderArrowBackButton }
from '../../../../../mobile/navigation/components/welcome/functions';
import { screen } from '../../../../../mobile/navigation/routes';
import { import {
AbstractSettingsView, AbstractSettingsView,
_mapStateToProps as _abstractMapStateToProps, _mapStateToProps as _abstractMapStateToProps,
type Props as AbstractProps type Props as AbstractProps
} from '../../../../settings/components/AbstractSettingsView'; } from '../../../../../settings/components/AbstractSettingsView';
import { normalizeUserInputURL, isServerURLChangeEnabled } from '../../../../settings/functions'; import { normalizeUserInputURL, isServerURLChangeEnabled } from '../../../../../settings/functions';
import { renderArrowBackButton } from '../../../../welcome/functions.native';
import FormRow from './FormRow'; import FormRow from './FormRow';
import FormSectionAccordion from './FormSectionAccordion'; import FormSectionAccordion from './FormSectionAccordion';

View File

@ -1,4 +1,4 @@
import BaseTheme from '../../../../base/ui/components/BaseTheme.native'; import BaseTheme from '../../../../../base/ui/components/BaseTheme';
export const ANDROID_UNDERLINE_COLOR = 'transparent'; export const ANDROID_UNDERLINE_COLOR = 'transparent';
export const PLACEHOLDER_COLOR = BaseTheme.palette.action02Focus; export const PLACEHOLDER_COLOR = BaseTheme.palette.action02Focus;
export const THUMB_COLOR = BaseTheme.palette.field02; export const THUMB_COLOR = BaseTheme.palette.field02;

View File

@ -1,12 +0,0 @@
/**
* The styles of the native components of the feature {@code privacy}.
*/
export default {
/**
* Style for screen container.
*/
privacyViewContainer: {
flex: 1
}
};

View File

@ -152,16 +152,6 @@ export default {
paddingVertical: 2 * BoxModel.padding paddingVertical: 2 * BoxModel.padding
}, },
/**
* The style of the top-level container/{@code View} of
* {@code LocalVideoTrackUnderlay}.
*/
localVideoTrackUnderlay: {
alignSelf: 'stretch',
backgroundColor: 'transparent',
flex: 1
},
/** /**
* Top-level screen style. * Top-level screen style.
*/ */
@ -280,5 +270,12 @@ export default {
flex: 1, flex: 1,
opacity: 0.8, opacity: 0.8,
overflow: 'hidden' overflow: 'hidden'
},
/**
* Style for screen container.
*/
screenContainer: {
flex: 1
} }
}; };

View File

@ -1,12 +0,0 @@
/**
* The styles of the native components of the feature {@code terms}.
*/
export default {
/**
* Style for screen container.
*/
termsViewContainer: {
flex: 1
}
};