@digitaldefiance/express-suite-react-components 2.1.42 → 2.1.47
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/README.md +6 -0
- package/package.json +2 -2
- package/src/components/ApiAccess.js +1 -1
- package/src/components/BackupCodeLoginForm.js +1 -1
- package/src/components/DropdownMenu.d.ts +4 -10
- package/src/components/DropdownMenu.d.ts.map +1 -1
- package/src/components/DropdownMenu.js +19 -7
- package/src/components/Flag.d.ts +12 -2
- package/src/components/Flag.d.ts.map +1 -1
- package/src/components/Flag.js +17 -4
- package/src/components/ForgotPasswordForm.js +1 -1
- package/src/components/LoginForm.js +1 -1
- package/src/components/SideMenu.d.ts +2 -7
- package/src/components/SideMenu.d.ts.map +1 -1
- package/src/components/SideMenu.js +7 -2
- package/src/components/TopMenu.d.ts +3 -14
- package/src/components/TopMenu.d.ts.map +1 -1
- package/src/components/TopMenu.js +23 -2
- package/src/components/TranslatedTitle.d.ts +5 -5
- package/src/components/TranslatedTitle.d.ts.map +1 -1
- package/src/components/TranslatedTitle.js +7 -5
- package/src/components/UserLanguageSelector.d.ts +1 -12
- package/src/components/UserLanguageSelector.d.ts.map +1 -1
- package/src/components/UserLanguageSelector.js +7 -4
- package/src/components/UserMenu.d.ts +4 -0
- package/src/components/UserMenu.d.ts.map +1 -0
- package/src/components/UserMenu.js +12 -0
- package/src/components/index.d.ts +1 -0
- package/src/components/index.d.ts.map +1 -1
- package/src/components/index.js +1 -0
- package/src/contexts/AuthProvider.d.ts +146 -0
- package/src/contexts/AuthProvider.d.ts.map +1 -0
- package/src/contexts/AuthProvider.js +406 -0
- package/src/contexts/I18nProvider.d.ts +6 -6
- package/src/contexts/I18nProvider.d.ts.map +1 -1
- package/src/contexts/I18nProvider.js +4 -4
- package/src/contexts/MenuContext.d.ts +16 -0
- package/src/contexts/MenuContext.d.ts.map +1 -0
- package/src/contexts/MenuContext.js +215 -0
- package/src/contexts/index.d.ts +2 -0
- package/src/contexts/index.d.ts.map +1 -1
- package/src/contexts/index.js +2 -0
- package/src/interfaces/AppConfig.d.ts +0 -2
- package/src/interfaces/AppConfig.d.ts.map +1 -1
- package/src/services/__mocks__/authService.d.ts +21 -0
- package/src/services/__mocks__/authService.d.ts.map +1 -0
- package/src/services/__mocks__/authService.js +15 -0
- package/src/services/authService.d.ts +80 -0
- package/src/services/authService.d.ts.map +1 -0
- package/src/services/authService.js +339 -0
- package/src/services/index.d.ts +1 -0
- package/src/services/index.d.ts.map +1 -1
- package/src/services/index.js +1 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useAuth = exports.AuthProvider = exports.AuthContext = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
|
|
6
|
+
const i18n_lib_1 = require("@digitaldefiance/i18n-lib");
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const react_router_dom_1 = require("react-router-dom");
|
|
9
|
+
const I18nProvider_1 = require("./I18nProvider");
|
|
10
|
+
const authService_1 = require("../services/authService");
|
|
11
|
+
const authenticatedApi_1 = require("../services/authenticatedApi");
|
|
12
|
+
const useExpiringValue_1 = require("../hooks/useExpiringValue");
|
|
13
|
+
const useLocalStorage_1 = require("../hooks/useLocalStorage");
|
|
14
|
+
const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
|
|
15
|
+
exports.AuthContext = (0, react_1.createContext)({});
|
|
16
|
+
const AuthProviderInner = ({ children, baseUrl, constants, eciesConfig }) => {
|
|
17
|
+
const { changeLanguage, currentLanguage, t, tComponent } = (0, I18nProvider_1.useI18n)();
|
|
18
|
+
const authService = (0, react_1.useMemo)(() => (0, authService_1.createAuthService)(constants, baseUrl, eciesConfig), [constants, baseUrl, eciesConfig]);
|
|
19
|
+
// Use the custom hooks for expiring values
|
|
20
|
+
const mnemonicManager = (0, useExpiringValue_1.useExpiringValue)(constants.DefaultExpireMemoryMnemonicSeconds, 'mnemonicExpirationSeconds');
|
|
21
|
+
const walletManager = (0, useExpiringValue_1.useExpiringValue)(constants.DefaultExpireMemoryWalletSeconds, 'walletExpirationSeconds');
|
|
22
|
+
// Use localStorage hook for expiration settings
|
|
23
|
+
const [mnemonicExpirationSeconds, _setMnemonicExpirationSeconds] = (0, useLocalStorage_1.useLocalStorage)('mnemonicExpirationSeconds', constants.DefaultExpireMemoryMnemonicSeconds);
|
|
24
|
+
const [walletExpirationSeconds, _setWalletExpirationSeconds] = (0, useLocalStorage_1.useLocalStorage)('walletExpirationSeconds', constants.DefaultExpireMemoryWalletSeconds);
|
|
25
|
+
const [serverPublicKey, setServerPublicKey] = (0, react_1.useState)(null);
|
|
26
|
+
const [user, setUser] = (0, react_1.useState)(null);
|
|
27
|
+
const [frontendUser, setFrontendUser] = (0, react_1.useState)(null);
|
|
28
|
+
const [isAuthenticated, setIsAuthenticated] = (0, react_1.useState)(false);
|
|
29
|
+
const [isGlobalAdmin, setIsGlobalAdmin] = (0, react_1.useState)(false);
|
|
30
|
+
const [loading, setLoading] = (0, react_1.useState)(true);
|
|
31
|
+
// Separate flag so route guards don't unmount during actions (e.g., register/login)
|
|
32
|
+
const [isCheckingAuth, setIsCheckingAuth] = (0, react_1.useState)(true);
|
|
33
|
+
const [token, setToken] = (0, react_1.useState)(null);
|
|
34
|
+
const [authState, setAuthState] = (0, react_1.useState)(0);
|
|
35
|
+
const navigate = (0, react_router_dom_1.useNavigate)();
|
|
36
|
+
const [currencyCode, setCurrencyCode] = (0, react_1.useState)(() => {
|
|
37
|
+
return new i18n_lib_1.CurrencyCode(localStorage.getItem('currencyCode') ?? i18n_lib_1.DefaultCurrencyCode);
|
|
38
|
+
});
|
|
39
|
+
// Helper functions to calculate remaining time (now provided by the hooks)
|
|
40
|
+
const getMnemonicRemainingTime = mnemonicManager.getRemainingTime;
|
|
41
|
+
const getWalletRemainingTime = walletManager.getRemainingTime;
|
|
42
|
+
// Wrapper functions to match the interface (the localStorage hook handles storage automatically)
|
|
43
|
+
const setMnemonicExpirationSeconds = _setMnemonicExpirationSeconds;
|
|
44
|
+
const setWalletExpirationSeconds = _setWalletExpirationSeconds;
|
|
45
|
+
// Sync user language with i18n provider when the user's saved language changes.
|
|
46
|
+
// Important: do NOT depend on currentLanguage here, or we'll run when the UI
|
|
47
|
+
// language changes and inadvertently revert to the older user.siteLanguage,
|
|
48
|
+
// causing a second update request with English US.
|
|
49
|
+
(0, react_1.useEffect)(() => {
|
|
50
|
+
if (user?.siteLanguage && user.siteLanguage !== currentLanguage) {
|
|
51
|
+
void changeLanguage(user.siteLanguage);
|
|
52
|
+
}
|
|
53
|
+
// We intentionally only react to changes in the user's saved language.
|
|
54
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
|
+
}, [user?.siteLanguage]);
|
|
56
|
+
const setMnemonic = (0, react_1.useCallback)((mnemonic, durationSeconds) => {
|
|
57
|
+
const finalDurationSeconds = durationSeconds ?? mnemonicExpirationSeconds;
|
|
58
|
+
// Store the duration to localStorage if provided
|
|
59
|
+
if (durationSeconds !== undefined) {
|
|
60
|
+
_setMnemonicExpirationSeconds(durationSeconds);
|
|
61
|
+
}
|
|
62
|
+
// Only save to storage if a custom duration was provided
|
|
63
|
+
return mnemonicManager.setValue(mnemonic, finalDurationSeconds, durationSeconds !== undefined);
|
|
64
|
+
}, [mnemonicExpirationSeconds, mnemonicManager.setValue, _setMnemonicExpirationSeconds]);
|
|
65
|
+
const setWallet = (0, react_1.useCallback)((wallet, durationSeconds) => {
|
|
66
|
+
const finalDurationSeconds = durationSeconds ?? walletExpirationSeconds;
|
|
67
|
+
// Store the duration to localStorage if provided
|
|
68
|
+
if (durationSeconds !== undefined) {
|
|
69
|
+
_setWalletExpirationSeconds(durationSeconds);
|
|
70
|
+
}
|
|
71
|
+
// Only save to storage if a custom duration was provided
|
|
72
|
+
return walletManager.setValue(wallet, finalDurationSeconds, durationSeconds !== undefined);
|
|
73
|
+
}, [walletExpirationSeconds, walletManager.setValue, _setWalletExpirationSeconds]);
|
|
74
|
+
const clearMnemonic = mnemonicManager.clearValue;
|
|
75
|
+
const clearWallet = walletManager.clearValue;
|
|
76
|
+
const checkAuth = (0, react_1.useCallback)(async () => {
|
|
77
|
+
const token = localStorage.getItem('authToken');
|
|
78
|
+
if (!token) {
|
|
79
|
+
setUser(null);
|
|
80
|
+
setIsAuthenticated(false);
|
|
81
|
+
setLoading(false);
|
|
82
|
+
setIsCheckingAuth(false);
|
|
83
|
+
setToken(null);
|
|
84
|
+
setFrontendUser(null);
|
|
85
|
+
setServerPublicKey(null);
|
|
86
|
+
clearMnemonic();
|
|
87
|
+
clearWallet();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const userData = await authService.verifyToken(token);
|
|
92
|
+
if ('error' in userData && typeof userData.error === 'string') {
|
|
93
|
+
setIsAuthenticated(false);
|
|
94
|
+
setToken(null);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
setUser(userData);
|
|
98
|
+
setIsGlobalAdmin(userData.roles.some((r) => r.admin));
|
|
99
|
+
setIsAuthenticated(true);
|
|
100
|
+
setToken(token);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Token verification failed:', error);
|
|
105
|
+
setUser(null);
|
|
106
|
+
setIsAuthenticated(false);
|
|
107
|
+
localStorage.removeItem('authToken');
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
setLoading(false);
|
|
111
|
+
setIsCheckingAuth(false);
|
|
112
|
+
}
|
|
113
|
+
}, [authService, clearMnemonic, clearWallet]);
|
|
114
|
+
(0, react_1.useEffect)(() => {
|
|
115
|
+
const token = localStorage.getItem('authToken');
|
|
116
|
+
if (token) {
|
|
117
|
+
(async () => {
|
|
118
|
+
await checkAuth();
|
|
119
|
+
})();
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
setLoading(false);
|
|
123
|
+
setIsCheckingAuth(false);
|
|
124
|
+
}
|
|
125
|
+
}, [checkAuth, authState]);
|
|
126
|
+
const directLogin = (0, react_1.useCallback)(async (mnemonic, username, email, expireMnemonicSeconds, expireWalletSeconds) => {
|
|
127
|
+
setLoading(true);
|
|
128
|
+
const loginResult = await authService.directLogin(mnemonic, username, email);
|
|
129
|
+
setLoading(false);
|
|
130
|
+
if (typeof loginResult === 'object' &&
|
|
131
|
+
'token' in loginResult &&
|
|
132
|
+
'user' in loginResult &&
|
|
133
|
+
'wallet' in loginResult) {
|
|
134
|
+
setMnemonic(mnemonic, expireMnemonicSeconds);
|
|
135
|
+
setUser(loginResult.user);
|
|
136
|
+
setWallet(loginResult.wallet, expireWalletSeconds);
|
|
137
|
+
setIsAuthenticated(true);
|
|
138
|
+
setAuthState((prev) => prev + 1);
|
|
139
|
+
localStorage.setItem('authToken', loginResult.token);
|
|
140
|
+
localStorage.setItem('user', JSON.stringify(loginResult.user));
|
|
141
|
+
return loginResult;
|
|
142
|
+
}
|
|
143
|
+
return loginResult;
|
|
144
|
+
}, [authService, setMnemonic, setWallet]);
|
|
145
|
+
const emailChallengeLogin = (0, react_1.useCallback)(async (mnemonic, token, username, email, expireMnemonicSeconds, expireWalletSeconds) => {
|
|
146
|
+
setLoading(true);
|
|
147
|
+
const loginResult = await authService.emailChallengeLogin(mnemonic, token, username, email);
|
|
148
|
+
setLoading(false);
|
|
149
|
+
if (typeof loginResult === 'object' &&
|
|
150
|
+
'token' in loginResult &&
|
|
151
|
+
'user' in loginResult &&
|
|
152
|
+
'wallet' in loginResult) {
|
|
153
|
+
setMnemonic(mnemonic, expireMnemonicSeconds);
|
|
154
|
+
setUser(loginResult.user);
|
|
155
|
+
setWallet(loginResult.wallet, expireWalletSeconds);
|
|
156
|
+
setIsAuthenticated(true);
|
|
157
|
+
setAuthState((prev) => prev + 1);
|
|
158
|
+
localStorage.setItem('authToken', loginResult.token);
|
|
159
|
+
localStorage.setItem('user', JSON.stringify(loginResult.user));
|
|
160
|
+
return loginResult;
|
|
161
|
+
}
|
|
162
|
+
return loginResult;
|
|
163
|
+
}, [authService, setMnemonic, setWallet]);
|
|
164
|
+
const getPasswordLoginService = (0, react_1.useCallback)(() => {
|
|
165
|
+
const eciesService = new ecies_lib_1.ECIESService(eciesConfig);
|
|
166
|
+
return new ecies_lib_1.PasswordLoginService(eciesService, new ecies_lib_1.Pbkdf2Service(ecies_lib_1.Constants.PBKDF2_PROFILES, ecies_lib_1.Constants.ECIES, ecies_lib_1.Constants.PBKDF2));
|
|
167
|
+
}, [eciesConfig]);
|
|
168
|
+
const isPasswordLoginAvailable = (0, react_1.useCallback)(() => {
|
|
169
|
+
const storedEncryptedPassword = localStorage.getItem('encryptedPassword');
|
|
170
|
+
return !!storedEncryptedPassword;
|
|
171
|
+
}, []);
|
|
172
|
+
const passwordLogin = (0, react_1.useCallback)(async (password, username, email) => {
|
|
173
|
+
if (!isPasswordLoginAvailable()) {
|
|
174
|
+
return { error: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_NotAvailable)) };
|
|
175
|
+
}
|
|
176
|
+
setLoading(true);
|
|
177
|
+
const passwordLoginService = getPasswordLoginService();
|
|
178
|
+
const { wallet, mnemonic } = await passwordLoginService.getWalletAndMnemonicFromLocalStorageBundle(password);
|
|
179
|
+
const loginResult = await authService.directLogin(mnemonic, username, email);
|
|
180
|
+
setLoading(false);
|
|
181
|
+
setWallet(wallet);
|
|
182
|
+
setMnemonic(mnemonic);
|
|
183
|
+
return loginResult;
|
|
184
|
+
}, [authService, getPasswordLoginService, setMnemonic, setWallet, t, tComponent, isPasswordLoginAvailable]);
|
|
185
|
+
const refreshToken = (0, react_1.useCallback)(async () => {
|
|
186
|
+
try {
|
|
187
|
+
const result = await authService.refreshToken();
|
|
188
|
+
localStorage.setItem('authToken', result.token);
|
|
189
|
+
localStorage.setItem('user', JSON.stringify(result.user));
|
|
190
|
+
setUser(result.user);
|
|
191
|
+
setIsAuthenticated(true);
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
setUser(null);
|
|
196
|
+
setIsAuthenticated(false);
|
|
197
|
+
localStorage.removeItem('authToken');
|
|
198
|
+
localStorage.removeItem('user');
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
}, [authService]);
|
|
202
|
+
const register = (0, react_1.useCallback)(async (username, email, timezone, password) => {
|
|
203
|
+
const registerResult = await authService.register(username, email, timezone, password);
|
|
204
|
+
return registerResult;
|
|
205
|
+
}, [baseUrl]);
|
|
206
|
+
const requestEmailLogin = (0, react_1.useCallback)(async (username, email) => {
|
|
207
|
+
setLoading(true);
|
|
208
|
+
const result = await authService.requestEmailLogin(username, email);
|
|
209
|
+
setLoading(false);
|
|
210
|
+
return result;
|
|
211
|
+
}, [baseUrl]);
|
|
212
|
+
const setUpPasswordLogin = (0, react_1.useCallback)(async (mnemonic, password, username, email) => {
|
|
213
|
+
setLoading(true);
|
|
214
|
+
const passwordLoginService = getPasswordLoginService();
|
|
215
|
+
try {
|
|
216
|
+
const wallet = await passwordLoginService.setupPasswordLoginLocalStorageBundle(mnemonic, password);
|
|
217
|
+
setLoading(false);
|
|
218
|
+
setWallet(wallet);
|
|
219
|
+
setMnemonic(mnemonic);
|
|
220
|
+
return { success: true, message: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_Success)) };
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
setLoading(false);
|
|
224
|
+
return { success: false, message: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_Failure)) };
|
|
225
|
+
}
|
|
226
|
+
}, [setMnemonic, setWallet, t, tComponent]);
|
|
227
|
+
const backupCodeLogin = (0, react_1.useCallback)(async (identifier, code, isEmail, recoverMnemonic, newPassword) => {
|
|
228
|
+
setLoading(true);
|
|
229
|
+
const loginResult = await authService.backupCodeLogin(identifier, code, isEmail, recoverMnemonic, newPassword);
|
|
230
|
+
setLoading(false);
|
|
231
|
+
if (typeof loginResult === 'object' && 'token' in loginResult) {
|
|
232
|
+
localStorage.setItem('authToken', loginResult.token);
|
|
233
|
+
if (loginResult.user) {
|
|
234
|
+
setUser(loginResult.user);
|
|
235
|
+
setIsAuthenticated(true);
|
|
236
|
+
}
|
|
237
|
+
setAuthState((prev) => prev + 1);
|
|
238
|
+
return {
|
|
239
|
+
token: loginResult.token,
|
|
240
|
+
mnemonic: loginResult.mnemonic,
|
|
241
|
+
message: loginResult.message,
|
|
242
|
+
codeCount: loginResult.codeCount,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
return loginResult;
|
|
246
|
+
}, [baseUrl]);
|
|
247
|
+
const logout = (0, react_1.useCallback)(async () => {
|
|
248
|
+
localStorage.removeItem('user');
|
|
249
|
+
localStorage.removeItem('authToken');
|
|
250
|
+
clearMnemonic();
|
|
251
|
+
setUser(null);
|
|
252
|
+
clearWallet();
|
|
253
|
+
setIsAuthenticated(false);
|
|
254
|
+
setAuthState((prev) => prev + 1);
|
|
255
|
+
navigate('/');
|
|
256
|
+
}, [navigate, clearMnemonic, clearWallet]);
|
|
257
|
+
const verifyToken = (0, react_1.useCallback)(async (token) => {
|
|
258
|
+
const requestUser = await authService.verifyToken(token);
|
|
259
|
+
if (typeof requestUser === 'object' && 'error' in requestUser) {
|
|
260
|
+
setIsAuthenticated(false);
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
setUser(requestUser);
|
|
265
|
+
setIsAuthenticated(true);
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
}, [baseUrl]);
|
|
269
|
+
const changePassword = (0, react_1.useCallback)(async (currentPassword, newPassword) => {
|
|
270
|
+
if (!isPasswordLoginAvailable()) {
|
|
271
|
+
return { error: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_NotAvailable)) };
|
|
272
|
+
}
|
|
273
|
+
setLoading(true);
|
|
274
|
+
try {
|
|
275
|
+
const passwordLoginService = getPasswordLoginService();
|
|
276
|
+
const { mnemonic, wallet } = await passwordLoginService.getWalletAndMnemonicFromLocalStorageBundle(new ecies_lib_1.SecureString(currentPassword));
|
|
277
|
+
if (!mnemonic) {
|
|
278
|
+
setLoading(false);
|
|
279
|
+
return { error: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_InvalidCurrentPassword)), errorType: 'InvalidCurrentPassword' };
|
|
280
|
+
}
|
|
281
|
+
await passwordLoginService.setupPasswordLoginLocalStorageBundle(mnemonic, new ecies_lib_1.SecureString(newPassword));
|
|
282
|
+
setLoading(false);
|
|
283
|
+
setWallet(wallet);
|
|
284
|
+
setMnemonic(mnemonic);
|
|
285
|
+
return { success: true, message: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordChange_Success)) };
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
setLoading(false);
|
|
289
|
+
return { error: 'Password change failed' };
|
|
290
|
+
}
|
|
291
|
+
}, [setMnemonic, setWallet, t, tComponent, isPasswordLoginAvailable]);
|
|
292
|
+
const contextValue = (0, react_1.useMemo)(() => {
|
|
293
|
+
const setUserAndLanguage = async (newUser) => {
|
|
294
|
+
setUser(newUser);
|
|
295
|
+
setIsAuthenticated(!!newUser);
|
|
296
|
+
};
|
|
297
|
+
const setLanguageAndUpdateUser = async (newLanguage) => {
|
|
298
|
+
changeLanguage(newLanguage);
|
|
299
|
+
};
|
|
300
|
+
const setCurrencyCodeAndUpdateStorage = async (code) => {
|
|
301
|
+
setCurrencyCode(code);
|
|
302
|
+
localStorage.setItem('currencyCode', code.value);
|
|
303
|
+
};
|
|
304
|
+
return {
|
|
305
|
+
admin: isGlobalAdmin,
|
|
306
|
+
authState,
|
|
307
|
+
backupCodeLogin,
|
|
308
|
+
changePassword,
|
|
309
|
+
checkAuth,
|
|
310
|
+
clearMnemonic,
|
|
311
|
+
clearWallet,
|
|
312
|
+
currencyCode,
|
|
313
|
+
directLogin,
|
|
314
|
+
emailChallengeLogin,
|
|
315
|
+
getMnemonicRemainingTime,
|
|
316
|
+
getWalletRemainingTime,
|
|
317
|
+
isAuthenticated,
|
|
318
|
+
isCheckingAuth,
|
|
319
|
+
isPasswordLoginAvailable,
|
|
320
|
+
language: currentLanguage,
|
|
321
|
+
loading,
|
|
322
|
+
logout,
|
|
323
|
+
mnemonic: mnemonicManager.value,
|
|
324
|
+
mnemonicExpirationSeconds,
|
|
325
|
+
passwordLogin,
|
|
326
|
+
refreshToken,
|
|
327
|
+
register,
|
|
328
|
+
requestEmailLogin,
|
|
329
|
+
serverPublicKey,
|
|
330
|
+
setCurrencyCode: setCurrencyCodeAndUpdateStorage,
|
|
331
|
+
setLanguage: setLanguageAndUpdateUser,
|
|
332
|
+
setMnemonic,
|
|
333
|
+
setMnemonicExpirationSeconds,
|
|
334
|
+
setUpPasswordLogin,
|
|
335
|
+
setUser: setUserAndLanguage,
|
|
336
|
+
setWallet,
|
|
337
|
+
setWalletExpirationSeconds,
|
|
338
|
+
token,
|
|
339
|
+
user: frontendUser,
|
|
340
|
+
userData: user,
|
|
341
|
+
verifyToken,
|
|
342
|
+
wallet: walletManager.value,
|
|
343
|
+
walletExpirationSeconds,
|
|
344
|
+
};
|
|
345
|
+
}, [
|
|
346
|
+
authState,
|
|
347
|
+
backupCodeLogin,
|
|
348
|
+
changeLanguage,
|
|
349
|
+
changePassword,
|
|
350
|
+
checkAuth,
|
|
351
|
+
clearMnemonic,
|
|
352
|
+
clearWallet,
|
|
353
|
+
currencyCode,
|
|
354
|
+
currentLanguage,
|
|
355
|
+
directLogin,
|
|
356
|
+
emailChallengeLogin,
|
|
357
|
+
frontendUser,
|
|
358
|
+
getMnemonicRemainingTime,
|
|
359
|
+
getWalletRemainingTime,
|
|
360
|
+
isAuthenticated,
|
|
361
|
+
isCheckingAuth,
|
|
362
|
+
isGlobalAdmin,
|
|
363
|
+
isPasswordLoginAvailable,
|
|
364
|
+
loading,
|
|
365
|
+
logout,
|
|
366
|
+
mnemonicManager.value,
|
|
367
|
+
mnemonicExpirationSeconds,
|
|
368
|
+
passwordLogin,
|
|
369
|
+
refreshToken,
|
|
370
|
+
register,
|
|
371
|
+
requestEmailLogin,
|
|
372
|
+
serverPublicKey,
|
|
373
|
+
setMnemonic,
|
|
374
|
+
setMnemonicExpirationSeconds,
|
|
375
|
+
setUpPasswordLogin,
|
|
376
|
+
setWallet,
|
|
377
|
+
setWalletExpirationSeconds,
|
|
378
|
+
token,
|
|
379
|
+
user,
|
|
380
|
+
verifyToken,
|
|
381
|
+
walletManager.value,
|
|
382
|
+
walletExpirationSeconds,
|
|
383
|
+
]);
|
|
384
|
+
return ((0, jsx_runtime_1.jsx)(exports.AuthContext.Provider, { value: contextValue, children: children }));
|
|
385
|
+
};
|
|
386
|
+
const AuthProvider = ({ children, baseUrl, constants, eciesConfig }) => {
|
|
387
|
+
const authenticatedApi = (0, react_1.useMemo)(() => (0, authenticatedApi_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
|
|
388
|
+
const handleLanguageChange = async (newLanguage) => {
|
|
389
|
+
// Only make API call if there's an auth token (user is logged in)
|
|
390
|
+
const token = localStorage.getItem('authToken');
|
|
391
|
+
if (!token)
|
|
392
|
+
return;
|
|
393
|
+
try {
|
|
394
|
+
await authenticatedApi.post('/user/language', { language: newLanguage });
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
console.error('Failed to update user language:', error);
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
return ((0, jsx_runtime_1.jsx)(I18nProvider_1.I18nProvider, { i18nEngine: i18n_lib_1.I18nEngine.getInstance(), onLanguageChange: handleLanguageChange, children: (0, jsx_runtime_1.jsx)(AuthProviderInner, { baseUrl: baseUrl, constants: constants, eciesConfig: eciesConfig, children: children }) }));
|
|
401
|
+
};
|
|
402
|
+
exports.AuthProvider = AuthProvider;
|
|
403
|
+
const useAuth = () => {
|
|
404
|
+
return (0, react_1.useContext)(exports.AuthContext);
|
|
405
|
+
};
|
|
406
|
+
exports.useAuth = useAuth;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { I18nEngine } from '@digitaldefiance/i18n-lib';
|
|
2
2
|
import { FC, ReactNode } from 'react';
|
|
3
3
|
export interface I18nProviderProps {
|
|
4
4
|
children: ReactNode;
|
|
5
5
|
i18nEngine: I18nEngine;
|
|
6
|
-
onLanguageChange?: (language:
|
|
6
|
+
onLanguageChange?: (language: string) => Promise<void>;
|
|
7
7
|
}
|
|
8
8
|
export interface I18nContextType {
|
|
9
|
-
t: (key: string, vars?: Record<string, string | number>, language?:
|
|
10
|
-
tComponent: <TStringKey extends string>(componentId: string, stringKey: TStringKey) => string;
|
|
11
|
-
changeLanguage: (language:
|
|
12
|
-
currentLanguage:
|
|
9
|
+
t: (key: string, vars?: Record<string, string | number>, language?: string) => string;
|
|
10
|
+
tComponent: <TStringKey extends string>(componentId: string, stringKey: TStringKey, vars?: Record<string, string | number>, language?: string) => string;
|
|
11
|
+
changeLanguage: (language: string) => void;
|
|
12
|
+
currentLanguage: string;
|
|
13
13
|
}
|
|
14
14
|
export declare const I18nProvider: FC<I18nProviderProps>;
|
|
15
15
|
export declare const useI18n: () => I18nContextType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"I18nProvider.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/I18nProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"I18nProvider.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/I18nProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,UAAU,EAEX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAiB,EAAE,EAAE,SAAS,EAAqC,MAAM,OAAO,CAAC;AAExF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACtF,UAAU,EAAE,CAAC,UAAU,SAAS,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzJ,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAoD9C,CAAC;AAEF,eAAO,MAAM,OAAO,uBAMnB,CAAC"}
|
|
@@ -22,10 +22,10 @@ const I18nProvider = ({ children, i18nEngine, onLanguageChange, }) => {
|
|
|
22
22
|
}
|
|
23
23
|
}, [onLanguageChange, i18nEngine, context]);
|
|
24
24
|
const t = (0, react_1.useCallback)((key, vars, language) => {
|
|
25
|
-
return i18nEngine.t(key, vars, language);
|
|
26
|
-
}, [i18nEngine]);
|
|
27
|
-
const tComponent = (0, react_1.useCallback)((componentId, stringKey) => {
|
|
28
|
-
return i18nEngine.translate(componentId, stringKey,
|
|
25
|
+
return i18nEngine.t(key, vars, language ?? currentLanguage);
|
|
26
|
+
}, [i18nEngine, currentLanguage]);
|
|
27
|
+
const tComponent = (0, react_1.useCallback)((componentId, stringKey, vars, language) => {
|
|
28
|
+
return i18nEngine.translate(componentId, stringKey, vars, language ?? currentLanguage);
|
|
29
29
|
}, [currentLanguage, i18nEngine]);
|
|
30
30
|
const value = {
|
|
31
31
|
t,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
import { IncludeOnMenu } from '../enumerations/IncludeOnMenu';
|
|
3
|
+
import { IMenuOption } from '../interfaces/IMenuOption';
|
|
4
|
+
interface MenuProviderProps {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
interface MenuContextType {
|
|
8
|
+
menuOptions: IMenuOption[];
|
|
9
|
+
getMenuOptions: (menuType: IncludeOnMenu, includeDividers: boolean) => IMenuOption[];
|
|
10
|
+
registerMenuOption: (option: IMenuOption) => () => void;
|
|
11
|
+
registerMenuOptions: (options: IMenuOption[]) => () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const MenuProvider: FC<MenuProviderProps>;
|
|
14
|
+
export declare const useMenu: () => MenuContextType;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=MenuContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuContext.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/MenuContext.tsx"],"names":[],"mappings":"AAeA,OAAO,EACL,EAAE,EACF,SAAS,EAOV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,cAAc,EAAE,CACd,QAAQ,EAAE,aAAa,EACvB,eAAe,EAAE,OAAO,KACrB,WAAW,EAAE,CAAC;IACnB,kBAAkB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;IACxD,mBAAmB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC;CAC7D;AAID,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAwN9C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,eAM1B,CAAC"}
|