verdnatura-chat/app/lib/Navigation.js

261 lines
6.7 KiB
JavaScript
Raw Normal View History

import { Navigation } from 'react-native-navigation';
import { Provider } from 'react-redux';
import { gestureHandlerRootHOC } from 'react-native-gesture-handler';
import store from './createStore';
import debounce from '../utils/debounce';
const DRAWER_ID = 'SidebarView';
class NavigationManager {
constructor() {
this.views = {
OnboardingView: {
name: 'OnboardingView',
loaded: false,
require: () => require('../views/OnboardingView').default
},
ProfileView: {
name: 'ProfileView',
loaded: false,
require: () => require('../views/ProfileView').default
},
RoomsListHeaderView: {
name: 'RoomsListHeaderView',
loaded: false,
require: () => require('../views/RoomsListView/Header').default
},
RoomsListView: {
name: 'RoomsListView',
loaded: false,
require: () => require('../views/RoomsListView').default
},
RoomView: {
name: 'RoomView',
loaded: false,
require: () => require('../views/RoomView').default
},
RoomHeaderView: {
name: 'RoomHeaderView',
loaded: false,
require: () => require('../views/RoomView/Header').default
},
SettingsView: {
name: 'SettingsView',
loaded: false,
require: () => require('../views/SettingsView').default
},
SidebarView: {
name: 'SidebarView',
loaded: false,
require: () => require('../views/SidebarView').default
},
NewServerView: {
name: 'NewServerView',
loaded: false,
require: () => require('../views/NewServerView').default
},
CreateChannelView: {
name: 'CreateChannelView',
loaded: false,
require: () => require('../views/CreateChannelView').default
},
ForgotPasswordView: {
name: 'ForgotPasswordView',
loaded: false,
require: () => require('../views/ForgotPasswordView').default
},
LegalView: {
name: 'LegalView',
loaded: false,
require: () => require('../views/LegalView').default
},
LoginSignupView: {
name: 'LoginSignupView',
loaded: false,
require: () => require('../views/LoginSignupView').default
},
LoginView: {
name: 'LoginView',
loaded: false,
require: () => require('../views/LoginView').default
},
NewMessageView: {
name: 'NewMessageView',
loaded: false,
require: () => require('../views/NewMessageView').default
},
OAuthView: {
name: 'OAuthView',
loaded: false,
require: () => require('../views/OAuthView').default
},
PrivacyPolicyView: {
name: 'PrivacyPolicyView',
loaded: false,
require: () => require('../views/PrivacyPolicyView').default
},
RegisterView: {
name: 'RegisterView',
loaded: false,
require: () => require('../views/RegisterView').default
},
SelectedUsersView: {
name: 'SelectedUsersView',
loaded: false,
require: () => require('../views/SelectedUsersView').default
},
SetUsernameView: {
name: 'SetUsernameView',
loaded: false,
require: () => require('../views/SetUsernameView').default
},
TermsServiceView: {
name: 'TermsServiceView',
loaded: false,
require: () => require('../views/TermsServiceView').default
},
MentionedMessagesView: {
name: 'MentionedMessagesView',
loaded: false,
require: () => require('../views/MentionedMessagesView').default
},
PinnedMessagesView: {
name: 'PinnedMessagesView',
loaded: false,
require: () => require('../views/PinnedMessagesView').default
},
RoomActionsView: {
name: 'RoomActionsView',
loaded: false,
require: () => require('../views/RoomActionsView').default
},
RoomFilesView: {
name: 'RoomFilesView',
loaded: false,
require: () => require('../views/RoomFilesView').default
},
RoomInfoEditView: {
name: 'RoomInfoEditView',
loaded: false,
require: () => require('../views/RoomInfoEditView').default
},
RoomInfoView: {
name: 'RoomInfoView',
loaded: false,
require: () => require('../views/RoomInfoView').default
},
RoomMembersView: {
name: 'RoomMembersView',
loaded: false,
require: () => require('../views/RoomMembersView').default
},
SearchMessagesView: {
name: 'SearchMessagesView',
loaded: false,
require: () => require('../views/SearchMessagesView').default
},
SnippetedMessagesView: {
name: 'SnippetedMessagesView',
loaded: false,
require: () => require('../views/SnippetedMessagesView').default
},
StarredMessagesView: {
name: 'StarredMessagesView',
loaded: false,
require: () => require('../views/StarredMessagesView').default
}
};
this.isDrawerVisible = false;
Navigation.events().registerComponentDidAppearListener(({ componentId }) => {
if (componentId === DRAWER_ID) {
this.isDrawerVisible = true;
}
});
Navigation.events().registerComponentDidDisappearListener(({ componentId }) => {
if (componentId === DRAWER_ID) {
this.isDrawerVisible = false;
}
});
}
handleComponentName = (componentName) => {
if (!componentName) {
return console.error('componentName not found');
}
}
loadView = (componentName) => {
const view = this.views[componentName];
if (!view) {
return console.error('view not found');
}
if (!view.loaded) {
Navigation.registerComponentWithRedux(view.name, () => gestureHandlerRootHOC(view.require()), Provider, store);
view.loaded = true;
}
}
push = debounce((...args) => {
let componentName;
try {
componentName = args[1].component.name;
} catch (error) {
return console.error(error);
}
this.handleComponentName(componentName);
this.loadView(componentName);
Navigation.push(...args);
}, 300, true)
showModal = debounce((...args) => {
let componentName;
try {
componentName = args[0].stack.children[0].component.name;
} catch (error) {
return console.error(error);
}
this.handleComponentName(componentName);
this.loadView(componentName);
Navigation.showModal(...args);
}, 300, true)
pop = (...args) => Navigation.pop(...args);
popToRoot = (...args) => Navigation.popToRoot(...args);
dismissModal = (...args) => Navigation.dismissModal(...args);
dismissAllModals = (...args) => Navigation.dismissAllModals(...args);
events = (...args) => Navigation.events(...args);
mergeOptions = (...args) => Navigation.mergeOptions(...args);
setDefaultOptions = (...args) => Navigation.setDefaultOptions(...args);
setRoot = (...args) => Navigation.setRoot(...args);
setStackRoot = (...args) => Navigation.setStackRoot(...args);
toggleDrawer = () => {
try {
const visibility = !this.isDrawerVisible;
Navigation.mergeOptions(DRAWER_ID, {
sideMenu: {
left: {
visible: visibility
}
}
});
this.isDrawerVisible = visibility;
} catch (error) {
console.warn(error);
}
}
}
export default new NavigationManager();