@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 +1 -1
- package/package.json +1 -1
- package/template/App.tsx +40 -12
- package/template/android/app/build.gradle +0 -1
- package/template/babel.config.js +1 -1
- package/template/ios/Podfile.lock +12 -2
- package/template/okta.config.js +10 -0
- package/template/package.json +7 -4
- package/template/src/components/UserMenuComponent.tsx +40 -4
- package/template/src/contexts/RegistrationContext.tsx +26 -0
- package/template/src/navigation/index.tsx +56 -61
- package/template/src/navigation/navigation-drawer.tsx +8 -9
- package/template/src/screens/ChangePassword.tsx +20 -4
- package/template/src/screens/OktaLogin.tsx +58 -0
- package/template/yarn.lock +123 -19
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
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
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
55
|
-
|
|
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
|
) : (
|
package/template/babel.config.js
CHANGED
|
@@ -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 (
|
|
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:
|
|
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
|
+
};
|
package/template/package.json
CHANGED
|
@@ -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": "^
|
|
21
|
-
"@brightlayer-ui/react-native-components": "^
|
|
22
|
-
"@brightlayer-ui/react-native-themes": "^
|
|
23
|
-
"@brightlayer-ui/react-native-vector-icons": "^
|
|
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
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
19
|
+
// below line is not need for okta workflow
|
|
20
|
+
// app.setLoginData({ email: '', rememberMe: false });
|
|
12
21
|
};
|
|
13
22
|
|
|
14
|
-
|
|
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
|
+
};
|
package/template/yarn.lock
CHANGED
|
@@ -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@^
|
|
1098
|
-
version "
|
|
1099
|
-
resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-auth-workflow/-/react-native-auth-workflow-
|
|
1100
|
-
integrity sha512-
|
|
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@^
|
|
1107
|
-
version "
|
|
1108
|
-
resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-components/-/react-native-components-
|
|
1109
|
-
integrity sha512-
|
|
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
|
-
|
|
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 "
|
|
1116
|
-
react-native-reanimated "^3.
|
|
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-
|
|
1127
|
-
version "
|
|
1128
|
-
resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-native-
|
|
1129
|
-
integrity sha512-
|
|
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.
|
|
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
|
|
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
|
|
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"
|