@oxyhq/services 19.2.0 → 20.0.1

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 (126) hide show
  1. package/lib/commonjs/ui/components/FollowButton.js +1 -2
  2. package/lib/commonjs/ui/components/FollowButton.js.map +1 -1
  3. package/lib/commonjs/ui/components/SettingsIcon.js +1 -2
  4. package/lib/commonjs/ui/components/SettingsIcon.js.map +1 -1
  5. package/lib/commonjs/ui/components/logo/LogoIcon.js +0 -2
  6. package/lib/commonjs/ui/components/logo/LogoIcon.js.map +1 -1
  7. package/lib/commonjs/ui/components/logo/LogoText.js +0 -2
  8. package/lib/commonjs/ui/components/logo/LogoText.js.map +1 -1
  9. package/lib/commonjs/ui/context/OxyContext.js +9 -8
  10. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  11. package/lib/commonjs/ui/context/commitSessionFlow.js +10 -0
  12. package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -1
  13. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +1 -3
  14. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  15. package/lib/commonjs/ui/hooks/useLanguageManagement.js +109 -28
  16. package/lib/commonjs/ui/hooks/useLanguageManagement.js.map +1 -1
  17. package/lib/commonjs/ui/hooks/useSessionManagement.js +1 -3
  18. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  19. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +151 -88
  20. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  21. package/lib/commonjs/ui/screens/PreferencesScreen.js +5 -6
  22. package/lib/commonjs/ui/screens/PreferencesScreen.js.map +1 -1
  23. package/lib/module/ui/components/FollowButton.js +1 -1
  24. package/lib/module/ui/components/FollowButton.js.map +1 -1
  25. package/lib/module/ui/components/SettingsIcon.js +1 -1
  26. package/lib/module/ui/components/SettingsIcon.js.map +1 -1
  27. package/lib/module/ui/components/logo/LogoIcon.js +0 -1
  28. package/lib/module/ui/components/logo/LogoIcon.js.map +1 -1
  29. package/lib/module/ui/components/logo/LogoText.js +0 -1
  30. package/lib/module/ui/components/logo/LogoText.js.map +1 -1
  31. package/lib/module/ui/context/OxyContext.js +9 -8
  32. package/lib/module/ui/context/OxyContext.js.map +1 -1
  33. package/lib/module/ui/context/commitSessionFlow.js +10 -0
  34. package/lib/module/ui/context/commitSessionFlow.js.map +1 -1
  35. package/lib/module/ui/context/hooks/useAuthOperations.js +1 -3
  36. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  37. package/lib/module/ui/hooks/useLanguageManagement.js +107 -29
  38. package/lib/module/ui/hooks/useLanguageManagement.js.map +1 -1
  39. package/lib/module/ui/hooks/useSessionManagement.js +1 -3
  40. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  41. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  42. package/lib/module/ui/screens/LanguageSelectorScreen.js +153 -91
  43. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  44. package/lib/module/ui/screens/PreferencesScreen.js +5 -6
  45. package/lib/module/ui/screens/PreferencesScreen.js.map +1 -1
  46. package/lib/typescript/commonjs/ui/components/FollowButton.d.ts +2 -2
  47. package/lib/typescript/commonjs/ui/components/FollowButton.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/ui/components/OxyPayButton.d.ts +1 -1
  49. package/lib/typescript/commonjs/ui/components/OxyPayButton.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts +1 -1
  51. package/lib/typescript/commonjs/ui/components/SettingsIcon.d.ts.map +1 -1
  52. package/lib/typescript/commonjs/ui/components/logo/LogoIcon.d.ts +1 -1
  53. package/lib/typescript/commonjs/ui/components/logo/LogoIcon.d.ts.map +1 -1
  54. package/lib/typescript/commonjs/ui/components/logo/LogoText.d.ts +1 -1
  55. package/lib/typescript/commonjs/ui/components/logo/LogoText.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +1 -1
  57. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -1
  59. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +1 -2
  60. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  61. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +3 -0
  62. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  63. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +5 -3
  64. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  65. package/lib/typescript/commonjs/ui/hooks/useFollow.d.ts +1 -1
  66. package/lib/typescript/commonjs/ui/hooks/useFollow.d.ts.map +1 -1
  67. package/lib/typescript/commonjs/ui/hooks/useLanguageManagement.d.ts +52 -8
  68. package/lib/typescript/commonjs/ui/hooks/useLanguageManagement.d.ts.map +1 -1
  69. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts +1 -2
  70. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  71. package/lib/typescript/commonjs/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  72. package/lib/typescript/commonjs/ui/screens/PreferencesScreen.d.ts.map +1 -1
  73. package/lib/typescript/commonjs/ui/screens/fileManagement/FileListSection.d.ts +1 -1
  74. package/lib/typescript/commonjs/ui/screens/fileManagement/FileListSection.d.ts.map +1 -1
  75. package/lib/typescript/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.d.ts +1 -1
  76. package/lib/typescript/commonjs/ui/screens/fileManagement/hooks/useFileUploadState.d.ts.map +1 -1
  77. package/lib/typescript/module/ui/components/FollowButton.d.ts +2 -2
  78. package/lib/typescript/module/ui/components/FollowButton.d.ts.map +1 -1
  79. package/lib/typescript/module/ui/components/OxyPayButton.d.ts +1 -1
  80. package/lib/typescript/module/ui/components/OxyPayButton.d.ts.map +1 -1
  81. package/lib/typescript/module/ui/components/SettingsIcon.d.ts +1 -1
  82. package/lib/typescript/module/ui/components/SettingsIcon.d.ts.map +1 -1
  83. package/lib/typescript/module/ui/components/logo/LogoIcon.d.ts +1 -1
  84. package/lib/typescript/module/ui/components/logo/LogoIcon.d.ts.map +1 -1
  85. package/lib/typescript/module/ui/components/logo/LogoText.d.ts +1 -1
  86. package/lib/typescript/module/ui/components/logo/LogoText.d.ts.map +1 -1
  87. package/lib/typescript/module/ui/context/OxyContext.d.ts +1 -1
  88. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  89. package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -1
  90. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +1 -2
  91. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  92. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +3 -0
  93. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  94. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +5 -3
  95. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  96. package/lib/typescript/module/ui/hooks/useFollow.d.ts +1 -1
  97. package/lib/typescript/module/ui/hooks/useFollow.d.ts.map +1 -1
  98. package/lib/typescript/module/ui/hooks/useLanguageManagement.d.ts +52 -8
  99. package/lib/typescript/module/ui/hooks/useLanguageManagement.d.ts.map +1 -1
  100. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts +1 -2
  101. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  102. package/lib/typescript/module/ui/screens/LanguageSelectorScreen.d.ts.map +1 -1
  103. package/lib/typescript/module/ui/screens/PreferencesScreen.d.ts.map +1 -1
  104. package/lib/typescript/module/ui/screens/fileManagement/FileListSection.d.ts +1 -1
  105. package/lib/typescript/module/ui/screens/fileManagement/FileListSection.d.ts.map +1 -1
  106. package/lib/typescript/module/ui/screens/fileManagement/hooks/useFileUploadState.d.ts +1 -1
  107. package/lib/typescript/module/ui/screens/fileManagement/hooks/useFileUploadState.d.ts.map +1 -1
  108. package/package.json +18 -17
  109. package/src/ui/components/FollowButton.tsx +6 -5
  110. package/src/ui/components/OxyPayButton.tsx +1 -1
  111. package/src/ui/components/SettingsIcon.tsx +2 -1
  112. package/src/ui/components/logo/LogoIcon.tsx +2 -1
  113. package/src/ui/components/logo/LogoText.tsx +2 -1
  114. package/src/ui/context/OxyContext.tsx +13 -11
  115. package/src/ui/context/__tests__/commitSessionFlow.test.ts +27 -0
  116. package/src/ui/context/commitSessionFlow.ts +10 -0
  117. package/src/ui/context/hooks/useAuthOperations.ts +1 -5
  118. package/src/ui/context/oxyContextTypes.ts +3 -0
  119. package/src/ui/hooks/useFollow.ts +1 -1
  120. package/src/ui/hooks/useLanguageManagement.ts +144 -42
  121. package/src/ui/hooks/useSessionManagement.ts +1 -4
  122. package/src/ui/screens/FeedbackScreen.tsx +1 -1
  123. package/src/ui/screens/LanguageSelectorScreen.tsx +195 -104
  124. package/src/ui/screens/PreferencesScreen.tsx +4 -6
  125. package/src/ui/screens/fileManagement/FileListSection.tsx +1 -1
  126. package/src/ui/screens/fileManagement/hooks/useFileUploadState.ts +1 -1
@@ -9,7 +9,6 @@ export interface UseSessionManagementOptions {
9
9
  storageKeyPrefix?: string;
10
10
  loginSuccess: (user: User) => void;
11
11
  logoutStore: () => void;
12
- applyLanguagePreference: (user: User) => Promise<void>;
13
12
  onAuthStateChange?: (user: User | null) => void;
14
13
  onError?: (error: ApiError) => void;
15
14
  setAuthError?: (message: string | null) => void;
@@ -38,5 +37,5 @@ export interface UseSessionManagementResult {
38
37
  *
39
38
  * @param options - Session management configuration
40
39
  */
41
- export declare const useSessionManagement: ({ oxyServices, storage, storageKeyPrefix, loginSuccess, logoutStore, applyLanguagePreference, onAuthStateChange, onError, setAuthError, logger, setTokenReady, queryClient, }: UseSessionManagementOptions) => UseSessionManagementResult;
40
+ export declare const useSessionManagement: ({ oxyServices, storage, storageKeyPrefix, loginSuccess, logoutStore, onAuthStateChange, onError, setAuthError, logger, setTokenReady, queryClient, }: UseSessionManagementOptions) => UseSessionManagementResult;
42
41
  //# sourceMappingURL=useSessionManagement.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSessionManagement.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useSessionManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,uBAAuB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAClH,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,eAAe,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAC/C,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAKD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,+KAalC,2BAA2B,KAAG,0BA4ThC,CAAC"}
1
+ {"version":3,"file":"useSessionManagement.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useSessionManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAClH,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,eAAe,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAC/C,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAKD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,sJAYlC,2BAA2B,KAAG,0BA2ThC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"LanguageSelectorScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/LanguageSelectorScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAqB,CAAC;AAa3D,UAAU,2BAA4B,SAAQ,eAAe;CAAI;;AA+LjE,wBAAkD"}
1
+ {"version":3,"file":"LanguageSelectorScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/LanguageSelectorScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAqB,CAAC;AAkB3D,UAAU,2BAA4B,SAAQ,eAAe;CAAI;;AAqRjE,wBAAkD"}
@@ -1 +1 @@
1
- {"version":3,"file":"PreferencesScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/PreferencesScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAMzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAqB,CAAC;;AA4O3D,wBAA6C"}
1
+ {"version":3,"file":"PreferencesScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/PreferencesScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAOzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAqB,CAAC;;AAyO3D,wBAA6C"}
@@ -1,7 +1,7 @@
1
1
  import type React from 'react';
2
2
  import { ScrollView } from 'react-native';
3
3
  import type { FileMetadata } from '@oxyhq/core';
4
- import { useTheme } from '@oxyhq/bloom/theme';
4
+ import type { useTheme } from '@oxyhq/bloom/theme';
5
5
  type ThemeColors = ReturnType<typeof useTheme>['colors'];
6
6
  /** A pre-built list row descriptor (produced by the orchestrator's memo). */
7
7
  export interface FileListItem {
@@ -1 +1 @@
1
- {"version":3,"file":"FileListSection.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/screens/fileManagement/FileListSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAIH,UAAU,EAGb,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;IACnE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,mEAAmE;IACnE,gBAAgB,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;CAC3C;AAED;;;;GAIG;AACH,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA2EnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"FileListSection.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/screens/fileManagement/FileListSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAIH,UAAU,EAGb,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;IACnE,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,mEAAmE;IACnE,gBAAgB,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;CAC3C;AAED;;;;GAIG;AACH,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA2EnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
2
  import type { FileMetadata } from '@oxyhq/core';
3
- import { useUploadFile } from '../../../hooks/mutations/useAccountMutations.js';
3
+ import type { useUploadFile } from '../../../hooks/mutations/useAccountMutations.js';
4
4
  import { type PendingUploadFile } from '../shared.js';
5
5
  /** Dependencies threaded into the upload-state hook from the orchestrator. */
6
6
  export interface UseFileUploadStateParams {
@@ -1 +1 @@
1
- {"version":3,"file":"useFileUploadState.d.ts","sourceRoot":"","sources":["../../../../../../../src/ui/screens/fileManagement/hooks/useFileUploadState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,iDAA8C,CAAC;AAE7E,OAAO,EACH,KAAK,iBAAiB,EAQzB,MAAM,cAAW,CAAC;AAEnB,8EAA8E;AAC9E,MAAM,WAAW,wBAAwB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACrD,iBAAiB,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrD,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtF,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;CACtE;AAED,mDAAmD;AACnD,MAAM,WAAW,wBAAwB;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,sKAchC,wBAAwB,KAAG,wBA4a7B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"useFileUploadState.d.ts","sourceRoot":"","sources":["../../../../../../../src/ui/screens/fileManagement/hooks/useFileUploadState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iDAA8C,CAAC;AAElF,OAAO,EACH,KAAK,iBAAiB,EAQzB,MAAM,cAAW,CAAC;AAEnB,8EAA8E;AAC9E,MAAM,WAAW,wBAAwB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACrD,iBAAiB,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrD,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtF,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;CACtE;AAED,mDAAmD;AACnD,MAAM,WAAW,wBAAwB;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,sKAchC,wBAAwB,KAAG,wBA4a7B,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "19.2.0",
3
+ "version": "20.0.1",
4
4
  "description": "OxyHQ Expo/React Native SDK — UI components, screens, and native features",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -126,24 +126,16 @@
126
126
  }
127
127
  },
128
128
  "dependencies": {
129
- "@oxyhq/contracts": "0.13.2",
129
+ "@oxyhq/contracts": "0.14.0",
130
+ "@oxyhq/core": "^10.1.3",
130
131
  "color": "^4.2.3"
131
132
  },
132
133
  "devDependencies": {
133
- "@oxyhq/core": "9.2.4",
134
- "nativewind": "5.0.0-preview.3",
135
- "react-native-css": "^3.0.0",
136
- "@react-native-async-storage/async-storage": "^2.0.0",
137
- "@types/react": "*",
138
- "copyfiles": "^2.4.1",
139
- "react-native-keyboard-controller": "1.21.13",
140
- "react-native-qrcode-svg": "^6.3.0",
141
- "socket.io-client": "^4.8.1",
142
- "typescript": "^5.9.2",
143
- "zustand": "^5.0.14",
144
134
  "@biomejs/biome": "^1.9.4",
145
135
  "@commitlint/cli": "^17.6.5",
146
136
  "@commitlint/config-conventional": "^17.6.5",
137
+ "@oxyhq/core": "10.1.3",
138
+ "@react-native-async-storage/async-storage": "^2.0.0",
147
139
  "@react-native-community/netinfo": "^11.4.1",
148
140
  "@react-native/babel-preset": "^0.86.0",
149
141
  "@release-it/conventional-changelog": "^10.0.2",
@@ -155,6 +147,8 @@
155
147
  "@types/color": "^4.2.1",
156
148
  "@types/jest": "^29.5.14",
157
149
  "@types/node": "^20.19.9",
150
+ "@types/react": "*",
151
+ "copyfiles": "^2.4.1",
158
152
  "expo-file-system": "~57.0.0",
159
153
  "expo-font": "~57.0.0",
160
154
  "expo-haptics": "~57.0.0",
@@ -163,18 +157,25 @@
163
157
  "husky": "^4.3.8",
164
158
  "jest": "~29.7.0",
165
159
  "lint-staged": "^15.2.4",
160
+ "nativewind": "5.0.0-preview.3",
166
161
  "react-native-builder-bob": "^0.43.0",
162
+ "react-native-css": "^3.0.0",
167
163
  "react-native-gesture-handler": "~2.32.0",
164
+ "react-native-keyboard-controller": "1.21.13",
165
+ "react-native-qrcode-svg": "^6.3.0",
168
166
  "react-native-reanimated": "4.5.0",
169
167
  "react-native-safe-area-context": "~5.8.0",
170
168
  "react-native-svg": "15.15.5",
171
169
  "release-it": "^19.0.6",
172
- "ts-jest": "^29.4.0"
170
+ "socket.io-client": "^4.8.1",
171
+ "ts-jest": "^29.4.0",
172
+ "typescript": "^5.9.2",
173
+ "zustand": "^5.0.14"
173
174
  },
174
175
  "peerDependencies": {
175
176
  "@expo/vector-icons": "^15.0.3",
176
177
  "@oxyhq/bloom": ">=0.16.0",
177
- "@oxyhq/core": "^9.2.3",
178
+ "@oxyhq/core": "^10.1.3",
178
179
  "@react-native-async-storage/async-storage": "^2.0.0",
179
180
  "@react-native-community/netinfo": "^11.4.1",
180
181
  "@tanstack/query-async-storage-persister": "^5.101",
@@ -192,6 +193,7 @@
192
193
  "expo-image": ">=2.0.0",
193
194
  "expo-image-manipulator": ">=56.0.0",
194
195
  "expo-linear-gradient": ">=56.0.0",
196
+ "nativewind": ">=5.0.0",
195
197
  "react": ">=18.0.0",
196
198
  "react-native": ">=0.85.0",
197
199
  "react-native-gesture-handler": "~2.32.0",
@@ -201,8 +203,7 @@
201
203
  "react-native-safe-area-context": "~5.8.0",
202
204
  "react-native-svg": ">=15.15.0",
203
205
  "socket.io-client": "^4.8.0",
204
- "zustand": "^5.0.0",
205
- "nativewind": ">=5.0.0"
206
+ "zustand": "^5.0.0"
206
207
  },
207
208
  "peerDependenciesMeta": {
208
209
  "nativewind": {
@@ -1,8 +1,9 @@
1
- import React, { useEffect, useCallback, useMemo, useState, memo } from 'react';
2
- import {
3
- type ViewStyle,
4
- type TextStyle,
5
- type StyleProp,
1
+ import type React from 'react';
2
+ import { useEffect, useCallback, useMemo, useState, memo } from 'react';
3
+ import type {
4
+ ViewStyle,
5
+ TextStyle,
6
+ StyleProp,
6
7
  } from 'react-native';
7
8
  import { useOxy } from '../context/OxyContext';
8
9
  import { toast } from '@oxyhq/bloom';
@@ -1,5 +1,5 @@
1
1
  import type React from 'react';
2
- import { type ViewStyle, type TextStyle, type StyleProp } from 'react-native';
2
+ import type { ViewStyle, TextStyle, StyleProp } from 'react-native';
3
3
  import { useTheme } from '@oxyhq/bloom/theme';
4
4
  import { Button } from '@oxyhq/bloom/button';
5
5
  import type { PaymentItem, PaymentGatewayResult } from '../screens/PaymentGatewayScreen';
@@ -1,4 +1,5 @@
1
- import React, { memo } from 'react';
1
+ import type React from 'react';
2
+ import { memo } from 'react';
2
3
  import { View, StyleSheet } from 'react-native';
3
4
  import { MaterialCommunityIcons } from '@expo/vector-icons';
4
5
  import { darkenColor } from '../utils/colorUtils';
@@ -1,4 +1,5 @@
1
- import React, { type ReactElement } from 'react';
1
+ import type React from 'react';
2
+ import type { ReactElement } from 'react';
2
3
  import Svg, { ClipPath, Defs, G, Path } from 'react-native-svg';
3
4
  import type { ViewStyle } from 'react-native';
4
5
  import { useTheme } from '@oxyhq/bloom/theme';
@@ -1,4 +1,5 @@
1
- import React, { type ReactElement } from 'react';
1
+ import type React from 'react';
2
+ import type { ReactElement } from 'react';
2
3
  import Svg, { G, Path } from 'react-native-svg';
3
4
  import type { ViewStyle } from 'react-native';
4
5
  import { useTheme } from '@oxyhq/bloom/theme';
@@ -56,11 +56,11 @@ import {
56
56
  activeUserOf,
57
57
  accountIdsOf,
58
58
  } from '../session';
59
- import {
60
- type OxyContextState,
61
- type PasswordSignInResult,
62
- type OxyContextProviderProps,
63
- type CommitInput,
59
+ import type {
60
+ OxyContextState,
61
+ PasswordSignInResult,
62
+ OxyContextProviderProps,
63
+ CommitInput,
64
64
  } from './oxyContextTypes';
65
65
  import { DEFAULT_SESSION_VALIDITY_MS, loadUseFollowHook } from './oxyContextHelpers';
66
66
  import { commitDeviceSetAndResolve } from './commitSessionFlow';
@@ -210,14 +210,15 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
210
210
 
211
211
  const {
212
212
  currentLanguage,
213
+ languages: currentLanguages,
213
214
  metadata: currentLanguageMetadata,
214
215
  languageName: currentLanguageName,
215
216
  nativeLanguageName: currentNativeLanguageName,
216
217
  setLanguage,
217
- applyLanguagePreference,
218
218
  } = useLanguageManagement({
219
219
  storage,
220
220
  languageKey: storageKeys.language,
221
+ user,
221
222
  onError,
222
223
  logger,
223
224
  });
@@ -238,7 +239,6 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
238
239
  storageKeyPrefix,
239
240
  loginSuccess,
240
241
  logoutStore,
241
- applyLanguagePreference,
242
242
  onAuthStateChange,
243
243
  onError,
244
244
  setAuthError: (message) => setAuthState({ error: message }),
@@ -376,7 +376,6 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
376
376
  switchSession,
377
377
  sessionClient,
378
378
  syncFromClient,
379
- applyLanguagePreference,
380
379
  onAuthStateChange,
381
380
  onError,
382
381
  loginSuccess,
@@ -873,6 +872,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
873
872
  isStorageReady: storage !== null,
874
873
  error,
875
874
  currentLanguage,
875
+ currentLanguages,
876
876
  currentLanguageMetadata,
877
877
  currentLanguageName,
878
878
  currentNativeLanguageName,
@@ -924,6 +924,7 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
924
924
  storage,
925
925
  error,
926
926
  currentLanguage,
927
+ currentLanguages,
927
928
  currentLanguageMetadata,
928
929
  currentLanguageName,
929
930
  currentNativeLanguageName,
@@ -992,10 +993,11 @@ const LOADING_STATE: OxyContextState = {
992
993
  isAuthResolved: false,
993
994
  isStorageReady: false,
994
995
  error: null,
995
- currentLanguage: 'en',
996
+ currentLanguage: 'en-US',
997
+ currentLanguages: [],
996
998
  currentLanguageMetadata: null,
997
- currentLanguageName: 'English',
998
- currentNativeLanguageName: 'English',
999
+ currentLanguageName: 'English (United States)',
1000
+ currentNativeLanguageName: 'English (United States)',
999
1001
  hasIdentity: () => Promise.resolve(false),
1000
1002
  getPublicKey: () => Promise.resolve(null),
1001
1003
  signIn: () => rejectMissingProvider<User>(),
@@ -149,6 +149,33 @@ describe('commitDeviceSetAndResolve — cold boot (activate: false)', () => {
149
149
  failure,
150
150
  );
151
151
  });
152
+
153
+ it('downgrades a 401 reconcile (signed-out edge) to debug — never warns', async () => {
154
+ const warnSpy = jest.spyOn(logger, 'warn').mockImplementation(() => undefined);
155
+ const debugSpy = jest.spyOn(logger, 'debug').mockImplementation(() => undefined);
156
+ const order: string[] = [];
157
+ // A stale/cleared bearer 401s `POST /session/device/add`: the EXPECTED
158
+ // signed-out outcome, not a failure the user should see warned in the console.
159
+ const unauthorized = Object.assign(new Error('Invalid or missing authorization header'), {
160
+ status: 401,
161
+ });
162
+ const deps = buildDeps(order, {
163
+ addCurrentAccount: jest.fn(async () => {
164
+ throw unauthorized;
165
+ }),
166
+ });
167
+
168
+ await commitDeviceSetAndResolve(deps);
169
+ await flush();
170
+
171
+ expect(deps.markAuthResolved).toHaveBeenCalledTimes(1);
172
+ expect(warnSpy).not.toHaveBeenCalled();
173
+ expect(debugSpy).toHaveBeenCalledWith(
174
+ 'commitSession: device-set registration skipped (signed out)',
175
+ { component: 'OxyContext', method: 'commitSession' },
176
+ unauthorized,
177
+ );
178
+ });
152
179
  });
153
180
 
154
181
  describe('commitDeviceSetAndResolve — deliberate sign-in (activate: true)', () => {
@@ -1,5 +1,6 @@
1
1
  import type { User } from '@oxyhq/core';
2
2
  import { logger as loggerUtil } from '@oxyhq/core';
3
+ import { isUnauthorizedStatus } from './oxyContextHelpers';
3
4
 
4
5
  const LOG_CONTEXT = { component: 'OxyContext', method: 'commitSession' } as const;
5
6
 
@@ -72,6 +73,15 @@ export async function commitDeviceSetAndResolve(
72
73
  };
73
74
 
74
75
  const logReconcileError = (registrationError: unknown): void => {
76
+ // A 401 here is the EXPECTED signed-out edge: the bearer was stale/cleared, so
77
+ // the device-set registration (`POST /session/device/add`) cannot carry auth.
78
+ // This is not a failure — the cold boot re-registers on the next load once a
79
+ // valid session is minted. Log at debug; warn only on genuine unexpected
80
+ // failures (network, 5xx, malformed).
81
+ if (isUnauthorizedStatus(registrationError)) {
82
+ loggerUtil.debug('commitSession: device-set registration skipped (signed out)', LOG_CONTEXT, registrationError);
83
+ return;
84
+ }
75
85
  loggerUtil.warn('commitSession: device-set registration failed', LOG_CONTEXT, registrationError);
76
86
  };
77
87
 
@@ -36,7 +36,6 @@ export interface UseAuthOperationsOptions {
36
36
  sessionClient: SessionClient;
37
37
  /** Reprojects `sessionClient.getState()` onto sessions/activeSessionId/user (Task 1's callback). Awaited after a partial `signOut` so the exposed state reflects the server truth before the call resolves. */
38
38
  syncFromClient: () => Promise<void>;
39
- applyLanguagePreference: (user: User) => Promise<void>;
40
39
  onAuthStateChange?: (user: User | null) => void;
41
40
  onError?: (error: ApiError) => void;
42
41
  loginSuccess: (user: User) => void;
@@ -91,7 +90,6 @@ export const useAuthOperations = ({
91
90
  switchSession,
92
91
  sessionClient,
93
92
  syncFromClient,
94
- applyLanguagePreference,
95
93
  onAuthStateChange,
96
94
  onError,
97
95
  loginSuccess,
@@ -219,14 +217,12 @@ export const useAuthOperations = ({
219
217
  await saveActiveSessionId(sessionResponse.sessionId);
220
218
  updateSessions(allDeviceSessions, { merge: true });
221
219
 
222
- await applyLanguagePreference(fullUser);
223
220
  loginSuccess(fullUser);
224
221
  onAuthStateChange?.(fullUser);
225
-
222
+
226
223
  return fullUser;
227
224
  },
228
225
  [
229
- applyLanguagePreference,
230
226
  logger,
231
227
  loginSuccess,
232
228
  onAuthStateChange,
@@ -28,7 +28,10 @@ export interface OxyContextState {
28
28
  isAuthResolved: boolean;
29
29
  isStorageReady: boolean;
30
30
  error: string | null;
31
+ /** Active UI locale (`language-REGION`): the account's primary locale when signed in, else the guest/device locale. */
31
32
  currentLanguage: string;
33
+ /** Ordered account locales (primary first) when signed in, or the single guest override when signed out. */
34
+ currentLanguages: string[];
32
35
  currentLanguageMetadata: ReturnType<typeof useLanguageManagement>['metadata'];
33
36
  currentLanguageName: string;
34
37
  currentNativeLanguageName: string;
@@ -2,7 +2,7 @@ import { useCallback, useMemo } from 'react';
2
2
  import { useQuery } from '@tanstack/react-query';
3
3
  import { useFollowStore } from '../stores/followStore';
4
4
  import { useOxy } from '../context/OxyContext';
5
- import { type OxyServices, type BulkFollowResult, type BulkUnfollowResult } from '@oxyhq/core';
5
+ import type { OxyServices, BulkFollowResult, BulkUnfollowResult } from '@oxyhq/core';
6
6
  import { useShallow } from 'zustand/react/shallow';
7
7
  import { queryKeys } from './queries/queryKeys';
8
8