@oxyhq/services 5.25.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 +273 -41
  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 +272 -41
  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 +117 -9
  300. package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +1 -1
  301. package/lib/typescript/commonjs/web/index.d.ts +19 -8
  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 +117 -9
  364. package/lib/typescript/module/web/WebOxyContext.d.ts.map +1 -1
  365. package/lib/typescript/module/web/index.d.ts +19 -8
  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 +331 -41
  433. package/src/web/index.ts +76 -6
  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,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;
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
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,
package/src/web.ts CHANGED
@@ -211,8 +211,8 @@ export {
211
211
  createApiError,
212
212
  handleHttpError,
213
213
  validateRequiredFields,
214
- retryWithBackoff
215
214
  } from './utils/errorUtils';
215
+ export { retryAsync } from './utils/asyncUtils';
216
216
  export * from './utils/validationUtils';
217
217
  export {
218
218
  logger,
@@ -1 +0,0 @@
1
- {"version":3,"names":["_react","require","_reactNative","_ThemeContext","useColorScheme","rnColorScheme","useRNColorScheme","themeContext","useContext","ThemeContext","resolvedTheme"],"sourceRoot":"../../../../src","sources":["ui/hooks/use-color-scheme.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,cAAcA,CAAA,EAAqB;EACjD;EACA,MAAMC,aAAa,GAAG,IAAAC,2BAAgB,EAAC,CAAC;EACxC,MAAMC,YAAY,GAAG,IAAAC,iBAAU,EAACC,0BAAY,CAAC;;EAE7C;EACA,IAAIF,YAAY,EAAEG,aAAa,EAAE;IAC/B,OAAOH,YAAY,CAACG,aAAa;EACnC;;EAEA;EACA,OAAQL,aAAa,IAAI,OAAO;AAClC","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["formatDate","dateString","date","Date","isNaN","getTime","toLocaleDateString","month","day","year","exports","getDisplayName","user","fullName","name","full","firstLast","first","last","filter","Boolean","join","trim","username","getShortDisplayName","firstName","split"],"sourceRoot":"../../../../src","sources":["ui/utils/user-utils.ts"],"mappings":";;;;;;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACO,MAAMA,UAAU,GAAIC,UAA4C,IAAa;EAClF,IAAI,CAACA,UAAU,EAAE,OAAO,EAAE;EAE1B,IAAI;IACF,MAAMC,IAAI,GAAGD,UAAU,YAAYE,IAAI,GAAGF,UAAU,GAAG,IAAIE,IAAI,CAACF,UAAU,CAAC;IAC3E,IAAIG,KAAK,CAACF,IAAI,CAACG,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE;IAEpC,OAAOH,IAAI,CAACI,kBAAkB,CAAC,OAAO,EAAE;MACtCC,KAAK,EAAE,OAAO;MACdC,GAAG,EAAE,SAAS;MACdC,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC,CAAC,MAAM;IACN,OAAO,EAAE;EACX;AACF,CAAC;;AAED;AACA;AACA;AAFAC,OAAA,CAAAV,UAAA,GAAAA,UAAA;AAGO,MAAMW,cAAc,GAAIC,IAAuG,IAAa;EACjJ,IAAI,CAACA,IAAI,EAAE,OAAO,MAAM;EAExB,MAAMC,QAAQ,GAAGD,IAAI,CAACE,IAAI,EAAEC,IAAI;EAChC,IAAIF,QAAQ,EAAE,OAAOA,QAAQ;EAE7B,MAAMG,SAAS,GAAG,CAACJ,IAAI,CAACE,IAAI,EAAEG,KAAK,EAAEL,IAAI,CAACE,IAAI,EAAEI,IAAI,CAAC,CAACC,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC,CAAC;EACtF,IAAIN,SAAS,EAAE,OAAOA,SAAS;EAE/B,OAAOJ,IAAI,CAACW,QAAQ,IAAI,MAAM;AAChC,CAAC;;AAED;AACA;AACA;AAFAb,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAGO,MAAMa,mBAAmB,GAAIZ,IAAwF,IAAa;EACvI,IAAI,CAACA,IAAI,EAAE,OAAO,MAAM;EAExB,MAAMa,SAAS,GAAGb,IAAI,CAACE,IAAI,EAAEG,KAAK,IAAIL,IAAI,CAACE,IAAI,EAAEC,IAAI,EAAEW,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EACpE,IAAID,SAAS,EAAE,OAAOA,SAAS;EAE/B,OAAOb,IAAI,CAACW,QAAQ,IAAI,MAAM;AAChC,CAAC;AAACb,OAAA,CAAAc,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["useContext","useColorScheme","useRNColorScheme","ThemeContext","rnColorScheme","themeContext","resolvedTheme"],"sourceRoot":"../../../../src","sources":["ui/hooks/use-color-scheme.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,cAAc,IAAIC,gBAAgB,QAAQ,cAAc;AACjE,SAASC,YAAY,QAAQ,4BAAyB;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASF,cAAcA,CAAA,EAAqB;EACjD;EACA,MAAMG,aAAa,GAAGF,gBAAgB,CAAC,CAAC;EACxC,MAAMG,YAAY,GAAGL,UAAU,CAACG,YAAY,CAAC;;EAE7C;EACA,IAAIE,YAAY,EAAEC,aAAa,EAAE;IAC/B,OAAOD,YAAY,CAACC,aAAa;EACnC;;EAEA;EACA,OAAQF,aAAa,IAAI,OAAO;AAClC","ignoreList":[]}