@brightlayer-ui/react-native-template-authentication-typescript 2.1.0 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +22 -17
  2. package/package.json +3 -3
  3. package/template/.bundle/config +2 -0
  4. package/template/.eslintrc.js +57 -0
  5. package/template/.prettierrc.js +7 -0
  6. package/template/.watchmanconfig +1 -0
  7. package/template/App.tsx +85 -47
  8. package/template/Gemfile +9 -0
  9. package/template/Gemfile.lock +105 -0
  10. package/template/README.md +79 -0
  11. package/template/__tests__/App.test.tsx +17 -0
  12. package/template/android/app/build.gradle +120 -0
  13. package/template/android/app/debug.keystore +0 -0
  14. package/template/android/app/proguard-rules.pro +10 -0
  15. package/template/android/app/src/debug/AndroidManifest.xml +9 -0
  16. package/template/android/app/src/main/AndroidManifest.xml +25 -0
  17. package/template/android/app/src/main/java/com/workflow/MainActivity.kt +28 -0
  18. package/template/android/app/src/main/java/com/workflow/MainApplication.kt +43 -0
  19. package/template/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
  20. package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  21. package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  22. package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  23. package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  24. package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  25. package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  26. package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  27. package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  28. package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  29. package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  30. package/template/android/app/src/main/res/values/strings.xml +3 -0
  31. package/template/android/app/src/main/res/values/styles.xml +9 -0
  32. package/template/android/build.gradle +21 -0
  33. package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  34. package/template/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  35. package/template/android/gradle.properties +41 -0
  36. package/template/android/gradlew +249 -0
  37. package/template/android/gradlew.bat +92 -0
  38. package/template/android/link-assets-manifest.json +25 -0
  39. package/template/android/settings.gradle +4 -0
  40. package/template/app.json +4 -0
  41. package/template/assets/fonts/OpenSans-Bold.ttf +0 -0
  42. package/template/assets/fonts/OpenSans-ExtraBold.ttf +0 -0
  43. package/template/assets/fonts/OpenSans-Light.ttf +0 -0
  44. package/template/assets/fonts/OpenSans-Regular.ttf +0 -0
  45. package/template/assets/fonts/OpenSans-SemiBold.ttf +0 -0
  46. package/template/assets/images/Logo.png +0 -0
  47. package/template/babel.config.js +1 -2
  48. package/template/eslint.config.mjs +10 -0
  49. package/template/index.js +11 -0
  50. package/template/ios/.xcode.env +11 -0
  51. package/template/ios/Podfile +40 -0
  52. package/template/ios/Podfile.lock +1496 -0
  53. package/template/ios/blankTemplate/AppDelegate.h +6 -0
  54. package/template/ios/blankTemplate/AppDelegate.mm +31 -0
  55. package/template/ios/blankTemplate/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  56. package/template/ios/blankTemplate/Images.xcassets/Contents.json +6 -0
  57. package/template/ios/blankTemplate/Info.plist +75 -0
  58. package/template/ios/blankTemplate/LaunchScreen.storyboard +47 -0
  59. package/template/ios/blankTemplate/PrivacyInfo.xcprivacy +37 -0
  60. package/template/ios/blankTemplate/main.m +10 -0
  61. package/template/ios/blankTemplate.xcodeproj/project.pbxproj +741 -0
  62. package/template/ios/blankTemplate.xcodeproj/xcshareddata/xcschemes/blankTemplate.xcscheme +88 -0
  63. package/template/ios/blankTemplate.xcworkspace/contents.xcworkspacedata +10 -0
  64. package/template/ios/blankTemplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  65. package/template/ios/blankTemplateTests/Info.plist +24 -0
  66. package/template/ios/blankTemplateTests/blankTemplateTests.m +66 -0
  67. package/template/ios/link-assets-manifest.json +25 -0
  68. package/template/jest.config.js +3 -0
  69. package/template/metro.config.js +7 -25
  70. package/template/package.json +70 -0
  71. package/template/src/actions/AuthUIActions.tsx +10 -11
  72. package/template/src/actions/RegistrationUIActions.tsx +37 -30
  73. package/template/src/assets/images/eaton_stacked_logo.png +0 -0
  74. package/template/src/components/AuthCustomScreen.tsx +50 -0
  75. package/template/src/components/CustomScreen.tsx +77 -0
  76. package/template/src/components/DebugComponent.tsx +49 -0
  77. package/template/src/components/ForgotPasswordScreenBaseExample.tsx +42 -0
  78. package/template/src/components/ResetPasswordScreenBaseExample.tsx +41 -0
  79. package/template/src/components/UserMenuExample.tsx +117 -0
  80. package/template/src/contexts/AppContextProvider.tsx +28 -0
  81. package/template/src/contexts/ThemeContext.ts +15 -0
  82. package/template/src/navigation/index.tsx +205 -22
  83. package/template/src/navigation/navigation-drawer.tsx +38 -25
  84. package/template/src/screens/ChangePassword.tsx +15 -0
  85. package/template/src/screens/Dashboard.tsx +137 -0
  86. package/template/src/screens/Homepage.tsx +135 -0
  87. package/template/src/screens/Locations.tsx +137 -0
  88. package/template/src/screens/Login.tsx +17 -0
  89. package/template/src/screens/Registration.tsx +4 -0
  90. package/template/src/screens/RegistrationInvite.tsx +5 -0
  91. package/template/src/screens/index.ts +12 -0
  92. package/template/src/store/local-storage.ts +4 -4
  93. package/template/translations/dictionary/chinese.ts +29 -0
  94. package/template/translations/dictionary/english.ts +29 -0
  95. package/template/translations/dictionary/french.ts +29 -0
  96. package/template/translations/dictionary/index.ts +19 -0
  97. package/template/translations/dictionary/portuguese.ts +29 -0
  98. package/template/translations/dictionary/spanish.ts +29 -0
  99. package/template/translations/dictionary/types.ts +27 -0
  100. package/template/translations/i18n.ts +58 -0
  101. package/template/tsconfig.json +60 -0
  102. package/template/yarn.lock +7341 -0
  103. package/template.config.js +4 -0
  104. package/CHANGELOG.md +0 -69
  105. package/dependencies.json +0 -31
  106. package/images/Logo.svg +0 -11
  107. package/template/__mocks__/svgMock.js +0 -8
  108. package/template/jestSetupFile.js +0 -17
  109. package/template/react-native.config.js +0 -3
  110. package/template/src/navigation/DeepLinking.ts +0 -62
  111. package/template/src/screens/home.tsx +0 -198
  112. package/template/src/screens/index.tsx +0 -3
  113. package/template/src/screens/pageOne.tsx +0 -91
  114. package/template/src/screens/pageTwo.tsx +0 -92
  115. /package/{fonts → template/android/app/src/main/assets/fonts}/OpenSans-Bold.ttf +0 -0
  116. /package/{fonts → template/android/app/src/main/assets/fonts}/OpenSans-ExtraBold.ttf +0 -0
  117. /package/{fonts → template/android/app/src/main/assets/fonts}/OpenSans-Light.ttf +0 -0
  118. /package/{fonts → template/android/app/src/main/assets/fonts}/OpenSans-Regular.ttf +0 -0
  119. /package/{fonts → template/android/app/src/main/assets/fonts}/OpenSans-SemiBold.ttf +0 -0
@@ -0,0 +1,49 @@
1
+ import { Spacer } from '@brightlayer-ui/react-native-components';
2
+ import { useNavigation } from '@react-navigation/native';
3
+ import React, { useState } from 'react';
4
+ import { View } from 'react-native';
5
+ import { Button, Text } from 'react-native-paper';
6
+
7
+ export const DebugComponent = (): JSX.Element => {
8
+ const [debugMode, setDebugMode] = useState(false);
9
+ const navigation = useNavigation();
10
+ return (
11
+ <>
12
+ <View style={{ flexDirection: 'row' }}>
13
+ {debugMode && <Text variant="headlineSmall">DEBUG MODE</Text>}
14
+ <Spacer />
15
+ <Button
16
+ mode="contained"
17
+ onPress={(): void => {
18
+ setDebugMode(!debugMode);
19
+ }}
20
+ >
21
+ DEBUG
22
+ </Button>
23
+ </View>
24
+ {debugMode && (
25
+ <View style={{ paddingBottom: 2 }}>
26
+ <Button
27
+ mode={'text'}
28
+ labelStyle={{ fontSize: 16 }}
29
+ uppercase={false}
30
+ onPress={(): void => {
31
+ navigation.navigate('RegistrationProviderExample', { screen: 'RegisterInvite' });
32
+ }}
33
+ >
34
+ [Test Invite Register]
35
+ </Button>
36
+
37
+ <Button
38
+ mode={'text'}
39
+ labelStyle={{ fontSize: 16 }}
40
+ uppercase={false}
41
+ onPress={(): void => navigation.navigate('ResetPassword')}
42
+ >
43
+ [Test Reset Password]
44
+ </Button>
45
+ </View>
46
+ )}
47
+ </>
48
+ );
49
+ };
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import {
3
+ ForgotPasswordScreen,
4
+ AuthContextProvider,
5
+ ErrorContextProvider,
6
+ } from '@brightlayer-ui/react-native-auth-workflow';
7
+ import { useNavigation } from '@react-navigation/native';
8
+ import { useApp } from '../contexts/AppContextProvider';
9
+ import { ProjectAuthUIActions } from '../actions/AuthUIActions';
10
+ import i18nAppInstance from '../../translations/i18n';
11
+
12
+ export const ForgotPasswordScreenBaseExample: React.FC = () => {
13
+ const app = useApp();
14
+ const navigation = useNavigation();
15
+
16
+ return (
17
+ <AuthContextProvider
18
+ language={app.language}
19
+ actions={ProjectAuthUIActions(app)}
20
+ i18n={i18nAppInstance}
21
+ navigate={(destination: -1 | string) => {
22
+ if (typeof destination === 'string') {
23
+ navigation.navigate(destination);
24
+ } else {
25
+ navigation.goBack();
26
+ }
27
+ }}
28
+ routeConfig={{
29
+ LOGIN: 'Home',
30
+ FORGOT_PASSWORD: undefined,
31
+ RESET_PASSWORD: undefined,
32
+ REGISTER_INVITE: undefined,
33
+ REGISTER_SELF: undefined,
34
+ SUPPORT: undefined,
35
+ }}
36
+ >
37
+ <ErrorContextProvider>
38
+ <ForgotPasswordScreen />
39
+ </ErrorContextProvider>
40
+ </AuthContextProvider>
41
+ );
42
+ };
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { AuthContextProvider, ResetPasswordScreen } from '@brightlayer-ui/react-native-auth-workflow';
3
+ import { useApp } from '../contexts/AppContextProvider';
4
+ import { useNavigation } from '@react-navigation/native';
5
+ import { ProjectAuthUIActions } from '../actions/AuthUIActions';
6
+ import i18nAppInstance from '../../translations/i18n';
7
+
8
+ export const ResetPasswordScreenBaseExample: React.FC = () => {
9
+ const app = useApp();
10
+ const navigation = useNavigation();
11
+
12
+ return (
13
+ <AuthContextProvider
14
+ language={app.language}
15
+ actions={ProjectAuthUIActions(app)}
16
+ i18n={i18nAppInstance}
17
+ navigate={(destination: -1 | string) => {
18
+ if (typeof destination === 'string') {
19
+ navigation.navigate(destination);
20
+ } else {
21
+ navigation.goBack();
22
+ }
23
+ }}
24
+ routeConfig={{
25
+ LOGIN: 'Home',
26
+ FORGOT_PASSWORD: undefined,
27
+ RESET_PASSWORD: undefined,
28
+ REGISTER_INVITE: undefined,
29
+ REGISTER_SELF: undefined,
30
+ SUPPORT: undefined,
31
+ }}
32
+ >
33
+ <ResetPasswordScreen
34
+ accountParams={{
35
+ code: '123',
36
+ email: 'test@eaton.com',
37
+ }}
38
+ />
39
+ </AuthContextProvider>
40
+ );
41
+ };
@@ -0,0 +1,117 @@
1
+ import { InfoListItemProps, UserMenu } from '@brightlayer-ui/react-native-components';
2
+ import React from 'react';
3
+ import { Avatar } from 'react-native-paper';
4
+ import * as BLUIColors from '@brightlayer-ui/colors';
5
+ import { IconFamily } from '@brightlayer-ui/react-native-components/core/__types__';
6
+ import SelectDropdown from 'react-native-select-dropdown';
7
+ import { useTranslation } from 'react-i18next';
8
+ import { useExtendedTheme } from '@brightlayer-ui/react-native-themes';
9
+ import { useApp } from '../contexts/AppContextProvider';
10
+ import AsyncStorage from '@react-native-async-storage/async-storage';
11
+ import { LocalStorage } from '../store/local-storage';
12
+ import { useNavigation } from '@react-navigation/native';
13
+ import { NativeStackNavigationProp } from '@react-navigation/native-stack';
14
+
15
+ const SwapIcon: IconFamily = {
16
+ family: 'material',
17
+ name: 'swap-horiz',
18
+ direction: 'ltr',
19
+ };
20
+ const InvertColorsIcon: IconFamily = {
21
+ family: 'material',
22
+ name: 'invert-colors',
23
+ direction: 'ltr',
24
+ };
25
+ const ExitToAppIcon: IconFamily = {
26
+ family: 'material',
27
+ name: 'exit-to-app',
28
+ direction: 'ltr',
29
+ };
30
+ const LockIcon: IconFamily = {
31
+ family: 'material',
32
+ name: 'lock',
33
+ direction: 'ltr',
34
+ };
35
+
36
+ type UserMenuExampleProps = {
37
+ onToggleRTL: () => void;
38
+ onToggleTheme: () => void;
39
+ };
40
+
41
+ export const UserMenuExample: React.FC<UserMenuExampleProps> = (props) => {
42
+ const { onToggleRTL, onToggleTheme } = props;
43
+ const theme = useExtendedTheme();
44
+ const { i18n, t } = useTranslation();
45
+ const navigation = useNavigation<NativeStackNavigationProp<any>>();
46
+ const app = useApp();
47
+ const handleLanguageChange = async (newLanguage: string): Promise<any> => {
48
+ app.setLanguage(newLanguage);
49
+ void i18n.changeLanguage(newLanguage);
50
+ try {
51
+ await AsyncStorage.setItem('userLanguage', newLanguage);
52
+ } catch (error) {
53
+ // eslint-disable-next-line no-console
54
+ console.error('Error setting new language:', error);
55
+ }
56
+ };
57
+ const logout = (): void => {
58
+ LocalStorage.clearAuthCredentials();
59
+ app.onUserNotAuthenticated();
60
+ };
61
+ const changePassword = (): void => {
62
+ navigation.navigate('ChangePassword');
63
+ };
64
+ const languageOptions = [
65
+ { label: 'English', value: 'en' },
66
+ { label: 'Spanish', value: 'es' },
67
+ { label: 'French', value: 'fr' },
68
+ { label: 'Chinese', value: 'zh' },
69
+ { label: 'Portuguese', value: 'pt' },
70
+ ];
71
+
72
+ const menuItems: InfoListItemProps[] = [
73
+ { title: t('USER_MENU.TOGGLE_RTL'), icon: SwapIcon, onPress: (): void => onToggleRTL() },
74
+ {
75
+ title: t('USER_MENU.TOGGLE_THEME'),
76
+ icon: InvertColorsIcon,
77
+ onPress: (): void => onToggleTheme(),
78
+ },
79
+ {
80
+ title: t('USER_MENU.LANGUAGE'),
81
+ icon: { name: 'translate' },
82
+ rightComponent: (
83
+ <SelectDropdown
84
+ defaultValue={languageOptions.find((option) => option.value === i18n.language)}
85
+ // eslint-disable-next-line
86
+ onSelect={(item) => handleLanguageChange(item.value)}
87
+ data={languageOptions}
88
+ buttonStyle={{ backgroundColor: theme.colors.background }}
89
+ buttonTextStyle={{ color: theme.colors.primary }}
90
+ rowTextForSelection={(item) => item.label}
91
+ buttonTextAfterSelection={() => {
92
+ const selectedLabel = languageOptions.find((option) => option.value === i18n.language)?.label;
93
+ return selectedLabel || 'Select Language';
94
+ }}
95
+ />
96
+ ),
97
+ },
98
+ { title: t('USER_MENU.CHANGE_PASSWORD'), icon: LockIcon, onPress: (): void => changePassword() },
99
+ { title: t('USER_MENU.LOG_OUT'), icon: ExitToAppIcon, onPress: (): void => logout() },
100
+ ];
101
+
102
+ return (
103
+ <UserMenu
104
+ menuTitle={'John Smith'}
105
+ menuSubtitle={'Account Manager'}
106
+ menuItems={menuItems}
107
+ avatar={
108
+ <Avatar.Icon
109
+ icon="account-circle"
110
+ size={40}
111
+ color={BLUIColors.primary[50]}
112
+ style={{ backgroundColor: BLUIColors.primary[80] }}
113
+ />
114
+ }
115
+ />
116
+ );
117
+ };
@@ -0,0 +1,28 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export type LoginData = {
4
+ email: string;
5
+ rememberMe: boolean;
6
+ };
7
+
8
+ export type AppContextType = {
9
+ isAuthenticated: boolean;
10
+ loginData: LoginData;
11
+ onUserAuthenticated: (args: { email: string; userId: string; rememberMe: boolean }) => void;
12
+ onUserNotAuthenticated: (clearRememberMe?: boolean, overrideRememberMeEmail?: string) => void;
13
+ language: string;
14
+ setLanguage: (language: string) => void;
15
+ setLoginData: (args: LoginData) => void;
16
+ setAuthenticated: (isAuthenticated: boolean) => void;
17
+ };
18
+
19
+ export const AppContext = createContext<AppContextType | null>(null);
20
+
21
+ export const useApp = (): AppContextType => {
22
+ const context = useContext(AppContext);
23
+
24
+ if (context === null) {
25
+ throw new Error('useApp must be used within a AppContextProvider');
26
+ }
27
+ return context;
28
+ };
@@ -0,0 +1,15 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export type ThemeType = 'light' | 'dark';
4
+
5
+ type ThemeContextType = {
6
+ theme: ThemeType;
7
+ setTheme: (themeName: ThemeType) => void;
8
+ };
9
+
10
+ export const ThemeContext = createContext<ThemeContextType>({
11
+ theme: 'light',
12
+ setTheme: () => {},
13
+ });
14
+
15
+ export const useThemeContext = (): ThemeContextType => useContext(ThemeContext);
@@ -1,37 +1,220 @@
1
1
  import React, { ReactNode } from 'react';
2
+ import { NavigationContainer, createNavigationContainerRef, useNavigation } from '@react-navigation/native';
3
+ import { useApp } from '../contexts/AppContextProvider';
4
+ import {
5
+ AuthContextProvider,
6
+ ContactSupportScreen,
7
+ ResetPasswordScreen,
8
+ RegistrationContextProvider,
9
+ ForgotPasswordScreen,
10
+ } from '@brightlayer-ui/react-native-auth-workflow';
11
+ import i18nAppInstance from '../../translations/i18n';
12
+ import { NavigationDrawer } from './navigation-drawer';
2
13
  import { createDrawerNavigator } from '@react-navigation/drawer';
3
- import { View } from 'react-native';
4
- import { NavDrawerProps, NavigationDrawer } from './navigation-drawer';
5
- import { createStackNavigator } from '@react-navigation/stack';
6
- import Home from '../screens/home';
7
- import PageOne from '../screens/pageOne';
8
- import PageTwo from '../screens/pageTwo';
14
+ import { Dimensions, View } from 'react-native';
9
15
 
16
+ import { ProjectAuthUIActions } from '../actions/AuthUIActions';
17
+ import { ProjectRegistrationUIActions } from '../actions/RegistrationUIActions';
18
+
19
+ import { Login } from '../screens/Login';
20
+ import { ChangePassword } from '../screens/ChangePassword';
21
+ import { Registration } from '../screens/Registration';
22
+ import { RegistrationInvite } from '../screens/RegistrationInvite';
23
+
24
+ import { Homepage } from '../screens/Homepage';
25
+ import Locations from '../screens/Locations';
26
+ import Dashboard from '../screens/Dashboard';
27
+ import { NativeStackNavigationProp, createNativeStackNavigator } from '@react-navigation/native-stack';
28
+
29
+ const Stack = createNativeStackNavigator();
10
30
  const Drawer = createDrawerNavigator();
31
+ const navigationRef = createNavigationContainerRef();
11
32
 
12
33
  export type RootStackParamList = {
13
- Home: undefined;
14
- PageOne: undefined;
15
- PageTwo: undefined;
34
+ Homepage: undefined;
35
+ Dashboard: undefined;
36
+ Locations: undefined;
16
37
  NavigationDrawer: undefined;
17
38
  };
18
39
 
19
- const RootStack = createStackNavigator<RootStackParamList>();
20
-
21
40
  const CustomDrawerContent = (props: any): any => (
22
41
  <View style={{ height: '100%' }}>
23
42
  <NavigationDrawer {...props} />
24
43
  </View>
25
44
  );
26
45
 
27
- export const MainRouter = (): any => (
28
- <Drawer.Navigator
29
- initialRouteName="Home"
30
- drawerStyle={{ backgroundColor: 'transparent', width: 300, maxWidth: '80%' }}
31
- drawerContent={(props: NavDrawerProps): ReactNode => <CustomDrawerContent {...props} />}
32
- >
33
- <RootStack.Screen name="Home" component={Home} />
34
- <RootStack.Screen name="PageOne" component={PageOne} />
35
- <RootStack.Screen name="PageTwo" component={PageTwo} />
36
- </Drawer.Navigator>
37
- );
46
+ const AuthRouter = (): any => {
47
+ const app = useApp();
48
+ const { email, rememberMe } = app.loginData;
49
+ const navigation = useNavigation<NativeStackNavigationProp<any>>();
50
+
51
+ return (
52
+ <>
53
+ <AuthContextProvider
54
+ language={app.language}
55
+ actions={ProjectAuthUIActions(app)}
56
+ i18n={i18nAppInstance}
57
+ navigate={(destination: -1 | string) => {
58
+ if (typeof destination === 'string') {
59
+ switch (destination) {
60
+ case 'SelfRegister':
61
+ case 'RegisterInvite':
62
+ navigation.navigate('RegistrationProviderExample', { screen: destination });
63
+ break;
64
+ default:
65
+ navigation.navigate(destination);
66
+ break;
67
+ }
68
+ } else if (destination === -1) {
69
+ navigation.goBack();
70
+ }
71
+ }}
72
+ routeConfig={{
73
+ LOGIN: 'Login',
74
+ FORGOT_PASSWORD: 'ForgotPassword',
75
+ RESET_PASSWORD: 'ResetPassword',
76
+ REGISTER_INVITE: 'RegisterInvite',
77
+ REGISTER_SELF: 'SelfRegister',
78
+ SUPPORT: 'ContactSupport',
79
+ }}
80
+ rememberMeDetails={{ email: rememberMe ? email : '', rememberMe: rememberMe }}
81
+ >
82
+ <Drawer.Navigator
83
+ screenOptions={{
84
+ headerShown: false,
85
+ drawerType: 'front',
86
+ drawerStyle: { backgroundColor: 'transparent' },
87
+ }}
88
+ drawerContent={(props: any): ReactNode => <CustomDrawerContent {...props} />}
89
+ backBehavior="history"
90
+ initialRouteName="Login"
91
+ >
92
+ {!app.isAuthenticated && (
93
+ <Drawer.Screen
94
+ options={{
95
+ swipeEnabled: false,
96
+ }}
97
+ name="Login"
98
+ component={Login}
99
+ />
100
+ )}
101
+ {!app.isAuthenticated && (
102
+ <Drawer.Screen
103
+ options={{
104
+ swipeEnabled: false,
105
+ }}
106
+ name="ForgotPassword"
107
+ component={ForgotPasswordScreen}
108
+ />
109
+ )}
110
+ {!app.isAuthenticated && (
111
+ <Drawer.Screen
112
+ options={{
113
+ swipeEnabled: false,
114
+ }}
115
+ name="ResetPassword"
116
+ component={ResetPasswordScreen}
117
+ />
118
+ )}
119
+
120
+ {app.isAuthenticated && <Drawer.Screen name="Homepage" component={Homepage} />}
121
+ {app.isAuthenticated && <Drawer.Screen name="Dashboard" component={Dashboard} />}
122
+ {app.isAuthenticated && <Drawer.Screen name="Locations" component={Locations} />}
123
+
124
+ <Drawer.Screen
125
+ name="ContactSupport"
126
+ options={{
127
+ swipeEnabled: false,
128
+ }}
129
+ component={ContactSupportScreen}
130
+ />
131
+ {app.isAuthenticated && (
132
+ <Drawer.Screen
133
+ name="ChangePassword"
134
+ options={{
135
+ swipeEnabled: false,
136
+ }}
137
+ component={ChangePassword}
138
+ />
139
+ )}
140
+ </Drawer.Navigator>
141
+ </AuthContextProvider>
142
+ </>
143
+ );
144
+ };
145
+
146
+ const RegistrationRouter = (): any => {
147
+ const app = useApp();
148
+ const navigation = useNavigation<NativeStackNavigationProp<any>>();
149
+ const RegistrationStack = createNativeStackNavigator();
150
+
151
+ return (
152
+ <>
153
+ <RegistrationContextProvider
154
+ language={app.language}
155
+ actions={ProjectRegistrationUIActions()}
156
+ i18n={i18nAppInstance}
157
+ routeConfig={{
158
+ LOGIN: 'Login',
159
+ FORGOT_PASSWORD: 'ForgotPassword',
160
+ RESET_PASSWORD: 'ResetPassword',
161
+ REGISTER_INVITE: 'RegisterInvite',
162
+ REGISTER_SELF: 'SelfRegister',
163
+ SUPPORT: 'ContactSupport',
164
+ }}
165
+ navigate={(destination: -1 | string) => {
166
+ if (typeof destination === 'string') {
167
+ switch (destination) {
168
+ case 'SelfRegister':
169
+ case 'RegisterInvite':
170
+ navigation.navigate('RegistrationProviderExample', { screen: destination });
171
+ break;
172
+ default:
173
+ navigation.navigate(destination);
174
+ break;
175
+ }
176
+ } else if (destination === -1) {
177
+ navigation.goBack();
178
+ }
179
+ }}
180
+ >
181
+ <RegistrationStack.Navigator
182
+ screenOptions={{
183
+ headerShown: false,
184
+ }}
185
+ initialRouteName="SelfRegister"
186
+ >
187
+ {!app.isAuthenticated && (
188
+ <RegistrationStack.Screen
189
+ name="SelfRegister"
190
+ component={Registration}
191
+ ></RegistrationStack.Screen>
192
+ )}
193
+ {!app.isAuthenticated && (
194
+ <RegistrationStack.Screen
195
+ name="RegisterInvite"
196
+ component={RegistrationInvite}
197
+ ></RegistrationStack.Screen>
198
+ )}
199
+ </RegistrationStack.Navigator>
200
+ </RegistrationContextProvider>
201
+ </>
202
+ );
203
+ };
204
+ export const MainRouter = (): any => {
205
+ const { height, width } = Dimensions.get('screen');
206
+ return (
207
+ <NavigationContainer ref={navigationRef}>
208
+ <Stack.Navigator
209
+ initialRouteName={'AuthProviderExample'}
210
+ screenOptions={{
211
+ headerShown: false,
212
+ orientation: width >= 768 && height >= 768 ? 'all' : 'portrait',
213
+ }}
214
+ >
215
+ <Stack.Screen name="AuthProviderExample" component={AuthRouter} />
216
+ <Stack.Screen name="RegistrationProviderExample" component={RegistrationRouter} />
217
+ </Stack.Navigator>
218
+ </NavigationContainer>
219
+ );
220
+ };
@@ -1,50 +1,63 @@
1
1
  import { Drawer, DrawerBody, DrawerHeader, DrawerNavGroup, NavItem } from '@brightlayer-ui/react-native-components';
2
- import React, { useState, useCallback } from 'react';
3
- import * as Colors from '@brightlayer-ui/colors';
4
- import { StackNavigationProp } from '@react-navigation/stack';
2
+ import React, { useState, useCallback, useEffect } from 'react';
5
3
  import { RootStackParamList } from './index';
6
-
7
- export const navGroupItems: NavItem[] = [
8
- {
9
- title: 'Home Page',
10
- itemID: 'Home',
11
- icon: { name: 'home' },
12
- },
13
- {
14
- title: 'Page One',
15
- itemID: 'PageOne',
16
- icon: { name: 'looks-one' },
17
- },
18
- {
19
- title: 'Page Two',
20
- itemID: 'PageTwo',
21
- icon: { name: 'looks-two' },
22
- },
23
- ];
4
+ import { DrawerActions } from '@react-navigation/native';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { IconFamily } from '@brightlayer-ui/react-native-components/core/__types__';
7
+ import { NativeStackNavigationProp } from '@react-navigation/native-stack';
24
8
 
25
9
  export type NavDrawerProps = {
26
- navigation: StackNavigationProp<RootStackParamList, 'NavigationDrawer'>;
10
+ navigation: NativeStackNavigationProp<RootStackParamList, 'NavigationDrawer'>;
27
11
  };
28
12
 
29
13
  export const NavigationDrawer: React.FC<NavDrawerProps> = ({ navigation }) => {
30
14
  const [selected, setSelected] = useState('Home');
15
+ const { t } = useTranslation();
16
+ const navigationState = navigation.getState();
17
+ const Homepage: IconFamily = { family: 'material', name: 'home', direction: 'ltr' };
18
+ const Dashboard: IconFamily = { family: 'material', name: 'dashboard', direction: 'ltr' };
19
+ const Notifications: IconFamily = { family: 'material', name: 'notifications', direction: 'ltr' };
31
20
  const selectItem = useCallback(
32
- (id) => {
21
+ (id: any) => {
33
22
  navigation.navigate(id);
34
23
  setSelected(id);
35
24
  },
36
25
  [navigation]
37
26
  );
38
27
 
28
+ const navGroupItems: NavItem[] = [
29
+ {
30
+ title: `${t('TOOLBAR_MENU.HOME_PAGE')}`,
31
+ itemID: 'Homepage',
32
+ icon: Homepage,
33
+ },
34
+ {
35
+ title: `${t('DRAWER_MENU.DASHBOARD')}`,
36
+ itemID: 'Dashboard',
37
+ icon: Dashboard,
38
+ },
39
+ {
40
+ title: `${t('DRAWER_MENU.LOCATIONS')}`,
41
+ itemID: 'Locations',
42
+ icon: Notifications,
43
+ },
44
+ ];
45
+
46
+ useEffect(() => {
47
+ const id = navGroupItems[navigationState.index]?.itemID;
48
+ if (id) {
49
+ setSelected(id);
50
+ }
51
+ }, [navigationState.index, navGroupItems]);
52
+
39
53
  return (
40
54
  <Drawer activeItem={selected} onItemSelect={(id: string): void => selectItem(id)}>
41
55
  <DrawerHeader
42
56
  title={'Brightlayer UI'}
43
57
  subtitle={'React Native Project'}
44
- fontColor={Colors.white[50]}
45
58
  icon={{ name: 'menu' }}
46
59
  onIconPress={(): void => {
47
- navigation.closeDrawer();
60
+ navigation.dispatch(DrawerActions.closeDrawer());
48
61
  }}
49
62
  />
50
63
  <DrawerBody>
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { ChangePasswordScreen } from '@brightlayer-ui/react-native-auth-workflow';
3
+ import { useApp } from '../contexts/AppContextProvider';
4
+ import { LocalStorage } from '../store/local-storage';
5
+
6
+ export const ChangePassword = (): JSX.Element => {
7
+ const app = useApp();
8
+ const logOut = (): void => {
9
+ LocalStorage.clearAuthCredentials();
10
+ app.onUserNotAuthenticated();
11
+ app.setLoginData({ email: '', rememberMe: false });
12
+ };
13
+
14
+ return <ChangePasswordScreen onFinish={(): void => logOut()} showSuccessScreen />;
15
+ };