1import * as Constants from '../constants/settings' 2import * as Kb from '../common-adapters' 3import * as React from 'react' 4import {NavigationViewProps, createNavigator, StackRouter, SceneView} from '@react-navigation/core' 5import * as Shim from '../router-v2/shim' 6import DevicesTab from '../devices/container' 7import GitTab from '../git/container' 8import FsTab from './files/container' 9import AdvancedTab from './advanced' 10import ChatTab from './chat/container' 11import DisplayTab from './display/container' 12import InvitationsTab from './invites/container' 13import AccountTab from './account/container' 14import FeedbackTab from './feedback/container' 15import NotificationsTab from './notifications/container' 16import DbNukeConfirm from './db-nuke-confirm/container' 17import DeleteConfirm from './delete-confirm/index' 18import InviteSent from './invite-generated/container' 19import RemoveDevice from '../devices/device-revoke/container' 20import LogOutTab from './logout/container' 21import ChangePassword from './password/container' 22import DisableCertPinningModal from './disable-cert-pinning-modal/container' 23import {DeleteModal} from './account/confirm-delete' 24import {Email, Phone, VerifyPhone} from './account/add-modals' 25 26const settingsSubRoutes = { 27 [Constants.devicesTab]: {getScreen: (): typeof DevicesTab => require('../devices/container').default}, 28 [Constants.gitTab]: {getScreen: (): typeof GitTab => require('../git/container').default}, 29 [Constants.fsTab]: {getScreen: (): typeof FsTab => require('./files/container').default}, 30 [Constants.advancedTab]: {getScreen: (): typeof AdvancedTab => require('./advanced').default}, 31 [Constants.chatTab]: {getScreen: (): typeof ChatTab => require('./chat/container').default}, 32 // TODO connect broken 33 [Constants.invitationsTab]: { 34 getScreen: (): typeof InvitationsTab => require('./invites/container').default, 35 }, 36 [Constants.accountTab]: {getScreen: (): typeof AccountTab => require('./account/container').default}, 37 [Constants.displayTab]: {getScreen: (): typeof DisplayTab => require('./display/container').default}, 38 [Constants.feedbackTab]: {getScreen: (): typeof FeedbackTab => require('./feedback/container').default}, 39 [Constants.notificationsTab]: { 40 getScreen: (): typeof NotificationsTab => require('./notifications/container').default, 41 }, 42 dbNukeConfirm: {getScreen: (): typeof DbNukeConfirm => require('./db-nuke-confirm/container').default}, 43 inviteSent: {getScreen: (): typeof InviteSent => require('./invite-generated/container').default}, 44 removeDevice: {getScreen: (): typeof RemoveDevice => require('../devices/device-revoke/container').default}, 45} 46const noScreenProps = {} 47class SettingsSubNav extends React.PureComponent<NavigationViewProps<any>> { 48 render() { 49 const navigation = this.props.navigation 50 const index = navigation.state.index 51 const activeKey = navigation.state.routes[index].key 52 const descriptor = this.props.descriptors[activeKey] 53 const childNav = descriptor.navigation 54 55 const Settings = require('./').default 56 return ( 57 <Kb.Box2 direction="horizontal" fullHeight={true} fullWidth={true}> 58 <Settings routeSelected={descriptor.state.routeName}> 59 <SceneView 60 navigation={childNav} 61 component={descriptor.getComponent()} 62 screenProps={this.props.screenProps || noScreenProps} 63 /> 64 </Settings> 65 </Kb.Box2> 66 ) 67 } 68} 69const SettingsSubNavigator = createNavigator( 70 SettingsSubNav, 71 StackRouter(Shim.shim(settingsSubRoutes), {initialRouteName: Constants.accountTab}), 72 {} 73) 74 75SettingsSubNavigator.navigationOptions = { 76 title: 'Settings', 77} 78 79export const newRoutes = { 80 // MUST use screen and not getScreen for subnavs! 81 settingsRoot: {screen: SettingsSubNavigator}, 82} 83export const newModalRoutes = { 84 [Constants.logOutTab]: {getScreen: (): typeof LogOutTab => require('./logout/container').default}, 85 // TODO connect broken 86 changePassword: {getScreen: (): typeof ChangePassword => require('./password/container').default}, 87 deleteConfirm: {getScreen: (): typeof DeleteConfirm => require('./delete-confirm/index').default}, 88 disableCertPinningModal: { 89 getScreen: (): typeof DisableCertPinningModal => 90 require('./disable-cert-pinning-modal/container').default, 91 }, 92 modalFeedback: {getScreen: (): typeof FeedbackTab => require('../signup/feedback/container').default}, 93 settingsAddEmail: {getScreen: (): typeof Email => require('./account/add-modals').Email}, 94 settingsAddPhone: {getScreen: (): typeof Phone => require('./account/add-modals').Phone}, 95 settingsDeleteAddress: { 96 getScreen: (): typeof DeleteModal => require('./account/confirm-delete').DeleteModal, 97 }, 98 settingsVerifyPhone: {getScreen: (): typeof VerifyPhone => require('./account/add-modals').VerifyPhone}, 99} 100