@axelor/aos-mobile-core 9.0.10 → 9.0.12
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/lib/api/axios-init.d.ts +10 -0
- package/lib/api/axios-init.js +43 -0
- package/lib/api/axios-init.js.map +1 -0
- package/lib/api/index.d.ts +2 -1
- package/lib/api/index.js +2 -1
- package/lib/api/index.js.map +1 -1
- package/lib/api/login-api.d.ts +2 -16
- package/lib/api/login-api.js +13 -27
- package/lib/api/login-api.js.map +1 -1
- package/lib/apiProviders/Standard/ObjectFieldsProvider.d.ts +2 -0
- package/lib/apiProviders/Standard/ObjectFieldsProvider.js +17 -2
- package/lib/apiProviders/Standard/ObjectFieldsProvider.js.map +1 -1
- package/lib/apiProviders/Standard/index.d.ts +1 -1
- package/lib/apiProviders/Standard/index.js +1 -1
- package/lib/apiProviders/Standard/index.js.map +1 -1
- package/lib/apiProviders/Standard/requests.helper.d.ts +2 -1
- package/lib/apiProviders/Standard/requests.helper.js +7 -4
- package/lib/apiProviders/Standard/requests.helper.js.map +1 -1
- package/lib/components/organisms/ScannerAutocompleteSearch/ScannerAutocompleteSearch.js +8 -5
- package/lib/components/organisms/ScannerAutocompleteSearch/ScannerAutocompleteSearch.js.map +1 -1
- package/lib/features/authSlice.d.ts +51 -4
- package/lib/features/authSlice.js +108 -13
- package/lib/features/authSlice.js.map +1 -1
- package/lib/features/scannerSlice.d.ts +2 -0
- package/lib/features/scannerSlice.js +8 -2
- package/lib/features/scannerSlice.js.map +1 -1
- package/lib/hooks/use-mass-scanner.js +6 -4
- package/lib/hooks/use-mass-scanner.js.map +1 -1
- package/lib/hooks/use-scan-activator.d.ts +1 -1
- package/lib/hooks/use-scan-activator.js +4 -4
- package/lib/hooks/use-scan-activator.js.map +1 -1
- package/lib/i18n/translations/en.json +17 -0
- package/lib/i18n/translations/fr.json +17 -0
- package/lib/navigator/components/DrawerContent.d.ts +1 -1
- package/lib/navigator/components/DrawerContent.js +16 -7
- package/lib/navigator/components/DrawerContent.js.map +1 -1
- package/lib/navigator/components/menu/Menu.d.ts +4 -2
- package/lib/navigator/components/menu/Menu.js +8 -2
- package/lib/navigator/components/menu/Menu.js.map +1 -1
- package/lib/navigator/helpers/index.d.ts +1 -1
- package/lib/navigator/helpers/index.js +1 -1
- package/lib/navigator/helpers/index.js.map +1 -1
- package/lib/navigator/helpers/menu.helper.d.ts +5 -4
- package/lib/navigator/helpers/menu.helper.js +17 -6
- package/lib/navigator/helpers/menu.helper.js.map +1 -1
- package/lib/screens/LoginScreen.js +2 -1
- package/lib/screens/LoginScreen.js.map +1 -1
- package/lib/screens/SessionManagementScreen.js +2 -1
- package/lib/screens/SessionManagementScreen.js.map +1 -1
- package/lib/sessions/components/alerts/MfaVerificationPopup.d.ts +3 -0
- package/lib/sessions/components/alerts/MfaVerificationPopup.js +136 -0
- package/lib/sessions/components/alerts/MfaVerificationPopup.js.map +1 -0
- package/lib/sessions/components/alerts/index.d.ts +1 -0
- package/lib/sessions/components/alerts/index.js +1 -0
- package/lib/sessions/components/alerts/index.js.map +1 -1
- package/lib/sessions/components/inputs/MfaCodeInput.d.ts +10 -0
- package/lib/sessions/components/inputs/MfaCodeInput.js +38 -0
- package/lib/sessions/components/inputs/MfaCodeInput.js.map +1 -0
- package/lib/sessions/components/inputs/index.d.ts +1 -0
- package/lib/sessions/components/inputs/index.js +1 -0
- package/lib/sessions/components/inputs/index.js.map +1 -1
- package/lib/sessions/index.d.ts +1 -0
- package/lib/sessions/index.js +1 -0
- package/lib/sessions/index.js.map +1 -1
- package/lib/sessions/mfa/api.d.ts +7 -0
- package/lib/sessions/mfa/api.js +71 -0
- package/lib/sessions/mfa/api.js.map +1 -0
- package/lib/sessions/mfa/errors.d.ts +14 -0
- package/lib/sessions/mfa/errors.js +36 -0
- package/lib/sessions/mfa/errors.js.map +1 -0
- package/lib/sessions/mfa/index.d.ts +6 -0
- package/lib/sessions/mfa/index.js +23 -0
- package/lib/sessions/mfa/index.js.map +1 -0
- package/lib/sessions/mfa/type.d.ts +34 -0
- package/lib/sessions/mfa/type.js +35 -0
- package/lib/sessions/mfa/type.js.map +1 -0
- package/lib/sessions/mfa/use-email-code.d.ts +14 -0
- package/lib/sessions/mfa/use-email-code.js +74 -0
- package/lib/sessions/mfa/use-email-code.js.map +1 -0
- package/lib/sessions/mfa/utils.d.ts +7 -0
- package/lib/sessions/mfa/utils.js +60 -0
- package/lib/sessions/mfa/utils.js.map +1 -0
- package/lib/utils/object.d.ts +1 -1
- package/lib/utils/string.d.ts +3 -3
- package/lib/utils/string.js +5 -7
- package/lib/utils/string.js.map +1 -1
- package/package.json +8 -8
|
@@ -16,29 +16,28 @@
|
|
|
16
16
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
|
|
19
|
-
import {
|
|
19
|
+
import { getActiveUserInfo, loginApi, logoutApi } from '../api/login-api';
|
|
20
|
+
import { ejectAxios } from '../api/axios-init';
|
|
20
21
|
import { apiProviderConfig } from '../apiProviders/config';
|
|
21
|
-
import { saveUrlInStorage } from '../sessions';
|
|
22
|
+
import { MfaVerifyErrorCode, saveUrlInStorage, verifyMfaApi } from '../sessions';
|
|
22
23
|
import { checkNullString, testUrl } from '../utils';
|
|
23
24
|
import { modulesProvider } from '../app';
|
|
24
25
|
import { webSocketProvider } from '../websocket';
|
|
25
26
|
import { resetConfigs } from './appConfigSlice';
|
|
26
|
-
|
|
27
|
-
const urlWithProtocol = await testUrl(url);
|
|
28
|
-
const { token, jsessionId, requestInterceptorId, responseInterceptorId } = await loginApi(urlWithProtocol, username, password);
|
|
27
|
+
async function finalizeLogin({ token, jsessionId, requestInterceptorId, responseInterceptorId }, url, dispatch) {
|
|
29
28
|
const { userId, applicationMode } = await getActiveUserInfo();
|
|
30
|
-
saveUrlInStorage(
|
|
29
|
+
saveUrlInStorage(url);
|
|
31
30
|
apiProviderConfig.setSessionExpired(false);
|
|
32
|
-
closePopup?.();
|
|
33
31
|
modulesProvider.getModuleRegisters().forEach(_f => _f(userId));
|
|
34
32
|
webSocketProvider.initWebSocket({
|
|
35
|
-
baseUrl:
|
|
33
|
+
baseUrl: url,
|
|
36
34
|
token,
|
|
37
35
|
jsessionId,
|
|
38
36
|
});
|
|
39
37
|
dispatch(resetConfigs());
|
|
40
38
|
return {
|
|
41
|
-
|
|
39
|
+
phase: 'session',
|
|
40
|
+
url,
|
|
42
41
|
token,
|
|
43
42
|
jsessionId,
|
|
44
43
|
userId,
|
|
@@ -46,6 +45,45 @@ export const login = createAsyncThunk('auth/login', async ({ url, username, pass
|
|
|
46
45
|
responseInterceptorId,
|
|
47
46
|
applicationMode,
|
|
48
47
|
};
|
|
48
|
+
}
|
|
49
|
+
export const login = createAsyncThunk('auth/login', async ({ url, username, password, closePopup }, { dispatch }) => {
|
|
50
|
+
const urlWithProtocol = await testUrl(url);
|
|
51
|
+
const result = await loginApi(urlWithProtocol, username, password);
|
|
52
|
+
if (result.kind === 'mfa') {
|
|
53
|
+
closePopup?.();
|
|
54
|
+
return {
|
|
55
|
+
phase: 'mfa',
|
|
56
|
+
url: urlWithProtocol,
|
|
57
|
+
mfaState: {
|
|
58
|
+
username: result.username,
|
|
59
|
+
methods: result.methods,
|
|
60
|
+
emailRetryAfter: result.emailRetryAfter,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
closePopup?.();
|
|
65
|
+
return finalizeLogin(result, urlWithProtocol, dispatch);
|
|
66
|
+
});
|
|
67
|
+
export const verifyMfa = createAsyncThunk('auth/verifyMfa', async ({ mfaCode, mfaMethod }, { getState, dispatch, rejectWithValue }) => {
|
|
68
|
+
const { baseUrl, mfaState } = getState()?.auth ?? {};
|
|
69
|
+
if (!baseUrl || !mfaState?.username) {
|
|
70
|
+
return rejectWithValue({ code: MfaVerifyErrorCode.SESSION_LOST });
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const result = await verifyMfaApi(baseUrl, {
|
|
74
|
+
username: mfaState.username,
|
|
75
|
+
mfaCode,
|
|
76
|
+
mfaMethod,
|
|
77
|
+
});
|
|
78
|
+
return finalizeLogin(result, baseUrl, dispatch);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
if (e?.code === MfaVerifyErrorCode.INVALID_CODE ||
|
|
82
|
+
e?.code === MfaVerifyErrorCode.SESSION_LOST) {
|
|
83
|
+
return rejectWithValue({ code: e.code });
|
|
84
|
+
}
|
|
85
|
+
throw e;
|
|
86
|
+
}
|
|
49
87
|
});
|
|
50
88
|
export const isUrlValid = createAsyncThunk('auth/isUrlValid', async ({ url }) => {
|
|
51
89
|
if (!checkNullString(url)) {
|
|
@@ -64,6 +102,8 @@ export const logout = createAsyncThunk('auth/logout', async function (_, { getSt
|
|
|
64
102
|
const initialState = {
|
|
65
103
|
loading: false,
|
|
66
104
|
logged: false,
|
|
105
|
+
mfaPending: false,
|
|
106
|
+
mfaState: null,
|
|
67
107
|
userId: null,
|
|
68
108
|
baseUrl: null,
|
|
69
109
|
token: null,
|
|
@@ -89,32 +129,85 @@ export const authSlice = createSlice({
|
|
|
89
129
|
state[key] = value;
|
|
90
130
|
});
|
|
91
131
|
},
|
|
132
|
+
cancelMfa: state => {
|
|
133
|
+
state.mfaPending = false;
|
|
134
|
+
state.mfaState = null;
|
|
135
|
+
state.error = null;
|
|
136
|
+
},
|
|
92
137
|
},
|
|
93
138
|
extraReducers: builder => {
|
|
94
139
|
builder.addCase(login.pending, state => {
|
|
95
140
|
state.logged = false;
|
|
96
141
|
state.loading = true;
|
|
142
|
+
state.mfaPending = false;
|
|
143
|
+
state.mfaState = null;
|
|
97
144
|
state.baseUrl = null;
|
|
98
145
|
state.token = null;
|
|
99
146
|
state.error = null;
|
|
100
147
|
});
|
|
101
148
|
builder.addCase(login.fulfilled, (state, action) => {
|
|
102
|
-
const
|
|
103
|
-
state.logged = token != null;
|
|
149
|
+
const payload = action.payload ?? {};
|
|
104
150
|
state.loading = false;
|
|
151
|
+
state.error = null;
|
|
152
|
+
if (payload.phase === 'mfa') {
|
|
153
|
+
state.logged = false;
|
|
154
|
+
state.mfaPending = true;
|
|
155
|
+
state.mfaState = payload.mfaState;
|
|
156
|
+
state.baseUrl = payload.url;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const { url, token, jsessionId, userId, requestInterceptorId, responseInterceptorId, applicationMode, } = payload;
|
|
160
|
+
state.logged = token != null;
|
|
161
|
+
state.mfaPending = false;
|
|
162
|
+
state.mfaState = null;
|
|
105
163
|
state.userId = userId;
|
|
106
164
|
state.baseUrl = url;
|
|
107
165
|
state.token = token;
|
|
108
166
|
state.jsessionId = jsessionId;
|
|
109
|
-
state.error = null;
|
|
110
167
|
state.requestInterceptorId = requestInterceptorId;
|
|
111
168
|
state.responseInterceptorId = responseInterceptorId;
|
|
112
169
|
state.applicationMode = applicationMode;
|
|
113
170
|
});
|
|
114
171
|
builder.addCase(login.rejected, (state, action) => {
|
|
115
172
|
state.loading = false;
|
|
173
|
+
state.mfaPending = false;
|
|
174
|
+
state.mfaState = null;
|
|
116
175
|
state.error = { ...action.error, url: action.meta?.arg?.url };
|
|
117
176
|
});
|
|
177
|
+
builder.addCase(verifyMfa.pending, state => {
|
|
178
|
+
state.loading = true;
|
|
179
|
+
state.error = null;
|
|
180
|
+
});
|
|
181
|
+
builder.addCase(verifyMfa.fulfilled, (state, action) => {
|
|
182
|
+
const { url, token, jsessionId, userId, requestInterceptorId, responseInterceptorId, applicationMode, } = action.payload ?? {};
|
|
183
|
+
state.loading = false;
|
|
184
|
+
state.logged = token != null;
|
|
185
|
+
state.mfaPending = false;
|
|
186
|
+
state.mfaState = null;
|
|
187
|
+
state.userId = userId;
|
|
188
|
+
state.baseUrl = url;
|
|
189
|
+
state.token = token;
|
|
190
|
+
state.jsessionId = jsessionId;
|
|
191
|
+
state.requestInterceptorId = requestInterceptorId;
|
|
192
|
+
state.responseInterceptorId = responseInterceptorId;
|
|
193
|
+
state.applicationMode = applicationMode;
|
|
194
|
+
state.error = null;
|
|
195
|
+
});
|
|
196
|
+
builder.addCase(verifyMfa.rejected, (state, action) => {
|
|
197
|
+
state.loading = false;
|
|
198
|
+
const code = action.payload?.code;
|
|
199
|
+
if (code === MfaVerifyErrorCode.SESSION_LOST) {
|
|
200
|
+
state.mfaPending = false;
|
|
201
|
+
state.mfaState = null;
|
|
202
|
+
state.error = { message: MfaVerifyErrorCode.SESSION_LOST };
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (code === MfaVerifyErrorCode.INVALID_CODE) {
|
|
206
|
+
state.error = { message: MfaVerifyErrorCode.INVALID_CODE };
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
state.error = { ...action.error };
|
|
210
|
+
});
|
|
118
211
|
builder.addCase(isUrlValid.fulfilled, (state, action) => {
|
|
119
212
|
state.error = null;
|
|
120
213
|
});
|
|
@@ -124,6 +217,8 @@ export const authSlice = createSlice({
|
|
|
124
217
|
builder.addCase(logout.fulfilled, state => {
|
|
125
218
|
state.logged = false;
|
|
126
219
|
state.loading = false;
|
|
220
|
+
state.mfaPending = false;
|
|
221
|
+
state.mfaState = null;
|
|
127
222
|
state.userId = null;
|
|
128
223
|
state.token = null;
|
|
129
224
|
state.jsessionId = null;
|
|
@@ -134,6 +229,6 @@ export const authSlice = createSlice({
|
|
|
134
229
|
});
|
|
135
230
|
},
|
|
136
231
|
});
|
|
137
|
-
export const { clearError, setAppVersion, updateAuthState } = authSlice.actions;
|
|
232
|
+
export const { clearError, setAppVersion, updateAuthState, cancelMfa } = authSlice.actions;
|
|
138
233
|
export const authReducer = authSlice.reducer;
|
|
139
234
|
//# sourceMappingURL=authSlice.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authSlice.js","sourceRoot":"","sources":["../../src/features/authSlice.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"authSlice.js","sourceRoot":"","sources":["../../src/features/authSlice.js"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ interface ScannerSliceState {
|
|
|
2
2
|
isEnabled: boolean;
|
|
3
3
|
scanKey: string | null;
|
|
4
4
|
scannedValue: string | null;
|
|
5
|
+
isMassScan: boolean;
|
|
5
6
|
}
|
|
6
7
|
export declare const enableScan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scanner/enableScan">, scanValue: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scanner/scanValue">, disableScan: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"scanner/disableScan">, clearScan: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"scanner/clearScan">;
|
|
7
8
|
export declare const useScannerSelector: () => ScannerSliceState;
|
|
@@ -10,5 +11,6 @@ declare const _default: import("redux").Reducer<{
|
|
|
10
11
|
isEnabled: boolean;
|
|
11
12
|
scanKey: any;
|
|
12
13
|
scannedValue: any;
|
|
14
|
+
isMassScan: boolean;
|
|
13
15
|
}>;
|
|
14
16
|
export default _default;
|
|
@@ -24,12 +24,17 @@ const scannerSlice = createSlice({
|
|
|
24
24
|
isEnabled: false,
|
|
25
25
|
scanKey: null,
|
|
26
26
|
scannedValue: null,
|
|
27
|
+
isMassScan: false,
|
|
27
28
|
},
|
|
28
29
|
reducers: {
|
|
29
30
|
enableScan(state, action) {
|
|
31
|
+
const { scanKey, isMassScan } = typeof action.payload === 'string'
|
|
32
|
+
? { scanKey: action.payload, isMassScan: false }
|
|
33
|
+
: action.payload;
|
|
30
34
|
state.isEnabled = true;
|
|
31
|
-
state.scanKey =
|
|
35
|
+
state.scanKey = scanKey;
|
|
32
36
|
state.scannedValue = null;
|
|
37
|
+
state.isMassScan = isMassScan ?? false;
|
|
33
38
|
},
|
|
34
39
|
scanValue(state, action) {
|
|
35
40
|
state.scannedValue = action.payload;
|
|
@@ -38,6 +43,7 @@ const scannerSlice = createSlice({
|
|
|
38
43
|
state.isEnabled = false;
|
|
39
44
|
state.scanKey = null;
|
|
40
45
|
state.scannedValue = null;
|
|
46
|
+
state.isMassScan = false;
|
|
41
47
|
},
|
|
42
48
|
clearScan(state) {
|
|
43
49
|
state.scannedValue = null;
|
|
@@ -45,7 +51,7 @@ const scannerSlice = createSlice({
|
|
|
45
51
|
},
|
|
46
52
|
});
|
|
47
53
|
export const { enableScan, scanValue, disableScan, clearScan } = scannerSlice.actions;
|
|
48
|
-
const selectScanner = state => state.scanner;
|
|
54
|
+
const selectScanner = (state) => state.scanner;
|
|
49
55
|
export const useScannerSelector = () => useSelector(selectScanner);
|
|
50
56
|
export const useScannedValueByKey = key => {
|
|
51
57
|
const { scanKey, scannedValue } = useScannerSelector();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scannerSlice.js","sourceRoot":"","sources":["../../src/features/scannerSlice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"scannerSlice.js","sourceRoot":"","sources":["../../src/features/scannerSlice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAS7C,MAAM,YAAY,GAAG,WAAW,CAAC;IAC/B,IAAI,EAAE,SAAS;IACf,YAAY,EAAE;QACZ,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;KAClB;IACD,QAAQ,EAAE;QACR,UAAU,CAAC,KAAK,EAAE,MAAM;YACtB,MAAM,EAAC,OAAO,EAAE,UAAU,EAAC,GACzB,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAChC,CAAC,CAAC,EAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAC;gBAC9C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAErB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YACvB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACxB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,UAAU,IAAI,KAAK,CAAC;QACzC,CAAC;QACD,SAAS,CAAC,KAAK,EAAE,MAAM;YACrB,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;QACtC,CAAC;QACD,WAAW,CAAC,KAAK;YACf,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YACxB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,CAAC;QACD,SAAS,CAAC,KAAK;YACb,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;QAC5B,CAAC;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAC,GAC1D,YAAY,CAAC,OAAO,CAAC;AAEvB,MAAM,aAAa,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;AAEpD,MAAM,CAAC,MAAM,kBAAkB,GAA4B,GAAG,EAAE,CAC9D,WAAW,CAAC,aAAa,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,oBAAoB,GAAmC,GAAG,CAAC,EAAE;IACxE,MAAM,EAAC,OAAO,EAAE,YAAY,EAAC,GAAG,kBAAkB,EAAE,CAAC;IACrD,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAC7C,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,CAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC,OAAO,CAAC"}
|
|
@@ -20,10 +20,12 @@ import { useDispatch } from '../redux/hooks';
|
|
|
20
20
|
import { useCameraScannerValueByKey, clearBarcode, } from '../features/cameraScannerSlice';
|
|
21
21
|
import { clearScan, useScannedValueByKey, useScannerSelector, } from '../features/scannerSlice';
|
|
22
22
|
import { useScanActivator } from './use-scan-activator';
|
|
23
|
+
import { useIsFocused } from './use-navigation';
|
|
23
24
|
export const useMassScanner = ({ scanKey, backgroundAction, fallbackAction, scanInterval = 1000, disableOnError = true, }) => {
|
|
24
25
|
const isProcessingRef = useRef(false);
|
|
25
26
|
const timerRef = useRef(null);
|
|
26
27
|
const dispatch = useDispatch();
|
|
28
|
+
const isFocused = useIsFocused();
|
|
27
29
|
const { isEnabled: isScanEnabled, scanKey: activeScanKey } = useScannerSelector();
|
|
28
30
|
const { enable: enableScan, disable: disableScan, isZebraDevice, } = useScanActivator(scanKey, true);
|
|
29
31
|
const scannedBarcode = useCameraScannerValueByKey(scanKey);
|
|
@@ -58,15 +60,15 @@ export const useMassScanner = ({ scanKey, backgroundAction, fallbackAction, scan
|
|
|
58
60
|
const processScanRef = useRef(processScan);
|
|
59
61
|
processScanRef.current = processScan;
|
|
60
62
|
useEffect(() => {
|
|
61
|
-
if (scannedValue) {
|
|
63
|
+
if (isFocused && scannedValue) {
|
|
62
64
|
processScanRef.current(scannedValue, () => dispatch(clearScan()));
|
|
63
65
|
}
|
|
64
|
-
}, [dispatch, scannedValue]);
|
|
66
|
+
}, [dispatch, isFocused, scannedValue]);
|
|
65
67
|
useEffect(() => {
|
|
66
|
-
if (scannedBarcode?.value) {
|
|
68
|
+
if (isFocused && scannedBarcode?.value) {
|
|
67
69
|
processScanRef.current(scannedBarcode.value, () => dispatch(clearBarcode()));
|
|
68
70
|
}
|
|
69
|
-
}, [dispatch, scannedBarcode?.value]);
|
|
71
|
+
}, [dispatch, isFocused, scannedBarcode?.value]);
|
|
70
72
|
return useMemo(() => ({ disableScan, enableScan, isEnabled }), [disableScan, enableScan, isEnabled]);
|
|
71
73
|
};
|
|
72
74
|
//# sourceMappingURL=use-mass-scanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-mass-scanner.js","sourceRoot":"","sources":["../../src/hooks/use-mass-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,0BAA0B,EAC1B,YAAY,GACb,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"use-mass-scanner.js","sourceRoot":"","sources":["../../src/hooks/use-mass-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ export declare const useScanActivator: (scanKeySearch: string, isMassScan?: bool
|
|
|
3
3
|
enable: () => void;
|
|
4
4
|
isZebraDevice: boolean;
|
|
5
5
|
};
|
|
6
|
-
export declare const useScannerDeviceActivator: (scanKeySearch: string) => {
|
|
6
|
+
export declare const useScannerDeviceActivator: (scanKeySearch: string, isMassScan?: boolean) => {
|
|
7
7
|
enable: () => void;
|
|
8
8
|
disable: () => void;
|
|
9
9
|
};
|
|
@@ -21,7 +21,7 @@ import { disableCameraScanner, enableCameraScanner, enableMassCameraScanner, } f
|
|
|
21
21
|
import { enableScan, disableScan } from '../features/scannerSlice';
|
|
22
22
|
import { useDispatch } from '../redux/hooks';
|
|
23
23
|
export const useScanActivator = (scanKeySearch, isMassScan = false) => {
|
|
24
|
-
const { enable: enableScanner, disable: disableScanner } = useScannerDeviceActivator(scanKeySearch);
|
|
24
|
+
const { enable: enableScanner, disable: disableScanner } = useScannerDeviceActivator(scanKeySearch, isMassScan);
|
|
25
25
|
const { enable: enableCamera, enableMassCamera, disable: disableCamera, } = useCameraScannerActivator(scanKeySearch);
|
|
26
26
|
const [isZebraDevice, setIsZebraDevice] = useState(false);
|
|
27
27
|
useEffect(() => {
|
|
@@ -54,11 +54,11 @@ export const useScanActivator = (scanKeySearch, isMassScan = false) => {
|
|
|
54
54
|
}, [isZebraDevice, disableScanner, disableCamera]);
|
|
55
55
|
return useMemo(() => ({ disable, enable, isZebraDevice }), [disable, enable, isZebraDevice]);
|
|
56
56
|
};
|
|
57
|
-
export const useScannerDeviceActivator = (scanKeySearch) => {
|
|
57
|
+
export const useScannerDeviceActivator = (scanKeySearch, isMassScan = false) => {
|
|
58
58
|
const dispatch = useDispatch();
|
|
59
59
|
const enable = useCallback(() => {
|
|
60
|
-
dispatch(enableScan(scanKeySearch));
|
|
61
|
-
}, [dispatch, scanKeySearch]);
|
|
60
|
+
dispatch(enableScan({ scanKey: scanKeySearch, isMassScan }));
|
|
61
|
+
}, [dispatch, scanKeySearch, isMassScan]);
|
|
62
62
|
const disable = useCallback(() => {
|
|
63
63
|
dispatch(disableScan());
|
|
64
64
|
}, [dispatch]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-scan-activator.js","sourceRoot":"","sources":["../../src/hooks/use-scan-activator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAChE,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAC,UAAU,EAAE,WAAW,EAAC,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,aAAqB,EACrB,aAAsB,KAAK,EAC3B,EAAE;IACF,MAAM,EAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAC,GACpD,yBAAyB,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"use-scan-activator.js","sourceRoot":"","sources":["../../src/hooks/use-scan-activator.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,6 +81,23 @@
|
|
|
81
81
|
"Base_Connection_SessionNameAlreadyExist": "Session name already exists",
|
|
82
82
|
"Base_Connection_WrongPasswordOrUserName": "Wrong username or password",
|
|
83
83
|
"Base_Connection_InvalidUrl": "Invalid url",
|
|
84
|
+
"Auth_MFA_Title": "Two-factor authentication",
|
|
85
|
+
"Auth_MFA_VerificationCode": "Verification code",
|
|
86
|
+
"Auth_MFA_TOTP_Description": "Enter the code from your authentication app.",
|
|
87
|
+
"Auth_MFA_TOTP_Placeholder": "Authenticator code",
|
|
88
|
+
"Auth_MFA_TOTP_Method": "Authenticator app",
|
|
89
|
+
"Auth_MFA_EMAIL_Description": "Enter the code from verification email.",
|
|
90
|
+
"Auth_MFA_EMAIL_Placeholder": "Email code",
|
|
91
|
+
"Auth_MFA_EMAIL_Method": "Email verification",
|
|
92
|
+
"Auth_MFA_Verify": "Verify",
|
|
93
|
+
"Auth_MFA_ResendEmail": "Resend email",
|
|
94
|
+
"Auth_MFA_ResendEmailIn": "Resend email in {{count}}s",
|
|
95
|
+
"Auth_MFA_OtherOptions": "Other options",
|
|
96
|
+
"Auth_MFA_BackToLogin": "Back to login",
|
|
97
|
+
"Auth_MFA_InvalidCode": "Invalid verification code",
|
|
98
|
+
"Auth_MFA_GenericError": "Sorry, something went wrong. Please try again later.",
|
|
99
|
+
"Auth_MFA_SessionLost": "Your session has expired. Please log in again.",
|
|
100
|
+
"Auth_MFA_EmailSent": "A verification code has been sent by email.",
|
|
84
101
|
"Base_Connection_CreateSession": "Create a session",
|
|
85
102
|
"Base_Connection_EditSession": "Edit session",
|
|
86
103
|
"Base_Connection_DefaultSession": "Default session ?",
|
|
@@ -81,6 +81,23 @@
|
|
|
81
81
|
"Base_Connection_SessionNameAlreadyExist": "Ce nom de session existe déjà",
|
|
82
82
|
"Base_Connection_WrongPasswordOrUserName": "Mauvais nom d'utilisateur ou mot de passe",
|
|
83
83
|
"Base_Connection_InvalidUrl": "Url non valide",
|
|
84
|
+
"Auth_MFA_Title": "Authentification à deux facteurs",
|
|
85
|
+
"Auth_MFA_VerificationCode": "Code de vérification",
|
|
86
|
+
"Auth_MFA_TOTP_Description": "Saisissez le code de votre application d'authentification.",
|
|
87
|
+
"Auth_MFA_TOTP_Placeholder": "Code de l'application",
|
|
88
|
+
"Auth_MFA_TOTP_Method": "Application d'authentification",
|
|
89
|
+
"Auth_MFA_EMAIL_Description": "Saisissez le code reçu par e-mail.",
|
|
90
|
+
"Auth_MFA_EMAIL_Placeholder": "Code reçu par e-mail",
|
|
91
|
+
"Auth_MFA_EMAIL_Method": "Vérification par e-mail",
|
|
92
|
+
"Auth_MFA_Verify": "Vérifier",
|
|
93
|
+
"Auth_MFA_ResendEmail": "Renvoyer l'e-mail",
|
|
94
|
+
"Auth_MFA_ResendEmailIn": "Renvoyer l'e-mail dans {{count}}s",
|
|
95
|
+
"Auth_MFA_OtherOptions": "Autres options",
|
|
96
|
+
"Auth_MFA_BackToLogin": "Retour à la connexion",
|
|
97
|
+
"Auth_MFA_InvalidCode": "Code de vérification invalide",
|
|
98
|
+
"Auth_MFA_GenericError": "Une erreur est survenue. Veuillez réessayer plus tard.",
|
|
99
|
+
"Auth_MFA_SessionLost": "Votre session a expiré. Veuillez vous reconnecter.",
|
|
100
|
+
"Auth_MFA_EmailSent": "Un code de vérification a été envoyé par e-mail.",
|
|
84
101
|
"Base_Connection_CreateSession": "Créer une session",
|
|
85
102
|
"Base_Connection_EditSession": "Editer la session",
|
|
86
103
|
"Base_Connection_DefaultSession": "Session par défaut ?",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License
|
|
16
16
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
import React, { useRef, useMemo, useEffect, useCallback } from 'react';
|
|
18
|
+
import React, { useRef, useMemo, useEffect, useCallback, useState } from 'react';
|
|
19
19
|
import { StyleSheet, View, Animated, ScrollView } from 'react-native';
|
|
20
20
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
|
21
21
|
import { CommonActions, DrawerActions } from '@react-navigation/native';
|
|
@@ -24,7 +24,7 @@ import { authModule } from '../../auth';
|
|
|
24
24
|
import { PopupApplicationInformation, PopupMinimalRequiredVersion, } from '../../components';
|
|
25
25
|
import { useOutdatedVersion } from '../../hooks';
|
|
26
26
|
import { useActiveModule } from '../providers';
|
|
27
|
-
import { moduleHasMenus, numberOfModules, getDefaultMenuKey, hasSubMenus, } from '../helpers';
|
|
27
|
+
import { getModuleOfMenu, moduleHasMenus, numberOfModules, getDefaultMenuKey, hasSubMenus, } from '../helpers';
|
|
28
28
|
import { AuthMenu, Menu, MenuIconButton, MenuTitle } from './menu';
|
|
29
29
|
const DrawerContent = ({ state, modules, navigation, onModuleClick, onRefresh, versionCheckConfig, }) => {
|
|
30
30
|
const Colors = useThemeColor();
|
|
@@ -36,7 +36,7 @@ const DrawerContent = ({ state, modules, navigation, onModuleClick, onRefresh, v
|
|
|
36
36
|
?.filter(_module => _module.menus)
|
|
37
37
|
?.flatMap(_module => {
|
|
38
38
|
const result = [];
|
|
39
|
-
for (const [key, menu] of Object.entries(_module.menus)) {
|
|
39
|
+
for (const [key, menu] of Object.entries(_module.menus ?? {})) {
|
|
40
40
|
result.push(key);
|
|
41
41
|
if (hasSubMenus(menu)) {
|
|
42
42
|
result.push(...Object.keys(menu.subMenus));
|
|
@@ -50,11 +50,14 @@ const DrawerContent = ({ state, modules, navigation, onModuleClick, onRefresh, v
|
|
|
50
50
|
const styles = useMemo(() => getStyles(Colors), [Colors]);
|
|
51
51
|
const secondaryMenusLeft = useRef(new Animated.Value(0)).current;
|
|
52
52
|
const { activeModule } = useActiveModule();
|
|
53
|
-
const
|
|
53
|
+
const [innerMenuDisabled, setInnerMenuDisabled] = useState(false);
|
|
54
|
+
const innerMenuIsVisible = useMemo(() => !innerMenuDisabled && activeModule.name !== authModule.name, [activeModule.name, innerMenuDisabled]);
|
|
54
55
|
const drawerModules = useMemo(() => modules
|
|
55
56
|
.filter(moduleHasMenus)
|
|
56
57
|
.filter(_module => _module.name !== authModule.name), [modules]);
|
|
57
58
|
const externalMenuIsVisible = useMemo(() => numberOfModules(drawerModules) > 1, [drawerModules]);
|
|
59
|
+
const navigatedModule = useMemo(() => getModuleOfMenu(modules, state.routes?.[state.index]?.name), [modules, state.routes, state.index]);
|
|
60
|
+
const showRestoreNavigatedModule = useMemo(() => externalMenuIsVisible && navigatedModule != null, [externalMenuIsVisible, navigatedModule]);
|
|
58
61
|
const toggleSecondaryMenu = useCallback(() => {
|
|
59
62
|
const openConfig = { toValue: 0, duration: 300 };
|
|
60
63
|
const closeConfig = { toValue: 100, duration: 0 };
|
|
@@ -73,6 +76,7 @@ const DrawerContent = ({ state, modules, navigation, onModuleClick, onRefresh, v
|
|
|
73
76
|
})
|
|
74
77
|
: 0, [externalMenuIsVisible, secondaryMenusLeft]);
|
|
75
78
|
const handleModuleClick = (_module) => {
|
|
79
|
+
setInnerMenuDisabled(false);
|
|
76
80
|
onModuleClick(_module.name);
|
|
77
81
|
const defaultMenuKey = getDefaultMenuKey(_module);
|
|
78
82
|
if (defaultMenuKey) {
|
|
@@ -85,7 +89,7 @@ const DrawerContent = ({ state, modules, navigation, onModuleClick, onRefresh, v
|
|
|
85
89
|
return;
|
|
86
90
|
}
|
|
87
91
|
const focused = state.routes.indexOf(route) === state.index &&
|
|
88
|
-
Object.keys(activeModule.menus).includes(route.name);
|
|
92
|
+
Object.keys(activeModule.menus ?? {}).includes(route.name);
|
|
89
93
|
const event = navigation.emit({
|
|
90
94
|
type: 'drawerItemPress',
|
|
91
95
|
target: route.key,
|
|
@@ -111,7 +115,7 @@ const DrawerContent = ({ state, modules, navigation, onModuleClick, onRefresh, v
|
|
|
111
115
|
{externalMenuIsVisible && (<View style={styles.iconsContainer}>
|
|
112
116
|
<ScrollView showsVerticalScrollIndicator={false} contentContainerStyle={styles.scrollView}>
|
|
113
117
|
{drawerModules.map(_module => (<View style={styles.globalContainer} key={_module.name}>
|
|
114
|
-
<MenuIconButton style={styles.menuItemContainer} icon={_module.icon} subtitle={_module.subtitle} disabled={_module.disabled} isActive={_module.name === activeModule?.name} onPress={() => handleModuleClick(_module)} compatibility={_module.compatibilityAOS}/>
|
|
118
|
+
<MenuIconButton style={styles.menuItemContainer} icon={_module.icon ?? ''} subtitle={_module.subtitle} disabled={_module.disabled} isActive={_module.name === activeModule?.name} onPress={() => handleModuleClick(_module)} compatibility={_module.compatibilityAOS}/>
|
|
115
119
|
{!innerMenuIsVisible && (<MenuTitle module={_module} onPress={() => handleModuleClick(_module)}/>)}
|
|
116
120
|
</View>))}
|
|
117
121
|
</ScrollView>
|
|
@@ -123,7 +127,12 @@ const DrawerContent = ({ state, modules, navigation, onModuleClick, onRefresh, v
|
|
|
123
127
|
<Animated.View style={[styles.secondaryMenusContainer, { left: innerMenuPosition }]}>
|
|
124
128
|
<Menu activeModule={externalMenuIsVisible ? activeModule : drawerModules[0]} state={state} navigation={navigation} authMenu={<AuthMenu onPress={handleModuleClick} isVisible={!externalMenuIsVisible}/>} onItemClick={externalMenuIsVisible
|
|
125
129
|
? () => { }
|
|
126
|
-
: () => onModuleClick(drawerModules[0]?.name)} compatibility={externalMenuIsVisible
|
|
130
|
+
: () => onModuleClick(drawerModules[0]?.name)} compatibility={externalMenuIsVisible
|
|
131
|
+
? undefined
|
|
132
|
+
: drawerModules[0].compatibilityAOS} showClose={showRestoreNavigatedModule} onClose={() => {
|
|
133
|
+
setInnerMenuDisabled(true);
|
|
134
|
+
onModuleClick(navigatedModule?.name);
|
|
135
|
+
}}/>
|
|
127
136
|
</Animated.View>
|
|
128
137
|
</View>
|
|
129
138
|
</SafeAreaView>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrawerContent.js","sourceRoot":"","sources":["../../../src/navigator/components/DrawerContent.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,EAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DrawerContent.js","sourceRoot":"","sources":["../../../src/navigator/components/DrawerContent.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,9 @@ interface MenuProps {
|
|
|
7
7
|
authMenu?: React.ReactNode;
|
|
8
8
|
activeModule: Module;
|
|
9
9
|
onItemClick: () => void;
|
|
10
|
-
compatibility
|
|
10
|
+
compatibility?: Compatibility;
|
|
11
|
+
showClose?: boolean;
|
|
12
|
+
onClose?: () => void;
|
|
11
13
|
}
|
|
12
|
-
declare const Menu: ({ state, navigation, authMenu, activeModule, onItemClick, compatibility, }: MenuProps) => React.JSX.Element;
|
|
14
|
+
declare const Menu: ({ state, navigation, authMenu, activeModule, onItemClick, compatibility, showClose, onClose, }: MenuProps) => React.JSX.Element;
|
|
13
15
|
export default Menu;
|
|
@@ -17,18 +17,20 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import React, { useMemo } from 'react';
|
|
19
19
|
import { View, StyleSheet, ScrollView } from 'react-native';
|
|
20
|
-
import { Text, WarningCard } from '@axelor/aos-mobile-ui';
|
|
20
|
+
import { Icon, Text, useThemeColor, WarningCard } from '@axelor/aos-mobile-ui';
|
|
21
21
|
import { useTranslator } from '../../../i18n';
|
|
22
22
|
import { getCompatibilityError, getMenuTitle, isMenuIncompatible, } from '../../helpers';
|
|
23
23
|
import MenuItemList from './MenuItemList';
|
|
24
|
-
const Menu = ({ state, navigation, authMenu, activeModule, onItemClick, compatibility, }) => {
|
|
24
|
+
const Menu = ({ state, navigation, authMenu, activeModule, onItemClick, compatibility, showClose = false, onClose, }) => {
|
|
25
25
|
const I18n = useTranslator();
|
|
26
|
+
const Colors = useThemeColor();
|
|
26
27
|
const title = useMemo(() => getMenuTitle(activeModule, I18n), [I18n, activeModule]);
|
|
27
28
|
const compatibilityError = useMemo(() => isMenuIncompatible(compatibility), [compatibility]);
|
|
28
29
|
return (<View style={styles.menuContainer}>
|
|
29
30
|
<ScrollView contentContainerStyle={styles.moduleMenuContainer} showsVerticalScrollIndicator={false}>
|
|
30
31
|
<View style={styles.menuTitleContainer}>
|
|
31
32
|
<Text style={styles.menuTitle}>{title}</Text>
|
|
33
|
+
{showClose && (<Icon name="x-lg" size={20} color={Colors.secondaryColor_dark.background} touchable onPress={onClose}/>)}
|
|
32
34
|
</View>
|
|
33
35
|
{compatibilityError && (<WarningCard errorMessage={getCompatibilityError(compatibility, I18n)}/>)}
|
|
34
36
|
<MenuItemList state={state} navigation={navigation} activeModule={activeModule} onItemClick={onItemClick} disabled={compatibilityError}/>
|
|
@@ -47,10 +49,14 @@ const styles = StyleSheet.create({
|
|
|
47
49
|
paddingVertical: 8,
|
|
48
50
|
},
|
|
49
51
|
menuTitleContainer: {
|
|
52
|
+
flexDirection: 'row',
|
|
53
|
+
justifyContent: 'space-between',
|
|
54
|
+
alignItems: 'center',
|
|
50
55
|
paddingHorizontal: 16,
|
|
51
56
|
marginBottom: 8,
|
|
52
57
|
},
|
|
53
58
|
menuTitle: {
|
|
59
|
+
flexShrink: 1,
|
|
54
60
|
fontSize: 21,
|
|
55
61
|
fontWeight: 'bold',
|
|
56
62
|
},
|