@oxyhq/services 5.16.29 → 5.16.30
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/commonjs/index.js +64 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/ui/hooks/auth/index.js +37 -0
- package/lib/commonjs/ui/hooks/auth/index.js.map +1 -0
- package/lib/commonjs/ui/hooks/auth/useUsernameValidation.js +171 -0
- package/lib/commonjs/ui/hooks/auth/useUsernameValidation.js.map +1 -0
- package/lib/commonjs/ui/hooks/index.js +20 -0
- package/lib/commonjs/ui/hooks/index.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/index.js +12 -0
- package/lib/commonjs/ui/hooks/mutations/index.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +45 -1
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/index.js +12 -0
- package/lib/commonjs/ui/hooks/queries/index.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/queryKeys.js +3 -1
- package/lib/commonjs/ui/hooks/queries/queryKeys.js.map +1 -1
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +43 -1
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +76 -97
- package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/module/index.js +3 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/ui/hooks/auth/index.js +7 -0
- package/lib/module/ui/hooks/auth/index.js.map +1 -0
- package/lib/module/ui/hooks/auth/useUsernameValidation.js +167 -0
- package/lib/module/ui/hooks/auth/useUsernameValidation.js.map +1 -0
- package/lib/module/ui/hooks/index.js +1 -0
- package/lib/module/ui/hooks/index.js.map +1 -1
- package/lib/module/ui/hooks/mutations/index.js +1 -1
- package/lib/module/ui/hooks/mutations/index.js.map +1 -1
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +42 -0
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
- package/lib/module/ui/hooks/queries/index.js +1 -1
- package/lib/module/ui/hooks/queries/index.js.map +1 -1
- package/lib/module/ui/hooks/queries/queryKeys.js +3 -1
- package/lib/module/ui/hooks/queries/queryKeys.js.map +1 -1
- package/lib/module/ui/hooks/queries/useAccountQueries.js +40 -0
- package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
- package/lib/module/ui/screens/PrivacySettingsScreen.js +77 -98
- package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
- package/lib/typescript/index.d.ts +4 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/auth/index.d.ts +6 -0
- package/lib/typescript/ui/hooks/auth/index.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/auth/useUsernameValidation.d.ts +32 -0
- package/lib/typescript/ui/hooks/auth/useUsernameValidation.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/index.d.ts +1 -0
- package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/mutations/index.d.ts +1 -1
- package/lib/typescript/ui/hooks/mutations/index.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +12 -0
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/index.d.ts +1 -1
- package/lib/typescript/ui/hooks/queries/index.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/queryKeys.d.ts +2 -0
- package/lib/typescript/ui/hooks/queries/queryKeys.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +12 -0
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +6 -0
- package/src/ui/hooks/auth/index.ts +6 -0
- package/src/ui/hooks/auth/useUsernameValidation.ts +177 -0
- package/src/ui/hooks/index.ts +2 -1
- package/src/ui/hooks/mutations/index.ts +2 -0
- package/src/ui/hooks/mutations/useAccountMutations.ts +36 -0
- package/src/ui/hooks/queries/index.ts +2 -0
- package/src/ui/hooks/queries/queryKeys.ts +2 -0
- package/src/ui/hooks/queries/useAccountQueries.ts +34 -0
- package/src/ui/screens/PrivacySettingsScreen.tsx +67 -101
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js +0 -281
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +0 -1
- package/lib/commonjs/ui/context/hooks/useStorage.js +0 -79
- package/lib/commonjs/ui/context/hooks/useStorage.js.map +0 -1
- package/lib/module/ui/context/hooks/useSessionManagement.js +0 -276
- package/lib/module/ui/context/hooks/useSessionManagement.js.map +0 -1
- package/lib/module/ui/context/hooks/useStorage.js +0 -74
- package/lib/module/ui/context/hooks/useStorage.js.map +0 -1
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +0 -41
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +0 -1
- package/lib/typescript/ui/context/hooks/useStorage.d.ts +0 -22
- package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +0 -1
- package/src/ui/context/hooks/useSessionManagement.ts +0 -401
- package/src/ui/context/hooks/useStorage.ts +0 -104
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import React, { useState, useCallback,
|
|
1
|
+
import React, { useState, useCallback, useMemo } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
View,
|
|
4
4
|
Text,
|
|
5
5
|
StyleSheet,
|
|
6
6
|
ScrollView,
|
|
7
|
-
ActivityIndicator,
|
|
8
7
|
TouchableOpacity,
|
|
9
8
|
} from 'react-native';
|
|
10
9
|
import type { BaseScreenProps } from '../types/navigation';
|
|
@@ -15,6 +14,8 @@ import { useThemeStyles } from '../hooks/useThemeStyles';
|
|
|
15
14
|
import { normalizeTheme } from '../utils/themeUtils';
|
|
16
15
|
import type { BlockedUser, RestrictedUser } from '../../models/interfaces';
|
|
17
16
|
import { useOxy } from '../context/OxyContext';
|
|
17
|
+
import { usePrivacySettings, useBlockedUsers, useRestrictedUsers } from '../hooks/queries';
|
|
18
|
+
import { useUpdatePrivacySettings, useUnblockUser, useUnrestrictUser } from '../hooks/mutations';
|
|
18
19
|
|
|
19
20
|
interface PrivacySettings {
|
|
20
21
|
isPrivateAccount: boolean;
|
|
@@ -44,8 +45,20 @@ const PrivacySettingsScreen: React.FC<BaseScreenProps> = ({
|
|
|
44
45
|
goBack,
|
|
45
46
|
}) => {
|
|
46
47
|
// Use useOxy() hook for OxyContext values
|
|
47
|
-
const { oxyServices
|
|
48
|
+
const { oxyServices } = useOxy();
|
|
48
49
|
const { t } = useI18n();
|
|
50
|
+
|
|
51
|
+
// TanStack Query hooks for server state
|
|
52
|
+
const { data: privacySettingsData, isLoading: isLoadingSettings, error: settingsError } = usePrivacySettings();
|
|
53
|
+
const { data: blockedUsers = [], isLoading: isLoadingBlocked } = useBlockedUsers();
|
|
54
|
+
const { data: restrictedUsers = [], isLoading: isLoadingRestricted } = useRestrictedUsers();
|
|
55
|
+
|
|
56
|
+
// Mutations
|
|
57
|
+
const updatePrivacySettingsMutation = useUpdatePrivacySettings();
|
|
58
|
+
const unblockUserMutation = useUnblockUser();
|
|
59
|
+
const unrestrictUserMutation = useUnrestrictUser();
|
|
60
|
+
|
|
61
|
+
// Client state for optimistic UI updates
|
|
49
62
|
const [settings, setSettings] = useState<PrivacySettings>({
|
|
50
63
|
isPrivateAccount: false,
|
|
51
64
|
hideOnlineStatus: false,
|
|
@@ -67,111 +80,64 @@ const PrivacySettingsScreen: React.FC<BaseScreenProps> = ({
|
|
|
67
80
|
autoFilter: true,
|
|
68
81
|
muteKeywords: false,
|
|
69
82
|
});
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
} catch (error) {
|
|
91
|
-
console.error('Failed to load privacy settings:', error);
|
|
92
|
-
toast.error(t('privacySettings.loadError') || 'Failed to load privacy settings');
|
|
93
|
-
} finally {
|
|
94
|
-
setIsLoading(false);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
loadSettings();
|
|
99
|
-
}, [oxyServices, t]);
|
|
100
|
-
|
|
101
|
-
// Load blocked and restricted users
|
|
102
|
-
useEffect(() => {
|
|
103
|
-
const loadUsers = async () => {
|
|
104
|
-
if (!oxyServices) return;
|
|
105
|
-
try {
|
|
106
|
-
setIsLoadingUsers(true);
|
|
107
|
-
const [blocked, restricted] = await Promise.all([
|
|
108
|
-
oxyServices.getBlockedUsers(),
|
|
109
|
-
oxyServices.getRestrictedUsers(),
|
|
110
|
-
]);
|
|
111
|
-
setBlockedUsers(blocked);
|
|
112
|
-
setRestrictedUsers(restricted);
|
|
113
|
-
} catch (error) {
|
|
114
|
-
console.error('Failed to load blocked/restricted users:', error);
|
|
115
|
-
} finally {
|
|
116
|
-
setIsLoadingUsers(false);
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
loadUsers();
|
|
121
|
-
}, [oxyServices]);
|
|
83
|
+
|
|
84
|
+
// Update local state when server data changes
|
|
85
|
+
React.useEffect(() => {
|
|
86
|
+
if (privacySettingsData) {
|
|
87
|
+
setSettings(privacySettingsData as PrivacySettings);
|
|
88
|
+
}
|
|
89
|
+
}, [privacySettingsData]);
|
|
90
|
+
|
|
91
|
+
// Show error toast if settings failed to load
|
|
92
|
+
React.useEffect(() => {
|
|
93
|
+
if (settingsError) {
|
|
94
|
+
toast.error(t('privacySettings.loadError') || 'Failed to load privacy settings');
|
|
95
|
+
}
|
|
96
|
+
}, [settingsError, t]);
|
|
97
|
+
|
|
98
|
+
const isLoading = isLoadingSettings;
|
|
99
|
+
const isSaving = updatePrivacySettingsMutation.isPending;
|
|
100
|
+
const isLoadingUsers = isLoadingBlocked || isLoadingRestricted;
|
|
122
101
|
|
|
123
102
|
const updateSetting = useCallback(async (key: keyof PrivacySettings, value: boolean) => {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
103
|
+
// Optimistic update
|
|
104
|
+
const newSettings = { ...settings, [key]: value };
|
|
105
|
+
setSettings(newSettings);
|
|
106
|
+
|
|
107
|
+
// Use mutation hook
|
|
108
|
+
updatePrivacySettingsMutation.mutate(
|
|
109
|
+
{ settings: { [key]: value } },
|
|
110
|
+
{
|
|
111
|
+
onError: () => {
|
|
112
|
+
// Revert on error
|
|
113
|
+
setSettings(settings);
|
|
114
|
+
toast.error(t('privacySettings.updateError') || 'Failed to update privacy setting');
|
|
115
|
+
},
|
|
135
116
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
toast.error(t('privacySettings.updateError') || 'Failed to update privacy setting');
|
|
139
|
-
// Revert on error
|
|
140
|
-
setSettings(settings);
|
|
141
|
-
} finally {
|
|
142
|
-
setIsSaving(false);
|
|
143
|
-
}
|
|
144
|
-
}, [settings, oxyServices, t]);
|
|
117
|
+
);
|
|
118
|
+
}, [settings, updatePrivacySettingsMutation, t]);
|
|
145
119
|
|
|
146
120
|
const handleUnblock = useCallback(async (userId: string) => {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
console.error('Failed to unblock user:', error);
|
|
157
|
-
toast.error(t('privacySettings.unblockError') || 'Failed to unblock user');
|
|
158
|
-
}
|
|
159
|
-
}, [oxyServices, t]);
|
|
121
|
+
unblockUserMutation.mutate(userId, {
|
|
122
|
+
onSuccess: () => {
|
|
123
|
+
toast.success(t('privacySettings.userUnblocked') || 'User unblocked');
|
|
124
|
+
},
|
|
125
|
+
onError: () => {
|
|
126
|
+
toast.error(t('privacySettings.unblockError') || 'Failed to unblock user');
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}, [unblockUserMutation, t]);
|
|
160
130
|
|
|
161
131
|
const handleUnrestrict = useCallback(async (userId: string) => {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
console.error('Failed to unrestrict user:', error);
|
|
172
|
-
toast.error(t('privacySettings.unrestrictError') || 'Failed to unrestrict user');
|
|
173
|
-
}
|
|
174
|
-
}, [oxyServices, t]);
|
|
132
|
+
unrestrictUserMutation.mutate(userId, {
|
|
133
|
+
onSuccess: () => {
|
|
134
|
+
toast.success(t('privacySettings.userUnrestricted') || 'User unrestricted');
|
|
135
|
+
},
|
|
136
|
+
onError: () => {
|
|
137
|
+
toast.error(t('privacySettings.unrestrictError') || 'Failed to unrestrict user');
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}, [unrestrictUserMutation, t]);
|
|
175
141
|
|
|
176
142
|
// Helper to extract user info from blocked/restricted objects
|
|
177
143
|
const extractUserInfo = useCallback((
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useSessionManagement = void 0;
|
|
7
|
-
var _react = require("react");
|
|
8
|
-
var _sessionUtils = require("../../../utils/sessionUtils");
|
|
9
|
-
var _sessionHelpers = require("../../utils/sessionHelpers");
|
|
10
|
-
var _storageHelpers = require("../../utils/storageHelpers");
|
|
11
|
-
var _errorHandlers = require("../../utils/errorHandlers");
|
|
12
|
-
var _queryClient = require("../../hooks/queryClient");
|
|
13
|
-
const DEFAULT_SAVE_ERROR_MESSAGE = 'Failed to save session data';
|
|
14
|
-
const CLEAR_STORAGE_ERROR = 'Failed to clear storage';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Manage session state, persistence, and high-level multi-session operations.
|
|
18
|
-
*
|
|
19
|
-
* @param options - Session management configuration
|
|
20
|
-
*/
|
|
21
|
-
const useSessionManagement = ({
|
|
22
|
-
oxyServices,
|
|
23
|
-
storage,
|
|
24
|
-
storageKeyPrefix,
|
|
25
|
-
loginSuccess,
|
|
26
|
-
logoutStore,
|
|
27
|
-
applyLanguagePreference,
|
|
28
|
-
onAuthStateChange,
|
|
29
|
-
onError,
|
|
30
|
-
setAuthError,
|
|
31
|
-
logger,
|
|
32
|
-
setTokenReady,
|
|
33
|
-
queryClient
|
|
34
|
-
}) => {
|
|
35
|
-
const [sessions, setSessions] = (0, _react.useState)([]);
|
|
36
|
-
const [activeSessionId, setActiveSessionId] = (0, _react.useState)(null);
|
|
37
|
-
const refreshInFlightRef = (0, _react.useRef)(null);
|
|
38
|
-
const removedSessionsRef = (0, _react.useRef)(new Set());
|
|
39
|
-
const lastRefreshRef = (0, _react.useRef)(0);
|
|
40
|
-
const storageKeys = (0, _react.useMemo)(() => (0, _storageHelpers.getStorageKeys)(storageKeyPrefix), [storageKeyPrefix]);
|
|
41
|
-
const saveSessionIds = (0, _react.useCallback)(async sessionIds => {
|
|
42
|
-
if (!storage) return;
|
|
43
|
-
try {
|
|
44
|
-
const uniqueIds = Array.from(new Set(sessionIds));
|
|
45
|
-
await storage.setItem(storageKeys.sessionIds, JSON.stringify(uniqueIds));
|
|
46
|
-
} catch (error) {
|
|
47
|
-
if (logger) {
|
|
48
|
-
logger(DEFAULT_SAVE_ERROR_MESSAGE, error);
|
|
49
|
-
} else if (__DEV__) {
|
|
50
|
-
console.warn('Failed to save session IDs:', error);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}, [logger, storage, storageKeys.sessionIds]);
|
|
54
|
-
const updateSessions = (0, _react.useCallback)((incoming, options = {}) => {
|
|
55
|
-
setSessions(prevSessions => {
|
|
56
|
-
const processed = options.merge ? (0, _sessionUtils.mergeSessions)(prevSessions, incoming, activeSessionId, false) : (0, _sessionUtils.normalizeAndSortSessions)(incoming, activeSessionId, false);
|
|
57
|
-
if (storage) {
|
|
58
|
-
void saveSessionIds(processed.map(session => session.sessionId));
|
|
59
|
-
}
|
|
60
|
-
if ((0, _sessionUtils.sessionsArraysEqual)(prevSessions, processed)) {
|
|
61
|
-
return prevSessions;
|
|
62
|
-
}
|
|
63
|
-
return processed;
|
|
64
|
-
});
|
|
65
|
-
}, [activeSessionId, saveSessionIds, storage]);
|
|
66
|
-
const saveActiveSessionId = (0, _react.useCallback)(async sessionId => {
|
|
67
|
-
if (!storage) return;
|
|
68
|
-
try {
|
|
69
|
-
await storage.setItem(storageKeys.activeSessionId, sessionId);
|
|
70
|
-
} catch (error) {
|
|
71
|
-
(0, _errorHandlers.handleAuthError)(error, {
|
|
72
|
-
defaultMessage: DEFAULT_SAVE_ERROR_MESSAGE,
|
|
73
|
-
code: 'SESSION_PERSISTENCE_ERROR',
|
|
74
|
-
onError,
|
|
75
|
-
setAuthError,
|
|
76
|
-
logger
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}, [logger, onError, setAuthError, storage, storageKeys.activeSessionId]);
|
|
80
|
-
const removeActiveSessionId = (0, _react.useCallback)(async () => {
|
|
81
|
-
if (!storage) return;
|
|
82
|
-
try {
|
|
83
|
-
await storage.removeItem(storageKeys.activeSessionId);
|
|
84
|
-
} catch (error) {
|
|
85
|
-
(0, _errorHandlers.handleAuthError)(error, {
|
|
86
|
-
defaultMessage: DEFAULT_SAVE_ERROR_MESSAGE,
|
|
87
|
-
code: 'SESSION_PERSISTENCE_ERROR',
|
|
88
|
-
onError,
|
|
89
|
-
setAuthError,
|
|
90
|
-
logger
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}, [logger, onError, setAuthError, storage, storageKeys.activeSessionId]);
|
|
94
|
-
const clearSessionStorage = (0, _react.useCallback)(async () => {
|
|
95
|
-
if (!storage) return;
|
|
96
|
-
try {
|
|
97
|
-
await storage.removeItem(storageKeys.activeSessionId);
|
|
98
|
-
await storage.removeItem(storageKeys.sessionIds);
|
|
99
|
-
// Clear identity sync state
|
|
100
|
-
await storage.removeItem('oxy_identity_synced').catch(() => {});
|
|
101
|
-
} catch (error) {
|
|
102
|
-
(0, _errorHandlers.handleAuthError)(error, {
|
|
103
|
-
defaultMessage: CLEAR_STORAGE_ERROR,
|
|
104
|
-
code: 'STORAGE_ERROR',
|
|
105
|
-
onError,
|
|
106
|
-
setAuthError,
|
|
107
|
-
logger
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}, [logger, onError, setAuthError, storage, storageKeys.activeSessionId, storageKeys.sessionIds]);
|
|
111
|
-
const clearSessionState = (0, _react.useCallback)(async () => {
|
|
112
|
-
setSessions([]);
|
|
113
|
-
setActiveSessionId(null);
|
|
114
|
-
logoutStore();
|
|
115
|
-
|
|
116
|
-
// Clear TanStack Query cache (in-memory)
|
|
117
|
-
if (queryClient) {
|
|
118
|
-
queryClient.clear();
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Clear persisted query cache
|
|
122
|
-
if (storage) {
|
|
123
|
-
try {
|
|
124
|
-
await (0, _queryClient.clearQueryCache)(storage);
|
|
125
|
-
} catch (error) {
|
|
126
|
-
if (logger) {
|
|
127
|
-
logger('Failed to clear persisted query cache', error);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
await clearSessionStorage();
|
|
132
|
-
onAuthStateChange?.(null);
|
|
133
|
-
}, [clearSessionStorage, logoutStore, onAuthStateChange, queryClient, storage, logger]);
|
|
134
|
-
const activateSession = (0, _react.useCallback)(async (sessionId, user) => {
|
|
135
|
-
await oxyServices.getTokenBySession(sessionId);
|
|
136
|
-
setTokenReady?.(true);
|
|
137
|
-
setActiveSessionId(sessionId);
|
|
138
|
-
loginSuccess(user);
|
|
139
|
-
await saveActiveSessionId(sessionId);
|
|
140
|
-
await applyLanguagePreference(user);
|
|
141
|
-
onAuthStateChange?.(user);
|
|
142
|
-
}, [applyLanguagePreference, loginSuccess, onAuthStateChange, oxyServices, saveActiveSessionId, setTokenReady]);
|
|
143
|
-
const trackRemovedSession = (0, _react.useCallback)(sessionId => {
|
|
144
|
-
removedSessionsRef.current.add(sessionId);
|
|
145
|
-
setTimeout(() => {
|
|
146
|
-
removedSessionsRef.current.delete(sessionId);
|
|
147
|
-
}, 5000);
|
|
148
|
-
}, []);
|
|
149
|
-
const findReplacementSession = (0, _react.useCallback)(async sessionIds => {
|
|
150
|
-
if (!sessionIds.length) {
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
const validationResults = await (0, _sessionHelpers.validateSessionBatch)(oxyServices, sessionIds, {
|
|
154
|
-
maxConcurrency: 3
|
|
155
|
-
});
|
|
156
|
-
const validSession = validationResults.find(result => result.valid);
|
|
157
|
-
if (!validSession) {
|
|
158
|
-
return null;
|
|
159
|
-
}
|
|
160
|
-
const validation = await oxyServices.validateSession(validSession.sessionId, {
|
|
161
|
-
useHeaderValidation: true
|
|
162
|
-
});
|
|
163
|
-
if (!validation?.valid || !validation.user) {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
const user = validation.user;
|
|
167
|
-
await activateSession(validSession.sessionId, user);
|
|
168
|
-
return user;
|
|
169
|
-
}, [activateSession, oxyServices]);
|
|
170
|
-
const switchSession = (0, _react.useCallback)(async sessionId => {
|
|
171
|
-
try {
|
|
172
|
-
const validation = await oxyServices.validateSession(sessionId, {
|
|
173
|
-
useHeaderValidation: true
|
|
174
|
-
});
|
|
175
|
-
if (!validation?.valid) {
|
|
176
|
-
throw new Error('Session is invalid or expired');
|
|
177
|
-
}
|
|
178
|
-
if (!validation.user) {
|
|
179
|
-
throw new Error('User data not available from session validation');
|
|
180
|
-
}
|
|
181
|
-
const user = validation.user;
|
|
182
|
-
await activateSession(sessionId, user);
|
|
183
|
-
try {
|
|
184
|
-
const deviceSessions = await (0, _sessionHelpers.fetchSessionsWithFallback)(oxyServices, sessionId, {
|
|
185
|
-
fallbackUserId: user.id,
|
|
186
|
-
logger
|
|
187
|
-
});
|
|
188
|
-
updateSessions(deviceSessions, {
|
|
189
|
-
merge: true
|
|
190
|
-
});
|
|
191
|
-
} catch (error) {
|
|
192
|
-
if (__DEV__) {
|
|
193
|
-
console.warn('Failed to synchronize sessions after switch:', error);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return user;
|
|
197
|
-
} catch (error) {
|
|
198
|
-
const invalidSession = (0, _errorHandlers.isInvalidSessionError)(error);
|
|
199
|
-
if (invalidSession) {
|
|
200
|
-
updateSessions(sessions.filter(session => session.sessionId !== sessionId), {
|
|
201
|
-
merge: false
|
|
202
|
-
});
|
|
203
|
-
if (sessionId === activeSessionId) {
|
|
204
|
-
const otherSessionIds = sessions.filter(session => session.sessionId !== sessionId && !removedSessionsRef.current.has(session.sessionId)).map(session => session.sessionId);
|
|
205
|
-
const replacementUser = await findReplacementSession(otherSessionIds);
|
|
206
|
-
if (replacementUser) {
|
|
207
|
-
return replacementUser;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
(0, _errorHandlers.handleAuthError)(error, {
|
|
212
|
-
defaultMessage: 'Failed to switch session',
|
|
213
|
-
code: invalidSession ? 'INVALID_SESSION' : 'SESSION_SWITCH_ERROR',
|
|
214
|
-
onError,
|
|
215
|
-
setAuthError,
|
|
216
|
-
logger
|
|
217
|
-
});
|
|
218
|
-
throw error instanceof Error ? error : new Error('Failed to switch session');
|
|
219
|
-
}
|
|
220
|
-
}, [activateSession, activeSessionId, findReplacementSession, logger, loginSuccess, onError, oxyServices, sessions, setAuthError, updateSessions]);
|
|
221
|
-
const refreshSessions = (0, _react.useCallback)(async activeUserId => {
|
|
222
|
-
if (!activeSessionId) return;
|
|
223
|
-
if (refreshInFlightRef.current) {
|
|
224
|
-
await refreshInFlightRef.current;
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
const now = Date.now();
|
|
228
|
-
if (now - lastRefreshRef.current < 500) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
lastRefreshRef.current = now;
|
|
232
|
-
const refreshPromise = (async () => {
|
|
233
|
-
try {
|
|
234
|
-
const deviceSessions = await (0, _sessionHelpers.fetchSessionsWithFallback)(oxyServices, activeSessionId, {
|
|
235
|
-
fallbackUserId: activeUserId,
|
|
236
|
-
logger
|
|
237
|
-
});
|
|
238
|
-
updateSessions(deviceSessions, {
|
|
239
|
-
merge: true
|
|
240
|
-
});
|
|
241
|
-
} catch (error) {
|
|
242
|
-
if ((0, _errorHandlers.isInvalidSessionError)(error)) {
|
|
243
|
-
const otherSessions = sessions.filter(session => session.sessionId !== activeSessionId && !removedSessionsRef.current.has(session.sessionId)).map(session => session.sessionId);
|
|
244
|
-
const replacementUser = await findReplacementSession(otherSessions);
|
|
245
|
-
if (!replacementUser) {
|
|
246
|
-
await clearSessionState();
|
|
247
|
-
}
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
(0, _errorHandlers.handleAuthError)(error, {
|
|
251
|
-
defaultMessage: 'Failed to refresh sessions',
|
|
252
|
-
code: 'SESSION_REFRESH_ERROR',
|
|
253
|
-
onError,
|
|
254
|
-
setAuthError,
|
|
255
|
-
logger
|
|
256
|
-
});
|
|
257
|
-
} finally {
|
|
258
|
-
refreshInFlightRef.current = null;
|
|
259
|
-
lastRefreshRef.current = Date.now();
|
|
260
|
-
}
|
|
261
|
-
})();
|
|
262
|
-
refreshInFlightRef.current = refreshPromise;
|
|
263
|
-
await refreshPromise;
|
|
264
|
-
}, [activeSessionId, clearSessionState, findReplacementSession, logger, onError, oxyServices, sessions, setAuthError, updateSessions]);
|
|
265
|
-
const isRefreshInFlight = Boolean(refreshInFlightRef.current);
|
|
266
|
-
return {
|
|
267
|
-
sessions,
|
|
268
|
-
activeSessionId,
|
|
269
|
-
setActiveSessionId,
|
|
270
|
-
updateSessions,
|
|
271
|
-
switchSession,
|
|
272
|
-
refreshSessions,
|
|
273
|
-
clearSessionState,
|
|
274
|
-
saveActiveSessionId,
|
|
275
|
-
trackRemovedSession,
|
|
276
|
-
storageKeys,
|
|
277
|
-
isRefreshInFlight
|
|
278
|
-
};
|
|
279
|
-
};
|
|
280
|
-
exports.useSessionManagement = useSessionManagement;
|
|
281
|
-
//# sourceMappingURL=useSessionManagement.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_sessionUtils","_sessionHelpers","_storageHelpers","_errorHandlers","_queryClient","DEFAULT_SAVE_ERROR_MESSAGE","CLEAR_STORAGE_ERROR","useSessionManagement","oxyServices","storage","storageKeyPrefix","loginSuccess","logoutStore","applyLanguagePreference","onAuthStateChange","onError","setAuthError","logger","setTokenReady","queryClient","sessions","setSessions","useState","activeSessionId","setActiveSessionId","refreshInFlightRef","useRef","removedSessionsRef","Set","lastRefreshRef","storageKeys","useMemo","getStorageKeys","saveSessionIds","useCallback","sessionIds","uniqueIds","Array","from","setItem","JSON","stringify","error","__DEV__","console","warn","updateSessions","incoming","options","prevSessions","processed","merge","mergeSessions","normalizeAndSortSessions","map","session","sessionId","sessionsArraysEqual","saveActiveSessionId","handleAuthError","defaultMessage","code","removeActiveSessionId","removeItem","clearSessionStorage","catch","clearSessionState","clear","clearQueryCache","activateSession","user","getTokenBySession","trackRemovedSession","current","add","setTimeout","delete","findReplacementSession","length","validationResults","validateSessionBatch","maxConcurrency","validSession","find","result","valid","validation","validateSession","useHeaderValidation","switchSession","Error","deviceSessions","fetchSessionsWithFallback","fallbackUserId","id","invalidSession","isInvalidSessionError","filter","otherSessionIds","has","replacementUser","refreshSessions","activeUserId","now","Date","refreshPromise","otherSessions","isRefreshInFlight","Boolean","exports"],"sourceRoot":"../../../../../src","sources":["ui/context/hooks/useSessionManagement.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AAGA,IAAAK,YAAA,GAAAL,OAAA;AA+BA,MAAMM,0BAA0B,GAAG,6BAA6B;AAChE,MAAMC,mBAAmB,GAAG,yBAAyB;;AAErD;AACA;AACA;AACA;AACA;AACO,MAAMC,oBAAoB,GAAGA,CAAC;EACnCC,WAAW;EACXC,OAAO;EACPC,gBAAgB;EAChBC,YAAY;EACZC,WAAW;EACXC,uBAAuB;EACvBC,iBAAiB;EACjBC,OAAO;EACPC,YAAY;EACZC,MAAM;EACNC,aAAa;EACbC;AAC2B,CAAC,KAAiC;EAC7D,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAG,IAAAC,eAAQ,EAAkB,EAAE,CAAC;EAC7D,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAF,eAAQ,EAAgB,IAAI,CAAC;EAE3E,MAAMG,kBAAkB,GAAG,IAAAC,aAAM,EAAuB,IAAI,CAAC;EAC7D,MAAMC,kBAAkB,GAAG,IAAAD,aAAM,EAAc,IAAIE,GAAG,CAAC,CAAC,CAAC;EACzD,MAAMC,cAAc,GAAG,IAAAH,aAAM,EAAS,CAAC,CAAC;EAExC,MAAMI,WAAW,GAAG,IAAAC,cAAO,EAAC,MAAM,IAAAC,8BAAc,EAACtB,gBAAgB,CAAC,EAAE,CAACA,gBAAgB,CAAC,CAAC;EAEvF,MAAMuB,cAAc,GAAG,IAAAC,kBAAW,EAChC,MAAOC,UAAoB,IAAoB;IAC7C,IAAI,CAAC1B,OAAO,EAAE;IACd,IAAI;MACF,MAAM2B,SAAS,GAAGC,KAAK,CAACC,IAAI,CAAC,IAAIV,GAAG,CAACO,UAAU,CAAC,CAAC;MACjD,MAAM1B,OAAO,CAAC8B,OAAO,CAACT,WAAW,CAACK,UAAU,EAAEK,IAAI,CAACC,SAAS,CAACL,SAAS,CAAC,CAAC;IAC1E,CAAC,CAAC,OAAOM,KAAK,EAAE;MACd,IAAIzB,MAAM,EAAE;QACVA,MAAM,CAACZ,0BAA0B,EAAEqC,KAAK,CAAC;MAC3C,CAAC,MAAM,IAAIC,OAAO,EAAE;QAClBC,OAAO,CAACC,IAAI,CAAC,6BAA6B,EAAEH,KAAK,CAAC;MACpD;IACF;EACF,CAAC,EACD,CAACzB,MAAM,EAAER,OAAO,EAAEqB,WAAW,CAACK,UAAU,CAC1C,CAAC;EAED,MAAMW,cAAc,GAAG,IAAAZ,kBAAW,EAChC,CAACa,QAAyB,EAAEC,OAA4B,GAAG,CAAC,CAAC,KAAW;IACtE3B,WAAW,CAAE4B,YAAY,IAAK;MAC5B,MAAMC,SAAS,GAAGF,OAAO,CAACG,KAAK,GAC3B,IAAAC,2BAAa,EAACH,YAAY,EAAEF,QAAQ,EAAExB,eAAe,EAAE,KAAK,CAAC,GAC7D,IAAA8B,sCAAwB,EAACN,QAAQ,EAAExB,eAAe,EAAE,KAAK,CAAC;MAE9D,IAAId,OAAO,EAAE;QACX,KAAKwB,cAAc,CAACiB,SAAS,CAACI,GAAG,CAAEC,OAAO,IAAKA,OAAO,CAACC,SAAS,CAAC,CAAC;MACpE;MAEA,IAAI,IAAAC,iCAAmB,EAACR,YAAY,EAAEC,SAAS,CAAC,EAAE;QAChD,OAAOD,YAAY;MACrB;MACA,OAAOC,SAAS;IAClB,CAAC,CAAC;EACJ,CAAC,EACD,CAAC3B,eAAe,EAAEU,cAAc,EAAExB,OAAO,CAC3C,CAAC;EAED,MAAMiD,mBAAmB,GAAG,IAAAxB,kBAAW,EACrC,MAAOsB,SAAiB,IAAoB;IAC1C,IAAI,CAAC/C,OAAO,EAAE;IACd,IAAI;MACF,MAAMA,OAAO,CAAC8B,OAAO,CAACT,WAAW,CAACP,eAAe,EAAEiC,SAAS,CAAC;IAC/D,CAAC,CAAC,OAAOd,KAAK,EAAE;MACd,IAAAiB,8BAAe,EAACjB,KAAK,EAAE;QACrBkB,cAAc,EAAEvD,0BAA0B;QAC1CwD,IAAI,EAAE,2BAA2B;QACjC9C,OAAO;QACPC,YAAY;QACZC;MACF,CAAC,CAAC;IACJ;EACF,CAAC,EACD,CAACA,MAAM,EAAEF,OAAO,EAAEC,YAAY,EAAEP,OAAO,EAAEqB,WAAW,CAACP,eAAe,CACtE,CAAC;EAED,MAAMuC,qBAAqB,GAAG,IAAA5B,kBAAW,EAAC,YAA2B;IACnE,IAAI,CAACzB,OAAO,EAAE;IACd,IAAI;MACF,MAAMA,OAAO,CAACsD,UAAU,CAACjC,WAAW,CAACP,eAAe,CAAC;IACvD,CAAC,CAAC,OAAOmB,KAAK,EAAE;MACd,IAAAiB,8BAAe,EAACjB,KAAK,EAAE;QACrBkB,cAAc,EAAEvD,0BAA0B;QAC1CwD,IAAI,EAAE,2BAA2B;QACjC9C,OAAO;QACPC,YAAY;QACZC;MACF,CAAC,CAAC;IACJ;EACF,CAAC,EAAE,CAACA,MAAM,EAAEF,OAAO,EAAEC,YAAY,EAAEP,OAAO,EAAEqB,WAAW,CAACP,eAAe,CAAC,CAAC;EAEzE,MAAMyC,mBAAmB,GAAG,IAAA9B,kBAAW,EAAC,YAA2B;IACjE,IAAI,CAACzB,OAAO,EAAE;IACd,IAAI;MACF,MAAMA,OAAO,CAACsD,UAAU,CAACjC,WAAW,CAACP,eAAe,CAAC;MACrD,MAAMd,OAAO,CAACsD,UAAU,CAACjC,WAAW,CAACK,UAAU,CAAC;MAChD;MACA,MAAM1B,OAAO,CAACsD,UAAU,CAAC,qBAAqB,CAAC,CAACE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,OAAOvB,KAAK,EAAE;MACd,IAAAiB,8BAAe,EAACjB,KAAK,EAAE;QACrBkB,cAAc,EAAEtD,mBAAmB;QACnCuD,IAAI,EAAE,eAAe;QACrB9C,OAAO;QACPC,YAAY;QACZC;MACF,CAAC,CAAC;IACJ;EACF,CAAC,EAAE,CAACA,MAAM,EAAEF,OAAO,EAAEC,YAAY,EAAEP,OAAO,EAAEqB,WAAW,CAACP,eAAe,EAAEO,WAAW,CAACK,UAAU,CAAC,CAAC;EAEjG,MAAM+B,iBAAiB,GAAG,IAAAhC,kBAAW,EAAC,YAA2B;IAC/Db,WAAW,CAAC,EAAE,CAAC;IACfG,kBAAkB,CAAC,IAAI,CAAC;IACxBZ,WAAW,CAAC,CAAC;;IAEb;IACA,IAAIO,WAAW,EAAE;MACfA,WAAW,CAACgD,KAAK,CAAC,CAAC;IACrB;;IAEA;IACA,IAAI1D,OAAO,EAAE;MACX,IAAI;QACF,MAAM,IAAA2D,4BAAe,EAAC3D,OAAO,CAAC;MAChC,CAAC,CAAC,OAAOiC,KAAK,EAAE;QACd,IAAIzB,MAAM,EAAE;UACVA,MAAM,CAAC,uCAAuC,EAAEyB,KAAK,CAAC;QACxD;MACF;IACF;IAEA,MAAMsB,mBAAmB,CAAC,CAAC;IAC3BlD,iBAAiB,GAAG,IAAI,CAAC;EAC3B,CAAC,EAAE,CAACkD,mBAAmB,EAAEpD,WAAW,EAAEE,iBAAiB,EAAEK,WAAW,EAAEV,OAAO,EAAEQ,MAAM,CAAC,CAAC;EAEvF,MAAMoD,eAAe,GAAG,IAAAnC,kBAAW,EACjC,OAAOsB,SAAiB,EAAEc,IAAU,KAAoB;IACtD,MAAM9D,WAAW,CAAC+D,iBAAiB,CAACf,SAAS,CAAC;IAC9CtC,aAAa,GAAG,IAAI,CAAC;IACrBM,kBAAkB,CAACgC,SAAS,CAAC;IAC7B7C,YAAY,CAAC2D,IAAI,CAAC;IAClB,MAAMZ,mBAAmB,CAACF,SAAS,CAAC;IACpC,MAAM3C,uBAAuB,CAACyD,IAAI,CAAC;IACnCxD,iBAAiB,GAAGwD,IAAI,CAAC;EAC3B,CAAC,EACD,CACEzD,uBAAuB,EACvBF,YAAY,EACZG,iBAAiB,EACjBN,WAAW,EACXkD,mBAAmB,EACnBxC,aAAa,CAEjB,CAAC;EAED,MAAMsD,mBAAmB,GAAG,IAAAtC,kBAAW,EAAEsB,SAAiB,IAAK;IAC7D7B,kBAAkB,CAAC8C,OAAO,CAACC,GAAG,CAAClB,SAAS,CAAC;IACzCmB,UAAU,CAAC,MAAM;MACfhD,kBAAkB,CAAC8C,OAAO,CAACG,MAAM,CAACpB,SAAS,CAAC;IAC9C,CAAC,EAAE,IAAI,CAAC;EACV,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMqB,sBAAsB,GAAG,IAAA3C,kBAAW,EACxC,MAAOC,UAAoB,IAA2B;IACpD,IAAI,CAACA,UAAU,CAAC2C,MAAM,EAAE;MACtB,OAAO,IAAI;IACb;IAEA,MAAMC,iBAAiB,GAAG,MAAM,IAAAC,oCAAoB,EAACxE,WAAW,EAAE2B,UAAU,EAAE;MAC5E8C,cAAc,EAAE;IAClB,CAAC,CAAC;IAEF,MAAMC,YAAY,GAAGH,iBAAiB,CAACI,IAAI,CAAEC,MAAM,IAAKA,MAAM,CAACC,KAAK,CAAC;IACrE,IAAI,CAACH,YAAY,EAAE;MACjB,OAAO,IAAI;IACb;IAEA,MAAMI,UAAU,GAAG,MAAM9E,WAAW,CAAC+E,eAAe,CAACL,YAAY,CAAC1B,SAAS,EAAE;MAC3EgC,mBAAmB,EAAE;IACvB,CAAC,CAAC;IAEF,IAAI,CAACF,UAAU,EAAED,KAAK,IAAI,CAACC,UAAU,CAAChB,IAAI,EAAE;MAC1C,OAAO,IAAI;IACb;IAEA,MAAMA,IAAI,GAAGgB,UAAU,CAAChB,IAAY;IACpC,MAAMD,eAAe,CAACa,YAAY,CAAC1B,SAAS,EAAEc,IAAI,CAAC;IACnD,OAAOA,IAAI;EACb,CAAC,EACD,CAACD,eAAe,EAAE7D,WAAW,CAC/B,CAAC;EAED,MAAMiF,aAAa,GAAG,IAAAvD,kBAAW,EAC/B,MAAOsB,SAAiB,IAAoB;IAC1C,IAAI;MACF,MAAM8B,UAAU,GAAG,MAAM9E,WAAW,CAAC+E,eAAe,CAAC/B,SAAS,EAAE;QAAEgC,mBAAmB,EAAE;MAAK,CAAC,CAAC;MAC9F,IAAI,CAACF,UAAU,EAAED,KAAK,EAAE;QACtB,MAAM,IAAIK,KAAK,CAAC,+BAA+B,CAAC;MAClD;MAEA,IAAI,CAACJ,UAAU,CAAChB,IAAI,EAAE;QACpB,MAAM,IAAIoB,KAAK,CAAC,iDAAiD,CAAC;MACpE;MAEA,MAAMpB,IAAI,GAAGgB,UAAU,CAAChB,IAAY;MACpC,MAAMD,eAAe,CAACb,SAAS,EAAEc,IAAI,CAAC;MAEtC,IAAI;QACF,MAAMqB,cAAc,GAAG,MAAM,IAAAC,yCAAyB,EAACpF,WAAW,EAAEgD,SAAS,EAAE;UAC7EqC,cAAc,EAAEvB,IAAI,CAACwB,EAAE;UACvB7E;QACF,CAAC,CAAC;QACF6B,cAAc,CAAC6C,cAAc,EAAE;UAAExC,KAAK,EAAE;QAAK,CAAC,CAAC;MACjD,CAAC,CAAC,OAAOT,KAAK,EAAE;QACd,IAAIC,OAAO,EAAE;UACXC,OAAO,CAACC,IAAI,CAAC,8CAA8C,EAAEH,KAAK,CAAC;QACrE;MACF;MAEA,OAAO4B,IAAI;IACb,CAAC,CAAC,OAAO5B,KAAK,EAAE;MACd,MAAMqD,cAAc,GAAG,IAAAC,oCAAqB,EAACtD,KAAK,CAAC;MAEnD,IAAIqD,cAAc,EAAE;QAClBjD,cAAc,CAAC1B,QAAQ,CAAC6E,MAAM,CAAE1C,OAAO,IAAKA,OAAO,CAACC,SAAS,KAAKA,SAAS,CAAC,EAAE;UAC5EL,KAAK,EAAE;QACT,CAAC,CAAC;QACF,IAAIK,SAAS,KAAKjC,eAAe,EAAE;UACjC,MAAM2E,eAAe,GAAG9E,QAAQ,CAC7B6E,MAAM,CACJ1C,OAAO,IACNA,OAAO,CAACC,SAAS,KAAKA,SAAS,IAAI,CAAC7B,kBAAkB,CAAC8C,OAAO,CAAC0B,GAAG,CAAC5C,OAAO,CAACC,SAAS,CACxF,CAAC,CACAF,GAAG,CAAEC,OAAO,IAAKA,OAAO,CAACC,SAAS,CAAC;UAEtC,MAAM4C,eAAe,GAAG,MAAMvB,sBAAsB,CAACqB,eAAe,CAAC;UACrE,IAAIE,eAAe,EAAE;YACnB,OAAOA,eAAe;UACxB;QACF;MACF;MAEA,IAAAzC,8BAAe,EAACjB,KAAK,EAAE;QACrBkB,cAAc,EAAE,0BAA0B;QAC1CC,IAAI,EAAEkC,cAAc,GAAG,iBAAiB,GAAG,sBAAsB;QACjEhF,OAAO;QACPC,YAAY;QACZC;MACF,CAAC,CAAC;MACF,MAAMyB,KAAK,YAAYgD,KAAK,GAAGhD,KAAK,GAAG,IAAIgD,KAAK,CAAC,0BAA0B,CAAC;IAC9E;EACF,CAAC,EACD,CACErB,eAAe,EACf9C,eAAe,EACfsD,sBAAsB,EACtB5D,MAAM,EACNN,YAAY,EACZI,OAAO,EACPP,WAAW,EACXY,QAAQ,EACRJ,YAAY,EACZ8B,cAAc,CAElB,CAAC;EAED,MAAMuD,eAAe,GAAG,IAAAnE,kBAAW,EACjC,MAAOoE,YAAqB,IAAoB;IAC9C,IAAI,CAAC/E,eAAe,EAAE;IAEtB,IAAIE,kBAAkB,CAACgD,OAAO,EAAE;MAC9B,MAAMhD,kBAAkB,CAACgD,OAAO;MAChC;IACF;IAEA,MAAM8B,GAAG,GAAGC,IAAI,CAACD,GAAG,CAAC,CAAC;IACtB,IAAIA,GAAG,GAAG1E,cAAc,CAAC4C,OAAO,GAAG,GAAG,EAAE;MACtC;IACF;IACA5C,cAAc,CAAC4C,OAAO,GAAG8B,GAAG;IAE5B,MAAME,cAAc,GAAG,CAAC,YAAY;MAClC,IAAI;QACF,MAAMd,cAAc,GAAG,MAAM,IAAAC,yCAAyB,EAACpF,WAAW,EAAEe,eAAe,EAAE;UACnFsE,cAAc,EAAES,YAAY;UAC5BrF;QACF,CAAC,CAAC;QACF6B,cAAc,CAAC6C,cAAc,EAAE;UAAExC,KAAK,EAAE;QAAK,CAAC,CAAC;MACjD,CAAC,CAAC,OAAOT,KAAK,EAAE;QACd,IAAI,IAAAsD,oCAAqB,EAACtD,KAAK,CAAC,EAAE;UAChC,MAAMgE,aAAa,GAAGtF,QAAQ,CAC3B6E,MAAM,CACJ1C,OAAO,IACNA,OAAO,CAACC,SAAS,KAAKjC,eAAe,IACrC,CAACI,kBAAkB,CAAC8C,OAAO,CAAC0B,GAAG,CAAC5C,OAAO,CAACC,SAAS,CACrD,CAAC,CACAF,GAAG,CAAEC,OAAO,IAAKA,OAAO,CAACC,SAAS,CAAC;UAEtC,MAAM4C,eAAe,GAAG,MAAMvB,sBAAsB,CAAC6B,aAAa,CAAC;UACnE,IAAI,CAACN,eAAe,EAAE;YACpB,MAAMlC,iBAAiB,CAAC,CAAC;UAC3B;UACA;QACF;QAEA,IAAAP,8BAAe,EAACjB,KAAK,EAAE;UACrBkB,cAAc,EAAE,4BAA4B;UAC5CC,IAAI,EAAE,uBAAuB;UAC7B9C,OAAO;UACPC,YAAY;UACZC;QACF,CAAC,CAAC;MACJ,CAAC,SAAS;QACRQ,kBAAkB,CAACgD,OAAO,GAAG,IAAI;QACjC5C,cAAc,CAAC4C,OAAO,GAAG+B,IAAI,CAACD,GAAG,CAAC,CAAC;MACrC;IACF,CAAC,EAAE,CAAC;IAEJ9E,kBAAkB,CAACgD,OAAO,GAAGgC,cAAc;IAC3C,MAAMA,cAAc;EACtB,CAAC,EACD,CACElF,eAAe,EACf2C,iBAAiB,EACjBW,sBAAsB,EACtB5D,MAAM,EACNF,OAAO,EACPP,WAAW,EACXY,QAAQ,EACRJ,YAAY,EACZ8B,cAAc,CAElB,CAAC;EAED,MAAM6D,iBAAiB,GAAGC,OAAO,CAACnF,kBAAkB,CAACgD,OAAO,CAAC;EAE7D,OAAO;IACLrD,QAAQ;IACRG,eAAe;IACfC,kBAAkB;IAClBsB,cAAc;IACd2C,aAAa;IACbY,eAAe;IACfnC,iBAAiB;IACjBR,mBAAmB;IACnBc,mBAAmB;IACnB1C,WAAW;IACX6E;EACF,CAAC;AACH,CAAC;AAACE,OAAA,CAAAtG,oBAAA,GAAAA,oBAAA","ignoreList":[]}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useStorage = void 0;
|
|
7
|
-
var _react = require("react");
|
|
8
|
-
var _storageHelpers = require("../../utils/storageHelpers");
|
|
9
|
-
var _errorHandlers = require("../../utils/errorHandlers");
|
|
10
|
-
const DEFAULT_ERROR_CODE = 'STORAGE_INIT_ERROR';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* React hook that exposes a platform-agnostic storage reference.
|
|
14
|
-
* Handles initialization, error propagation, and lazy re-initialization.
|
|
15
|
-
*
|
|
16
|
-
* @param options - Optional configuration for error reporting and logging
|
|
17
|
-
*/
|
|
18
|
-
const useStorage = ({
|
|
19
|
-
onError,
|
|
20
|
-
logger,
|
|
21
|
-
errorCode = DEFAULT_ERROR_CODE
|
|
22
|
-
} = {}) => {
|
|
23
|
-
const [storage, setStorage] = (0, _react.useState)(null);
|
|
24
|
-
const [error, setError] = (0, _react.useState)(null);
|
|
25
|
-
const initializingRef = (0, _react.useRef)(null);
|
|
26
|
-
const notifyError = (0, _react.useCallback)(err => {
|
|
27
|
-
const message = (0, _errorHandlers.extractErrorMessage)(err, 'Failed to initialize storage');
|
|
28
|
-
setError(message);
|
|
29
|
-
if (logger) {
|
|
30
|
-
logger(message, err);
|
|
31
|
-
}
|
|
32
|
-
onError?.({
|
|
33
|
-
message,
|
|
34
|
-
code: errorCode,
|
|
35
|
-
status: 500
|
|
36
|
-
});
|
|
37
|
-
}, [errorCode, logger, onError]);
|
|
38
|
-
const createStorageInstance = (0, _react.useCallback)(async () => {
|
|
39
|
-
try {
|
|
40
|
-
const platformStorage = await (0, _storageHelpers.createPlatformStorage)();
|
|
41
|
-
setStorage(platformStorage);
|
|
42
|
-
setError(null);
|
|
43
|
-
return platformStorage;
|
|
44
|
-
} catch (err) {
|
|
45
|
-
notifyError(err);
|
|
46
|
-
setStorage(null);
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
}, [notifyError]);
|
|
50
|
-
const refresh = (0, _react.useCallback)(async () => {
|
|
51
|
-
if (!initializingRef.current) {
|
|
52
|
-
initializingRef.current = createStorageInstance().finally(() => {
|
|
53
|
-
initializingRef.current = null;
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
return initializingRef.current;
|
|
57
|
-
}, [createStorageInstance]);
|
|
58
|
-
(0, _react.useEffect)(() => {
|
|
59
|
-
refresh().catch(err => {
|
|
60
|
-
notifyError(err);
|
|
61
|
-
});
|
|
62
|
-
}, [refresh, notifyError]);
|
|
63
|
-
const withStorage = (0, _react.useCallback)(async callback => {
|
|
64
|
-
const resolvedStorage = storage ?? (await refresh());
|
|
65
|
-
if (!resolvedStorage) {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
return callback(resolvedStorage);
|
|
69
|
-
}, [refresh, storage]);
|
|
70
|
-
return {
|
|
71
|
-
storage,
|
|
72
|
-
isReady: Boolean(storage) && !error,
|
|
73
|
-
error,
|
|
74
|
-
refresh,
|
|
75
|
-
withStorage
|
|
76
|
-
};
|
|
77
|
-
};
|
|
78
|
-
exports.useStorage = useStorage;
|
|
79
|
-
//# sourceMappingURL=useStorage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_storageHelpers","_errorHandlers","DEFAULT_ERROR_CODE","useStorage","onError","logger","errorCode","storage","setStorage","useState","error","setError","initializingRef","useRef","notifyError","useCallback","err","message","extractErrorMessage","code","status","createStorageInstance","platformStorage","createPlatformStorage","refresh","current","finally","useEffect","catch","withStorage","callback","resolvedStorage","isReady","Boolean","exports"],"sourceRoot":"../../../../../src","sources":["ui/context/hooks/useStorage.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AAgBA,MAAMG,kBAAkB,GAAG,oBAAoB;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,UAAU,GAAGA,CAAC;EACzBC,OAAO;EACPC,MAAM;EACNC,SAAS,GAAGJ;AACK,CAAC,GAAG,CAAC,CAAC,KAAuB;EAC9C,MAAM,CAACK,OAAO,EAAEC,UAAU,CAAC,GAAG,IAAAC,eAAQ,EAA0B,IAAI,CAAC;EACrE,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAF,eAAQ,EAAgB,IAAI,CAAC;EACvD,MAAMG,eAAe,GAAG,IAAAC,aAAM,EAA0C,IAAI,CAAC;EAE7E,MAAMC,WAAW,GAAG,IAAAC,kBAAW,EAC5BC,GAAY,IAAK;IAChB,MAAMC,OAAO,GAAG,IAAAC,kCAAmB,EAACF,GAAG,EAAE,8BAA8B,CAAC;IACxEL,QAAQ,CAACM,OAAO,CAAC;IAEjB,IAAIZ,MAAM,EAAE;MACVA,MAAM,CAACY,OAAO,EAAED,GAAG,CAAC;IACtB;IAEAZ,OAAO,GAAG;MACRa,OAAO;MACPE,IAAI,EAAEb,SAAS;MACfc,MAAM,EAAE;IACV,CAAC,CAAC;EACJ,CAAC,EACD,CAACd,SAAS,EAAED,MAAM,EAAED,OAAO,CAC7B,CAAC;EAED,MAAMiB,qBAAqB,GAAG,IAAAN,kBAAW,EAAC,YAA8C;IACtF,IAAI;MACF,MAAMO,eAAe,GAAG,MAAM,IAAAC,qCAAqB,EAAC,CAAC;MACrDf,UAAU,CAACc,eAAe,CAAC;MAC3BX,QAAQ,CAAC,IAAI,CAAC;MACd,OAAOW,eAAe;IACxB,CAAC,CAAC,OAAON,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;MAChBR,UAAU,CAAC,IAAI,CAAC;MAChB,OAAO,IAAI;IACb;EACF,CAAC,EAAE,CAACM,WAAW,CAAC,CAAC;EAEjB,MAAMU,OAAO,GAAG,IAAAT,kBAAW,EAAC,YAA8C;IACxE,IAAI,CAACH,eAAe,CAACa,OAAO,EAAE;MAC5Bb,eAAe,CAACa,OAAO,GAAGJ,qBAAqB,CAAC,CAAC,CAACK,OAAO,CAAC,MAAM;QAC9Dd,eAAe,CAACa,OAAO,GAAG,IAAI;MAChC,CAAC,CAAC;IACJ;IAEA,OAAOb,eAAe,CAACa,OAAO;EAChC,CAAC,EAAE,CAACJ,qBAAqB,CAAC,CAAC;EAE3B,IAAAM,gBAAS,EAAC,MAAM;IACdH,OAAO,CAAC,CAAC,CAACI,KAAK,CAAEZ,GAAG,IAAK;MACvBF,WAAW,CAACE,GAAG,CAAC;IAClB,CAAC,CAAC;EACJ,CAAC,EAAE,CAACQ,OAAO,EAAEV,WAAW,CAAC,CAAC;EAE1B,MAAMe,WAAW,GAAG,IAAAd,kBAAW,EAC7B,MAAWe,QAA2D,IAAwB;IAC5F,MAAMC,eAAe,GAAGxB,OAAO,KAAK,MAAMiB,OAAO,CAAC,CAAC,CAAC;IACpD,IAAI,CAACO,eAAe,EAAE;MACpB,OAAO,IAAI;IACb;IACA,OAAOD,QAAQ,CAACC,eAAe,CAAC;EAClC,CAAC,EACD,CAACP,OAAO,EAAEjB,OAAO,CACnB,CAAC;EAED,OAAO;IACLA,OAAO;IACPyB,OAAO,EAAEC,OAAO,CAAC1B,OAAO,CAAC,IAAI,CAACG,KAAK;IACnCA,KAAK;IACLc,OAAO;IACPK;EACF,CAAC;AACH,CAAC;AAACK,OAAA,CAAA/B,UAAA,GAAAA,UAAA","ignoreList":[]}
|