@oxyhq/services 5.24.0 → 5.26.0

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 (444) 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/index.js +321 -18
  13. package/lib/commonjs/index.js.map +1 -1
  14. package/lib/commonjs/shared/index.js +227 -0
  15. package/lib/commonjs/shared/index.js.map +1 -0
  16. package/lib/commonjs/shared/utils/colorUtils.js +161 -0
  17. package/lib/commonjs/shared/utils/colorUtils.js.map +1 -0
  18. package/lib/commonjs/shared/utils/debugUtils.js +84 -0
  19. package/lib/commonjs/shared/utils/debugUtils.js.map +1 -0
  20. package/lib/commonjs/shared/utils/errorUtils.js +190 -0
  21. package/lib/commonjs/shared/utils/errorUtils.js.map +1 -0
  22. package/lib/commonjs/shared/utils/index.js +196 -0
  23. package/lib/commonjs/shared/utils/index.js.map +1 -0
  24. package/lib/commonjs/shared/utils/networkUtils.js +213 -0
  25. package/lib/commonjs/shared/utils/networkUtils.js.map +1 -0
  26. package/lib/commonjs/shared/utils/themeUtils.js +118 -0
  27. package/lib/commonjs/shared/utils/themeUtils.js.map +1 -0
  28. package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -1
  29. package/lib/commonjs/ui/components/FontLoader.js +1 -1
  30. package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
  31. package/lib/commonjs/ui/components/GroupedItem.js +1 -1
  32. package/lib/commonjs/ui/components/Header.js +1 -1
  33. package/lib/commonjs/ui/components/OxyProvider.js +9 -1
  34. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  35. package/lib/commonjs/ui/components/OxySignInButton.js +19 -20
  36. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  37. package/lib/commonjs/ui/components/ProfileCard.js +1 -1
  38. package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
  39. package/lib/commonjs/ui/components/QuickActions.js +1 -1
  40. package/lib/commonjs/ui/components/QuickActions.js.map +1 -1
  41. package/lib/commonjs/ui/components/Section.js +1 -1
  42. package/lib/commonjs/ui/components/SectionTitle.js +1 -1
  43. package/lib/commonjs/ui/components/SignInModal.js +546 -0
  44. package/lib/commonjs/ui/components/SignInModal.js.map +1 -0
  45. package/lib/commonjs/ui/context/OxyContext.js +2 -1
  46. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  47. package/lib/commonjs/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
  48. package/lib/commonjs/ui/hooks/useColorScheme.js.map +1 -0
  49. package/lib/commonjs/ui/hooks/useSessionSocket.js +6 -12
  50. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  51. package/lib/commonjs/ui/hooks/useThemeColors.js +1 -1
  52. package/lib/commonjs/ui/hooks/useThemeStyles.js +1 -1
  53. package/lib/commonjs/ui/navigation/bottomSheetManager.js +5 -2
  54. package/lib/commonjs/ui/navigation/bottomSheetManager.js.map +1 -1
  55. package/lib/commonjs/ui/navigation/routes.js +7 -8
  56. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  57. package/lib/commonjs/ui/screens/AccountCenterScreen.js +7 -7
  58. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  59. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +6 -6
  60. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  61. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +2 -2
  62. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +4 -4
  63. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  64. package/lib/commonjs/ui/screens/AppInfoScreen.js +1 -1
  65. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +1 -1
  66. package/lib/commonjs/ui/screens/FileManagementScreen.js +1 -1
  67. package/lib/commonjs/ui/screens/FollowersListScreen.js +18 -0
  68. package/lib/commonjs/ui/screens/FollowersListScreen.js.map +1 -0
  69. package/lib/commonjs/ui/screens/FollowingListScreen.js +18 -0
  70. package/lib/commonjs/ui/screens/FollowingListScreen.js.map +1 -0
  71. package/lib/commonjs/ui/screens/HelpSupportScreen.js +1 -1
  72. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  73. package/lib/commonjs/ui/screens/HistoryViewScreen.js +1 -1
  74. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +1 -1
  75. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +229 -0
  76. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
  77. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +1 -1
  78. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  79. package/lib/commonjs/ui/screens/OxyAuthScreen.js +9 -21
  80. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  81. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +1 -1
  82. package/lib/commonjs/ui/screens/ProfileScreen.js +1 -1
  83. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  84. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +1 -1
  85. package/lib/commonjs/ui/screens/UserListScreen.js +411 -0
  86. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -0
  87. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +1 -1
  88. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +1 -1
  89. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +1 -1
  90. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
  91. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +1 -1
  92. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +1 -1
  93. package/lib/commonjs/ui/stores/authStore.js +4 -6
  94. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  95. package/lib/commonjs/ui/utils/colorUtils.js +43 -46
  96. package/lib/commonjs/ui/utils/colorUtils.js.map +1 -1
  97. package/lib/commonjs/ui/utils/themeUtils.js +29 -39
  98. package/lib/commonjs/ui/utils/themeUtils.js.map +1 -1
  99. package/lib/commonjs/ui/utils/{user-utils.js → userUtils.js} +1 -1
  100. package/lib/commonjs/ui/utils/userUtils.js.map +1 -0
  101. package/lib/commonjs/utils/errorUtils.js +0 -13
  102. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  103. package/lib/commonjs/utils/hookUtils.js +8 -8
  104. package/lib/commonjs/utils/hookUtils.js.map +1 -1
  105. package/lib/commonjs/web/WebOxyContext.js +277 -72
  106. package/lib/commonjs/web/WebOxyContext.js.map +1 -1
  107. package/lib/commonjs/web/index.js +177 -4
  108. package/lib/commonjs/web/index.js.map +1 -1
  109. package/lib/commonjs/web.js +12 -12
  110. package/lib/commonjs/web.js.map +1 -1
  111. package/lib/module/core/AuthManager.js +399 -0
  112. package/lib/module/core/AuthManager.js.map +1 -0
  113. package/lib/module/core/HttpService.js +39 -1
  114. package/lib/module/core/HttpService.js.map +1 -1
  115. package/lib/module/core/index.js +2 -0
  116. package/lib/module/core/index.js.map +1 -1
  117. package/lib/module/core/mixins/OxyServices.fedcm.js +38 -44
  118. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
  119. package/lib/module/core/mixins/OxyServices.popup.js +9 -7
  120. package/lib/module/core/mixins/OxyServices.popup.js.map +1 -1
  121. package/lib/module/index.js +27 -2
  122. package/lib/module/index.js.map +1 -1
  123. package/lib/module/shared/index.js +37 -0
  124. package/lib/module/shared/index.js.map +1 -0
  125. package/lib/module/shared/utils/colorUtils.js +150 -0
  126. package/lib/module/shared/utils/colorUtils.js.map +1 -0
  127. package/lib/module/shared/utils/debugUtils.js +75 -0
  128. package/lib/module/shared/utils/debugUtils.js.map +1 -0
  129. package/lib/module/shared/utils/errorUtils.js +176 -0
  130. package/lib/module/shared/utils/errorUtils.js.map +1 -0
  131. package/lib/module/shared/utils/index.js +21 -0
  132. package/lib/module/shared/utils/index.js.map +1 -0
  133. package/lib/module/shared/utils/networkUtils.js +202 -0
  134. package/lib/module/shared/utils/networkUtils.js.map +1 -0
  135. package/lib/module/shared/utils/themeUtils.js +109 -0
  136. package/lib/module/shared/utils/themeUtils.js.map +1 -0
  137. package/lib/module/ui/components/BottomSheetRouter.js +1 -1
  138. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  139. package/lib/module/ui/components/FontLoader.js +1 -1
  140. package/lib/module/ui/components/FontLoader.js.map +1 -1
  141. package/lib/module/ui/components/GroupedItem.js +1 -1
  142. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  143. package/lib/module/ui/components/Header.js +1 -1
  144. package/lib/module/ui/components/Header.js.map +1 -1
  145. package/lib/module/ui/components/OxyProvider.js +9 -1
  146. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  147. package/lib/module/ui/components/OxySignInButton.js +20 -21
  148. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  149. package/lib/module/ui/components/ProfileCard.js +1 -1
  150. package/lib/module/ui/components/ProfileCard.js.map +1 -1
  151. package/lib/module/ui/components/QuickActions.js +1 -1
  152. package/lib/module/ui/components/QuickActions.js.map +1 -1
  153. package/lib/module/ui/components/Section.js +1 -1
  154. package/lib/module/ui/components/Section.js.map +1 -1
  155. package/lib/module/ui/components/SectionTitle.js +1 -1
  156. package/lib/module/ui/components/SectionTitle.js.map +1 -1
  157. package/lib/module/ui/components/SignInModal.js +536 -0
  158. package/lib/module/ui/components/SignInModal.js.map +1 -0
  159. package/lib/module/ui/context/OxyContext.js +1 -1
  160. package/lib/module/ui/context/OxyContext.js.map +1 -1
  161. package/lib/module/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
  162. package/lib/module/ui/hooks/useColorScheme.js.map +1 -0
  163. package/lib/module/ui/hooks/useSessionSocket.js +6 -12
  164. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  165. package/lib/module/ui/hooks/useThemeColors.js +1 -1
  166. package/lib/module/ui/hooks/useThemeColors.js.map +1 -1
  167. package/lib/module/ui/hooks/useThemeStyles.js +1 -1
  168. package/lib/module/ui/hooks/useThemeStyles.js.map +1 -1
  169. package/lib/module/ui/navigation/bottomSheetManager.js +5 -2
  170. package/lib/module/ui/navigation/bottomSheetManager.js.map +1 -1
  171. package/lib/module/ui/navigation/routes.js +7 -8
  172. package/lib/module/ui/navigation/routes.js.map +1 -1
  173. package/lib/module/ui/screens/AccountCenterScreen.js +7 -7
  174. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  175. package/lib/module/ui/screens/AccountOverviewScreen.js +6 -6
  176. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  177. package/lib/module/ui/screens/AccountSettingsScreen.js +2 -2
  178. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  179. package/lib/module/ui/screens/AccountSwitcherScreen.js +4 -4
  180. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  181. package/lib/module/ui/screens/AppInfoScreen.js +1 -1
  182. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  183. package/lib/module/ui/screens/EditProfileFieldScreen.js +1 -1
  184. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  185. package/lib/module/ui/screens/FileManagementScreen.js +1 -1
  186. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  187. package/lib/module/ui/screens/FollowersListScreen.js +13 -0
  188. package/lib/module/ui/screens/FollowersListScreen.js.map +1 -0
  189. package/lib/module/ui/screens/FollowingListScreen.js +13 -0
  190. package/lib/module/ui/screens/FollowingListScreen.js.map +1 -0
  191. package/lib/module/ui/screens/HelpSupportScreen.js +1 -1
  192. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  193. package/lib/module/ui/screens/HistoryViewScreen.js +1 -1
  194. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  195. package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
  196. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  197. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +224 -0
  198. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
  199. package/lib/module/ui/screens/LegalDocumentsScreen.js +1 -1
  200. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  201. package/lib/module/ui/screens/OxyAuthScreen.js +9 -21
  202. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  203. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +1 -1
  204. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  205. package/lib/module/ui/screens/ProfileScreen.js +1 -1
  206. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  207. package/lib/module/ui/screens/SavesCollectionsScreen.js +1 -1
  208. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  209. package/lib/module/ui/screens/UserListScreen.js +405 -0
  210. package/lib/module/ui/screens/UserListScreen.js.map +1 -0
  211. package/lib/module/ui/screens/karma/KarmaAboutScreen.js +1 -1
  212. package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  213. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +1 -1
  214. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  215. package/lib/module/ui/screens/karma/KarmaFAQScreen.js +1 -1
  216. package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  217. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
  218. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  219. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +1 -1
  220. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  221. package/lib/module/ui/screens/karma/KarmaRulesScreen.js +1 -1
  222. package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  223. package/lib/module/ui/stores/authStore.js +4 -6
  224. package/lib/module/ui/stores/authStore.js.map +1 -1
  225. package/lib/module/ui/utils/colorUtils.js +7 -40
  226. package/lib/module/ui/utils/colorUtils.js.map +1 -1
  227. package/lib/module/ui/utils/themeUtils.js +7 -35
  228. package/lib/module/ui/utils/themeUtils.js.map +1 -1
  229. package/lib/module/ui/utils/{user-utils.js → userUtils.js} +1 -1
  230. package/lib/module/ui/utils/userUtils.js.map +1 -0
  231. package/lib/module/utils/errorUtils.js +0 -7
  232. package/lib/module/utils/errorUtils.js.map +1 -1
  233. package/lib/module/utils/hookUtils.js +8 -8
  234. package/lib/module/utils/hookUtils.js.map +1 -1
  235. package/lib/module/web/WebOxyContext.js +276 -72
  236. package/lib/module/web/WebOxyContext.js.map +1 -1
  237. package/lib/module/web/index.js +26 -5
  238. package/lib/module/web/index.js.map +1 -1
  239. package/lib/module/web.js +2 -1
  240. package/lib/module/web.js.map +1 -1
  241. package/lib/typescript/commonjs/core/AuthManager.d.ts +144 -0
  242. package/lib/typescript/commonjs/core/AuthManager.d.ts.map +1 -0
  243. package/lib/typescript/commonjs/core/HttpService.d.ts.map +1 -1
  244. package/lib/typescript/commonjs/core/index.d.ts +2 -0
  245. package/lib/typescript/commonjs/core/index.d.ts.map +1 -1
  246. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  247. package/lib/typescript/commonjs/core/mixins/OxyServices.popup.d.ts.map +1 -1
  248. package/lib/typescript/commonjs/index.d.ts +16 -2
  249. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  250. package/lib/typescript/commonjs/models/session.d.ts +4 -0
  251. package/lib/typescript/commonjs/models/session.d.ts.map +1 -1
  252. package/lib/typescript/commonjs/shared/index.d.ts +29 -0
  253. package/lib/typescript/commonjs/shared/index.d.ts.map +1 -0
  254. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts +105 -0
  255. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts.map +1 -0
  256. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts +49 -0
  257. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts.map +1 -0
  258. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts +98 -0
  259. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts.map +1 -0
  260. package/lib/typescript/commonjs/shared/utils/index.d.ts +14 -0
  261. package/lib/typescript/commonjs/shared/utils/index.d.ts.map +1 -0
  262. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts +140 -0
  263. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts.map +1 -0
  264. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts +91 -0
  265. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts.map +1 -0
  266. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts +1 -1
  267. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts.map +1 -1
  268. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  269. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  270. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts +18 -0
  271. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -0
  272. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +1 -2
  273. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  274. package/lib/typescript/commonjs/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
  275. package/lib/typescript/commonjs/ui/hooks/useColorScheme.d.ts.map +1 -0
  276. package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +1 -1
  277. package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts +2 -0
  278. package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts.map +1 -1
  279. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
  280. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  281. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts +9 -0
  282. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts.map +1 -0
  283. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts +9 -0
  284. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts.map +1 -0
  285. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
  286. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
  287. package/lib/typescript/commonjs/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  288. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts +11 -0
  289. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -0
  290. package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
  291. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts +7 -11
  292. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts.map +1 -1
  293. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts +6 -19
  294. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts.map +1 -1
  295. package/lib/typescript/commonjs/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
  296. package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -0
  297. package/lib/typescript/commonjs/utils/errorUtils.d.ts +0 -6
  298. package/lib/typescript/commonjs/utils/errorUtils.d.ts.map +1 -1
  299. package/lib/typescript/commonjs/web/WebOxyContext.d.ts +113 -4
  300. package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +1 -1
  301. package/lib/typescript/commonjs/web/index.d.ts +20 -9
  302. package/lib/typescript/commonjs/web/index.d.ts.map +1 -1
  303. package/lib/typescript/commonjs/web.d.ts +2 -1
  304. package/lib/typescript/commonjs/web.d.ts.map +1 -1
  305. package/lib/typescript/module/core/AuthManager.d.ts +144 -0
  306. package/lib/typescript/module/core/AuthManager.d.ts.map +1 -0
  307. package/lib/typescript/module/core/HttpService.d.ts.map +1 -1
  308. package/lib/typescript/module/core/index.d.ts +2 -0
  309. package/lib/typescript/module/core/index.d.ts.map +1 -1
  310. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  311. package/lib/typescript/module/core/mixins/OxyServices.popup.d.ts.map +1 -1
  312. package/lib/typescript/module/index.d.ts +16 -2
  313. package/lib/typescript/module/index.d.ts.map +1 -1
  314. package/lib/typescript/module/models/session.d.ts +4 -0
  315. package/lib/typescript/module/models/session.d.ts.map +1 -1
  316. package/lib/typescript/module/shared/index.d.ts +29 -0
  317. package/lib/typescript/module/shared/index.d.ts.map +1 -0
  318. package/lib/typescript/module/shared/utils/colorUtils.d.ts +105 -0
  319. package/lib/typescript/module/shared/utils/colorUtils.d.ts.map +1 -0
  320. package/lib/typescript/module/shared/utils/debugUtils.d.ts +49 -0
  321. package/lib/typescript/module/shared/utils/debugUtils.d.ts.map +1 -0
  322. package/lib/typescript/module/shared/utils/errorUtils.d.ts +98 -0
  323. package/lib/typescript/module/shared/utils/errorUtils.d.ts.map +1 -0
  324. package/lib/typescript/module/shared/utils/index.d.ts +14 -0
  325. package/lib/typescript/module/shared/utils/index.d.ts.map +1 -0
  326. package/lib/typescript/module/shared/utils/networkUtils.d.ts +140 -0
  327. package/lib/typescript/module/shared/utils/networkUtils.d.ts.map +1 -0
  328. package/lib/typescript/module/shared/utils/themeUtils.d.ts +91 -0
  329. package/lib/typescript/module/shared/utils/themeUtils.d.ts.map +1 -0
  330. package/lib/typescript/module/ui/components/FontLoader.d.ts +1 -1
  331. package/lib/typescript/module/ui/components/FontLoader.d.ts.map +1 -1
  332. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  333. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  334. package/lib/typescript/module/ui/components/SignInModal.d.ts +18 -0
  335. package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -0
  336. package/lib/typescript/module/ui/context/OxyContext.d.ts +1 -2
  337. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  338. package/lib/typescript/module/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
  339. package/lib/typescript/module/ui/hooks/useColorScheme.d.ts.map +1 -0
  340. package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +1 -1
  341. package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts +2 -0
  342. package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts.map +1 -1
  343. package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
  344. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  345. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts +9 -0
  346. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts.map +1 -0
  347. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts +9 -0
  348. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts.map +1 -0
  349. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
  350. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
  351. package/lib/typescript/module/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  352. package/lib/typescript/module/ui/screens/UserListScreen.d.ts +11 -0
  353. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -0
  354. package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
  355. package/lib/typescript/module/ui/utils/colorUtils.d.ts +7 -11
  356. package/lib/typescript/module/ui/utils/colorUtils.d.ts.map +1 -1
  357. package/lib/typescript/module/ui/utils/themeUtils.d.ts +6 -19
  358. package/lib/typescript/module/ui/utils/themeUtils.d.ts.map +1 -1
  359. package/lib/typescript/module/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
  360. package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -0
  361. package/lib/typescript/module/utils/errorUtils.d.ts +0 -6
  362. package/lib/typescript/module/utils/errorUtils.d.ts.map +1 -1
  363. package/lib/typescript/module/web/WebOxyContext.d.ts +113 -4
  364. package/lib/typescript/module/web/WebOxyContext.d.ts.map +1 -1
  365. package/lib/typescript/module/web/index.d.ts +20 -9
  366. package/lib/typescript/module/web/index.d.ts.map +1 -1
  367. package/lib/typescript/module/web.d.ts +2 -1
  368. package/lib/typescript/module/web.d.ts.map +1 -1
  369. package/package.json +8 -2
  370. package/src/core/AuthManager.ts +436 -0
  371. package/src/core/HttpService.ts +43 -1
  372. package/src/core/index.ts +4 -0
  373. package/src/core/mixins/OxyServices.fedcm.ts +37 -42
  374. package/src/core/mixins/OxyServices.popup.ts +10 -7
  375. package/src/index.ts +76 -11
  376. package/src/models/session.ts +4 -0
  377. package/src/shared/index.ts +82 -0
  378. package/src/shared/utils/colorUtils.ts +155 -0
  379. package/src/shared/utils/debugUtils.ts +73 -0
  380. package/src/shared/utils/errorUtils.ts +181 -0
  381. package/src/shared/utils/index.ts +59 -0
  382. package/src/shared/utils/networkUtils.ts +248 -0
  383. package/src/shared/utils/themeUtils.ts +115 -0
  384. package/src/ui/components/BottomSheetRouter.tsx +1 -1
  385. package/src/ui/components/FontLoader.tsx +1 -2
  386. package/src/ui/components/GroupedItem.tsx +1 -1
  387. package/src/ui/components/Header.tsx +1 -1
  388. package/src/ui/components/OxyProvider.tsx +10 -0
  389. package/src/ui/components/OxySignInButton.tsx +20 -22
  390. package/src/ui/components/ProfileCard.tsx +1 -1
  391. package/src/ui/components/QuickActions.tsx +1 -1
  392. package/src/ui/components/Section.tsx +1 -1
  393. package/src/ui/components/SectionTitle.tsx +1 -1
  394. package/src/ui/components/SignInModal.tsx +534 -0
  395. package/src/ui/context/OxyContext.tsx +1 -2
  396. package/src/ui/hooks/queries/queryKeys.ts +2 -2
  397. package/src/ui/hooks/useSessionSocket.ts +12 -17
  398. package/src/ui/hooks/useThemeColors.ts +1 -1
  399. package/src/ui/hooks/useThemeStyles.ts +1 -1
  400. package/src/ui/navigation/bottomSheetManager.ts +5 -1
  401. package/src/ui/navigation/routes.ts +8 -9
  402. package/src/ui/screens/AccountCenterScreen.tsx +7 -7
  403. package/src/ui/screens/AccountOverviewScreen.tsx +6 -6
  404. package/src/ui/screens/AccountSettingsScreen.tsx +2 -2
  405. package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
  406. package/src/ui/screens/AppInfoScreen.tsx +1 -1
  407. package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
  408. package/src/ui/screens/FileManagementScreen.tsx +1 -1
  409. package/src/ui/screens/FollowersListScreen.tsx +14 -0
  410. package/src/ui/screens/FollowingListScreen.tsx +14 -0
  411. package/src/ui/screens/HelpSupportScreen.tsx +1 -1
  412. package/src/ui/screens/HistoryViewScreen.tsx +1 -1
  413. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  414. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +231 -0
  415. package/src/ui/screens/LegalDocumentsScreen.tsx +1 -1
  416. package/src/ui/screens/OxyAuthScreen.tsx +10 -21
  417. package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
  418. package/src/ui/screens/ProfileScreen.tsx +1 -1
  419. package/src/ui/screens/SavesCollectionsScreen.tsx +1 -1
  420. package/src/ui/screens/UserListScreen.tsx +416 -0
  421. package/src/ui/screens/karma/KarmaAboutScreen.tsx +1 -1
  422. package/src/ui/screens/karma/KarmaCenterScreen.tsx +1 -1
  423. package/src/ui/screens/karma/KarmaFAQScreen.tsx +1 -1
  424. package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +1 -1
  425. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +1 -1
  426. package/src/ui/screens/karma/KarmaRulesScreen.tsx +1 -1
  427. package/src/ui/stores/authStore.ts +5 -6
  428. package/src/ui/utils/colorUtils.ts +15 -43
  429. package/src/ui/utils/themeUtils.ts +14 -39
  430. package/src/utils/errorUtils.ts +1 -6
  431. package/src/utils/hookUtils.ts +8 -8
  432. package/src/web/WebOxyContext.tsx +330 -72
  433. package/src/web/index.ts +77 -7
  434. package/src/web.ts +1 -1
  435. package/lib/commonjs/ui/hooks/use-color-scheme.js.map +0 -1
  436. package/lib/commonjs/ui/utils/user-utils.js.map +0 -1
  437. package/lib/module/ui/hooks/use-color-scheme.js.map +0 -1
  438. package/lib/module/ui/utils/user-utils.js.map +0 -1
  439. package/lib/typescript/commonjs/ui/hooks/use-color-scheme.d.ts.map +0 -1
  440. package/lib/typescript/commonjs/ui/utils/user-utils.d.ts.map +0 -1
  441. package/lib/typescript/module/ui/hooks/use-color-scheme.d.ts.map +0 -1
  442. package/lib/typescript/module/ui/utils/user-utils.d.ts.map +0 -1
  443. /package/src/ui/hooks/{use-color-scheme.ts → useColorScheme.ts} +0 -0
  444. /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
 
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * Web-Only Oxy Context
3
- * Clean implementation with ZERO React Native dependencies
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
4
9
  */
5
10
 
6
11
  import {
@@ -8,11 +13,15 @@ import {
8
13
  useCallback,
9
14
  useContext,
10
15
  useEffect,
16
+ useMemo,
11
17
  useState,
12
18
  type ReactNode,
13
19
  } from 'react';
14
- import { OxyServices } from '../core';
20
+ import { OxyServices } from '../core/OxyServices';
21
+ import { CrossDomainAuth } from '../core/CrossDomainAuth';
22
+ import { AuthManager, createAuthManager } from '../core/AuthManager';
15
23
  import type { User } from '../models/interfaces';
24
+ import type { SessionLoginResponse, MinimalUserData } from '../models/session';
16
25
  import { QueryClientProvider } from '@tanstack/react-query';
17
26
  import { createQueryClient } from '../ui/hooks/queryClient';
18
27
 
@@ -24,57 +33,195 @@ export interface WebAuthState {
24
33
  }
25
34
 
26
35
  export interface WebAuthActions {
36
+ /**
37
+ * Sign in using the best available method (FedCM → Popup → Redirect)
38
+ */
27
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
+ */
28
60
  signOut: () => Promise<void>;
61
+
62
+ /**
63
+ * Check if FedCM is supported in the current browser
64
+ */
65
+ isFedCMSupported: () => boolean;
29
66
  }
30
67
 
31
68
  export interface WebOxyContextValue extends WebAuthState, WebAuthActions {
32
69
  oxyServices: OxyServices;
70
+ crossDomainAuth: CrossDomainAuth;
71
+ authManager: AuthManager;
33
72
  }
34
73
 
35
74
  const WebOxyContext = createContext<WebOxyContextValue | null>(null);
36
75
 
37
76
  export interface WebOxyProviderProps {
38
77
  children: ReactNode;
78
+ /** Base URL for the Oxy API (e.g., 'https://api.oxy.so') */
39
79
  baseURL: string;
80
+ /** Optional auth web URL for popup/redirect (defaults to 'https://auth.oxy.so') */
40
81
  authWebUrl?: string;
82
+ /** Callback when auth state changes */
41
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;
42
90
  }
43
91
 
44
92
  /**
45
93
  * Web-only Oxy Provider
46
- * Minimal, clean implementation for web apps
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
+ * ```
47
119
  */
48
120
  export function WebOxyProvider({
49
121
  children,
50
122
  baseURL,
51
123
  authWebUrl,
52
124
  onAuthStateChange,
125
+ onError,
126
+ preferredAuthMethod = 'auto',
127
+ skipAutoCheck = false,
53
128
  }: WebOxyProviderProps) {
129
+ // Initialize services with centralized AuthManager
54
130
  const [oxyServices] = useState(() => new OxyServices({ baseURL, authWebUrl }));
131
+ const [crossDomainAuth] = useState(() => new CrossDomainAuth(oxyServices));
132
+ const [authManager] = useState(() => createAuthManager(oxyServices, { autoRefresh: true }));
133
+ const [queryClient] = useState(() => createQueryClient());
134
+
135
+ // Auth state
55
136
  const [user, setUser] = useState<User | null>(null);
56
- const [isLoading, setIsLoading] = useState(true);
137
+ const [isLoading, setIsLoading] = useState(!skipAutoCheck);
57
138
  const [error, setError] = useState<string | null>(null);
58
- const [queryClient] = useState(() => createQueryClient());
59
139
 
60
140
  const isAuthenticated = !!user;
61
141
 
62
- // Initialize - check for existing session
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
63
178
  useEffect(() => {
179
+ if (skipAutoCheck) return;
180
+
64
181
  let mounted = true;
65
182
 
66
183
  const initAuth = async () => {
67
184
  try {
68
- // Try to get current user (will use existing auth token if available)
69
- const currentUser = await oxyServices.getCurrentUser();
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
+ }
70
191
 
71
- if (mounted && currentUser) {
72
- setUser(currentUser);
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);
73
223
  }
74
224
  } catch (err) {
75
- // No active session - this is fine
76
- console.log('[WebOxy] No active session');
77
- } finally {
78
225
  if (mounted) {
79
226
  setIsLoading(false);
80
227
  }
@@ -86,98 +233,147 @@ export function WebOxyProvider({
86
233
  return () => {
87
234
  mounted = false;
88
235
  };
89
- }, [oxyServices]);
236
+ }, [oxyServices, crossDomainAuth, authManager, skipAutoCheck, handleAuthSuccess]);
90
237
 
91
238
  // Notify parent of auth state changes
92
239
  useEffect(() => {
93
240
  onAuthStateChange?.(user);
94
241
  }, [user, onAuthStateChange]);
95
242
 
243
+ /**
244
+ * Sign in with automatic method selection
245
+ */
96
246
  const signIn = useCallback(async () => {
97
247
  setError(null);
98
248
  setIsLoading(true);
99
249
 
250
+ let selectedMethod: 'fedcm' | 'popup' | 'redirect' = 'popup';
251
+
100
252
  try {
101
- // Open popup to auth.oxy.so
102
- const popup = window.open(
103
- `${authWebUrl || 'https://auth.oxy.so'}/login?origin=${encodeURIComponent(window.location.origin)}`,
104
- 'oxy-auth',
105
- 'width=500,height=700,popup=yes'
106
- );
107
-
108
- if (!popup) {
109
- throw new Error('Popup blocked. Please allow popups for this site.');
253
+ const session = await crossDomainAuth.signIn({
254
+ method: preferredAuthMethod,
255
+ onMethodSelected: (method) => {
256
+ selectedMethod = method as 'fedcm' | 'popup' | 'redirect';
257
+ },
258
+ });
259
+
260
+ if (session) {
261
+ await handleAuthSuccess(session, selectedMethod);
262
+ } else {
263
+ // Redirect method - page will reload
264
+ setIsLoading(false);
110
265
  }
266
+ } catch (err) {
267
+ handleAuthError(err);
268
+ }
269
+ }, [crossDomainAuth, preferredAuthMethod, handleAuthSuccess, handleAuthError]);
111
270
 
112
- // Listen for message from popup
113
- const handleMessage = async (event: MessageEvent) => {
114
- if (event.origin !== (authWebUrl || 'https://auth.oxy.so')) {
115
- return;
116
- }
117
-
118
- if (event.data.type === 'oxy-auth-success') {
119
- const { accessToken, user: authUser } = event.data;
120
-
121
- // Store the access token for API requests
122
- if (typeof window !== 'undefined' && accessToken) {
123
- localStorage.setItem('oxy-access-token', accessToken);
124
- }
125
-
126
- setUser(authUser);
127
- setIsLoading(false);
271
+ /**
272
+ * Sign in with FedCM specifically
273
+ */
274
+ const signInWithFedCM = useCallback(async () => {
275
+ setError(null);
276
+ setIsLoading(true);
128
277
 
129
- window.removeEventListener('message', handleMessage);
130
- popup.close();
131
- } else if (event.data.type === 'oxy-auth-error') {
132
- setError(event.data.error || 'Authentication failed');
133
- setIsLoading(false);
134
- window.removeEventListener('message', handleMessage);
135
- popup.close();
136
- }
137
- };
278
+ try {
279
+ const session = await crossDomainAuth.signInWithFedCM();
280
+ await handleAuthSuccess(session, 'fedcm');
281
+ } catch (err) {
282
+ handleAuthError(err);
283
+ }
284
+ }, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
138
285
 
139
- window.addEventListener('message', handleMessage);
286
+ /**
287
+ * Sign in with popup specifically
288
+ */
289
+ const signInWithPopup = useCallback(async () => {
290
+ setError(null);
291
+ setIsLoading(true);
140
292
 
141
- // Check if popup was closed
142
- const checkClosed = setInterval(() => {
143
- if (popup.closed) {
144
- clearInterval(checkClosed);
145
- window.removeEventListener('message', handleMessage);
146
- setIsLoading(false);
147
- }
148
- }, 500);
293
+ try {
294
+ const session = await crossDomainAuth.signInWithPopup();
295
+ await handleAuthSuccess(session, 'popup');
149
296
  } catch (err) {
150
- console.error('[WebOxy] Sign in error:', err);
151
- setError(err instanceof Error ? err.message : 'Sign in failed');
152
- setIsLoading(false);
297
+ handleAuthError(err);
153
298
  }
154
- }, [authWebUrl]);
299
+ }, [crossDomainAuth, handleAuthSuccess, handleAuthError]);
155
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();
316
+ }, [crossDomainAuth]);
317
+
318
+ /**
319
+ * Sign out via AuthManager (handles FedCM revocation and storage cleanup)
320
+ */
156
321
  const signOut = useCallback(async () => {
157
322
  setError(null);
158
323
 
159
324
  try {
160
- // Clear stored token
161
- if (typeof window !== 'undefined') {
162
- localStorage.removeItem('oxy-access-token');
163
- }
325
+ // Use centralized AuthManager for sign out (handles FedCM, storage cleanup)
326
+ await authManager.signOut();
164
327
 
328
+ // Clear user state
165
329
  setUser(null);
166
330
  } catch (err) {
167
- console.error('[WebOxy] Sign out error:', err);
168
- 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));
169
334
  }
170
- }, []);
335
+ }, [authManager, onError]);
171
336
 
172
- const contextValue: WebOxyContextValue = {
337
+ // Cleanup on unmount
338
+ useEffect(() => {
339
+ return () => {
340
+ authManager.destroy();
341
+ };
342
+ }, [authManager]);
343
+
344
+ // Memoize context value to prevent unnecessary re-renders
345
+ const contextValue = useMemo<WebOxyContextValue>(() => ({
346
+ // State
173
347
  user,
174
348
  isAuthenticated,
175
349
  isLoading,
176
350
  error,
351
+ // Services
352
+ oxyServices,
353
+ crossDomainAuth,
354
+ authManager,
355
+ // Actions
177
356
  signIn,
357
+ signInWithFedCM,
358
+ signInWithPopup,
359
+ signInWithRedirect,
178
360
  signOut,
361
+ isFedCMSupported,
362
+ }), [
363
+ user,
364
+ isAuthenticated,
365
+ isLoading,
366
+ error,
179
367
  oxyServices,
180
- };
368
+ crossDomainAuth,
369
+ authManager,
370
+ signIn,
371
+ signInWithFedCM,
372
+ signInWithPopup,
373
+ signInWithRedirect,
374
+ signOut,
375
+ isFedCMSupported,
376
+ ]);
181
377
 
182
378
  return (
183
379
  <QueryClientProvider client={queryClient}>
@@ -188,7 +384,13 @@ export function WebOxyProvider({
188
384
  );
189
385
  }
190
386
 
191
- 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 {
192
394
  const context = useContext(WebOxyContext);
193
395
  if (!context) {
194
396
  throw new Error('useWebOxy must be used within WebOxyProvider');
@@ -196,17 +398,73 @@ export function useWebOxy() {
196
398
  return context;
197
399
  }
198
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
+ */
199
433
  export function useAuth() {
200
- 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();
201
448
 
202
449
  return {
450
+ // State
203
451
  user,
204
452
  isAuthenticated,
205
453
  isLoading,
206
454
  isReady: !isLoading,
207
455
  error,
456
+ // Actions
208
457
  signIn,
458
+ signInWithFedCM,
459
+ signInWithPopup,
460
+ signInWithRedirect,
209
461
  signOut,
462
+ // Utilities
463
+ isFedCMSupported,
210
464
  oxyServices,
465
+ authManager,
211
466
  };
212
467
  }
468
+
469
+ // Default export for convenience
470
+ export default WebOxyProvider;
package/src/web/index.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * Features:
8
8
  * - WebOxyProvider for React context
9
9
  * - useAuth hook for authentication
10
- * - Cross-domain SSO via FedCM
10
+ * - Cross-domain SSO via FedCM, popup, or redirect
11
11
  * - Full TypeScript support
12
12
  * - Zero bundler configuration needed
13
13
  *
@@ -24,8 +24,13 @@
24
24
  * }
25
25
  *
26
26
  * function YourApp() {
27
- * const { user, isAuthenticated, signIn, signOut } = useAuth();
28
- * // ... your app logic
27
+ * const { user, isAuthenticated, signIn, signOut, isFedCMSupported } = useAuth();
28
+ *
29
+ * return (
30
+ * <button onClick={signIn}>
31
+ * {isFedCMSupported() ? 'Sign in with Oxy' : 'Sign in'}
32
+ * </button>
33
+ * );
29
34
  * }
30
35
  * ```
31
36
  */
@@ -41,17 +46,79 @@ export {
41
46
  CrossDomainAuth,
42
47
  createCrossDomainAuth,
43
48
  DeviceManager,
49
+ // Centralized auth management
50
+ AuthManager,
51
+ createAuthManager,
44
52
  } from '../core';
45
53
 
46
54
  export type {
47
55
  CrossDomainAuthOptions,
48
56
  DeviceFingerprint,
49
57
  StoredDeviceInfo,
58
+ // Auth manager types
59
+ StorageAdapter,
60
+ AuthStateChangeCallback,
61
+ AuthMethod,
62
+ AuthManagerConfig,
50
63
  } from '../core';
51
64
 
52
65
  // ==================== Web Components ====================
53
- export { WebOxyProvider, useWebOxy, useAuth } from './WebOxyContext';
54
- export type { WebOxyProviderProps, WebAuthState, WebAuthActions, WebOxyContextValue } from './WebOxyContext';
66
+ export {
67
+ WebOxyProvider,
68
+ useWebOxy,
69
+ useAuth,
70
+ } from './WebOxyContext';
71
+
72
+ export type {
73
+ WebOxyProviderProps,
74
+ WebAuthState,
75
+ WebAuthActions,
76
+ WebOxyContextValue,
77
+ } from './WebOxyContext';
78
+
79
+ // ==================== Shared Utilities ====================
80
+ // Re-export shared utilities that work everywhere
81
+ export {
82
+ // Color utilities
83
+ darkenColor,
84
+ lightenColor,
85
+ hexToRgb,
86
+ rgbToHex,
87
+ withOpacity,
88
+ isLightColor,
89
+ getContrastTextColor,
90
+ } from '../shared/utils/colorUtils';
91
+
92
+ export {
93
+ // Theme utilities
94
+ normalizeTheme,
95
+ normalizeColorScheme,
96
+ getOppositeTheme,
97
+ systemPrefersDarkMode,
98
+ getSystemColorScheme,
99
+ } from '../shared/utils/themeUtils';
100
+ export type { ThemeValue } from '../shared/utils/themeUtils';
101
+
102
+ export {
103
+ // Error utilities
104
+ HttpStatus,
105
+ getErrorStatus,
106
+ getErrorMessage,
107
+ isAlreadyRegisteredError,
108
+ isUnauthorizedError,
109
+ isForbiddenError,
110
+ isNotFoundError,
111
+ isRateLimitError,
112
+ isServerError,
113
+ isNetworkError,
114
+ isRetryableError,
115
+ } from '../shared/utils/errorUtils';
116
+
117
+ export {
118
+ // Network utilities
119
+ delay,
120
+ withRetry,
121
+ } from '../shared/utils/networkUtils';
55
122
 
56
123
  // ==================== Models & Types ====================
57
124
  // Re-export commonly used types
@@ -66,12 +133,15 @@ export type {
66
133
  KarmaRule,
67
134
  Transaction,
68
135
  DeviceSession,
136
+ LoginResponse,
69
137
  } from '../models/interfaces';
70
138
 
139
+ export type { SessionLoginResponse } from '../models/session';
140
+
71
141
  // Re-export session types
72
- export type { ClientSession } from '../models/session';
142
+ export type { ClientSession, MinimalUserData } from '../models/session';
73
143
 
74
- // ==================== Utilities ====================
144
+ // ==================== Language Utilities ====================
75
145
  export {
76
146
  SUPPORTED_LANGUAGES,
77
147
  getLanguageMetadata,