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