@brightlayer-ui/react-native-template-authentication-typescript 4.0.0-alpha.0 → 4.0.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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## v4.0.0 (Unreleased)
3
+ ## v4.0.0 (July 30, 2025)
4
4
 
5
5
  ### Changed
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightlayer-ui/react-native-template-authentication-typescript",
3
- "version": "4.0.0-alpha.0",
3
+ "version": "4.0.0",
4
4
  "author": "brightlayer-ui <brightlayer-ui@eaton.com>",
5
5
  "keywords": [
6
6
  "react native",
package/template/App.tsx CHANGED
@@ -15,12 +15,12 @@ import { blue, blueDark } from '@brightlayer-ui/react-native-themes';
15
15
  import i18nAppInstance from './translations/i18n';
16
16
  import { I18nextProvider, useTranslation } from 'react-i18next';
17
17
  import { AppContext, AppContextType } from './src/contexts/AppContextProvider';
18
- import { LocalStorage } from './src/store/local-storage';
19
18
  import { Spinner } from '@brightlayer-ui/react-native-auth-workflow';
20
19
  import AsyncStorage from '@react-native-async-storage/async-storage';
21
- // import { NativeModules, Platform } from 'react-native';
20
+ import { NativeModules, Platform } from 'react-native';
21
+ import { isAuthenticated as isOktaAuthenticated, EventEmitter, getAccessToken } from '@okta/okta-react-native';
22
22
 
23
- export const App = (): JSX.Element => {
23
+ export const App = (): React.JSX.Element => {
24
24
  const [theme, setTheme] = useState<ThemeType>('light');
25
25
  const [language, setLanguage] = useState('en');
26
26
  const [isAuthenticated, setAuthenticated] = useState<AppContextType['isAuthenticated']>(false);
@@ -37,25 +37,54 @@ export const App = (): JSX.Element => {
37
37
  setLanguage(storedLanguage);
38
38
  void i18n.changeLanguage(storedLanguage);
39
39
  } else {
40
- const locale = 'en';
41
- // Platform.OS === 'ios'
42
- // ? NativeModules.SettingsManager.settings.AppleLocale
43
- // : NativeModules.I18nManager.localeIdentifier;
40
+ let locale = 'en';
41
+ locale =
42
+ Platform.OS === 'ios'
43
+ ? NativeModules.SettingsManager.settings.AppleLocale ||
44
+ NativeModules.SettingsManager.settings.AppleLocale[0]
45
+ : NativeModules.I18nManager.localeIdentifier;
44
46
  setLanguage(locale?.substring(0, 2) || 'en');
45
47
  }
46
48
  } catch (error) {
49
+ let locale = 'en';
50
+ locale =
51
+ Platform.OS === 'ios'
52
+ ? NativeModules.SettingsManager.settings.AppleLocale ||
53
+ NativeModules.SettingsManager.settings.AppleLocale[0]
54
+ : NativeModules.I18nManager.localeIdentifier;
55
+ setLanguage(locale?.substring(0, 2) || 'en');
47
56
  console.error('Error getting language from Async Storage:', error);
48
57
  }
49
58
  };
59
+
60
+ const handleSignInSuccess = (): any => {
61
+ setAuthenticated(true);
62
+ try {
63
+ getAccessToken() // eslint-disable-next-line
64
+ .then((res) => console.log(res.access_token)) // eslint-disable-next-line
65
+ .catch((err) => console.log(err));
66
+ } catch (error) {
67
+ console.error('Okta error for access token', error);
68
+ }
69
+ };
70
+
71
+ useEffect(() => {
72
+ EventEmitter.addListener('signInSuccess', handleSignInSuccess);
73
+
74
+ return (): any => {
75
+ EventEmitter.removeAllListeners('signInSuccess');
76
+ };
77
+ }, []);
78
+
50
79
  // handle initialization of auth data on first load
51
80
  useEffect(() => {
52
81
  const initialize = async (): Promise<void> => {
53
82
  try {
54
- const userData = await LocalStorage.readAuthData();
55
- setLoginData({ email: userData.rememberMeData.user, rememberMe: userData.rememberMeData.rememberMe });
56
- setAuthenticated(Boolean(userData.userId));
83
+ const authState = await isOktaAuthenticated();
84
+ setAuthenticated(Boolean(authState?.authenticated));
57
85
  await getLanguage();
58
- } catch {
86
+ } catch (error) {
87
+ console.error('Error initializing authentication state:', error);
59
88
  // handle any error state, rejected promises, etc..
60
89
  } finally {
61
90
  setIsLoading(false);
@@ -64,7 +93,6 @@ export const App = (): JSX.Element => {
64
93
  // eslint-disable-next-line
65
94
  initialize();
66
95
  }, []);
67
-
68
96
  return isLoading ? (
69
97
  <Spinner visible={isLoading} />
70
98
  ) : (
@@ -120,4 +120,3 @@ dependencies {
120
120
  }
121
121
 
122
122
  apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
123
- apply from: "../../node_modules/@brightlayer-ui/react-native-vector-icons/fonts.gradle"
@@ -1,5 +1,5 @@
1
1
  module.exports = {
2
2
  presets: ['module:@react-native/babel-preset'],
3
3
  // react-native-reanimated/plugin must be listed last
4
- plugins: ['react-native-reanimated/plugin'],
4
+ plugins: ['module:react-native-dotenv', 'react-native-reanimated/plugin'],
5
5
  };
@@ -1778,6 +1778,8 @@ PODS:
1778
1778
  - ReactCommon/turbomodule/core
1779
1779
  - SocketRocket
1780
1780
  - Yoga
1781
+ - react-native-vector-icons-material-design-icons (12.2.0)
1782
+ - react-native-vector-icons-material-icons (12.2.0)
1781
1783
  - react-native-webview (13.15.0):
1782
1784
  - boost
1783
1785
  - DoubleConversion
@@ -2281,7 +2283,7 @@ PODS:
2281
2283
  - React-perflogger (= 0.80.1)
2282
2284
  - React-utils (= 0.80.1)
2283
2285
  - SocketRocket
2284
- - RNBLUIVectorIcons (2.4.0):
2286
+ - RNBLUIVectorIcons (3.0.0):
2285
2287
  - React
2286
2288
  - RNCAsyncStorage (2.2.0):
2287
2289
  - boost
@@ -2690,6 +2692,8 @@ DEPENDENCIES:
2690
2692
  - react-native-pager-view (from `../node_modules/react-native-pager-view`)
2691
2693
  - react-native-restart (from `../node_modules/react-native-restart`)
2692
2694
  - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
2695
+ - "react-native-vector-icons-material-design-icons (from `../node_modules/@react-native-vector-icons/material-design-icons`)"
2696
+ - "react-native-vector-icons-material-icons (from `../node_modules/@react-native-vector-icons/material-icons`)"
2693
2697
  - react-native-webview (from `../node_modules/react-native-webview`)
2694
2698
  - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
2695
2699
  - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`)
@@ -2828,6 +2832,10 @@ EXTERNAL SOURCES:
2828
2832
  :path: "../node_modules/react-native-restart"
2829
2833
  react-native-safe-area-context:
2830
2834
  :path: "../node_modules/react-native-safe-area-context"
2835
+ react-native-vector-icons-material-design-icons:
2836
+ :path: "../node_modules/@react-native-vector-icons/material-design-icons"
2837
+ react-native-vector-icons-material-icons:
2838
+ :path: "../node_modules/@react-native-vector-icons/material-icons"
2831
2839
  react-native-webview:
2832
2840
  :path: "../node_modules/react-native-webview"
2833
2841
  React-NativeModulesApple:
@@ -2957,6 +2965,8 @@ SPEC CHECKSUMS:
2957
2965
  react-native-pager-view: 6e60acfd433ace1a7a1af75bd80b619a41478640
2958
2966
  react-native-restart: 0bc732f4461709022a742bb29bcccf6bbc5b4863
2959
2967
  react-native-safe-area-context: d3738f0c3b1fcefaed874a45891b0d44306c47c1
2968
+ react-native-vector-icons-material-design-icons: e406b4fc1787999a5d150c897837150543e90b9c
2969
+ react-native-vector-icons-material-icons: 02aacdc7a2aa4d22dd841eaddad080a5f967b888
2960
2970
  react-native-webview: 9a8ea59197aa76145b8ce72aa3eea69f1e89dd38
2961
2971
  React-NativeModulesApple: 983f3483ef0a3446b56d490f09d579fba2442e17
2962
2972
  React-oscompat: 114036cd8f064558c9c1a0c04fc9ae5e1453706a
@@ -2989,7 +2999,7 @@ SPEC CHECKSUMS:
2989
2999
  ReactAppDependencyProvider: afd905e84ee36e1678016ae04d7370c75ed539be
2990
3000
  ReactCodegen: f8d5fb047c4cd9d2caade972cad9edac22521362
2991
3001
  ReactCommon: 17fd88849a174bf9ce45461912291aca711410fc
2992
- RNBLUIVectorIcons: c45655a90c6b6d2777bb6443c7088a63149c4b52
3002
+ RNBLUIVectorIcons: 60165888903e319a1ef8acf2e1e3ef2a9fc1192c
2993
3003
  RNCAsyncStorage: 1f04c8d56558e533277beda29187f571cf7eecb2
2994
3004
  RNCMaskedView: 4c5ee1c8667d56077246cc6d1977f77393923560
2995
3005
  RNGestureHandler: 5e1a1605659c22098719fc2e8aee453fe728f52e
@@ -0,0 +1,10 @@
1
+ export default {
2
+ oidc: {
3
+ clientId: process.env.OKTA_CLIENT_ID,
4
+ redirectUri: process.env.OKTA_REDIRECT_URI,
5
+ endSessionRedirectUri: process.env.OKTA_LOGOUT_REDIRECT_URI,
6
+ discoveryUri: process.env.OKTA_ISSUER,
7
+ scopes: ['openid', 'profile', 'offline_access', 'groups'],
8
+ requireHardwareBackedKeyStore: false,
9
+ },
10
+ };
@@ -17,13 +17,15 @@
17
17
  "dependencies": {
18
18
  "@brightlayer-ui/colors": "^4.0.0",
19
19
  "@brightlayer-ui/icons-svg": "^1.15.0",
20
- "@brightlayer-ui/react-native-auth-workflow": "^7.0.2",
21
- "@brightlayer-ui/react-native-components": "^8.0.4",
22
- "@brightlayer-ui/react-native-themes": "^7.0.1",
23
- "@brightlayer-ui/react-native-vector-icons": "^2.4.0",
20
+ "@brightlayer-ui/react-native-auth-workflow": "^8.0.0",
21
+ "@brightlayer-ui/react-native-components": "^9.0.0",
22
+ "@brightlayer-ui/react-native-themes": "^8.0.0",
23
+ "@brightlayer-ui/react-native-vector-icons": "^3.0.0",
24
24
  "@okta/okta-react-native": "^2.17.0",
25
25
  "@react-native-async-storage/async-storage": "^2.2.0",
26
26
  "@react-native-community/masked-view": "^0.1.11",
27
+ "@react-native-vector-icons/material-design-icons": "^12.2.0",
28
+ "@react-native-vector-icons/material-icons": "^12.2.0",
27
29
  "@react-native/new-app-screen": "0.80.0",
28
30
  "@react-navigation/drawer": "^6.6.6",
29
31
  "@react-navigation/native": "^6.1.9",
@@ -35,6 +37,7 @@
35
37
  "react": "^19.1.0",
36
38
  "react-i18next": "^15.5.3",
37
39
  "react-native": "^0.80.0",
40
+ "react-native-dotenv": "^3.4.11",
38
41
  "react-native-gesture-handler": "^2.26.0",
39
42
  "react-native-keyboard-aware-scroll-view": "^0.9.5",
40
43
  "react-native-modal": "^13.0.2",
@@ -2,7 +2,6 @@ import { InfoListItemProps, UserMenu } from '@brightlayer-ui/react-native-compon
2
2
  import React from 'react';
3
3
  import { Avatar } from 'react-native-paper';
4
4
  import * as BLUIColors from '@brightlayer-ui/colors';
5
- import { IconFamily } from '@brightlayer-ui/react-native-components/core/__types__';
6
5
  import SelectDropdown from 'react-native-select-dropdown';
7
6
  import { useTranslation } from 'react-i18next';
8
7
  import { useExtendedTheme } from '@brightlayer-ui/react-native-themes';
@@ -11,6 +10,8 @@ import AsyncStorage from '@react-native-async-storage/async-storage';
11
10
  import { LocalStorage } from '../store/local-storage';
12
11
  import { useNavigation } from '@react-navigation/native';
13
12
  import { NativeStackNavigationProp } from '@react-navigation/native-stack';
13
+ import { revokeAccessToken, clearTokens, signOut } from '@okta/okta-react-native';
14
+ import { IconFamily } from '@brightlayer-ui/react-native-components/core/__types__';
14
15
 
15
16
  const SwapIcon: IconFamily = {
16
17
  family: 'material',
@@ -53,10 +54,43 @@ export const UserMenuComponent: React.FC<UserMenuExampleProps> = (props) => {
53
54
  console.error('Error setting new language:', error);
54
55
  }
55
56
  };
56
- const logout = (): void => {
57
+ const logout = async (): Promise<void> => {
58
+ // Clear local credentials first
57
59
  LocalStorage.clearAuthCredentials();
60
+
61
+ // Try to sign out from Okta, but continue with local logout even if it fails
62
+ try {
63
+ await signOut();
64
+ } catch (signOutError) {
65
+ // eslint-disable-next-line no-console
66
+ console.error('Sign out from Okta failed:', signOutError);
67
+ }
68
+
69
+ try {
70
+ await revokeAccessToken();
71
+ } catch (revokeError) {
72
+ // eslint-disable-next-line no-console
73
+ console.error('Token revocation failed:', revokeError);
74
+ }
75
+
76
+ try {
77
+ await clearTokens();
78
+ } catch (clearError) {
79
+ // eslint-disable-next-line no-console
80
+ console.error('Clear tokens failed:', clearError);
81
+ }
82
+
83
+ // Always proceed with local logout regardless of Okta errors
58
84
  app.onUserNotAuthenticated();
59
85
  };
86
+ const handleLogout = (): void => {
87
+ logout().catch((error) => {
88
+ // Handle any errors here if needed
89
+ console.error('Logout process failed:', error);
90
+ // Even if logout fails, ensure user is logged out locally
91
+ app.onUserNotAuthenticated();
92
+ });
93
+ };
60
94
  const changePassword = (): void => {
61
95
  navigation.navigate('ChangePassword');
62
96
  };
@@ -81,7 +115,9 @@ export const UserMenuComponent: React.FC<UserMenuExampleProps> = (props) => {
81
115
  rightComponent: (
82
116
  <SelectDropdown
83
117
  defaultValue={languageOptions.find((option) => option.value === i18n.language)}
84
- onSelect={(item: any) => void handleLanguageChange(item.value)}
118
+ onSelect={(item) => {
119
+ void handleLanguageChange(item.value);
120
+ }}
85
121
  data={languageOptions}
86
122
  buttonStyle={{ backgroundColor: theme.colors.background }}
87
123
  buttonTextStyle={{ color: theme.colors.primary }}
@@ -94,7 +130,7 @@ export const UserMenuComponent: React.FC<UserMenuExampleProps> = (props) => {
94
130
  ),
95
131
  },
96
132
  { title: t('USER_MENU.CHANGE_PASSWORD'), icon: LockIcon, onPress: (): void => changePassword() },
97
- { title: t('USER_MENU.LOG_OUT'), icon: ExitToAppIcon, onPress: (): void => logout() },
133
+ { title: t('USER_MENU.LOG_OUT'), icon: ExitToAppIcon, onPress: handleLogout },
98
134
  ];
99
135
 
100
136
  return (
@@ -0,0 +1,26 @@
1
+ import React, { createContext, useState, useContext, ReactNode } from 'react';
2
+
3
+ type RegistrationContextType = {
4
+ isRequestingCode: number;
5
+ setIsRequestingCode: (value: number) => void;
6
+ };
7
+
8
+ const RegistrationContext = createContext<RegistrationContextType | undefined>(undefined);
9
+
10
+ export const RegistrationProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
11
+ const [isRequestingCode, setIsRequestingCode] = useState(0);
12
+
13
+ return (
14
+ <RegistrationContext.Provider value={{ isRequestingCode, setIsRequestingCode }}>
15
+ {children}
16
+ </RegistrationContext.Provider>
17
+ );
18
+ };
19
+
20
+ export const useRegistrationContext = (): RegistrationContextType => {
21
+ const context = useContext(RegistrationContext);
22
+ if (!context) {
23
+ throw new Error('useRegistrationContext must be used within a RegistrationProvider');
24
+ }
25
+ return context;
26
+ };
@@ -1,4 +1,4 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { ReactNode, useCallback } from 'react';
2
2
  import { NavigationContainer, createNavigationContainerRef, useNavigation } from '@react-navigation/native';
3
3
  import { useApp } from '../contexts/AppContextProvider';
4
4
  import {
@@ -16,7 +16,6 @@ import { Dimensions, View } from 'react-native';
16
16
  import { ProjectAuthUIActions } from '../actions/AuthUIActions';
17
17
  import { ProjectRegistrationUIActions } from '../actions/RegistrationUIActions';
18
18
 
19
- import { Login } from '../screens/Login';
20
19
  import { ChangePassword } from '../screens/ChangePassword';
21
20
  import { Registration } from '../screens/Registration';
22
21
  import { RegistrationInvite } from '../screens/RegistrationInvite';
@@ -25,9 +24,11 @@ import { Homepage } from '../screens/Homepage';
25
24
  import Locations from '../screens/Locations';
26
25
  import Dashboard from '../screens/Dashboard';
27
26
  import { NativeStackNavigationProp, createNativeStackNavigator } from '@react-navigation/native-stack';
27
+ import { OktaLogin } from '../screens/OktaLogin';
28
28
 
29
29
  const Stack = createNativeStackNavigator();
30
30
  const Drawer = createDrawerNavigator();
31
+ const LoginStack = createNativeStackNavigator();
31
32
  const navigationRef = createNavigationContainerRef();
32
33
 
33
34
  export type RootStackParamList = {
@@ -48,6 +49,57 @@ const AuthRouter = (): any => {
48
49
  const { email, rememberMe } = app.loginData;
49
50
  const navigation = useNavigation<NativeStackNavigationProp<any>>();
50
51
 
52
+ const LoginNavigatorComponent = useCallback(
53
+ () => (
54
+ <LoginStack.Navigator screenOptions={{ headerShown: false }}>
55
+ <LoginStack.Screen name="Login" component={OktaLogin} />
56
+ <LoginStack.Screen name="ForgotPassword" component={ForgotPasswordScreen} />
57
+ <LoginStack.Screen name="ResetPassword" component={ResetPasswordScreen} />
58
+ <LoginStack.Screen name="ContactSupport" component={ContactSupportScreen} />
59
+ </LoginStack.Navigator>
60
+ ),
61
+ []
62
+ );
63
+
64
+ const DrawerNavigatorComponent = (): any => (
65
+ <Drawer.Navigator
66
+ screenOptions={{
67
+ headerShown: false,
68
+ drawerType: 'front',
69
+ drawerStyle: { backgroundColor: 'transparent' },
70
+ }}
71
+ drawerContent={(props: any): ReactNode => <CustomDrawerContent {...props} />}
72
+ backBehavior="history"
73
+ initialRouteName="LoginScreen"
74
+ >
75
+ {!app.isAuthenticated && <Drawer.Screen name="LoginScreen" component={LoginNavigatorComponent} />}
76
+
77
+ {app.isAuthenticated && (
78
+ <>
79
+ <Drawer.Screen name="Homepage" component={Homepage} />
80
+ <Drawer.Screen name="Dashboard" component={Dashboard} />
81
+ <Drawer.Screen name="Locations" component={Locations} />
82
+
83
+ <Drawer.Screen
84
+ name="ContactSupport"
85
+ options={{
86
+ swipeEnabled: false,
87
+ }}
88
+ component={ContactSupportScreen}
89
+ />
90
+
91
+ <Drawer.Screen
92
+ name="ChangePassword"
93
+ options={{
94
+ swipeEnabled: false,
95
+ }}
96
+ component={ChangePassword}
97
+ />
98
+ </>
99
+ )}
100
+ </Drawer.Navigator>
101
+ );
102
+
51
103
  return (
52
104
  <>
53
105
  <AuthContextProvider
@@ -79,65 +131,7 @@ const AuthRouter = (): any => {
79
131
  }}
80
132
  rememberMeDetails={{ email: rememberMe ? email : '', rememberMe: rememberMe }}
81
133
  >
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>
134
+ {DrawerNavigatorComponent()}
141
135
  </AuthContextProvider>
142
136
  </>
143
137
  );
@@ -201,6 +195,7 @@ const RegistrationRouter = (): any => {
201
195
  </>
202
196
  );
203
197
  };
198
+
204
199
  export const MainRouter = (): any => {
205
200
  const { height, width } = Dimensions.get('screen');
206
201
  return (
@@ -1,24 +1,22 @@
1
- import { Drawer, DrawerBody, DrawerHeader, DrawerNavGroup } from '@brightlayer-ui/react-native-components';
2
- import React, { useState, useCallback, useEffect } from 'react';
1
+ import { Drawer, DrawerBody, DrawerHeader, DrawerNavGroup, NavItem } from '@brightlayer-ui/react-native-components';
2
+ import React, { useState, useCallback, useEffect, useMemo } from 'react';
3
+ import { StackNavigationProp } from '@react-navigation/stack';
3
4
  import { RootStackParamList } from './index';
4
5
  import { DrawerActions } from '@react-navigation/native';
5
6
  import { useTranslation } from 'react-i18next';
6
7
  import { IconFamily } from '@brightlayer-ui/react-native-components/core/__types__';
7
- import { NativeStackNavigationProp } from '@react-navigation/native-stack';
8
8
 
9
9
  export type NavDrawerProps = {
10
- navigation: NativeStackNavigationProp<RootStackParamList, 'NavigationDrawer'>;
10
+ navigation: StackNavigationProp<RootStackParamList, 'NavigationDrawer'>;
11
11
  };
12
12
 
13
13
  export const NavigationDrawer: React.FC<NavDrawerProps> = ({ navigation }) => {
14
14
  const [selected, setSelected] = useState('Home');
15
15
  const { t } = useTranslation();
16
16
  const navigationState = navigation.getState();
17
-
18
17
  const Homepage: IconFamily = { family: 'material', name: 'home', direction: 'ltr' };
19
18
  const Dashboard: IconFamily = { family: 'material', name: 'dashboard', direction: 'ltr' };
20
19
  const Notifications: IconFamily = { family: 'material', name: 'notifications', direction: 'ltr' };
21
-
22
20
  const selectItem = useCallback(
23
21
  (id: any) => {
24
22
  navigation.navigate(id);
@@ -27,8 +25,8 @@ export const NavigationDrawer: React.FC<NavDrawerProps> = ({ navigation }) => {
27
25
  [navigation]
28
26
  );
29
27
 
30
- const navGroupItems = React.useMemo(
31
- () => [
28
+ const navGroupItems = useMemo(
29
+ (): NavItem[] => [
32
30
  {
33
31
  title: `${t('TOOLBAR_MENU.HOME_PAGE')}`,
34
32
  itemID: 'Homepage',
@@ -45,7 +43,8 @@ export const NavigationDrawer: React.FC<NavDrawerProps> = ({ navigation }) => {
45
43
  icon: Notifications,
46
44
  },
47
45
  ],
48
- [t]
46
+
47
+ []
49
48
  );
50
49
 
51
50
  useEffect(() => {
@@ -2,14 +2,30 @@ import React from 'react';
2
2
  import { ChangePasswordScreen } from '@brightlayer-ui/react-native-auth-workflow';
3
3
  import { useApp } from '../contexts/AppContextProvider';
4
4
  import { LocalStorage } from '../store/local-storage';
5
+ import { clearTokens, revokeAccessToken } from '@okta/okta-react-native';
5
6
 
6
- export const ChangePassword = (): JSX.Element => {
7
+ export const ChangePassword = (): React.JSX.Element => {
7
8
  const app = useApp();
8
- const logOut = (): void => {
9
+ const logOut = async (): Promise<void> => {
9
10
  LocalStorage.clearAuthCredentials();
11
+ try {
12
+ await revokeAccessToken();
13
+ await clearTokens();
14
+ } catch (_error) {
15
+ // eslint-disable-next-line no-console
16
+ console.log(_error as Error);
17
+ }
10
18
  app.onUserNotAuthenticated();
11
- app.setLoginData({ email: '', rememberMe: false });
19
+ // below line is not need for okta workflow
20
+ // app.setLoginData({ email: '', rememberMe: false });
12
21
  };
13
22
 
14
- return <ChangePasswordScreen onFinish={(): void => logOut()} showSuccessScreen />;
23
+ const handleLogout = (): void => {
24
+ logOut().catch((error) => {
25
+ // Handle any errors here if needed
26
+ console.error(error);
27
+ });
28
+ };
29
+
30
+ return <ChangePasswordScreen onFinish={handleLogout} showSuccessScreen />;
15
31
  };
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import { Image } from 'react-native';
3
+ import {
4
+ OktaAuthContextProvider,
5
+ OktaLoginScreenProps,
6
+ OktaRedirectLoginScreen,
7
+ } from '@brightlayer-ui/react-native-auth-workflow';
8
+ import { useApp } from '../contexts/AppContextProvider';
9
+ import { useNavigation } from '@react-navigation/native';
10
+ import { NativeStackNavigationProp } from '@react-navigation/native-stack';
11
+ import i18nAppInstance from '../../translations/i18n';
12
+ import oktaConfig from '../../okta.config';
13
+
14
+ export const OktaLogin: React.FC<React.PropsWithChildren<OktaLoginScreenProps>> = () => {
15
+ const app = useApp();
16
+ const navigation = useNavigation<NativeStackNavigationProp<any>>();
17
+
18
+ return (
19
+ <OktaAuthContextProvider
20
+ language={app.language}
21
+ i18n={i18nAppInstance}
22
+ navigate={(destination: -1 | string) => {
23
+ if (typeof destination === 'string') {
24
+ switch (destination) {
25
+ case 'SelfRegister':
26
+ case 'RegisterInvite':
27
+ navigation.navigate('RegistrationProviderExample', { screen: destination });
28
+ break;
29
+ default:
30
+ navigation.navigate(destination);
31
+ break;
32
+ }
33
+ } else if (destination === -1) {
34
+ navigation.goBack();
35
+ }
36
+ }}
37
+ routeConfig={{
38
+ LOGIN: 'Login',
39
+ FORGOT_PASSWORD: 'ForgotPassword',
40
+ RESET_PASSWORD: 'ResetPassword',
41
+ REGISTER_INVITE: 'RegisterInvite',
42
+ REGISTER_SELF: 'SelfRegister',
43
+ SUPPORT: 'ContactSupport',
44
+ }}
45
+ >
46
+ <OktaRedirectLoginScreen
47
+ projectImage={
48
+ <Image
49
+ style={{ width: '100%' }}
50
+ resizeMode="contain"
51
+ source={require('../assets/images/eaton_stacked_logo.png')}
52
+ />
53
+ }
54
+ oktaConfigObject={oktaConfig.oidc}
55
+ />
56
+ </OktaAuthContextProvider>
57
+ );
58
+ };
@@ -1094,26 +1094,33 @@
1094
1094
  resolved "https://registry.yarnpkg.com/@brightlayer-ui/prettier-config/-/prettier-config-1.0.3.tgz#e40a7ae7435c6fd5118acbf249080e0aa81e93af"
1095
1095
  integrity sha512-EYm3+V7Qd+oYEF+8FadsXAZqXryEHHbGnrV1BMp9selhABjceqUqXPVE4Sn3SKWQdBNJ3En2A3EzgrzRbvRTaw==
1096
1096
 
1097
- "@brightlayer-ui/react-native-auth-workflow@^7.0.2":
1098
- version "7.0.2"
1099
- resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-auth-workflow/-/react-native-auth-workflow-7.0.2.tgz#98f6483bf7eba7ff90d8de749ed76776593cabf1"
1100
- integrity sha512-VPskmDL020D0sdI9G0lEZhApiiRybQsQwwUlX2VTyk9rLooI8/nTU4a8CfaxHmqAPYm16H3vKWJAG9kZlcMmdA==
1097
+ "@brightlayer-ui/react-native-auth-workflow@^8.0.0":
1098
+ version "8.0.0"
1099
+ resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-auth-workflow/-/react-native-auth-workflow-8.0.0.tgz#1f6aaedf72ea74433e5e993c5bc82ddb928fe1aa"
1100
+ integrity sha512-xJ670a1jf7V5HtQ0NnFmUw3X/zypWxANoTFDxyLsBJNhJ6ro/4M1pBovK596mastwsS9g6ReO4gwcNz4+1FtJQ==
1101
1101
  dependencies:
1102
1102
  "@brightlayer-ui/react-native-themes" "^7.0.1"
1103
+ "@types/react" "^19.0.0"
1104
+ "@types/react-dom" "^19.0.0"
1103
1105
  color "^4.2.3"
1104
1106
  lodash.clonedeep "^4.5.0"
1105
1107
 
1106
- "@brightlayer-ui/react-native-components@^8.0.4":
1107
- version "8.0.4"
1108
- resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-components/-/react-native-components-8.0.4.tgz#96a1932289b9111b3c23777673530c01a1bcd2b6"
1109
- integrity sha512-1dZ0E6IMWNYPA2sRVrMP6WLkJJ4r58aTP1snrTLZPrhOgXJNZRIXBGHPZw5Kahl7HjFeNnytZLYUNVVfNBY2Jw==
1108
+ "@brightlayer-ui/react-native-components@^9.0.0":
1109
+ version "9.0.0"
1110
+ resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-components/-/react-native-components-9.0.0.tgz#eb5412be3f9237e9ea92e21d25c9fe1d3ead74a2"
1111
+ integrity sha512-xQfpubAUgMDjOxKVIRjVgC0H20og2Ntx59xK84Zx1qO6P6PasECvXYl+CyqTCWlXptJ0rcBeWZzEWhjqGw7izQ==
1110
1112
  dependencies:
1111
1113
  "@brightlayer-ui/react-native-themes" "7.0.1"
1114
+ "@callstack/react-theme-provider" "^3.0.9"
1115
+ "@types/prop-types" "^15.7.15"
1116
+ "@types/react" "^19.0.0"
1117
+ "@types/react-dom" "^19.0.0"
1112
1118
  color "^4.2.3"
1113
- react-native-collapsible "^1.6.0"
1119
+ prop-types "^15.8.1"
1120
+ react-native-collapsible "^1.6.2"
1114
1121
  react-native-keyboard-aware-scroll-view "^0.9.5"
1115
- react-native-modal ">=13.0.1"
1116
- react-native-reanimated "^3.6.1"
1122
+ react-native-modal "^13.0.1"
1123
+ react-native-reanimated "^3.18.0"
1117
1124
 
1118
1125
  "@brightlayer-ui/react-native-themes@7.0.1", "@brightlayer-ui/react-native-themes@^7.0.1":
1119
1126
  version "7.0.1"
@@ -1123,10 +1130,22 @@
1123
1130
  "@brightlayer-ui/colors" "4.0.0"
1124
1131
  color "^4.2.3"
1125
1132
 
1126
- "@brightlayer-ui/react-native-vector-icons@^2.4.0":
1127
- version "2.4.0"
1128
- resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-vector-icons/-/react-native-vector-icons-2.4.0.tgz#99236f898e423346350db1a90c731ad5644b562c"
1129
- integrity sha512-USFMjyoDGybaVux7wfeN1Kmo8h8rM3PooNEv+YTV84XkH1K+M3ASf6dQ/PSWaoCvRFb/xv0Du9FQ744wN4keog==
1133
+ "@brightlayer-ui/react-native-themes@^8.0.0":
1134
+ version "8.0.0"
1135
+ resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-themes/-/react-native-themes-8.0.0.tgz#93b36733b5d31c780574a5340b637c8f57c1e7ba"
1136
+ integrity sha512-87j5m7/eUkSvDyF89HMxGQHtvaVNgtUdPRzLtPzDD0AkyQ4uFdCMgzHydZdGOemMw/bGdyrdcwUn46tFrWVL7w==
1137
+ dependencies:
1138
+ "@brightlayer-ui/colors" "4.0.0"
1139
+ "@callstack/react-theme-provider" "^3.0.9"
1140
+ color "^4.2.3"
1141
+ react-native-safe-area-context "5.4.1"
1142
+
1143
+ "@brightlayer-ui/react-native-vector-icons@^3.0.0":
1144
+ version "3.0.0"
1145
+ resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-vector-icons/-/react-native-vector-icons-3.0.0.tgz#599f404caa7777bf8c403e99858e05a106a86725"
1146
+ integrity sha512-lJC81d6sn13W0rhjennuZcoHpEEDfn/EEzNuQ1z0u1hZCzlzYs2gH7moN2vrTNczyjsOBYIq1aeLKdvpceQGlg==
1147
+ dependencies:
1148
+ "@react-native-vector-icons/common" "^12.0.0"
1130
1149
 
1131
1150
  "@callstack/react-theme-provider@^3.0.9":
1132
1151
  version "3.0.9"
@@ -1882,6 +1901,22 @@
1882
1901
  prompts "^2.4.2"
1883
1902
  semver "^7.5.2"
1884
1903
 
1904
+ "@react-native-community/cli-tools@^17.0.0":
1905
+ version "17.0.0"
1906
+ resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-17.0.0.tgz#c46bae5e5ffeee7067d0e55d2ee1de128e310ac3"
1907
+ integrity sha512-mVXH7U/uXd7yizqm2iE+W4SSVc4FGYYEafAu29HihA+FHttonqdg35zVAnIX2FKbyla+TotR1ACNSgo7KFDq+w==
1908
+ dependencies:
1909
+ "@vscode/sudo-prompt" "^9.0.0"
1910
+ appdirsjs "^1.2.4"
1911
+ chalk "^4.1.2"
1912
+ execa "^5.0.0"
1913
+ find-up "^5.0.0"
1914
+ launch-editor "^2.9.1"
1915
+ mime "^2.4.1"
1916
+ ora "^5.4.1"
1917
+ prompts "^2.4.2"
1918
+ semver "^7.5.2"
1919
+
1885
1920
  "@react-native-community/cli-types@19.0.0":
1886
1921
  version "19.0.0"
1887
1922
  resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-19.0.0.tgz#fe4266eac8ce8ea58bee1a253af9a4ff3543241a"
@@ -1915,6 +1950,29 @@
1915
1950
  resolved "https://registry.yarnpkg.com/@react-native-community/masked-view/-/masked-view-0.1.11.tgz#2f4c6e10bee0786abff4604e39a37ded6f3980ce"
1916
1951
  integrity sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw==
1917
1952
 
1953
+ "@react-native-vector-icons/common@^12.0.0", "@react-native-vector-icons/common@^12.2.0":
1954
+ version "12.2.0"
1955
+ resolved "https://registry.yarnpkg.com/@react-native-vector-icons/common/-/common-12.2.0.tgz#9d42cddd6dc87ba1f7daf7386150034b0ed8caa7"
1956
+ integrity sha512-FGVwBwuio2A9N9sJckXeTwp/oe20hCMe/Zul+b1ql3WkhUJpdJWVbpWKp8ikpHLRRstwuUqkeM5eY74f0zNn1A==
1957
+ dependencies:
1958
+ "@react-native-community/cli-tools" "^17.0.0"
1959
+ picocolors "^1.1.1"
1960
+ plist "^3.1.0"
1961
+
1962
+ "@react-native-vector-icons/material-design-icons@^12.2.0":
1963
+ version "12.2.0"
1964
+ resolved "https://registry.yarnpkg.com/@react-native-vector-icons/material-design-icons/-/material-design-icons-12.2.0.tgz#e606320ae031c56cee231f515d3b1f0334a06b42"
1965
+ integrity sha512-XFGkuTLATGMH5RtcbuiJ18mMFKsge5PZjiS+cs+/KwFCWMMznRiQkZlycIVOx52V1WFE+L6oBv3Z6r+L6HHekA==
1966
+ dependencies:
1967
+ "@react-native-vector-icons/common" "^12.2.0"
1968
+
1969
+ "@react-native-vector-icons/material-icons@^12.2.0":
1970
+ version "12.2.0"
1971
+ resolved "https://registry.yarnpkg.com/@react-native-vector-icons/material-icons/-/material-icons-12.2.0.tgz#53838fe85fc45f139ae7eaf352c184e6d8fddc10"
1972
+ integrity sha512-ZOG1sryGmbZ0s/TBHQ28dMpdTKZ/RR/rhkuXgvMRjiX+vlvV91FmySH5P7NM0zcvqK6BEgONLRtRDaL7zz4xRw==
1973
+ dependencies:
1974
+ "@react-native-vector-icons/common" "^12.2.0"
1975
+
1918
1976
  "@react-native/assets-registry@0.80.1":
1919
1977
  version "0.80.1"
1920
1978
  resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.80.1.tgz#f692115d706e2b9b1847fca81ad8c2bbec67f6ef"
@@ -2419,6 +2477,16 @@
2419
2477
  dependencies:
2420
2478
  undici-types "~7.8.0"
2421
2479
 
2480
+ "@types/prop-types@^15.7.15":
2481
+ version "15.7.15"
2482
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7"
2483
+ integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==
2484
+
2485
+ "@types/react-dom@^19.0.0":
2486
+ version "19.1.6"
2487
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.1.6.tgz#4af629da0e9f9c0f506fc4d1caa610399c595d64"
2488
+ integrity sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==
2489
+
2422
2490
  "@types/react-native-vector-icons@^6.4.18":
2423
2491
  version "6.4.18"
2424
2492
  resolved "https://registry.yarnpkg.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.18.tgz#18671c617b9d0958747bc959903470dde91a8c79"
@@ -2441,7 +2509,7 @@
2441
2509
  dependencies:
2442
2510
  "@types/react" "*"
2443
2511
 
2444
- "@types/react@*", "@types/react@^19.1.8":
2512
+ "@types/react@*", "@types/react@^19.0.0", "@types/react@^19.1.8":
2445
2513
  version "19.1.8"
2446
2514
  resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.8.tgz#ff8395f2afb764597265ced15f8dddb0720ae1c3"
2447
2515
  integrity sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==
@@ -2810,6 +2878,11 @@
2810
2878
  resolved "https://registry.yarnpkg.com/@vscode/sudo-prompt/-/sudo-prompt-9.3.1.tgz#c562334bc6647733649fd42afc96c0eea8de3b65"
2811
2879
  integrity sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA==
2812
2880
 
2881
+ "@xmldom/xmldom@^0.8.8":
2882
+ version "0.8.10"
2883
+ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
2884
+ integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
2885
+
2813
2886
  Base64@1.1.0:
2814
2887
  version "1.1.0"
2815
2888
  resolved "https://registry.yarnpkg.com/Base64/-/Base64-1.1.0.tgz#810ef21afa8357df92ad7b5389188c446b9cb956"
@@ -3931,6 +4004,11 @@ dot-case@^3.0.4:
3931
4004
  no-case "^3.0.4"
3932
4005
  tslib "^2.0.3"
3933
4006
 
4007
+ dotenv@^16.4.5:
4008
+ version "16.6.1"
4009
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020"
4010
+ integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==
4011
+
3934
4012
  dunder-proto@^1.0.0, dunder-proto@^1.0.1:
3935
4013
  version "1.0.1"
3936
4014
  resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
@@ -6808,6 +6886,15 @@ pkg-dir@^4.2.0:
6808
6886
  dependencies:
6809
6887
  find-up "^4.0.0"
6810
6888
 
6889
+ plist@^3.1.0:
6890
+ version "3.1.0"
6891
+ resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9"
6892
+ integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
6893
+ dependencies:
6894
+ "@xmldom/xmldom" "^0.8.8"
6895
+ base64-js "^1.5.1"
6896
+ xmlbuilder "^15.1.1"
6897
+
6811
6898
  possible-typed-array-names@^1.0.0:
6812
6899
  version "1.1.0"
6813
6900
  resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae"
@@ -7001,11 +7088,18 @@ react-native-animatable@1.4.0:
7001
7088
  dependencies:
7002
7089
  prop-types "^15.8.1"
7003
7090
 
7004
- react-native-collapsible@^1.6.0:
7091
+ react-native-collapsible@^1.6.2:
7005
7092
  version "1.6.2"
7006
7093
  resolved "https://registry.yarnpkg.com/react-native-collapsible/-/react-native-collapsible-1.6.2.tgz#3b67fa402a6ba3c291022f5db8f345083862c3d8"
7007
7094
  integrity sha512-MCOBVJWqHNjnDaGkvxX997VONmJeebh6wyJxnHEgg0L1PrlcXU1e/bo6eK+CDVFuMrCafw8Qh4DOv/C4V/+Iew==
7008
7095
 
7096
+ react-native-dotenv@^3.4.11:
7097
+ version "3.4.11"
7098
+ resolved "https://registry.yarnpkg.com/react-native-dotenv/-/react-native-dotenv-3.4.11.tgz#2e6c4eabd55d5f1bf109b3dd9141dadf9c55cdd4"
7099
+ integrity sha512-6vnIE+WHABSeHCaYP6l3O1BOEhWxKH6nHAdV7n/wKn/sciZ64zPPp2NUdEUf1m7g4uuzlLbjgr+6uDt89q2DOg==
7100
+ dependencies:
7101
+ dotenv "^16.4.5"
7102
+
7009
7103
  react-native-gesture-handler@^2.26.0:
7010
7104
  version "2.27.1"
7011
7105
  resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.27.1.tgz#8865b2345f4c65536517f20cedc420481fc72d49"
@@ -7038,7 +7132,7 @@ react-native-keyboard-aware-scroll-view@^0.9.5:
7038
7132
  prop-types "^15.6.2"
7039
7133
  react-native-iphone-x-helper "^1.0.3"
7040
7134
 
7041
- react-native-modal@>=13.0.1, react-native-modal@^13.0.2:
7135
+ react-native-modal@^13.0.1, react-native-modal@^13.0.2:
7042
7136
  version "13.0.2"
7043
7137
  resolved "https://registry.yarnpkg.com/react-native-modal/-/react-native-modal-13.0.2.tgz#4e4d777fdb0f5af5a50003a53eebc4de9ead5695"
7044
7138
  integrity sha512-jCUR2DAskuZtVIbnt2ZssX70DCbTLydkL1Glv1Fc/fqVIhq1LpwBK2hKgSf9VIINXFnDjjGIMIC9HhDXnW7Enw==
@@ -7059,7 +7153,7 @@ react-native-paper@^5.14.5:
7059
7153
  color "^3.1.2"
7060
7154
  use-latest-callback "^0.2.3"
7061
7155
 
7062
- react-native-reanimated@^3.18.0, react-native-reanimated@^3.6.1:
7156
+ react-native-reanimated@^3.18.0:
7063
7157
  version "3.18.0"
7064
7158
  resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.18.0.tgz#0a246eab38a9e807887fe561a2868cfe85351f3c"
7065
7159
  integrity sha512-eVcNcqeOkMW+BUWAHdtvN3FKgC8J8wiEJkX6bNGGQaLS7m7e4amTfjIcqf/Ta+lerZLurmDaQ0lICI1CKPrb1Q==
@@ -7082,6 +7176,11 @@ react-native-restart@^0.0.27:
7082
7176
  resolved "https://registry.yarnpkg.com/react-native-restart/-/react-native-restart-0.0.27.tgz#43aa8210312c9dfa5ec7bd4b2f35238ad7972b19"
7083
7177
  integrity sha512-8KScVICrXwcTSJ1rjWkqVTHyEKQIttm5AIMGSK1QG1+RS5owYlE4z/1DykOTdWfVl9l16FIk0w9Xzk9ZO6jxlA==
7084
7178
 
7179
+ react-native-safe-area-context@5.4.1:
7180
+ version "5.4.1"
7181
+ resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.4.1.tgz#6d04eac20f99622fa13895fa7ae96199f1ecf800"
7182
+ integrity sha512-x+g3NblZ9jof8y+XkVvaGlpMrSlixhrJJ33BRzhTAKUKctQVecO1heSXmzxc5UdjvGYBKS6kPZVUw2b8NxHcPg==
7183
+
7085
7184
  react-native-safe-area-context@^5.5.0:
7086
7185
  version "5.5.1"
7087
7186
  resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.5.1.tgz#9fac8ae5da8b9ff6f77eb3f697e073f04a1f2f3f"
@@ -8425,6 +8524,11 @@ xhr2@0.1.3:
8425
8524
  resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.3.tgz#cbfc4759a69b4a888e78cf4f20b051038757bd11"
8426
8525
  integrity sha512-6RmGK22QwC7yXB1CRwyLWuS2opPcKOlAu0ViAnyZjDlzrEmCKL4kLHkfvB8oMRWeztMsNoDGAjsMZY15w/4tTw==
8427
8526
 
8527
+ xmlbuilder@^15.1.1:
8528
+ version "15.1.1"
8529
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"
8530
+ integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
8531
+
8428
8532
  y18n@^4.0.0:
8429
8533
  version "4.0.3"
8430
8534
  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"