@oxyhq/services 5.16.32 → 5.16.34

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.
Files changed (190) hide show
  1. package/README.md +26 -8
  2. package/lib/commonjs/core/OxyServices.base.js.map +1 -1
  3. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
  4. package/lib/commonjs/core/mixins/OxyServices.utility.js.map +1 -1
  5. package/lib/commonjs/core/services/AuthService.js +156 -0
  6. package/lib/commonjs/core/services/AuthService.js.map +1 -0
  7. package/lib/commonjs/core/services/SessionService.js +1 -2
  8. package/lib/commonjs/core/services/SessionService.js.map +1 -1
  9. package/lib/commonjs/core/services/SessionTransportService.js +64 -0
  10. package/lib/commonjs/core/services/SessionTransportService.js.map +1 -0
  11. package/lib/commonjs/core/services/TokenService.js +9 -17
  12. package/lib/commonjs/core/services/TokenService.js.map +1 -1
  13. package/lib/commonjs/core/services/UserService.js +123 -0
  14. package/lib/commonjs/core/services/UserService.js.map +1 -0
  15. package/lib/commonjs/core/services/index.js +34 -0
  16. package/lib/commonjs/core/services/index.js.map +1 -0
  17. package/lib/commonjs/crypto/index.js.map +1 -1
  18. package/lib/commonjs/crypto/keyManager.js +5 -2
  19. package/lib/commonjs/crypto/keyManager.js.map +1 -1
  20. package/lib/commonjs/crypto/signatureService.js +36 -121
  21. package/lib/commonjs/crypto/signatureService.js.map +1 -1
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/models/interfaces.js +11 -11
  24. package/lib/commonjs/models/interfaces.js.map +1 -1
  25. package/lib/commonjs/ui/context/OxyContext.js +4 -40
  26. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  27. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +14 -25
  28. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  29. package/lib/commonjs/ui/context/hooks/useLanguageManagement.js.map +1 -1
  30. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +4 -12
  31. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  32. package/lib/commonjs/ui/hooks/useLanguageManagement.js.map +1 -1
  33. package/lib/commonjs/ui/hooks/useSessionManagement.js +0 -8
  34. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  35. package/lib/commonjs/ui/index.js +2 -0
  36. package/lib/commonjs/ui/index.js.map +1 -1
  37. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  38. package/lib/commonjs/ui/screens/OxyAuthScreen.js +9 -13
  39. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  40. package/lib/commonjs/ui/utils/sessionHelpers.js +11 -26
  41. package/lib/commonjs/ui/utils/sessionHelpers.js.map +1 -1
  42. package/lib/commonjs/utils/sessionUtils.js +1 -8
  43. package/lib/commonjs/utils/sessionUtils.js.map +1 -1
  44. package/lib/module/core/OxyServices.base.js.map +1 -1
  45. package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
  46. package/lib/module/core/mixins/OxyServices.utility.js.map +1 -1
  47. package/lib/module/core/services/AuthService.js +151 -0
  48. package/lib/module/core/services/AuthService.js.map +1 -0
  49. package/lib/module/core/services/SessionService.js +1 -2
  50. package/lib/module/core/services/SessionService.js.map +1 -1
  51. package/lib/module/core/services/SessionTransportService.js +59 -0
  52. package/lib/module/core/services/SessionTransportService.js.map +1 -0
  53. package/lib/module/core/services/TokenService.js +9 -17
  54. package/lib/module/core/services/TokenService.js.map +1 -1
  55. package/lib/module/core/services/UserService.js +118 -0
  56. package/lib/module/core/services/UserService.js.map +1 -0
  57. package/lib/module/core/services/index.js +16 -0
  58. package/lib/module/core/services/index.js.map +1 -0
  59. package/lib/module/crypto/index.js +9 -0
  60. package/lib/module/crypto/index.js.map +1 -1
  61. package/lib/module/crypto/keyManager.js +5 -2
  62. package/lib/module/crypto/keyManager.js.map +1 -1
  63. package/lib/module/crypto/signatureService.js +36 -122
  64. package/lib/module/crypto/signatureService.js.map +1 -1
  65. package/lib/module/index.js +1 -0
  66. package/lib/module/index.js.map +1 -1
  67. package/lib/module/models/interfaces.js +11 -11
  68. package/lib/module/models/interfaces.js.map +1 -1
  69. package/lib/module/ui/context/OxyContext.js +4 -40
  70. package/lib/module/ui/context/OxyContext.js.map +1 -1
  71. package/lib/module/ui/context/hooks/useAuthOperations.js +14 -25
  72. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  73. package/lib/module/ui/context/hooks/useLanguageManagement.js.map +1 -1
  74. package/lib/module/ui/hooks/queries/useServicesQueries.js +5 -13
  75. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  76. package/lib/module/ui/hooks/useLanguageManagement.js.map +1 -1
  77. package/lib/module/ui/hooks/useSessionManagement.js +0 -8
  78. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  79. package/lib/module/ui/index.js +1 -0
  80. package/lib/module/ui/index.js.map +1 -1
  81. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  82. package/lib/module/ui/screens/OxyAuthScreen.js +7 -9
  83. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  84. package/lib/module/ui/utils/sessionHelpers.js +11 -26
  85. package/lib/module/ui/utils/sessionHelpers.js.map +1 -1
  86. package/lib/module/utils/sessionUtils.js +1 -8
  87. package/lib/module/utils/sessionUtils.js.map +1 -1
  88. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
  89. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  90. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  91. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +1 -1
  92. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  93. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  94. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  95. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  96. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  97. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  98. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  99. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  100. package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
  101. package/lib/typescript/core/mixins/OxyServices.user.d.ts +2 -1
  102. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  103. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  104. package/lib/typescript/core/mixins/index.d.ts +13 -13
  105. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  106. package/lib/typescript/core/services/AuthService.d.ts +50 -0
  107. package/lib/typescript/core/services/AuthService.d.ts.map +1 -0
  108. package/lib/typescript/core/services/SessionService.d.ts +3 -5
  109. package/lib/typescript/core/services/SessionService.d.ts.map +1 -1
  110. package/lib/typescript/core/services/SessionTransportService.d.ts +31 -0
  111. package/lib/typescript/core/services/SessionTransportService.d.ts.map +1 -0
  112. package/lib/typescript/core/services/TokenService.d.ts +3 -8
  113. package/lib/typescript/core/services/TokenService.d.ts.map +1 -1
  114. package/lib/typescript/core/services/UserService.d.ts +39 -0
  115. package/lib/typescript/core/services/UserService.d.ts.map +1 -0
  116. package/lib/typescript/core/services/index.d.ts +13 -0
  117. package/lib/typescript/core/services/index.d.ts.map +1 -0
  118. package/lib/typescript/crypto/index.d.ts +9 -0
  119. package/lib/typescript/crypto/index.d.ts.map +1 -1
  120. package/lib/typescript/crypto/keyManager.d.ts.map +1 -1
  121. package/lib/typescript/crypto/signatureService.d.ts +10 -13
  122. package/lib/typescript/crypto/signatureService.d.ts.map +1 -1
  123. package/lib/typescript/index.d.ts +1 -1
  124. package/lib/typescript/index.d.ts.map +1 -1
  125. package/lib/typescript/models/interfaces.d.ts +15 -69
  126. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  127. package/lib/typescript/models/session.d.ts +2 -4
  128. package/lib/typescript/models/session.d.ts.map +1 -1
  129. package/lib/typescript/ui/context/OxyContext.d.ts +2 -1
  130. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  131. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +2 -1
  132. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  133. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts +2 -1
  134. package/lib/typescript/ui/context/hooks/useLanguageManagement.d.ts.map +1 -1
  135. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts +1 -1
  136. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  137. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts +1 -1
  138. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  139. package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  140. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts +2 -1
  141. package/lib/typescript/ui/hooks/useLanguageManagement.d.ts.map +1 -1
  142. package/lib/typescript/ui/hooks/useSessionManagement.d.ts +2 -1
  143. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
  144. package/lib/typescript/ui/index.d.ts +1 -1
  145. package/lib/typescript/ui/index.d.ts.map +1 -1
  146. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  147. package/lib/typescript/ui/stores/authStore.d.ts +1 -1
  148. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  149. package/lib/typescript/ui/utils/avatarUtils.d.ts +1 -1
  150. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  151. package/lib/typescript/ui/utils/sessionHelpers.d.ts +2 -6
  152. package/lib/typescript/ui/utils/sessionHelpers.d.ts.map +1 -1
  153. package/lib/typescript/utils/sessionUtils.d.ts.map +1 -1
  154. package/package.json +2 -1
  155. package/src/core/OxyServices.base.ts +2 -1
  156. package/src/core/mixins/OxyServices.auth.ts +1 -1
  157. package/src/core/mixins/OxyServices.user.ts +2 -1
  158. package/src/core/mixins/OxyServices.utility.ts +2 -1
  159. package/src/core/services/AuthService.ts +153 -0
  160. package/src/core/services/SessionService.ts +3 -5
  161. package/src/core/services/SessionTransportService.ts +69 -0
  162. package/src/core/services/TokenService.ts +10 -18
  163. package/src/core/services/UserService.ts +125 -0
  164. package/src/core/services/index.ts +14 -0
  165. package/src/crypto/index.ts +9 -0
  166. package/src/crypto/keyManager.ts +3 -2
  167. package/src/crypto/signatureService.ts +44 -142
  168. package/src/index.ts +1 -2
  169. package/src/models/interfaces.ts +21 -74
  170. package/src/models/session.ts +3 -5
  171. package/src/ui/context/OxyContext.tsx +22 -57
  172. package/src/ui/context/hooks/useAuthOperations.ts +17 -24
  173. package/src/ui/context/hooks/useLanguageManagement.ts +2 -1
  174. package/src/ui/hooks/auth/index.ts +0 -1
  175. package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
  176. package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
  177. package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
  178. package/src/ui/hooks/queries/useServicesQueries.ts +3 -8
  179. package/src/ui/hooks/useLanguageManagement.ts +2 -1
  180. package/src/ui/hooks/useSessionManagement.ts +3 -9
  181. package/src/ui/index.ts +2 -1
  182. package/src/ui/screens/AccountSettingsScreen.tsx +6 -6
  183. package/src/ui/screens/AccountSwitcherScreen.tsx +1 -1
  184. package/src/ui/screens/OxyAuthScreen.tsx +5 -9
  185. package/src/ui/screens/ProfileScreen.tsx +1 -1
  186. package/src/ui/stores/authStore.ts +1 -1
  187. package/src/ui/types/navigation.ts +1 -1
  188. package/src/ui/utils/avatarUtils.ts +1 -1
  189. package/src/ui/utils/sessionHelpers.ts +15 -32
  190. package/src/utils/sessionUtils.ts +1 -8
@@ -1,5 +1,6 @@
1
1
  import { useCallback } from 'react';
2
- import type { ApiError, User } from '../../../models/interfaces';
2
+ import type { ApiError } from '../../../models/interfaces';
3
+ import type { User } from '@oxyhq/shared';
3
4
  import type { AuthState } from '../../stores/authStore';
4
5
  import type { ClientSession, SessionLoginResponse } from '../../../models/session';
5
6
  import { DeviceManager } from '../../../utils/deviceManager';
@@ -146,9 +147,9 @@ export const useAuthOperations = ({
146
147
  const localDeviceId = `device_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
147
148
  const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(); // 7 days
148
149
 
149
- // Create minimal user object with publicKey as id (canonical identity)
150
+ // Create minimal user object with publicKey as id
150
151
  fullUser = {
151
- id: publicKey, // publicKey is the canonical user identity
152
+ id: publicKey, // Use publicKey as id (per migration document)
152
153
  publicKey,
153
154
  username: '',
154
155
  privacySettings: {},
@@ -170,7 +171,7 @@ export const useAuthOperations = ({
170
171
  deviceId: localDeviceId,
171
172
  expiresAt,
172
173
  lastActive: new Date().toISOString(),
173
- publicKey, // Canonical user identity
174
+ userId: publicKey,
174
175
  isCurrent: true,
175
176
  };
176
177
 
@@ -204,10 +205,17 @@ export const useAuthOperations = ({
204
205
  // Get full user data
205
206
  fullUser = await oxyServices.getUserBySession(sessionResponse.sessionId);
206
207
 
207
- // user.id is now publicKey (canonical identity) - this is correct
208
- // Ensure publicKey field is set for consistency
209
- if (!fullUser.publicKey && fullUser.id) {
210
- fullUser.publicKey = fullUser.id;
208
+ // IMPORTANT: user.id should be MongoDB ObjectId, not publicKey
209
+ // The API should return the correct id (ObjectId) from the database
210
+ // If it doesn't, we need to fix the API, not work around it here
211
+ // Validate that id is ObjectId format (24 hex characters)
212
+ if (fullUser.id && !/^[0-9a-fA-F]{24}$/.test(fullUser.id)) {
213
+ console.warn('[useAuthOperations] User.id is not MongoDB ObjectId format:', {
214
+ id: fullUser.id.substring(0, 20),
215
+ publicKey: fullUser.publicKey.substring(0, 20),
216
+ message: 'API should return MongoDB ObjectId as user.id, not publicKey'
217
+ });
218
+ // Don't override - let the API fix this issue
211
219
  }
212
220
 
213
221
  // Fetch device sessions
@@ -215,8 +223,7 @@ export const useAuthOperations = ({
215
223
  try {
216
224
  allDeviceSessions = await fetchSessionsWithFallback(oxyServices, sessionResponse.sessionId, {
217
225
  fallbackDeviceId: sessionResponse.deviceId,
218
- fallbackUserId: fullUser.id, // Still pass for backward compatibility
219
- fallbackPublicKey: fullUser.publicKey || fullUser.id, // publicKey is canonical identity
226
+ fallbackUserId: fullUser.id,
220
227
  logger,
221
228
  });
222
229
  } catch (error) {
@@ -286,13 +293,6 @@ export const useAuthOperations = ({
286
293
  setAuthState({ isLoading: true, error: null });
287
294
 
288
295
  try {
289
- // SESSION CLEANUP: Clear all sessions before creating new identity
290
- // New identity means old sessions are no longer valid
291
- await clearSessionState();
292
- if (__DEV__ && logger) {
293
- logger('Cleared all sessions before creating new identity');
294
- }
295
-
296
296
  // Generate new key pair directly (works offline)
297
297
  const { publicKey, privateKey } = await KeyManager.generateKeyPair();
298
298
  await KeyManager.importKeyPair(privateKey);
@@ -464,13 +464,6 @@ export const useAuthOperations = ({
464
464
  setAuthState({ isLoading: true, error: null });
465
465
 
466
466
  try {
467
- // SESSION CLEANUP: Clear all sessions before importing new identity
468
- // Importing a different identity means old sessions are no longer valid
469
- await clearSessionState();
470
- if (__DEV__ && logger) {
471
- logger('Cleared all sessions before importing identity');
472
- }
473
-
474
467
  // Decrypt private key from backup data
475
468
  const Crypto = await import('expo-crypto');
476
469
 
@@ -1,5 +1,6 @@
1
1
  import { useCallback, useEffect, useMemo, useState } from 'react';
2
- import type { ApiError, User } from '../../../models/interfaces';
2
+ import type { ApiError } from '../../../models/interfaces';
3
+ import type { User } from '@oxyhq/shared';
3
4
  import {
4
5
  getLanguageMetadata,
5
6
  getLanguageName,
@@ -4,4 +4,3 @@
4
4
  export { useUsernameValidation, USERNAME_MIN_LENGTH, USERNAME_REGEX, USERNAME_FORMAT_ERROR, USERNAME_DEBOUNCE_MS } from './useUsernameValidation';
5
5
  export type { UsernameValidationResult } from './useUsernameValidation';
6
6
 
7
-
@@ -1,5 +1,5 @@
1
1
  import { useMutation, useQueryClient } from '@tanstack/react-query';
2
- import type { User } from '../../../models/interfaces';
2
+ import type { User } from '@oxyhq/shared';
3
3
  import { queryKeys, invalidateAccountQueries, invalidateUserQueries } from '../queries/queryKeys';
4
4
  import { useOxy } from '../../context/OxyContext';
5
5
  import { toast } from '../../../lib/sonner';
@@ -1,5 +1,5 @@
1
1
  import { useMutation, useQueryClient } from '@tanstack/react-query';
2
- import type { User } from '../../../models/interfaces';
2
+ import type { User } from '@oxyhq/shared';
3
3
  import { queryKeys, invalidateSessionQueries } from '../queries/queryKeys';
4
4
  import { useOxy } from '../../context/OxyContext';
5
5
  import { toast } from '../../../lib/sonner';
@@ -1,5 +1,5 @@
1
1
  import { useQuery, useQueries } from '@tanstack/react-query';
2
- import type { User } from '../../../models/interfaces';
2
+ import type { User } from '@oxyhq/shared';
3
3
  import type { OxyServices } from '../../../core';
4
4
  import { queryKeys } from './queryKeys';
5
5
  import { useOxy } from '../../context/OxyContext';
@@ -8,7 +8,7 @@ import { fetchSessionsWithFallback, mapSessionsToClient } from '../../utils/sess
8
8
  * Get all active sessions for the current user
9
9
  */
10
10
  export const useSessions = (userId?: string, options?: { enabled?: boolean }) => {
11
- const { oxyServices, activeSessionId, user } = useOxy();
11
+ const { oxyServices, activeSessionId } = useOxy();
12
12
 
13
13
  return useQuery({
14
14
  queryKey: queryKeys.sessions.list(userId),
@@ -17,14 +17,12 @@ export const useSessions = (userId?: string, options?: { enabled?: boolean }) =>
17
17
  throw new Error('No active session');
18
18
  }
19
19
 
20
- const publicKey = user?.publicKey || user?.id || ''; // user.id is now publicKey
21
20
  const sessions = await fetchSessionsWithFallback(oxyServices, activeSessionId, {
22
21
  fallbackDeviceId: undefined,
23
22
  fallbackUserId: userId,
24
- fallbackPublicKey: publicKey,
25
23
  });
26
24
 
27
- return sessions; // Already mapped by fetchSessionsWithFallback
25
+ return mapSessionsToClient(sessions, activeSessionId);
28
26
  },
29
27
  enabled: (options?.enabled !== false) && !!activeSessionId,
30
28
  staleTime: 2 * 60 * 1000, // 2 minutes (sessions change frequently)
@@ -51,15 +49,12 @@ export const useSession = (sessionId: string | null, options?: { enabled?: boole
51
49
  }
52
50
 
53
51
  const now = new Date();
54
- // user.id is now publicKey (canonical identity)
55
- const publicKey = validation.user.publicKey || validation.user.id || '';
56
52
  return {
57
53
  sessionId,
58
54
  deviceId: '', // Device ID not available from validation response
59
55
  expiresAt: validation.expiresAt || new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),
60
56
  lastActive: validation.lastActivity || now.toISOString(),
61
- publicKey, // Canonical user identity
62
- userId: validation.user.id?.toString(), // Optional MongoDB ObjectId
57
+ userId: validation.user.id?.toString() ?? '',
63
58
  isCurrent: false,
64
59
  } as ClientSession;
65
60
  },
@@ -1,5 +1,6 @@
1
1
  import { useCallback, useEffect, useMemo, useState } from 'react';
2
- import type { ApiError, User } from '../../models/interfaces';
2
+ import type { ApiError } from '../../models/interfaces';
3
+ import type { User } from '@oxyhq/shared';
3
4
  import {
4
5
  getLanguageMetadata,
5
6
  getLanguageName,
@@ -1,5 +1,6 @@
1
1
  import { useCallback, useMemo, useRef, useState } from 'react';
2
- import type { ApiError, User } from '../../models/interfaces';
2
+ import type { ApiError } from '../../models/interfaces';
3
+ import type { User } from '@oxyhq/shared';
3
4
  import type { ClientSession } from '../../models/session';
4
5
  import { mergeSessions, normalizeAndSortSessions, sessionsArraysEqual } from '../../utils/sessionUtils';
5
6
  import { fetchSessionsWithFallback, mapSessionsToClient, validateSessionBatch } from '../utils/sessionHelpers';
@@ -255,10 +256,8 @@ export const useSessionManagement = ({
255
256
  await activateSession(sessionId, user);
256
257
 
257
258
  try {
258
- const publicKey = user.publicKey || user.id || ''; // user.id is now publicKey
259
259
  const deviceSessions = await fetchSessionsWithFallback(oxyServices, sessionId, {
260
- fallbackUserId: user.id, // Still pass for backward compatibility
261
- fallbackPublicKey: publicKey,
260
+ fallbackUserId: user.id,
262
261
  logger,
263
262
  });
264
263
  updateSessions(deviceSessions, { merge: true });
@@ -332,13 +331,8 @@ export const useSessionManagement = ({
332
331
 
333
332
  const refreshPromise = (async () => {
334
333
  try {
335
- // Get publicKey from active session or current user
336
- const activeSession = sessions.find(s => s.sessionId === activeSessionId);
337
- const publicKey = activeSession?.publicKey || activeUserId || ''; // Fallback to userId if publicKey not available
338
-
339
334
  const deviceSessions = await fetchSessionsWithFallback(oxyServices, activeSessionId, {
340
335
  fallbackUserId: activeUserId,
341
- fallbackPublicKey: publicKey,
342
336
  logger,
343
337
  });
344
338
  updateSessions(deviceSessions, { merge: true });
package/src/ui/index.ts CHANGED
@@ -81,4 +81,5 @@ export {
81
81
 
82
82
  // Re-export core services for convenience in UI context
83
83
  export { OxyServices } from '../core';
84
- export type { User, LoginResponse, ApiError } from '../models/interfaces';
84
+ // Note: User and LoginResponse should be imported from @oxyhq/shared
85
+ export type { ApiError } from '../models/interfaces';
@@ -233,7 +233,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
233
233
 
234
234
  // Handle locations - convert single location to array format
235
235
  if (finalUser.locations && Array.isArray(finalUser.locations)) {
236
- setLocations(finalUser.locations.map((loc, index) => ({
236
+ setLocations(finalUser.locations.map((loc: any, index: number) => ({
237
237
  id: loc.id || `existing-${index}`,
238
238
  name: loc.name,
239
239
  label: loc.label,
@@ -252,17 +252,17 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
252
252
 
253
253
  // Handle links - simple and direct like other fields
254
254
  if (finalUser.linksMetadata && Array.isArray(finalUser.linksMetadata)) {
255
- const urls = finalUser.linksMetadata.map(l => l.url);
255
+ const urls = finalUser.linksMetadata.map((l: any) => l.url);
256
256
  setLinks(urls);
257
- const metadataWithIds = finalUser.linksMetadata.map((link, index) => ({
257
+ const metadataWithIds = finalUser.linksMetadata.map((link: any, index: number) => ({
258
258
  ...link,
259
259
  id: link.id || `existing-${index}`
260
260
  }));
261
261
  setLinksMetadata(metadataWithIds);
262
262
  } else if (Array.isArray(finalUser.links)) {
263
- const simpleLinks = finalUser.links.map(l => typeof l === 'string' ? l : l.link).filter(Boolean);
263
+ const simpleLinks = finalUser.links.map((l: any) => typeof l === 'string' ? l : l.link).filter(Boolean);
264
264
  setLinks(simpleLinks);
265
- const linksWithMetadata = simpleLinks.map((url, index) => ({
265
+ const linksWithMetadata = simpleLinks.map((url: string, index: number) => ({
266
266
  url,
267
267
  title: url.replace(/^https?:\/\//, '').replace(/\/$/, ''),
268
268
  description: `Link to ${url}`,
@@ -553,7 +553,7 @@ const AccountSettingsScreen: React.FC<BaseScreenProps & { initialField?: string;
553
553
  }
554
554
 
555
555
  if (currentUser.linksMetadata && Array.isArray(currentUser.linksMetadata)) {
556
- setLinksMetadata(currentUser.linksMetadata.map((link, index) => ({
556
+ setLinksMetadata(currentUser.linksMetadata.map((link: any, index: number) => ({
557
557
  ...link,
558
558
  id: link.id || `existing-${index}`
559
559
  })));
@@ -15,7 +15,7 @@ import {
15
15
  import type { BaseScreenProps } from '../types/navigation';
16
16
  import type { ClientSession } from '../../models/session';
17
17
  import { fontFamilies } from '../styles/fonts';
18
- import type { User } from '../../models/interfaces';
18
+ import type { User } from '@oxyhq/shared';
19
19
  import { toast } from '../../lib/sonner';
20
20
  import { confirmAction } from '../utils/confirmAction';
21
21
  import OxyIcon from '../components/icon/OxyIcon';
@@ -220,7 +220,7 @@ const OxyAuthScreen: React.FC<BaseScreenProps> = ({
220
220
 
221
221
  try {
222
222
  // Generate a unique session token for this auth request
223
- const sessionToken = generateSessionToken();
223
+ const sessionToken = await generateSessionToken();
224
224
  const expiresAt = Date.now() + AUTH_SESSION_EXPIRY_MS;
225
225
 
226
226
  // Register the auth session with the server
@@ -242,14 +242,10 @@ const OxyAuthScreen: React.FC<BaseScreenProps> = ({
242
242
  }
243
243
  }, [oxyServices, connectSocket]);
244
244
 
245
- // Generate a random session token
246
- const generateSessionToken = (): string => {
247
- const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
248
- let result = '';
249
- for (let i = 0; i < 32; i++) {
250
- result += chars.charAt(Math.floor(Math.random() * chars.length));
251
- }
252
- return result;
245
+ // Generate a random session token using secure random bytes
246
+ const generateSessionToken = async (): Promise<string> => {
247
+ const { generateSessionToken: sharedGenerate } = await import('@oxyhq/shared');
248
+ return sharedGenerate(32); // 32 bytes = 64 hex characters
253
249
  };
254
250
 
255
251
  // Clean up on unmount
@@ -10,7 +10,7 @@ import { Ionicons } from '@expo/vector-icons';
10
10
  import { useI18n } from '../hooks/useI18n';
11
11
  import { useOxy } from '../context/OxyContext';
12
12
  import { logger } from '../../utils/loggerUtils';
13
- import type { User } from '../../models/interfaces';
13
+ import type { User } from '@oxyhq/shared';
14
14
  import { extractErrorMessage } from '../utils/errorHandlers';
15
15
 
16
16
  interface ProfileScreenProps extends BaseScreenProps {
@@ -1,5 +1,5 @@
1
1
  import { create } from 'zustand';
2
- import type { User } from '../../models/interfaces';
2
+ import type { User } from '@oxyhq/shared';
3
3
 
4
4
  export interface AuthState {
5
5
  user: User | null;
@@ -1,7 +1,7 @@
1
1
  import type { ReactNode, RefObject } from 'react';
2
2
  import type { QueryClient } from '@tanstack/react-query';
3
3
  import type { RouteName } from '../navigation/routes';
4
- import type { User } from '../../models/interfaces';
4
+ import type { User } from '@oxyhq/shared';
5
5
  import type { ClientSession } from '../../models/session';
6
6
 
7
7
  // Re-export RouteName from routes for convenience
@@ -1,5 +1,5 @@
1
1
  import type { OxyServices } from '../../core';
2
- import type { User } from '../../models/interfaces';
2
+ import type { User } from '@oxyhq/shared';
3
3
  import { useAccountStore } from '../stores/accountStore';
4
4
  import { useAuthStore } from '../stores/authStore';
5
5
  import { QueryClient } from '@tanstack/react-query';
@@ -7,16 +7,14 @@ interface DeviceSession {
7
7
  deviceName?: string;
8
8
  expiresAt?: string;
9
9
  lastActive?: string;
10
- user?: { id?: string; publicKey?: string; _id?: { toString(): string } };
10
+ user?: { id?: string; _id?: { toString(): string } };
11
11
  userId?: string;
12
- publicKey?: string;
13
12
  isCurrent?: boolean;
14
13
  }
15
14
 
16
15
  export interface FetchSessionsWithFallbackOptions {
17
16
  fallbackDeviceId?: string;
18
17
  fallbackUserId?: string;
19
- fallbackPublicKey?: string; // Canonical user identity
20
18
  logger?: (message: string, error?: unknown) => void;
21
19
  }
22
20
 
@@ -39,41 +37,27 @@ export interface SessionValidationResult {
39
37
  * @param sessions - Raw session array returned from the API
40
38
  * @param fallbackDeviceId - Device identifier to use when missing from payload
41
39
  * @param fallbackUserId - User identifier to use when missing from payload
42
- * @param fallbackPublicKey - Public key to use when missing from payload (canonical identity)
43
40
  */
44
41
  export const mapSessionsToClient = (
45
42
  sessions: DeviceSession[],
46
43
  fallbackDeviceId?: string,
47
44
  fallbackUserId?: string,
48
- fallbackPublicKey?: string,
49
45
  ): ClientSession[] => {
50
46
  const now = new Date();
51
47
 
52
- return sessions.map((session) => {
53
- // publicKey is the canonical user identity (user.id now equals publicKey)
54
- // Extract from user.id (which is now publicKey), user.publicKey, or session.publicKey
55
- const publicKey =
56
- session.user?.id || // user.id is now publicKey (canonical identifier)
57
- session.user?.publicKey ||
58
- session.publicKey ||
59
- fallbackPublicKey ||
60
- '';
61
-
62
- // userId is MongoDB ObjectId (internal backend reference, optional)
63
- const userId =
48
+ return sessions.map((session) => ({
49
+ sessionId: session.sessionId,
50
+ deviceId: session.deviceId || fallbackDeviceId || '',
51
+ expiresAt: session.expiresAt || new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),
52
+ lastActive: session.lastActive || now.toISOString(),
53
+ userId:
54
+ session.user?.id ||
64
55
  session.userId ||
65
- (session.user?._id ? session.user._id.toString() : undefined);
66
-
67
- return {
68
- sessionId: session.sessionId,
69
- deviceId: session.deviceId || fallbackDeviceId || '',
70
- expiresAt: session.expiresAt || new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),
71
- lastActive: session.lastActive || now.toISOString(),
72
- publicKey, // Canonical user identity - REQUIRED
73
- userId, // MongoDB ObjectId (optional, for backward compatibility)
74
- isCurrent: Boolean(session.isCurrent),
75
- };
76
- });
56
+ (session.user?._id ? session.user._id.toString() : undefined) ||
57
+ fallbackUserId ||
58
+ '',
59
+ isCurrent: Boolean(session.isCurrent),
60
+ }));
77
61
  };
78
62
 
79
63
  /**
@@ -89,20 +73,19 @@ export const fetchSessionsWithFallback = async (
89
73
  {
90
74
  fallbackDeviceId,
91
75
  fallbackUserId,
92
- fallbackPublicKey,
93
76
  logger,
94
77
  }: FetchSessionsWithFallbackOptions = {},
95
78
  ): Promise<ClientSession[]> => {
96
79
  try {
97
80
  const deviceSessions = await oxyServices.getDeviceSessions(sessionId);
98
- return mapSessionsToClient(deviceSessions, fallbackDeviceId, fallbackUserId, fallbackPublicKey);
81
+ return mapSessionsToClient(deviceSessions, fallbackDeviceId, fallbackUserId);
99
82
  } catch (error) {
100
83
  if (__DEV__ && logger) {
101
84
  logger('Failed to get device sessions, falling back to user sessions', error);
102
85
  }
103
86
 
104
87
  const userSessions = await oxyServices.getSessionsBySessionId(sessionId);
105
- return mapSessionsToClient(userSessions, fallbackDeviceId, fallbackUserId, fallbackPublicKey);
88
+ return mapSessionsToClient(userSessions, fallbackDeviceId, fallbackUserId);
106
89
  }
107
90
  };
108
91
 
@@ -12,19 +12,12 @@ import type { ClientSession } from '../models/session';
12
12
  */
13
13
  export function normalizeSession(session: Partial<ClientSession> & { sessionId: string }): ClientSession {
14
14
  const now = new Date().toISOString();
15
-
16
- // publicKey is required (canonical user identity)
17
- if (!session.publicKey) {
18
- throw new Error(`Session ${session.sessionId} is missing required publicKey field`);
19
- }
20
-
21
15
  return {
22
16
  sessionId: session.sessionId,
23
17
  deviceId: session.deviceId || '',
24
18
  expiresAt: session.expiresAt || now,
25
19
  lastActive: session.lastActive || now,
26
- publicKey: session.publicKey, // Canonical user identity - required
27
- userId: session.userId, // Optional MongoDB ObjectId for backward compatibility
20
+ userId: session.userId || '',
28
21
  };
29
22
  }
30
23