@oxyhq/services 5.25.0 → 5.26.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 (532) hide show
  1. package/README.md +60 -8
  2. package/lib/commonjs/core/AuthManager.js +405 -0
  3. package/lib/commonjs/core/AuthManager.js.map +1 -0
  4. package/lib/commonjs/core/HttpService.js +39 -1
  5. package/lib/commonjs/core/HttpService.js.map +1 -1
  6. package/lib/commonjs/core/index.js +16 -0
  7. package/lib/commonjs/core/index.js.map +1 -1
  8. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +38 -44
  9. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -1
  10. package/lib/commonjs/core/mixins/OxyServices.popup.js +9 -7
  11. package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -1
  12. package/lib/commonjs/crypto/keyManager.js +16 -21
  13. package/lib/commonjs/crypto/keyManager.js.map +1 -1
  14. package/lib/commonjs/index.js +386 -18
  15. package/lib/commonjs/index.js.map +1 -1
  16. package/lib/commonjs/lib/sonner.js +13 -17
  17. package/lib/commonjs/lib/sonner.js.map +1 -1
  18. package/lib/commonjs/lib/sonner.native.js +24 -0
  19. package/lib/commonjs/lib/sonner.native.js.map +1 -0
  20. package/lib/commonjs/lib/sonner.web.js +24 -0
  21. package/lib/commonjs/lib/sonner.web.js.map +1 -0
  22. package/lib/commonjs/shared/index.js +227 -0
  23. package/lib/commonjs/shared/index.js.map +1 -0
  24. package/lib/commonjs/shared/utils/colorUtils.js +161 -0
  25. package/lib/commonjs/shared/utils/colorUtils.js.map +1 -0
  26. package/lib/commonjs/shared/utils/debugUtils.js +84 -0
  27. package/lib/commonjs/shared/utils/debugUtils.js.map +1 -0
  28. package/lib/commonjs/shared/utils/errorUtils.js +190 -0
  29. package/lib/commonjs/shared/utils/errorUtils.js.map +1 -0
  30. package/lib/commonjs/shared/utils/index.js +196 -0
  31. package/lib/commonjs/shared/utils/index.js.map +1 -0
  32. package/lib/commonjs/shared/utils/networkUtils.js +213 -0
  33. package/lib/commonjs/shared/utils/networkUtils.js.map +1 -0
  34. package/lib/commonjs/shared/utils/themeUtils.js +118 -0
  35. package/lib/commonjs/shared/utils/themeUtils.js.map +1 -0
  36. package/lib/commonjs/ui/client.js +1 -1
  37. package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -1
  38. package/lib/commonjs/ui/components/FollowButton.js +1 -1
  39. package/lib/commonjs/ui/components/FontLoader.js +1 -1
  40. package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
  41. package/lib/commonjs/ui/components/GroupedItem.js +1 -1
  42. package/lib/commonjs/ui/components/Header.js +1 -1
  43. package/lib/commonjs/ui/components/OxyProvider.js +10 -2
  44. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  45. package/lib/commonjs/ui/components/OxySignInButton.js +19 -20
  46. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  47. package/lib/commonjs/ui/components/ProfileCard.js +1 -1
  48. package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
  49. package/lib/commonjs/ui/components/QuickActions.js +1 -1
  50. package/lib/commonjs/ui/components/QuickActions.js.map +1 -1
  51. package/lib/commonjs/ui/components/Section.js +1 -1
  52. package/lib/commonjs/ui/components/SectionTitle.js +1 -1
  53. package/lib/commonjs/ui/components/SignInModal.js +546 -0
  54. package/lib/commonjs/ui/components/SignInModal.js.map +1 -0
  55. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +1 -1
  56. package/lib/commonjs/ui/context/OxyContext.js +3 -2
  57. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  58. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +1 -1
  59. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +1 -1
  60. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +1 -1
  61. package/lib/commonjs/ui/hooks/useAsyncAction.js +1 -1
  62. package/lib/commonjs/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
  63. package/lib/commonjs/ui/hooks/useColorScheme.js.map +1 -0
  64. package/lib/commonjs/ui/hooks/useSessionSocket.js +7 -13
  65. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  66. package/lib/commonjs/ui/hooks/useSettingToggle.js +1 -1
  67. package/lib/commonjs/ui/hooks/useThemeColors.js +1 -1
  68. package/lib/commonjs/ui/hooks/useThemeStyles.js +1 -1
  69. package/lib/commonjs/ui/navigation/bottomSheetManager.js +5 -2
  70. package/lib/commonjs/ui/navigation/bottomSheetManager.js.map +1 -1
  71. package/lib/commonjs/ui/navigation/routes.js +7 -8
  72. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  73. package/lib/commonjs/ui/screens/AccountCenterScreen.js +8 -8
  74. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  75. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +7 -7
  76. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  77. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +3 -3
  78. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +5 -5
  79. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +1 -1
  81. package/lib/commonjs/ui/screens/AppInfoScreen.js +2 -2
  82. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +2 -2
  83. package/lib/commonjs/ui/screens/FAQScreen.js +1 -1
  84. package/lib/commonjs/ui/screens/FeedbackScreen.js +1 -1
  85. package/lib/commonjs/ui/screens/FileManagementScreen.js +2 -2
  86. package/lib/commonjs/ui/screens/FollowersListScreen.js +18 -0
  87. package/lib/commonjs/ui/screens/FollowersListScreen.js.map +1 -0
  88. package/lib/commonjs/ui/screens/FollowingListScreen.js +18 -0
  89. package/lib/commonjs/ui/screens/FollowingListScreen.js.map +1 -0
  90. package/lib/commonjs/ui/screens/HelpSupportScreen.js +2 -2
  91. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  92. package/lib/commonjs/ui/screens/HistoryViewScreen.js +2 -2
  93. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +2 -2
  94. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +229 -0
  95. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
  96. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +2 -2
  97. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  98. package/lib/commonjs/ui/screens/OxyAuthScreen.js +9 -21
  99. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  100. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +2 -2
  101. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +1 -1
  102. package/lib/commonjs/ui/screens/ProfileScreen.js +1 -1
  103. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  104. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +2 -2
  105. package/lib/commonjs/ui/screens/SessionManagementScreen.js +1 -1
  106. package/lib/commonjs/ui/screens/UserListScreen.js +411 -0
  107. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -0
  108. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +1 -1
  109. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +1 -1
  110. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +1 -1
  111. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +1 -1
  112. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
  113. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +1 -1
  114. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +1 -1
  115. package/lib/commonjs/ui/stores/authStore.js +4 -6
  116. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  117. package/lib/commonjs/ui/utils/colorUtils.js +43 -46
  118. package/lib/commonjs/ui/utils/colorUtils.js.map +1 -1
  119. package/lib/commonjs/ui/utils/fileManagement.js +1 -1
  120. package/lib/commonjs/ui/utils/themeUtils.js +29 -39
  121. package/lib/commonjs/ui/utils/themeUtils.js.map +1 -1
  122. package/lib/commonjs/ui/utils/{user-utils.js → userUtils.js} +1 -1
  123. package/lib/commonjs/ui/utils/userUtils.js.map +1 -0
  124. package/lib/commonjs/utils/errorUtils.js +0 -13
  125. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  126. package/lib/commonjs/utils/hookUtils.js +8 -8
  127. package/lib/commonjs/utils/hookUtils.js.map +1 -1
  128. package/lib/commonjs/utils/platform.js +129 -0
  129. package/lib/commonjs/utils/platform.js.map +1 -0
  130. package/lib/commonjs/web/WebOxyContext.js +273 -41
  131. package/lib/commonjs/web/WebOxyContext.js.map +1 -1
  132. package/lib/commonjs/web/index.js +177 -4
  133. package/lib/commonjs/web/index.js.map +1 -1
  134. package/lib/commonjs/web.js +12 -12
  135. package/lib/commonjs/web.js.map +1 -1
  136. package/lib/module/core/AuthManager.js +399 -0
  137. package/lib/module/core/AuthManager.js.map +1 -0
  138. package/lib/module/core/HttpService.js +39 -1
  139. package/lib/module/core/HttpService.js.map +1 -1
  140. package/lib/module/core/index.js +2 -0
  141. package/lib/module/core/index.js.map +1 -1
  142. package/lib/module/core/mixins/OxyServices.fedcm.js +38 -44
  143. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
  144. package/lib/module/core/mixins/OxyServices.popup.js +9 -7
  145. package/lib/module/core/mixins/OxyServices.popup.js.map +1 -1
  146. package/lib/module/crypto/keyManager.js +16 -21
  147. package/lib/module/crypto/keyManager.js.map +1 -1
  148. package/lib/module/index.js +34 -3
  149. package/lib/module/index.js.map +1 -1
  150. package/lib/module/lib/sonner.js +11 -16
  151. package/lib/module/lib/sonner.js.map +1 -1
  152. package/lib/module/lib/sonner.native.js +19 -0
  153. package/lib/module/lib/sonner.native.js.map +1 -0
  154. package/lib/module/lib/sonner.web.js +19 -0
  155. package/lib/module/lib/sonner.web.js.map +1 -0
  156. package/lib/module/shared/index.js +37 -0
  157. package/lib/module/shared/index.js.map +1 -0
  158. package/lib/module/shared/utils/colorUtils.js +150 -0
  159. package/lib/module/shared/utils/colorUtils.js.map +1 -0
  160. package/lib/module/shared/utils/debugUtils.js +75 -0
  161. package/lib/module/shared/utils/debugUtils.js.map +1 -0
  162. package/lib/module/shared/utils/errorUtils.js +176 -0
  163. package/lib/module/shared/utils/errorUtils.js.map +1 -0
  164. package/lib/module/shared/utils/index.js +21 -0
  165. package/lib/module/shared/utils/index.js.map +1 -0
  166. package/lib/module/shared/utils/networkUtils.js +202 -0
  167. package/lib/module/shared/utils/networkUtils.js.map +1 -0
  168. package/lib/module/shared/utils/themeUtils.js +109 -0
  169. package/lib/module/shared/utils/themeUtils.js.map +1 -0
  170. package/lib/module/ui/client.js +1 -1
  171. package/lib/module/ui/client.js.map +1 -1
  172. package/lib/module/ui/components/BottomSheetRouter.js +1 -1
  173. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  174. package/lib/module/ui/components/FollowButton.js +1 -1
  175. package/lib/module/ui/components/FollowButton.js.map +1 -1
  176. package/lib/module/ui/components/FontLoader.js +1 -1
  177. package/lib/module/ui/components/FontLoader.js.map +1 -1
  178. package/lib/module/ui/components/GroupedItem.js +1 -1
  179. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  180. package/lib/module/ui/components/Header.js +1 -1
  181. package/lib/module/ui/components/Header.js.map +1 -1
  182. package/lib/module/ui/components/OxyProvider.js +10 -2
  183. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  184. package/lib/module/ui/components/OxySignInButton.js +20 -21
  185. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  186. package/lib/module/ui/components/ProfileCard.js +1 -1
  187. package/lib/module/ui/components/ProfileCard.js.map +1 -1
  188. package/lib/module/ui/components/QuickActions.js +1 -1
  189. package/lib/module/ui/components/QuickActions.js.map +1 -1
  190. package/lib/module/ui/components/Section.js +1 -1
  191. package/lib/module/ui/components/Section.js.map +1 -1
  192. package/lib/module/ui/components/SectionTitle.js +1 -1
  193. package/lib/module/ui/components/SectionTitle.js.map +1 -1
  194. package/lib/module/ui/components/SignInModal.js +536 -0
  195. package/lib/module/ui/components/SignInModal.js.map +1 -0
  196. package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
  197. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  198. package/lib/module/ui/context/OxyContext.js +2 -2
  199. package/lib/module/ui/context/OxyContext.js.map +1 -1
  200. package/lib/module/ui/hooks/mutations/mutationFactory.js +1 -1
  201. package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
  202. package/lib/module/ui/hooks/mutations/useAccountMutations.js +1 -1
  203. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  204. package/lib/module/ui/hooks/mutations/useServicesMutations.js +1 -1
  205. package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  206. package/lib/module/ui/hooks/useAsyncAction.js +1 -1
  207. package/lib/module/ui/hooks/useAsyncAction.js.map +1 -1
  208. package/lib/module/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
  209. package/lib/module/ui/hooks/useColorScheme.js.map +1 -0
  210. package/lib/module/ui/hooks/useSessionSocket.js +7 -13
  211. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  212. package/lib/module/ui/hooks/useSettingToggle.js +1 -1
  213. package/lib/module/ui/hooks/useSettingToggle.js.map +1 -1
  214. package/lib/module/ui/hooks/useThemeColors.js +1 -1
  215. package/lib/module/ui/hooks/useThemeColors.js.map +1 -1
  216. package/lib/module/ui/hooks/useThemeStyles.js +1 -1
  217. package/lib/module/ui/hooks/useThemeStyles.js.map +1 -1
  218. package/lib/module/ui/navigation/bottomSheetManager.js +5 -2
  219. package/lib/module/ui/navigation/bottomSheetManager.js.map +1 -1
  220. package/lib/module/ui/navigation/routes.js +7 -8
  221. package/lib/module/ui/navigation/routes.js.map +1 -1
  222. package/lib/module/ui/screens/AccountCenterScreen.js +8 -8
  223. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  224. package/lib/module/ui/screens/AccountOverviewScreen.js +7 -7
  225. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  226. package/lib/module/ui/screens/AccountSettingsScreen.js +3 -3
  227. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  228. package/lib/module/ui/screens/AccountSwitcherScreen.js +5 -5
  229. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  230. package/lib/module/ui/screens/AccountVerificationScreen.js +1 -1
  231. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  232. package/lib/module/ui/screens/AppInfoScreen.js +2 -2
  233. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  234. package/lib/module/ui/screens/EditProfileFieldScreen.js +2 -2
  235. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  236. package/lib/module/ui/screens/FAQScreen.js +1 -1
  237. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  238. package/lib/module/ui/screens/FeedbackScreen.js +1 -1
  239. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  240. package/lib/module/ui/screens/FileManagementScreen.js +2 -2
  241. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  242. package/lib/module/ui/screens/FollowersListScreen.js +13 -0
  243. package/lib/module/ui/screens/FollowersListScreen.js.map +1 -0
  244. package/lib/module/ui/screens/FollowingListScreen.js +13 -0
  245. package/lib/module/ui/screens/FollowingListScreen.js.map +1 -0
  246. package/lib/module/ui/screens/HelpSupportScreen.js +2 -2
  247. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  248. package/lib/module/ui/screens/HistoryViewScreen.js +2 -2
  249. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  250. package/lib/module/ui/screens/LanguageSelectorScreen.js +2 -2
  251. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  252. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +224 -0
  253. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
  254. package/lib/module/ui/screens/LegalDocumentsScreen.js +2 -2
  255. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  256. package/lib/module/ui/screens/OxyAuthScreen.js +9 -21
  257. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  258. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +2 -2
  259. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  260. package/lib/module/ui/screens/PrivacySettingsScreen.js +1 -1
  261. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  262. package/lib/module/ui/screens/ProfileScreen.js +1 -1
  263. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  264. package/lib/module/ui/screens/SavesCollectionsScreen.js +2 -2
  265. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  266. package/lib/module/ui/screens/SessionManagementScreen.js +1 -1
  267. package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
  268. package/lib/module/ui/screens/UserListScreen.js +405 -0
  269. package/lib/module/ui/screens/UserListScreen.js.map +1 -0
  270. package/lib/module/ui/screens/WelcomeNewUserScreen.js +1 -1
  271. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  272. package/lib/module/ui/screens/karma/KarmaAboutScreen.js +1 -1
  273. package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  274. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +1 -1
  275. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  276. package/lib/module/ui/screens/karma/KarmaFAQScreen.js +1 -1
  277. package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  278. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
  279. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  280. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +1 -1
  281. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  282. package/lib/module/ui/screens/karma/KarmaRulesScreen.js +1 -1
  283. package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  284. package/lib/module/ui/stores/authStore.js +4 -6
  285. package/lib/module/ui/stores/authStore.js.map +1 -1
  286. package/lib/module/ui/utils/colorUtils.js +7 -40
  287. package/lib/module/ui/utils/colorUtils.js.map +1 -1
  288. package/lib/module/ui/utils/fileManagement.js +1 -1
  289. package/lib/module/ui/utils/fileManagement.js.map +1 -1
  290. package/lib/module/ui/utils/themeUtils.js +7 -35
  291. package/lib/module/ui/utils/themeUtils.js.map +1 -1
  292. package/lib/module/ui/utils/{user-utils.js → userUtils.js} +1 -1
  293. package/lib/module/ui/utils/userUtils.js.map +1 -0
  294. package/lib/module/utils/errorUtils.js +0 -7
  295. package/lib/module/utils/errorUtils.js.map +1 -1
  296. package/lib/module/utils/hookUtils.js +8 -8
  297. package/lib/module/utils/hookUtils.js.map +1 -1
  298. package/lib/module/utils/platform.js +118 -0
  299. package/lib/module/utils/platform.js.map +1 -0
  300. package/lib/module/web/WebOxyContext.js +272 -41
  301. package/lib/module/web/WebOxyContext.js.map +1 -1
  302. package/lib/module/web/index.js +26 -5
  303. package/lib/module/web/index.js.map +1 -1
  304. package/lib/module/web.js +2 -1
  305. package/lib/module/web.js.map +1 -1
  306. package/lib/typescript/commonjs/core/AuthManager.d.ts +144 -0
  307. package/lib/typescript/commonjs/core/AuthManager.d.ts.map +1 -0
  308. package/lib/typescript/commonjs/core/HttpService.d.ts.map +1 -1
  309. package/lib/typescript/commonjs/core/index.d.ts +2 -0
  310. package/lib/typescript/commonjs/core/index.d.ts.map +1 -1
  311. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  312. package/lib/typescript/commonjs/core/mixins/OxyServices.popup.d.ts.map +1 -1
  313. package/lib/typescript/commonjs/crypto/keyManager.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/index.d.ts +16 -2
  315. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  316. package/lib/typescript/commonjs/lib/sonner.d.ts +11 -14
  317. package/lib/typescript/commonjs/lib/sonner.d.ts.map +1 -1
  318. package/lib/typescript/commonjs/lib/sonner.native.d.ts +15 -0
  319. package/lib/typescript/commonjs/lib/sonner.native.d.ts.map +1 -0
  320. package/lib/typescript/commonjs/lib/sonner.web.d.ts +15 -0
  321. package/lib/typescript/commonjs/lib/sonner.web.d.ts.map +1 -0
  322. package/lib/typescript/commonjs/models/session.d.ts +4 -0
  323. package/lib/typescript/commonjs/models/session.d.ts.map +1 -1
  324. package/lib/typescript/commonjs/shared/index.d.ts +29 -0
  325. package/lib/typescript/commonjs/shared/index.d.ts.map +1 -0
  326. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts +105 -0
  327. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts.map +1 -0
  328. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts +49 -0
  329. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts.map +1 -0
  330. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts +98 -0
  331. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts.map +1 -0
  332. package/lib/typescript/commonjs/shared/utils/index.d.ts +14 -0
  333. package/lib/typescript/commonjs/shared/utils/index.d.ts.map +1 -0
  334. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts +140 -0
  335. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts.map +1 -0
  336. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts +91 -0
  337. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts.map +1 -0
  338. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts +1 -1
  339. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts.map +1 -1
  340. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  341. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  342. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts +18 -0
  343. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -0
  344. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +1 -2
  345. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  346. package/lib/typescript/commonjs/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
  347. package/lib/typescript/commonjs/ui/hooks/useColorScheme.d.ts.map +1 -0
  348. package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +1 -1
  349. package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts +2 -0
  350. package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts.map +1 -1
  351. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
  352. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  353. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts +9 -0
  354. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts.map +1 -0
  355. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts +9 -0
  356. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts.map +1 -0
  357. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
  358. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
  359. package/lib/typescript/commonjs/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  360. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts +11 -0
  361. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -0
  362. package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
  363. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts +7 -11
  364. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts.map +1 -1
  365. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts +6 -19
  366. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts.map +1 -1
  367. package/lib/typescript/commonjs/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
  368. package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -0
  369. package/lib/typescript/commonjs/utils/errorUtils.d.ts +0 -6
  370. package/lib/typescript/commonjs/utils/errorUtils.d.ts.map +1 -1
  371. package/lib/typescript/commonjs/utils/platform.d.ts +41 -0
  372. package/lib/typescript/commonjs/utils/platform.d.ts.map +1 -0
  373. package/lib/typescript/commonjs/web/WebOxyContext.d.ts +117 -9
  374. package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +1 -1
  375. package/lib/typescript/commonjs/web/index.d.ts +19 -8
  376. package/lib/typescript/commonjs/web/index.d.ts.map +1 -1
  377. package/lib/typescript/commonjs/web.d.ts +2 -1
  378. package/lib/typescript/commonjs/web.d.ts.map +1 -1
  379. package/lib/typescript/module/core/AuthManager.d.ts +144 -0
  380. package/lib/typescript/module/core/AuthManager.d.ts.map +1 -0
  381. package/lib/typescript/module/core/HttpService.d.ts.map +1 -1
  382. package/lib/typescript/module/core/index.d.ts +2 -0
  383. package/lib/typescript/module/core/index.d.ts.map +1 -1
  384. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  385. package/lib/typescript/module/core/mixins/OxyServices.popup.d.ts.map +1 -1
  386. package/lib/typescript/module/crypto/keyManager.d.ts.map +1 -1
  387. package/lib/typescript/module/index.d.ts +16 -2
  388. package/lib/typescript/module/index.d.ts.map +1 -1
  389. package/lib/typescript/module/lib/sonner.d.ts +11 -14
  390. package/lib/typescript/module/lib/sonner.d.ts.map +1 -1
  391. package/lib/typescript/module/lib/sonner.native.d.ts +15 -0
  392. package/lib/typescript/module/lib/sonner.native.d.ts.map +1 -0
  393. package/lib/typescript/module/lib/sonner.web.d.ts +15 -0
  394. package/lib/typescript/module/lib/sonner.web.d.ts.map +1 -0
  395. package/lib/typescript/module/models/session.d.ts +4 -0
  396. package/lib/typescript/module/models/session.d.ts.map +1 -1
  397. package/lib/typescript/module/shared/index.d.ts +29 -0
  398. package/lib/typescript/module/shared/index.d.ts.map +1 -0
  399. package/lib/typescript/module/shared/utils/colorUtils.d.ts +105 -0
  400. package/lib/typescript/module/shared/utils/colorUtils.d.ts.map +1 -0
  401. package/lib/typescript/module/shared/utils/debugUtils.d.ts +49 -0
  402. package/lib/typescript/module/shared/utils/debugUtils.d.ts.map +1 -0
  403. package/lib/typescript/module/shared/utils/errorUtils.d.ts +98 -0
  404. package/lib/typescript/module/shared/utils/errorUtils.d.ts.map +1 -0
  405. package/lib/typescript/module/shared/utils/index.d.ts +14 -0
  406. package/lib/typescript/module/shared/utils/index.d.ts.map +1 -0
  407. package/lib/typescript/module/shared/utils/networkUtils.d.ts +140 -0
  408. package/lib/typescript/module/shared/utils/networkUtils.d.ts.map +1 -0
  409. package/lib/typescript/module/shared/utils/themeUtils.d.ts +91 -0
  410. package/lib/typescript/module/shared/utils/themeUtils.d.ts.map +1 -0
  411. package/lib/typescript/module/ui/components/FontLoader.d.ts +1 -1
  412. package/lib/typescript/module/ui/components/FontLoader.d.ts.map +1 -1
  413. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  414. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  415. package/lib/typescript/module/ui/components/SignInModal.d.ts +18 -0
  416. package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -0
  417. package/lib/typescript/module/ui/context/OxyContext.d.ts +1 -2
  418. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  419. package/lib/typescript/module/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
  420. package/lib/typescript/module/ui/hooks/useColorScheme.d.ts.map +1 -0
  421. package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +1 -1
  422. package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts +2 -0
  423. package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts.map +1 -1
  424. package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
  425. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  426. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts +9 -0
  427. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts.map +1 -0
  428. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts +9 -0
  429. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts.map +1 -0
  430. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
  431. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
  432. package/lib/typescript/module/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  433. package/lib/typescript/module/ui/screens/UserListScreen.d.ts +11 -0
  434. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -0
  435. package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
  436. package/lib/typescript/module/ui/utils/colorUtils.d.ts +7 -11
  437. package/lib/typescript/module/ui/utils/colorUtils.d.ts.map +1 -1
  438. package/lib/typescript/module/ui/utils/themeUtils.d.ts +6 -19
  439. package/lib/typescript/module/ui/utils/themeUtils.d.ts.map +1 -1
  440. package/lib/typescript/module/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
  441. package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -0
  442. package/lib/typescript/module/utils/errorUtils.d.ts +0 -6
  443. package/lib/typescript/module/utils/errorUtils.d.ts.map +1 -1
  444. package/lib/typescript/module/utils/platform.d.ts +41 -0
  445. package/lib/typescript/module/utils/platform.d.ts.map +1 -0
  446. package/lib/typescript/module/web/WebOxyContext.d.ts +117 -9
  447. package/lib/typescript/module/web/WebOxyContext.d.ts.map +1 -1
  448. package/lib/typescript/module/web/index.d.ts +19 -8
  449. package/lib/typescript/module/web/index.d.ts.map +1 -1
  450. package/lib/typescript/module/web.d.ts +2 -1
  451. package/lib/typescript/module/web.d.ts.map +1 -1
  452. package/package.json +8 -2
  453. package/src/core/AuthManager.ts +436 -0
  454. package/src/core/HttpService.ts +43 -1
  455. package/src/core/index.ts +4 -0
  456. package/src/core/mixins/OxyServices.fedcm.ts +37 -42
  457. package/src/core/mixins/OxyServices.popup.ts +10 -7
  458. package/src/crypto/keyManager.ts +16 -21
  459. package/src/index.ts +83 -12
  460. package/src/lib/sonner.native.ts +28 -0
  461. package/src/lib/sonner.ts +11 -28
  462. package/src/lib/sonner.web.ts +28 -0
  463. package/src/models/session.ts +4 -0
  464. package/src/shared/index.ts +82 -0
  465. package/src/shared/utils/colorUtils.ts +155 -0
  466. package/src/shared/utils/debugUtils.ts +73 -0
  467. package/src/shared/utils/errorUtils.ts +181 -0
  468. package/src/shared/utils/index.ts +59 -0
  469. package/src/shared/utils/networkUtils.ts +248 -0
  470. package/src/shared/utils/themeUtils.ts +115 -0
  471. package/src/ui/components/BottomSheetRouter.tsx +1 -1
  472. package/src/ui/components/FontLoader.tsx +1 -2
  473. package/src/ui/components/GroupedItem.tsx +1 -1
  474. package/src/ui/components/Header.tsx +1 -1
  475. package/src/ui/components/OxyProvider.tsx +10 -0
  476. package/src/ui/components/OxySignInButton.tsx +20 -22
  477. package/src/ui/components/ProfileCard.tsx +1 -1
  478. package/src/ui/components/QuickActions.tsx +1 -1
  479. package/src/ui/components/Section.tsx +1 -1
  480. package/src/ui/components/SectionTitle.tsx +1 -1
  481. package/src/ui/components/SignInModal.tsx +534 -0
  482. package/src/ui/context/OxyContext.tsx +1 -2
  483. package/src/ui/hooks/queries/queryKeys.ts +2 -2
  484. package/src/ui/hooks/useSessionSocket.ts +12 -17
  485. package/src/ui/hooks/useThemeColors.ts +1 -1
  486. package/src/ui/hooks/useThemeStyles.ts +1 -1
  487. package/src/ui/navigation/bottomSheetManager.ts +5 -1
  488. package/src/ui/navigation/routes.ts +8 -9
  489. package/src/ui/screens/AccountCenterScreen.tsx +7 -7
  490. package/src/ui/screens/AccountOverviewScreen.tsx +6 -6
  491. package/src/ui/screens/AccountSettingsScreen.tsx +2 -2
  492. package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
  493. package/src/ui/screens/AppInfoScreen.tsx +1 -1
  494. package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
  495. package/src/ui/screens/FileManagementScreen.tsx +1 -1
  496. package/src/ui/screens/FollowersListScreen.tsx +14 -0
  497. package/src/ui/screens/FollowingListScreen.tsx +14 -0
  498. package/src/ui/screens/HelpSupportScreen.tsx +1 -1
  499. package/src/ui/screens/HistoryViewScreen.tsx +1 -1
  500. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  501. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +231 -0
  502. package/src/ui/screens/LegalDocumentsScreen.tsx +1 -1
  503. package/src/ui/screens/OxyAuthScreen.tsx +10 -21
  504. package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
  505. package/src/ui/screens/ProfileScreen.tsx +1 -1
  506. package/src/ui/screens/SavesCollectionsScreen.tsx +1 -1
  507. package/src/ui/screens/UserListScreen.tsx +416 -0
  508. package/src/ui/screens/karma/KarmaAboutScreen.tsx +1 -1
  509. package/src/ui/screens/karma/KarmaCenterScreen.tsx +1 -1
  510. package/src/ui/screens/karma/KarmaFAQScreen.tsx +1 -1
  511. package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +1 -1
  512. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +1 -1
  513. package/src/ui/screens/karma/KarmaRulesScreen.tsx +1 -1
  514. package/src/ui/stores/authStore.ts +5 -6
  515. package/src/ui/utils/colorUtils.ts +15 -43
  516. package/src/ui/utils/themeUtils.ts +14 -39
  517. package/src/utils/errorUtils.ts +1 -6
  518. package/src/utils/hookUtils.ts +8 -8
  519. package/src/utils/platform.ts +117 -0
  520. package/src/web/WebOxyContext.tsx +331 -41
  521. package/src/web/index.ts +76 -6
  522. package/src/web.ts +1 -1
  523. package/lib/commonjs/ui/hooks/use-color-scheme.js.map +0 -1
  524. package/lib/commonjs/ui/utils/user-utils.js.map +0 -1
  525. package/lib/module/ui/hooks/use-color-scheme.js.map +0 -1
  526. package/lib/module/ui/utils/user-utils.js.map +0 -1
  527. package/lib/typescript/commonjs/ui/hooks/use-color-scheme.d.ts.map +0 -1
  528. package/lib/typescript/commonjs/ui/utils/user-utils.d.ts.map +0 -1
  529. package/lib/typescript/module/ui/hooks/use-color-scheme.d.ts.map +0 -1
  530. package/lib/typescript/module/ui/utils/user-utils.d.ts.map +0 -1
  531. /package/src/ui/hooks/{use-color-scheme.ts → useColorScheme.ts} +0 -0
  532. /package/src/ui/utils/{user-utils.ts → userUtils.ts} +0 -0
@@ -172,8 +172,8 @@ export function useLocalStorage<T>(key: string, initialValue: T) {
172
172
  try {
173
173
  const item = window.localStorage.getItem(key);
174
174
  return item ? JSON.parse(item) : initialValue;
175
- } catch (error) {
176
- console.error(`Error reading localStorage key "${key}":`, error);
175
+ } catch {
176
+ // Silently fail and return initial value
177
177
  return initialValue;
178
178
  }
179
179
  });
@@ -185,8 +185,8 @@ export function useLocalStorage<T>(key: string, initialValue: T) {
185
185
  if (hasLocalStorage) {
186
186
  window.localStorage.setItem(key, JSON.stringify(valueToStore));
187
187
  }
188
- } catch (error) {
189
- console.error(`Error setting localStorage key "${key}":`, error);
188
+ } catch {
189
+ // Silently fail - storage might be full or blocked
190
190
  }
191
191
  }, [key, storedValue]);
192
192
 
@@ -202,8 +202,8 @@ export function useSessionStorage<T>(key: string, initialValue: T) {
202
202
  try {
203
203
  const item = window.sessionStorage.getItem(key);
204
204
  return item ? JSON.parse(item) : initialValue;
205
- } catch (error) {
206
- console.error(`Error reading sessionStorage key "${key}":`, error);
205
+ } catch {
206
+ // Silently fail and return initial value
207
207
  return initialValue;
208
208
  }
209
209
  });
@@ -215,8 +215,8 @@ export function useSessionStorage<T>(key: string, initialValue: T) {
215
215
  if (hasSessionStorage) {
216
216
  window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
217
217
  }
218
- } catch (error) {
219
- console.error(`Error setting sessionStorage key "${key}":`, error);
218
+ } catch {
219
+ // Silently fail - storage might be full or blocked
220
220
  }
221
221
  }, [key, storedValue]);
222
222
 
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Platform Detection Utility
3
+ *
4
+ * Provides platform detection WITHOUT importing from 'react-native'.
5
+ * This allows core modules to be used in web/Node.js environments
6
+ * without bundlers failing on react-native imports.
7
+ */
8
+
9
+ export type PlatformOS = 'ios' | 'android' | 'web' | 'windows' | 'macos' | 'unknown';
10
+
11
+ /**
12
+ * Detect the current platform without importing react-native
13
+ *
14
+ * Detection order:
15
+ * 1. Check for React Native's Platform object on globalThis (set by RN runtime)
16
+ * 2. Check for Node.js environment
17
+ * 3. Check for browser environment
18
+ * 4. Fall back to 'unknown'
19
+ */
20
+ function detectPlatform(): PlatformOS {
21
+ // Check if React Native Platform is available globally (set by RN runtime)
22
+ // This avoids static imports while still detecting RN environment
23
+ const rnPlatform = (globalThis as any).__REACT_NATIVE_PLATFORM__;
24
+ if (rnPlatform) {
25
+ return rnPlatform as PlatformOS;
26
+ }
27
+
28
+ // Check navigator.product for React Native
29
+ if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
30
+ // We're in React Native but Platform wasn't set globally
31
+ // Try to get OS from userAgent or default to 'unknown'
32
+ return 'unknown';
33
+ }
34
+
35
+ // Check for Node.js environment
36
+ if (typeof process !== 'undefined' && process.versions?.node) {
37
+ return 'web'; // Treat Node.js as 'web' for compatibility (no native features)
38
+ }
39
+
40
+ // Check for browser/web environment
41
+ if (typeof window !== 'undefined' && typeof document !== 'undefined') {
42
+ return 'web';
43
+ }
44
+
45
+ return 'unknown';
46
+ }
47
+
48
+ // Cache the platform detection result
49
+ let cachedPlatform: PlatformOS | null = null;
50
+
51
+ /**
52
+ * Get the current platform OS
53
+ * Safe to call from any environment (web, Node.js, React Native)
54
+ */
55
+ export function getPlatformOS(): PlatformOS {
56
+ if (cachedPlatform === null) {
57
+ cachedPlatform = detectPlatform();
58
+ }
59
+ return cachedPlatform;
60
+ }
61
+
62
+ /**
63
+ * Check if running on web platform (browser or Node.js)
64
+ */
65
+ export function isWeb(): boolean {
66
+ return getPlatformOS() === 'web';
67
+ }
68
+
69
+ /**
70
+ * Check if running in a native app (iOS or Android)
71
+ */
72
+ export function isNative(): boolean {
73
+ const os = getPlatformOS();
74
+ return os === 'ios' || os === 'android';
75
+ }
76
+
77
+ /**
78
+ * Check if running on iOS
79
+ */
80
+ export function isIOS(): boolean {
81
+ return getPlatformOS() === 'ios';
82
+ }
83
+
84
+ /**
85
+ * Check if running on Android
86
+ */
87
+ export function isAndroid(): boolean {
88
+ return getPlatformOS() === 'android';
89
+ }
90
+
91
+ /**
92
+ * Set the platform OS explicitly
93
+ * Called by React Native entry point to register the platform
94
+ * This allows lazy detection in environments where react-native is available
95
+ */
96
+ export function setPlatformOS(os: PlatformOS): void {
97
+ cachedPlatform = os;
98
+ (globalThis as any).__REACT_NATIVE_PLATFORM__ = os;
99
+ }
100
+
101
+ /**
102
+ * Try to initialize platform from react-native if available
103
+ * This is called lazily when needed, avoiding top-level imports
104
+ */
105
+ export async function initPlatformFromReactNative(): Promise<void> {
106
+ if (cachedPlatform !== null && cachedPlatform !== 'unknown') {
107
+ return; // Already initialized
108
+ }
109
+
110
+ try {
111
+ // Dynamic import to avoid bundler issues
112
+ const { Platform } = await import('react-native');
113
+ setPlatformOS(Platform.OS as PlatformOS);
114
+ } catch {
115
+ // react-native not available, use detected platform
116
+ }
117
+ }
@@ -1,7 +1,11 @@
1
1
  /**
2
2
  * Web-Only Oxy Context
3
- * Clean implementation with ZERO React Native dependencies
4
- * Uses CrossDomainAuth for proper SSO flow
3
+ *
4
+ * Clean implementation with ZERO React Native dependencies.
5
+ * Provides FedCM, popup, and redirect authentication methods.
6
+ * Uses centralized AuthManager for token and session management.
7
+ *
8
+ * @module web/WebOxyContext
5
9
  */
6
10
 
7
11
  import {
@@ -9,75 +13,215 @@ import {
9
13
  useCallback,
10
14
  useContext,
11
15
  useEffect,
16
+ useMemo,
12
17
  useState,
13
18
  type ReactNode,
14
19
  } from 'react';
15
- import { OxyServices, createCrossDomainAuth } from '../core';
20
+ import { OxyServices } from '../core/OxyServices';
21
+ import { CrossDomainAuth } from '../core/CrossDomainAuth';
22
+ import { AuthManager, createAuthManager } from '../core/AuthManager';
16
23
  import type { User } from '../models/interfaces';
17
- import type { MinimalUserData } from '../models/session';
24
+ import type { SessionLoginResponse, MinimalUserData } from '../models/session';
18
25
  import { QueryClientProvider } from '@tanstack/react-query';
19
26
  import { createQueryClient } from '../ui/hooks/queryClient';
20
27
 
21
28
  export interface WebAuthState {
22
- user: MinimalUserData | null;
29
+ user: User | null;
23
30
  isAuthenticated: boolean;
24
31
  isLoading: boolean;
25
32
  error: string | null;
26
33
  }
27
34
 
28
35
  export interface WebAuthActions {
36
+ /**
37
+ * Sign in using the best available method (FedCM → Popup → Redirect)
38
+ */
29
39
  signIn: () => Promise<void>;
40
+
41
+ /**
42
+ * Sign in using FedCM (browser-native, Google-style)
43
+ * Falls back to popup if FedCM is not supported
44
+ */
45
+ signInWithFedCM: () => Promise<void>;
46
+
47
+ /**
48
+ * Sign in using popup window
49
+ */
50
+ signInWithPopup: () => Promise<void>;
51
+
52
+ /**
53
+ * Sign in using redirect (full page redirect to auth.oxy.so)
54
+ */
55
+ signInWithRedirect: () => void;
56
+
57
+ /**
58
+ * Sign out and clear session
59
+ */
30
60
  signOut: () => Promise<void>;
61
+
62
+ /**
63
+ * Check if FedCM is supported in the current browser
64
+ */
65
+ isFedCMSupported: () => boolean;
31
66
  }
32
67
 
33
68
  export interface WebOxyContextValue extends WebAuthState, WebAuthActions {
34
69
  oxyServices: OxyServices;
70
+ crossDomainAuth: CrossDomainAuth;
71
+ authManager: AuthManager;
35
72
  }
36
73
 
37
74
  const WebOxyContext = createContext<WebOxyContextValue | null>(null);
38
75
 
39
76
  export interface WebOxyProviderProps {
40
77
  children: ReactNode;
78
+ /** Base URL for the Oxy API (e.g., 'https://api.oxy.so') */
41
79
  baseURL: string;
80
+ /** Optional auth web URL for popup/redirect (defaults to 'https://auth.oxy.so') */
42
81
  authWebUrl?: string;
43
- onAuthStateChange?: (user: MinimalUserData | null) => void;
82
+ /** Callback when auth state changes */
83
+ onAuthStateChange?: (user: User | null) => void;
84
+ /** Callback when an error occurs */
85
+ onError?: (error: Error) => void;
86
+ /** Preferred auth method: 'auto' (default), 'fedcm', 'popup', or 'redirect' */
87
+ preferredAuthMethod?: 'auto' | 'fedcm' | 'popup' | 'redirect';
88
+ /** Skip automatic session check on mount */
89
+ skipAutoCheck?: boolean;
44
90
  }
45
91
 
46
92
  /**
47
93
  * Web-only Oxy Provider
48
- * Uses CrossDomainAuth for automatic SSO with FedCM/Popup/Redirect fallback
94
+ *
95
+ * Provides authentication context for pure web applications (React, Next.js, Vite).
96
+ * Supports FedCM, popup, and redirect authentication methods.
97
+ *
98
+ * @example
99
+ * ```tsx
100
+ * import { WebOxyProvider, useAuth } from '@oxyhq/services/web';
101
+ *
102
+ * function App() {
103
+ * return (
104
+ * <WebOxyProvider baseURL="https://api.oxy.so">
105
+ * <YourApp />
106
+ * </WebOxyProvider>
107
+ * );
108
+ * }
109
+ *
110
+ * function LoginButton() {
111
+ * const { signIn, isLoading, isFedCMSupported } = useAuth();
112
+ * return (
113
+ * <button onClick={signIn} disabled={isLoading}>
114
+ * {isFedCMSupported() ? 'Sign in with Oxy' : 'Sign in'}
115
+ * </button>
116
+ * );
117
+ * }
118
+ * ```
49
119
  */
50
120
  export function WebOxyProvider({
51
121
  children,
52
122
  baseURL,
53
123
  authWebUrl,
54
124
  onAuthStateChange,
125
+ onError,
126
+ preferredAuthMethod = 'auto',
127
+ skipAutoCheck = false,
55
128
  }: WebOxyProviderProps) {
129
+ // Initialize services with centralized AuthManager
56
130
  const [oxyServices] = useState(() => new OxyServices({ baseURL, authWebUrl }));
57
- const [crossDomainAuth] = useState(() => createCrossDomainAuth(oxyServices));
58
- const [user, setUser] = useState<MinimalUserData | null>(null);
59
- const [isLoading, setIsLoading] = useState(true);
60
- const [error, setError] = useState<string | null>(null);
131
+ const [crossDomainAuth] = useState(() => new CrossDomainAuth(oxyServices));
132
+ const [authManager] = useState(() => createAuthManager(oxyServices, { autoRefresh: true }));
61
133
  const [queryClient] = useState(() => createQueryClient());
62
134
 
135
+ // Auth state
136
+ const [user, setUser] = useState<User | null>(null);
137
+ const [isLoading, setIsLoading] = useState(!skipAutoCheck);
138
+ const [error, setError] = useState<string | null>(null);
139
+
63
140
  const isAuthenticated = !!user;
64
141
 
65
- // Initialize - handle callbacks, restore session, try silent sign-in
142
+ /**
143
+ * Handles successful authentication via AuthManager
144
+ */
145
+ const handleAuthSuccess = useCallback(async (session: SessionLoginResponse, method: 'fedcm' | 'popup' | 'redirect' | 'credentials' = 'credentials') => {
146
+ // Use centralized AuthManager for token/session storage
147
+ await authManager.handleAuthSuccess(session, method);
148
+
149
+ // Fetch full user profile (session.user only contains MinimalUserData)
150
+ try {
151
+ const fullUser = await oxyServices.getCurrentUser();
152
+ if (fullUser) {
153
+ setUser(fullUser);
154
+ } else {
155
+ // Fallback to minimal data if full profile unavailable
156
+ setUser(session.user as User);
157
+ }
158
+ } catch {
159
+ // Fallback to minimal data on error
160
+ setUser(session.user as User);
161
+ }
162
+
163
+ setError(null);
164
+ setIsLoading(false);
165
+ }, [authManager, oxyServices]);
166
+
167
+ /**
168
+ * Handles authentication errors
169
+ */
170
+ const handleAuthError = useCallback((err: unknown) => {
171
+ const errorMessage = err instanceof Error ? err.message : 'Authentication failed';
172
+ setError(errorMessage);
173
+ setIsLoading(false);
174
+ onError?.(err instanceof Error ? err : new Error(errorMessage));
175
+ }, [onError]);
176
+
177
+ // Initialize - check for existing session or redirect callback
66
178
  useEffect(() => {
179
+ if (skipAutoCheck) return;
180
+
67
181
  let mounted = true;
68
182
 
69
183
  const initAuth = async () => {
70
184
  try {
71
- // Complete initialization: handles callbacks, restores session, tries silent sign-in
72
- const session = await crossDomainAuth.initialize();
185
+ // 1. Check for redirect callback (user returning from auth.oxy.so)
186
+ const callbackSession = crossDomainAuth.handleRedirectCallback();
187
+ if (callbackSession && mounted) {
188
+ await handleAuthSuccess(callbackSession, 'redirect');
189
+ return;
190
+ }
73
191
 
74
- if (mounted && session?.user) {
75
- setUser(session.user);
192
+ // 2. Try to restore session from AuthManager (handles token refresh automatically)
193
+ const restoredUser = await authManager.initialize();
194
+ if (restoredUser && mounted) {
195
+ // Verify token is still valid by fetching current user
196
+ try {
197
+ const currentUser = await oxyServices.getCurrentUser();
198
+ if (mounted && currentUser) {
199
+ setUser(currentUser);
200
+ setIsLoading(false);
201
+ return;
202
+ }
203
+ } catch {
204
+ // Token invalid, AuthManager will handle clearing
205
+ await authManager.signOut();
206
+ }
207
+ }
208
+
209
+ // 3. Try silent sign-in (FedCM or iframe-based SSO)
210
+ try {
211
+ const session = await crossDomainAuth.silentSignIn();
212
+ if (mounted && session?.user) {
213
+ await handleAuthSuccess(session, 'fedcm');
214
+ return;
215
+ }
216
+ } catch {
217
+ // Silent sign-in failed, that's fine
218
+ }
219
+
220
+ // No session found
221
+ if (mounted) {
222
+ setIsLoading(false);
76
223
  }
77
224
  } catch (err) {
78
- // No active session - this is fine
79
- console.log('[WebOxy] No active session');
80
- } finally {
81
225
  if (mounted) {
82
226
  setIsLoading(false);
83
227
  }
@@ -89,63 +233,147 @@ export function WebOxyProvider({
89
233
  return () => {
90
234
  mounted = false;
91
235
  };
92
- }, [crossDomainAuth]);
236
+ }, [oxyServices, crossDomainAuth, authManager, skipAutoCheck, handleAuthSuccess]);
93
237
 
94
238
  // Notify parent of auth state changes
95
239
  useEffect(() => {
96
240
  onAuthStateChange?.(user);
97
241
  }, [user, onAuthStateChange]);
98
242
 
243
+ /**
244
+ * Sign in with automatic method selection
245
+ */
99
246
  const signIn = useCallback(async () => {
100
247
  setError(null);
101
248
  setIsLoading(true);
102
249
 
250
+ let selectedMethod: 'fedcm' | 'popup' | 'redirect' = 'popup';
251
+
103
252
  try {
104
- // Sign in with automatic method selection (FedCM → Popup → Redirect)
105
253
  const session = await crossDomainAuth.signIn({
106
- method: 'auto', // Automatic fallback
254
+ method: preferredAuthMethod,
107
255
  onMethodSelected: (method) => {
108
- console.log('[WebOxy] Using auth method:', method);
256
+ selectedMethod = method as 'fedcm' | 'popup' | 'redirect';
109
257
  },
110
258
  });
111
259
 
112
- if (session?.user) {
113
- setUser(session.user);
260
+ if (session) {
261
+ await handleAuthSuccess(session, selectedMethod);
262
+ } else {
263
+ // Redirect method - page will reload
264
+ setIsLoading(false);
114
265
  }
115
266
  } catch (err) {
116
- console.error('[WebOxy] Sign in error:', err);
117
- setError(err instanceof Error ? err.message : 'Sign in failed');
118
- } finally {
119
- setIsLoading(false);
267
+ handleAuthError(err);
120
268
  }
269
+ }, [crossDomainAuth, preferredAuthMethod, handleAuthSuccess, handleAuthError]);
270
+
271
+ /**
272
+ * Sign in with FedCM specifically
273
+ */
274
+ const signInWithFedCM = useCallback(async () => {
275
+ setError(null);
276
+ setIsLoading(true);
277
+
278
+ try {
279
+ const session = await crossDomainAuth.signInWithFedCM();
280
+ await handleAuthSuccess(session, 'fedcm');
281
+ } catch (err) {
282
+ handleAuthError(err);
283
+ }
284
+ }, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
285
+
286
+ /**
287
+ * Sign in with popup specifically
288
+ */
289
+ const signInWithPopup = useCallback(async () => {
290
+ setError(null);
291
+ setIsLoading(true);
292
+
293
+ try {
294
+ const session = await crossDomainAuth.signInWithPopup();
295
+ await handleAuthSuccess(session, 'popup');
296
+ } catch (err) {
297
+ handleAuthError(err);
298
+ }
299
+ }, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
300
+
301
+ /**
302
+ * Sign in with redirect specifically
303
+ */
304
+ const signInWithRedirect = useCallback(() => {
305
+ setError(null);
306
+ crossDomainAuth.signInWithRedirect({
307
+ redirectUri: typeof window !== 'undefined' ? window.location.href : undefined,
308
+ });
309
+ }, [crossDomainAuth]);
310
+
311
+ /**
312
+ * Check if FedCM is supported
313
+ */
314
+ const isFedCMSupported = useCallback(() => {
315
+ return crossDomainAuth.isFedCMSupported();
121
316
  }, [crossDomainAuth]);
122
317
 
318
+ /**
319
+ * Sign out via AuthManager (handles FedCM revocation and storage cleanup)
320
+ */
123
321
  const signOut = useCallback(async () => {
124
322
  setError(null);
125
323
 
126
324
  try {
127
- // Clear stored session
128
- if (typeof window !== 'undefined') {
129
- localStorage.removeItem('oxy-session');
130
- localStorage.removeItem('oxy-access-token');
131
- }
325
+ // Use centralized AuthManager for sign out (handles FedCM, storage cleanup)
326
+ await authManager.signOut();
132
327
 
328
+ // Clear user state
133
329
  setUser(null);
134
330
  } catch (err) {
135
- console.error('[WebOxy] Sign out error:', err);
136
- setError(err instanceof Error ? err.message : 'Sign out failed');
331
+ const errorMessage = err instanceof Error ? err.message : 'Sign out failed';
332
+ setError(errorMessage);
333
+ onError?.(err instanceof Error ? err : new Error(errorMessage));
137
334
  }
138
- }, []);
335
+ }, [authManager, onError]);
336
+
337
+ // Cleanup on unmount
338
+ useEffect(() => {
339
+ return () => {
340
+ authManager.destroy();
341
+ };
342
+ }, [authManager]);
139
343
 
140
- const contextValue: WebOxyContextValue = {
344
+ // Memoize context value to prevent unnecessary re-renders
345
+ const contextValue = useMemo<WebOxyContextValue>(() => ({
346
+ // State
141
347
  user,
142
348
  isAuthenticated,
143
349
  isLoading,
144
350
  error,
351
+ // Services
352
+ oxyServices,
353
+ crossDomainAuth,
354
+ authManager,
355
+ // Actions
145
356
  signIn,
357
+ signInWithFedCM,
358
+ signInWithPopup,
359
+ signInWithRedirect,
146
360
  signOut,
361
+ isFedCMSupported,
362
+ }), [
363
+ user,
364
+ isAuthenticated,
365
+ isLoading,
366
+ error,
147
367
  oxyServices,
148
- };
368
+ crossDomainAuth,
369
+ authManager,
370
+ signIn,
371
+ signInWithFedCM,
372
+ signInWithPopup,
373
+ signInWithRedirect,
374
+ signOut,
375
+ isFedCMSupported,
376
+ ]);
149
377
 
150
378
  return (
151
379
  <QueryClientProvider client={queryClient}>
@@ -156,7 +384,13 @@ export function WebOxyProvider({
156
384
  );
157
385
  }
158
386
 
159
- export function useWebOxy() {
387
+ /**
388
+ * Hook to access the full Web Oxy context.
389
+ *
390
+ * @returns Full context value including oxyServices and crossDomainAuth
391
+ * @throws Error if used outside WebOxyProvider
392
+ */
393
+ export function useWebOxy(): WebOxyContextValue {
160
394
  const context = useContext(WebOxyContext);
161
395
  if (!context) {
162
396
  throw new Error('useWebOxy must be used within WebOxyProvider');
@@ -164,17 +398,73 @@ export function useWebOxy() {
164
398
  return context;
165
399
  }
166
400
 
401
+ /**
402
+ * Hook for authentication in web apps.
403
+ *
404
+ * Provides a simplified interface for common auth operations.
405
+ *
406
+ * @returns Auth state and actions
407
+ * @throws Error if used outside WebOxyProvider
408
+ *
409
+ * @example
410
+ * ```tsx
411
+ * function LoginPage() {
412
+ * const { user, isAuthenticated, isLoading, signIn, signOut, isFedCMSupported } = useAuth();
413
+ *
414
+ * if (isLoading) return <Spinner />;
415
+ *
416
+ * if (isAuthenticated) {
417
+ * return (
418
+ * <div>
419
+ * <p>Welcome, {user.username}!</p>
420
+ * <button onClick={signOut}>Sign Out</button>
421
+ * </div>
422
+ * );
423
+ * }
424
+ *
425
+ * return (
426
+ * <button onClick={signIn}>
427
+ * {isFedCMSupported() ? 'Sign in with Oxy' : 'Sign in'}
428
+ * </button>
429
+ * );
430
+ * }
431
+ * ```
432
+ */
167
433
  export function useAuth() {
168
- const { user, isAuthenticated, isLoading, error, signIn, signOut, oxyServices } = useWebOxy();
434
+ const {
435
+ user,
436
+ isAuthenticated,
437
+ isLoading,
438
+ error,
439
+ signIn,
440
+ signInWithFedCM,
441
+ signInWithPopup,
442
+ signInWithRedirect,
443
+ signOut,
444
+ isFedCMSupported,
445
+ oxyServices,
446
+ authManager,
447
+ } = useWebOxy();
169
448
 
170
449
  return {
450
+ // State
171
451
  user,
172
452
  isAuthenticated,
173
453
  isLoading,
174
454
  isReady: !isLoading,
175
455
  error,
456
+ // Actions
176
457
  signIn,
458
+ signInWithFedCM,
459
+ signInWithPopup,
460
+ signInWithRedirect,
177
461
  signOut,
462
+ // Utilities
463
+ isFedCMSupported,
178
464
  oxyServices,
465
+ authManager,
179
466
  };
180
467
  }
468
+
469
+ // Default export for convenience
470
+ export default WebOxyProvider;