@oxyhq/services 5.16.1 → 5.16.2
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/core/mixins/OxyServices.user.js +14 -13
- package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/commonjs/crypto/keyManager.js +164 -3
- package/lib/commonjs/crypto/keyManager.js.map +1 -1
- package/lib/commonjs/crypto/signatureService.js +26 -0
- package/lib/commonjs/crypto/signatureService.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedSection.js +1 -1
- package/lib/commonjs/ui/components/GroupedSection.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +71 -24
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/profile/EditDisplayNameModal.js +1 -4
- package/lib/commonjs/ui/components/profile/EditDisplayNameModal.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +177 -4
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js +148 -49
- package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js +22 -2
- package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/hooks/mutations/index.js +28 -0
- package/lib/commonjs/ui/hooks/mutations/index.js.map +1 -0
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +314 -0
- package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -0
- package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +193 -0
- package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js.map +1 -0
- package/lib/commonjs/ui/hooks/queries/index.js +39 -0
- package/lib/commonjs/ui/hooks/queries/index.js.map +1 -0
- package/lib/commonjs/ui/hooks/queries/queryKeys.js +85 -0
- package/lib/commonjs/ui/hooks/queries/queryKeys.js.map +1 -0
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +145 -0
- package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -0
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +138 -0
- package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -0
- package/lib/commonjs/ui/hooks/queryClient.js +117 -0
- package/lib/commonjs/ui/hooks/queryClient.js.map +1 -0
- package/lib/commonjs/ui/hooks/useIdentityMutations.js +111 -0
- package/lib/commonjs/ui/hooks/useIdentityMutations.js.map +1 -0
- package/lib/commonjs/ui/hooks/useProfileEditing.js +42 -58
- package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
- package/lib/commonjs/ui/hooks/useQueryClient.js +20 -0
- package/lib/commonjs/ui/hooks/useQueryClient.js.map +1 -0
- package/lib/commonjs/ui/hooks/useSessionManagement.js +22 -2
- package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +43 -42
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +63 -58
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +6 -6
- package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/commonjs/ui/stores/accountStore.js +57 -42
- package/lib/commonjs/ui/stores/accountStore.js.map +1 -1
- package/lib/commonjs/ui/stores/authStore.js +4 -25
- package/lib/commonjs/ui/stores/authStore.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.user.js +14 -13
- package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
- package/lib/module/crypto/keyManager.js +164 -3
- package/lib/module/crypto/keyManager.js.map +1 -1
- package/lib/module/crypto/signatureService.js +26 -0
- package/lib/module/crypto/signatureService.js.map +1 -1
- package/lib/module/ui/components/GroupedSection.js +1 -1
- package/lib/module/ui/components/GroupedSection.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +72 -25
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/profile/EditDisplayNameModal.js +1 -4
- package/lib/module/ui/components/profile/EditDisplayNameModal.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +176 -4
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/hooks/useAuthOperations.js +148 -49
- package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
- package/lib/module/ui/context/hooks/useSessionManagement.js +22 -2
- package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/hooks/mutations/index.js +6 -0
- package/lib/module/ui/hooks/mutations/index.js.map +1 -0
- package/lib/module/ui/hooks/mutations/useAccountMutations.js +308 -0
- package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -0
- package/lib/module/ui/hooks/mutations/useServicesMutations.js +185 -0
- package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -0
- package/lib/module/ui/hooks/queries/index.js +7 -0
- package/lib/module/ui/hooks/queries/index.js.map +1 -0
- package/lib/module/ui/hooks/queries/queryKeys.js +78 -0
- package/lib/module/ui/hooks/queries/queryKeys.js.map +1 -0
- package/lib/module/ui/hooks/queries/useAccountQueries.js +136 -0
- package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -0
- package/lib/module/ui/hooks/queries/useServicesQueries.js +130 -0
- package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -0
- package/lib/module/ui/hooks/queryClient.js +110 -0
- package/lib/module/ui/hooks/queryClient.js.map +1 -0
- package/lib/module/ui/hooks/useIdentityMutations.js +105 -0
- package/lib/module/ui/hooks/useIdentityMutations.js.map +1 -0
- package/lib/module/ui/hooks/useProfileEditing.js +43 -59
- package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
- package/lib/module/ui/hooks/useQueryClient.js +15 -0
- package/lib/module/ui/hooks/useQueryClient.js.map +1 -0
- package/lib/module/ui/hooks/useSessionManagement.js +22 -2
- package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +43 -42
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +63 -58
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/WelcomeNewUserScreen.js +6 -6
- package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
- package/lib/module/ui/stores/accountStore.js +57 -42
- package/lib/module/ui/stores/accountStore.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +4 -25
- package/lib/module/ui/stores/authStore.js.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.user.d.ts +4 -5
- package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
- package/lib/typescript/core/mixins/index.d.ts +0 -1
- package/lib/typescript/core/mixins/index.d.ts.map +1 -1
- package/lib/typescript/crypto/keyManager.d.ts +19 -2
- package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
- package/lib/typescript/crypto/signatureService.d.ts +5 -0
- package/lib/typescript/crypto/signatureService.d.ts.map +1 -1
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/profile/EditDisplayNameModal.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts +4 -0
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +3 -1
- package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/mutations/index.d.ts +3 -0
- package/lib/typescript/ui/hooks/mutations/index.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +25 -0
- package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/mutations/useServicesMutations.d.ts +23 -0
- package/lib/typescript/ui/hooks/mutations/useServicesMutations.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/queries/index.d.ts +4 -0
- package/lib/typescript/ui/hooks/queries/index.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/queries/queryKeys.d.ts +56 -0
- package/lib/typescript/ui/hooks/queries/queryKeys.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +41 -0
- package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts +34 -0
- package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/queryClient.d.ts +19 -0
- package/lib/typescript/ui/hooks/queryClient.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/useIdentityMutations.d.ts +29 -0
- package/lib/typescript/ui/hooks/useIdentityMutations.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useQueryClient.d.ts +7 -0
- package/lib/typescript/ui/hooks/useQueryClient.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts +3 -1
- package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/WelcomeNewUserScreen.d.ts.map +1 -1
- package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts +0 -4
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/core/mixins/OxyServices.user.ts +17 -10
- package/src/crypto/keyManager.ts +177 -2
- package/src/crypto/signatureService.ts +30 -0
- package/src/ui/components/GroupedSection.tsx +1 -1
- package/src/ui/components/OxyProvider.tsx +91 -37
- package/src/ui/components/profile/EditDisplayNameModal.tsx +1 -3
- package/src/ui/context/OxyContext.tsx +185 -2
- package/src/ui/context/hooks/useAuthOperations.ts +171 -58
- package/src/ui/context/hooks/useSessionManagement.ts +24 -1
- package/src/ui/hooks/mutations/index.ts +4 -0
- package/src/ui/hooks/mutations/useAccountMutations.ts +277 -0
- package/src/ui/hooks/mutations/useServicesMutations.ts +164 -0
- package/src/ui/hooks/queries/index.ts +5 -0
- package/src/ui/hooks/queries/queryKeys.ts +73 -0
- package/src/ui/hooks/queries/useAccountQueries.ts +126 -0
- package/src/ui/hooks/queries/useServicesQueries.ts +121 -0
- package/src/ui/hooks/queryClient.ts +112 -0
- package/src/ui/hooks/useIdentityMutations.ts +115 -0
- package/src/ui/hooks/useProfileEditing.ts +46 -60
- package/src/ui/hooks/useQueryClient.ts +17 -0
- package/src/ui/hooks/useSessionManagement.ts +24 -1
- package/src/ui/screens/AccountOverviewScreen.tsx +38 -46
- package/src/ui/screens/AccountSettingsScreen.tsx +54 -54
- package/src/ui/screens/WelcomeNewUserScreen.tsx +13 -12
- package/src/ui/stores/accountStore.ts +54 -43
- package/src/ui/stores/authStore.ts +3 -17
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useQuery, useQueries } from '@tanstack/react-query';
|
|
4
|
+
import { queryKeys } from './queryKeys';
|
|
5
|
+
import { useOxy } from '../../context/OxyContext';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Get user profile by session ID
|
|
9
|
+
*/
|
|
10
|
+
export const useUserProfile = (sessionId, options) => {
|
|
11
|
+
const {
|
|
12
|
+
oxyServices
|
|
13
|
+
} = useOxy();
|
|
14
|
+
return useQuery({
|
|
15
|
+
queryKey: queryKeys.users.profile(sessionId || ''),
|
|
16
|
+
queryFn: async () => {
|
|
17
|
+
if (!sessionId) {
|
|
18
|
+
throw new Error('Session ID is required');
|
|
19
|
+
}
|
|
20
|
+
return await oxyServices.getUserBySession(sessionId);
|
|
21
|
+
},
|
|
22
|
+
enabled: options?.enabled !== false && !!sessionId,
|
|
23
|
+
staleTime: 5 * 60 * 1000,
|
|
24
|
+
// 5 minutes
|
|
25
|
+
gcTime: 30 * 60 * 1000 // 30 minutes
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Get multiple user profiles by session IDs (batch query)
|
|
31
|
+
*/
|
|
32
|
+
export const useUserProfiles = (sessionIds, options) => {
|
|
33
|
+
const {
|
|
34
|
+
oxyServices
|
|
35
|
+
} = useOxy();
|
|
36
|
+
return useQueries({
|
|
37
|
+
queries: sessionIds.map(sessionId => ({
|
|
38
|
+
queryKey: queryKeys.users.profile(sessionId),
|
|
39
|
+
queryFn: async () => {
|
|
40
|
+
const results = await oxyServices.getUsersBySessions([sessionId]);
|
|
41
|
+
return results[0]?.user || null;
|
|
42
|
+
},
|
|
43
|
+
enabled: options?.enabled !== false && !!sessionId,
|
|
44
|
+
staleTime: 5 * 60 * 1000,
|
|
45
|
+
gcTime: 30 * 60 * 1000
|
|
46
|
+
}))
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get current authenticated user
|
|
52
|
+
*/
|
|
53
|
+
export const useCurrentUser = options => {
|
|
54
|
+
const {
|
|
55
|
+
oxyServices,
|
|
56
|
+
activeSessionId,
|
|
57
|
+
isAuthenticated
|
|
58
|
+
} = useOxy();
|
|
59
|
+
return useQuery({
|
|
60
|
+
queryKey: queryKeys.accounts.current(),
|
|
61
|
+
queryFn: async () => {
|
|
62
|
+
if (!activeSessionId) {
|
|
63
|
+
throw new Error('No active session');
|
|
64
|
+
}
|
|
65
|
+
return await oxyServices.getUserBySession(activeSessionId);
|
|
66
|
+
},
|
|
67
|
+
enabled: options?.enabled !== false && isAuthenticated && !!activeSessionId,
|
|
68
|
+
staleTime: 1 * 60 * 1000,
|
|
69
|
+
// 1 minute for current user
|
|
70
|
+
gcTime: 30 * 60 * 1000
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get user by ID
|
|
76
|
+
*/
|
|
77
|
+
export const useUserById = (userId, options) => {
|
|
78
|
+
const {
|
|
79
|
+
oxyServices
|
|
80
|
+
} = useOxy();
|
|
81
|
+
return useQuery({
|
|
82
|
+
queryKey: queryKeys.users.detail(userId || ''),
|
|
83
|
+
queryFn: async () => {
|
|
84
|
+
if (!userId) {
|
|
85
|
+
throw new Error('User ID is required');
|
|
86
|
+
}
|
|
87
|
+
return await oxyServices.getUserById(userId);
|
|
88
|
+
},
|
|
89
|
+
enabled: options?.enabled !== false && !!userId,
|
|
90
|
+
staleTime: 5 * 60 * 1000,
|
|
91
|
+
gcTime: 30 * 60 * 1000
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get user profile by username
|
|
97
|
+
*/
|
|
98
|
+
export const useUserByUsername = (username, options) => {
|
|
99
|
+
const {
|
|
100
|
+
oxyServices
|
|
101
|
+
} = useOxy();
|
|
102
|
+
return useQuery({
|
|
103
|
+
queryKey: [...queryKeys.users.details(), 'username', username || ''],
|
|
104
|
+
queryFn: async () => {
|
|
105
|
+
if (!username) {
|
|
106
|
+
throw new Error('Username is required');
|
|
107
|
+
}
|
|
108
|
+
return await oxyServices.getProfileByUsername(username);
|
|
109
|
+
},
|
|
110
|
+
enabled: options?.enabled !== false && !!username,
|
|
111
|
+
staleTime: 5 * 60 * 1000,
|
|
112
|
+
gcTime: 30 * 60 * 1000
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Batch get users by session IDs (optimized single API call)
|
|
118
|
+
*/
|
|
119
|
+
export const useUsersBySessions = (sessionIds, options) => {
|
|
120
|
+
const {
|
|
121
|
+
oxyServices
|
|
122
|
+
} = useOxy();
|
|
123
|
+
return useQuery({
|
|
124
|
+
queryKey: queryKeys.accounts.list(sessionIds),
|
|
125
|
+
queryFn: async () => {
|
|
126
|
+
if (sessionIds.length === 0) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
return await oxyServices.getUsersBySessions(sessionIds);
|
|
130
|
+
},
|
|
131
|
+
enabled: options?.enabled !== false && sessionIds.length > 0,
|
|
132
|
+
staleTime: 5 * 60 * 1000,
|
|
133
|
+
gcTime: 30 * 60 * 1000
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=useAccountQueries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useQuery","useQueries","queryKeys","useOxy","useUserProfile","sessionId","options","oxyServices","queryKey","users","profile","queryFn","Error","getUserBySession","enabled","staleTime","gcTime","useUserProfiles","sessionIds","queries","map","results","getUsersBySessions","user","useCurrentUser","activeSessionId","isAuthenticated","accounts","current","useUserById","userId","detail","getUserById","useUserByUsername","username","details","getProfileByUsername","useUsersBySessions","list","length"],"sourceRoot":"../../../../../src","sources":["ui/hooks/queries/useAccountQueries.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useQuery } from '@tanstack/react-query';
|
|
4
|
+
import { queryKeys } from './queryKeys';
|
|
5
|
+
import { useOxy } from '../../context/OxyContext';
|
|
6
|
+
import { fetchSessionsWithFallback, mapSessionsToClient } from '../../context/utils/sessionHelpers';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Get all active sessions for the current user
|
|
10
|
+
*/
|
|
11
|
+
export const useSessions = (userId, options) => {
|
|
12
|
+
const {
|
|
13
|
+
oxyServices,
|
|
14
|
+
activeSessionId
|
|
15
|
+
} = useOxy();
|
|
16
|
+
return useQuery({
|
|
17
|
+
queryKey: queryKeys.sessions.list(userId),
|
|
18
|
+
queryFn: async () => {
|
|
19
|
+
if (!activeSessionId) {
|
|
20
|
+
throw new Error('No active session');
|
|
21
|
+
}
|
|
22
|
+
const sessions = await fetchSessionsWithFallback(oxyServices, activeSessionId, {
|
|
23
|
+
fallbackDeviceId: undefined,
|
|
24
|
+
fallbackUserId: userId
|
|
25
|
+
});
|
|
26
|
+
return mapSessionsToClient(sessions, activeSessionId);
|
|
27
|
+
},
|
|
28
|
+
enabled: options?.enabled !== false && !!activeSessionId,
|
|
29
|
+
staleTime: 2 * 60 * 1000,
|
|
30
|
+
// 2 minutes (sessions change frequently)
|
|
31
|
+
gcTime: 10 * 60 * 1000 // 10 minutes
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get specific session by ID
|
|
37
|
+
*/
|
|
38
|
+
export const useSession = (sessionId, options) => {
|
|
39
|
+
const {
|
|
40
|
+
oxyServices
|
|
41
|
+
} = useOxy();
|
|
42
|
+
return useQuery({
|
|
43
|
+
queryKey: queryKeys.sessions.detail(sessionId || ''),
|
|
44
|
+
queryFn: async () => {
|
|
45
|
+
if (!sessionId) {
|
|
46
|
+
throw new Error('Session ID is required');
|
|
47
|
+
}
|
|
48
|
+
const validation = await oxyServices.validateSession(sessionId, {
|
|
49
|
+
useHeaderValidation: true
|
|
50
|
+
});
|
|
51
|
+
if (!validation?.valid || !validation.user) {
|
|
52
|
+
throw new Error('Session not found or invalid');
|
|
53
|
+
}
|
|
54
|
+
const now = new Date();
|
|
55
|
+
return {
|
|
56
|
+
sessionId,
|
|
57
|
+
deviceId: '',
|
|
58
|
+
// Device ID not available from validation response
|
|
59
|
+
expiresAt: validation.expiresAt || new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
60
|
+
lastActive: validation.lastActivity || now.toISOString(),
|
|
61
|
+
userId: validation.user.id?.toString() ?? '',
|
|
62
|
+
isCurrent: false
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
enabled: options?.enabled !== false && !!sessionId,
|
|
66
|
+
staleTime: 2 * 60 * 1000,
|
|
67
|
+
gcTime: 10 * 60 * 1000
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get device sessions for the current active session
|
|
73
|
+
*/
|
|
74
|
+
export const useDeviceSessions = options => {
|
|
75
|
+
const {
|
|
76
|
+
oxyServices,
|
|
77
|
+
activeSessionId
|
|
78
|
+
} = useOxy();
|
|
79
|
+
return useQuery({
|
|
80
|
+
queryKey: queryKeys.sessions.active(),
|
|
81
|
+
queryFn: async () => {
|
|
82
|
+
if (!activeSessionId) {
|
|
83
|
+
throw new Error('No active session');
|
|
84
|
+
}
|
|
85
|
+
return await oxyServices.getDeviceSessions(activeSessionId);
|
|
86
|
+
},
|
|
87
|
+
enabled: options?.enabled !== false && !!activeSessionId,
|
|
88
|
+
staleTime: 2 * 60 * 1000,
|
|
89
|
+
gcTime: 10 * 60 * 1000
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Get user devices
|
|
95
|
+
*/
|
|
96
|
+
export const useUserDevices = options => {
|
|
97
|
+
const {
|
|
98
|
+
oxyServices,
|
|
99
|
+
isAuthenticated
|
|
100
|
+
} = useOxy();
|
|
101
|
+
return useQuery({
|
|
102
|
+
queryKey: queryKeys.devices.list(),
|
|
103
|
+
queryFn: async () => {
|
|
104
|
+
return await oxyServices.getUserDevices();
|
|
105
|
+
},
|
|
106
|
+
enabled: options?.enabled !== false && isAuthenticated,
|
|
107
|
+
staleTime: 5 * 60 * 1000,
|
|
108
|
+
gcTime: 30 * 60 * 1000
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get security information
|
|
114
|
+
*/
|
|
115
|
+
export const useSecurityInfo = options => {
|
|
116
|
+
const {
|
|
117
|
+
oxyServices,
|
|
118
|
+
isAuthenticated
|
|
119
|
+
} = useOxy();
|
|
120
|
+
return useQuery({
|
|
121
|
+
queryKey: [...queryKeys.devices.all, 'security'],
|
|
122
|
+
queryFn: async () => {
|
|
123
|
+
return await oxyServices.getSecurityInfo();
|
|
124
|
+
},
|
|
125
|
+
enabled: options?.enabled !== false && isAuthenticated,
|
|
126
|
+
staleTime: 5 * 60 * 1000,
|
|
127
|
+
gcTime: 30 * 60 * 1000
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=useServicesQueries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useQuery","queryKeys","useOxy","fetchSessionsWithFallback","mapSessionsToClient","useSessions","userId","options","oxyServices","activeSessionId","queryKey","sessions","list","queryFn","Error","fallbackDeviceId","undefined","fallbackUserId","enabled","staleTime","gcTime","useSession","sessionId","detail","validation","validateSession","useHeaderValidation","valid","user","now","Date","deviceId","expiresAt","getTime","toISOString","lastActive","lastActivity","id","toString","isCurrent","useDeviceSessions","active","getDeviceSessions","useUserDevices","isAuthenticated","devices","getUserDevices","useSecurityInfo","all","getSecurityInfo"],"sourceRoot":"../../../../../src","sources":["ui/hooks/queries/useServicesQueries.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { QueryClient } from '@tanstack/react-query';
|
|
4
|
+
const QUERY_CACHE_KEY = 'oxy_query_cache';
|
|
5
|
+
const QUERY_CACHE_VERSION = '1';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Custom persistence adapter for TanStack Query using our StorageInterface
|
|
9
|
+
*/
|
|
10
|
+
export const createPersistenceAdapter = storage => {
|
|
11
|
+
return {
|
|
12
|
+
persistClient: async client => {
|
|
13
|
+
try {
|
|
14
|
+
const serialized = JSON.stringify({
|
|
15
|
+
clientState: client,
|
|
16
|
+
timestamp: Date.now(),
|
|
17
|
+
version: QUERY_CACHE_VERSION
|
|
18
|
+
});
|
|
19
|
+
await storage.setItem(QUERY_CACHE_KEY, serialized);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (__DEV__) {
|
|
22
|
+
console.warn('[QueryClient] Failed to persist cache:', error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
restoreClient: async () => {
|
|
27
|
+
try {
|
|
28
|
+
const cached = await storage.getItem(QUERY_CACHE_KEY);
|
|
29
|
+
if (!cached) return undefined;
|
|
30
|
+
const parsed = JSON.parse(cached);
|
|
31
|
+
|
|
32
|
+
// Check version compatibility
|
|
33
|
+
if (parsed.version !== QUERY_CACHE_VERSION) {
|
|
34
|
+
// Clear old cache on version mismatch
|
|
35
|
+
await storage.removeItem(QUERY_CACHE_KEY);
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Check if cache is too old (30 days)
|
|
40
|
+
const maxAge = 30 * 24 * 60 * 60 * 1000;
|
|
41
|
+
if (parsed.timestamp && Date.now() - parsed.timestamp > maxAge) {
|
|
42
|
+
await storage.removeItem(QUERY_CACHE_KEY);
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return parsed.clientState;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (__DEV__) {
|
|
48
|
+
console.warn('[QueryClient] Failed to restore cache:', error);
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
removeClient: async () => {
|
|
54
|
+
try {
|
|
55
|
+
await storage.removeItem(QUERY_CACHE_KEY);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
if (__DEV__) {
|
|
58
|
+
console.warn('[QueryClient] Failed to remove cache:', error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Create a QueryClient with offline-first configuration
|
|
67
|
+
*/
|
|
68
|
+
export const createQueryClient = storage => {
|
|
69
|
+
const client = new QueryClient({
|
|
70
|
+
defaultOptions: {
|
|
71
|
+
queries: {
|
|
72
|
+
// Data is fresh for 5 minutes
|
|
73
|
+
staleTime: 5 * 60 * 1000,
|
|
74
|
+
// Keep unused data in cache for 30 minutes
|
|
75
|
+
gcTime: 30 * 60 * 1000,
|
|
76
|
+
// Retry 3 times with exponential backoff
|
|
77
|
+
retry: 3,
|
|
78
|
+
retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
79
|
+
// Refetch on reconnect
|
|
80
|
+
refetchOnReconnect: true,
|
|
81
|
+
// Don't refetch on window focus (better for mobile)
|
|
82
|
+
refetchOnWindowFocus: false,
|
|
83
|
+
// Offline-first: use cache when offline
|
|
84
|
+
networkMode: 'offlineFirst'
|
|
85
|
+
},
|
|
86
|
+
mutations: {
|
|
87
|
+
// Retry once for mutations
|
|
88
|
+
retry: 1,
|
|
89
|
+
// Offline-first: queue mutations when offline
|
|
90
|
+
networkMode: 'offlineFirst'
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Note: Persistence is handled by TanStack Query's built-in persistence
|
|
96
|
+
// For now, we rely on the query client's default behavior with networkMode: 'offlineFirst'
|
|
97
|
+
// The cache will be available in memory and queries will use cached data when offline
|
|
98
|
+
// Full persistence to AsyncStorage can be added later with @tanstack/react-query-persist-client if needed
|
|
99
|
+
|
|
100
|
+
return client;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Clear persisted query cache
|
|
105
|
+
*/
|
|
106
|
+
export const clearQueryCache = async storage => {
|
|
107
|
+
const adapter = createPersistenceAdapter(storage);
|
|
108
|
+
await adapter.removeClient();
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=queryClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["QueryClient","QUERY_CACHE_KEY","QUERY_CACHE_VERSION","createPersistenceAdapter","storage","persistClient","client","serialized","JSON","stringify","clientState","timestamp","Date","now","version","setItem","error","__DEV__","console","warn","restoreClient","cached","getItem","undefined","parsed","parse","removeItem","maxAge","removeClient","createQueryClient","defaultOptions","queries","staleTime","gcTime","retry","retryDelay","attemptIndex","Math","min","refetchOnReconnect","refetchOnWindowFocus","networkMode","mutations","clearQueryCache","adapter"],"sourceRoot":"../../../../src","sources":["ui/hooks/queryClient.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* TanStack Query mutations for identity operations
|
|
5
|
+
* Provides offline-first mutations for identity creation, import, and sync
|
|
6
|
+
* Never deletes identity on errors - preserves user data
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
10
|
+
/**
|
|
11
|
+
* Hook for creating a new identity with offline support
|
|
12
|
+
* Never deletes identity on error - preserves user data
|
|
13
|
+
*/
|
|
14
|
+
export function useCreateIdentity(createIdentityFn) {
|
|
15
|
+
const queryClient = useQueryClient();
|
|
16
|
+
return useMutation({
|
|
17
|
+
mutationFn: createIdentityFn,
|
|
18
|
+
onSuccess: data => {
|
|
19
|
+
// Invalidate user queries to refetch after identity creation
|
|
20
|
+
queryClient.invalidateQueries({
|
|
21
|
+
queryKey: ['user']
|
|
22
|
+
});
|
|
23
|
+
queryClient.invalidateQueries({
|
|
24
|
+
queryKey: ['identity']
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
onError: error => {
|
|
28
|
+
// Never delete identity on error - just log it
|
|
29
|
+
// User can recover using recovery phrase
|
|
30
|
+
if (__DEV__) {
|
|
31
|
+
console.warn('[useCreateIdentity] Identity creation error (identity may still exist):', error);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
retry: false,
|
|
35
|
+
// Don't retry identity creation
|
|
36
|
+
networkMode: 'offlineFirst'
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Hook for importing an identity from recovery phrase
|
|
42
|
+
* Never deletes identity on error - preserves user data
|
|
43
|
+
*/
|
|
44
|
+
export function useImportIdentity(importIdentityFn) {
|
|
45
|
+
const queryClient = useQueryClient();
|
|
46
|
+
return useMutation({
|
|
47
|
+
mutationFn: importIdentityFn,
|
|
48
|
+
onSuccess: data => {
|
|
49
|
+
queryClient.invalidateQueries({
|
|
50
|
+
queryKey: ['user']
|
|
51
|
+
});
|
|
52
|
+
queryClient.invalidateQueries({
|
|
53
|
+
queryKey: ['identity']
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
onError: error => {
|
|
57
|
+
// Never delete identity on error - just log it
|
|
58
|
+
if (__DEV__) {
|
|
59
|
+
console.warn('[useImportIdentity] Identity import error (identity may still exist):', error);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
retry: false,
|
|
63
|
+
networkMode: 'offlineFirst'
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Hook for syncing identity with server
|
|
69
|
+
* Never deletes identity on error - only logs and allows retry
|
|
70
|
+
*/
|
|
71
|
+
export function useSyncIdentity(syncIdentityFn) {
|
|
72
|
+
const queryClient = useQueryClient();
|
|
73
|
+
return useMutation({
|
|
74
|
+
mutationFn: syncIdentityFn,
|
|
75
|
+
onSuccess: user => {
|
|
76
|
+
// Update user cache
|
|
77
|
+
queryClient.setQueryData(['user', 'current'], user);
|
|
78
|
+
queryClient.invalidateQueries({
|
|
79
|
+
queryKey: ['user']
|
|
80
|
+
});
|
|
81
|
+
queryClient.invalidateQueries({
|
|
82
|
+
queryKey: ['identity']
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
onError: error => {
|
|
86
|
+
// Never delete identity on error - just log it
|
|
87
|
+
// User can retry sync later or use recovery phrase
|
|
88
|
+
if (__DEV__) {
|
|
89
|
+
console.warn('[useSyncIdentity] Sync failed, but identity is preserved:', error);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
retry: (failureCount, error) => {
|
|
93
|
+
// Retry up to 2 times for sync operations
|
|
94
|
+
// Don't retry if it's a network error - user can retry when online
|
|
95
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
96
|
+
const isNetworkError = errorMessage.includes('Network') || errorMessage.includes('Failed to fetch') || error?.code === 'NETWORK_ERROR';
|
|
97
|
+
if (isNetworkError) {
|
|
98
|
+
return false; // Don't retry network errors - user will retry when online
|
|
99
|
+
}
|
|
100
|
+
return failureCount < 2;
|
|
101
|
+
},
|
|
102
|
+
networkMode: 'offlineFirst'
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=useIdentityMutations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMutation","useQueryClient","useCreateIdentity","createIdentityFn","queryClient","mutationFn","onSuccess","data","invalidateQueries","queryKey","onError","error","__DEV__","console","warn","retry","networkMode","useImportIdentity","importIdentityFn","useSyncIdentity","syncIdentityFn","user","setQueryData","failureCount","errorMessage","Error","message","String","isNetworkError","includes","code"],"sourceRoot":"../../../../src","sources":["ui/hooks/useIdentityMutations.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,83 +1,67 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { useOxy } from '../context/OxyContext';
|
|
5
|
-
import { useAuthStore } from '../stores/authStore';
|
|
6
|
-
import { toast } from '../../lib/sonner';
|
|
3
|
+
import { useCallback } from 'react';
|
|
7
4
|
import { useI18n } from './useI18n';
|
|
5
|
+
import { useUpdateProfile } from './mutations/useAccountMutations';
|
|
6
|
+
import { useAuthStore } from '../stores/authStore';
|
|
8
7
|
/**
|
|
9
8
|
* Hook for managing profile editing operations
|
|
10
9
|
* Provides functions to update profile fields and handle saving
|
|
11
10
|
*/
|
|
12
11
|
export const useProfileEditing = () => {
|
|
13
|
-
const {
|
|
14
|
-
oxyServices,
|
|
15
|
-
activeSessionId
|
|
16
|
-
} = useOxy();
|
|
17
|
-
const updateUser = useAuthStore(state => state.updateUser);
|
|
18
12
|
const {
|
|
19
13
|
t
|
|
20
14
|
} = useI18n();
|
|
21
|
-
const
|
|
15
|
+
const updateProfileMutation = useUpdateProfile();
|
|
22
16
|
|
|
23
17
|
/**
|
|
24
|
-
* Save profile updates to the server
|
|
18
|
+
* Save profile updates to the server using TanStack Query
|
|
25
19
|
*/
|
|
26
20
|
const saveProfile = useCallback(async updates => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
// Prepare update object
|
|
22
|
+
const updateData = {};
|
|
23
|
+
if (updates.username !== undefined) {
|
|
24
|
+
updateData.username = updates.username;
|
|
30
25
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (updates.
|
|
40
|
-
updateData.
|
|
41
|
-
}
|
|
42
|
-
if (updates.bio !== undefined) {
|
|
43
|
-
updateData.bio = updates.bio;
|
|
44
|
-
}
|
|
45
|
-
if (updates.location !== undefined || updates.locations !== undefined) {
|
|
46
|
-
updateData.location = updates.locations && updates.locations.length > 0 ? updates.locations[0].name : updates.location || '';
|
|
47
|
-
if (updates.locations) {
|
|
48
|
-
updateData.locations = updates.locations;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (updates.links !== undefined) {
|
|
52
|
-
updateData.links = updates.links;
|
|
53
|
-
}
|
|
54
|
-
if (updates.linksMetadata !== undefined) {
|
|
55
|
-
updateData.linksMetadata = updates.linksMetadata;
|
|
56
|
-
}
|
|
57
|
-
if (updates.avatar !== undefined) {
|
|
58
|
-
updateData.avatar = updates.avatar;
|
|
26
|
+
if (updates.email !== undefined) {
|
|
27
|
+
updateData.email = updates.email;
|
|
28
|
+
}
|
|
29
|
+
if (updates.bio !== undefined) {
|
|
30
|
+
updateData.bio = updates.bio;
|
|
31
|
+
}
|
|
32
|
+
if (updates.location !== undefined || updates.locations !== undefined) {
|
|
33
|
+
updateData.location = updates.locations && updates.locations.length > 0 ? updates.locations[0].name : updates.location || '';
|
|
34
|
+
if (updates.locations) {
|
|
35
|
+
updateData.locations = updates.locations;
|
|
59
36
|
}
|
|
37
|
+
}
|
|
38
|
+
if (updates.links !== undefined) {
|
|
39
|
+
updateData.links = updates.links;
|
|
40
|
+
}
|
|
41
|
+
if (updates.linksMetadata !== undefined) {
|
|
42
|
+
updateData.linksMetadata = updates.linksMetadata;
|
|
43
|
+
}
|
|
44
|
+
if (updates.avatar !== undefined) {
|
|
45
|
+
updateData.avatar = updates.avatar;
|
|
46
|
+
}
|
|
60
47
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
48
|
+
// Handle name field
|
|
49
|
+
if (updates.displayName !== undefined || updates.lastName !== undefined) {
|
|
50
|
+
const currentUser = useAuthStore.getState().user;
|
|
51
|
+
const currentName = currentUser?.name;
|
|
52
|
+
updateData.name = {
|
|
53
|
+
first: updates.displayName ?? (typeof currentName === 'object' ? currentName?.first : '') ?? '',
|
|
54
|
+
last: updates.lastName ?? (typeof currentName === 'object' ? currentName?.last : '') ?? ''
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
await updateProfileMutation.mutateAsync(updateData);
|
|
72
59
|
return true;
|
|
73
60
|
} catch (error) {
|
|
74
|
-
|
|
75
|
-
toast.error(error?.message || t('editProfile.toasts.updateFailed') || 'Failed to update profile');
|
|
61
|
+
// Error toast is handled by the mutation
|
|
76
62
|
return false;
|
|
77
|
-
} finally {
|
|
78
|
-
setIsSaving(false);
|
|
79
63
|
}
|
|
80
|
-
}, [
|
|
64
|
+
}, [updateProfileMutation, t]);
|
|
81
65
|
|
|
82
66
|
/**
|
|
83
67
|
* Update a single profile field
|
|
@@ -112,7 +96,7 @@ export const useProfileEditing = () => {
|
|
|
112
96
|
return {
|
|
113
97
|
saveProfile,
|
|
114
98
|
updateField,
|
|
115
|
-
isSaving
|
|
99
|
+
isSaving: updateProfileMutation.isPending
|
|
116
100
|
};
|
|
117
101
|
};
|
|
118
102
|
//# sourceMappingURL=useProfileEditing.js.map
|