@oxyhq/services 5.25.0 → 5.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/README.md +60 -8
  2. package/lib/commonjs/core/AuthManager.js +405 -0
  3. package/lib/commonjs/core/AuthManager.js.map +1 -0
  4. package/lib/commonjs/core/HttpService.js +39 -1
  5. package/lib/commonjs/core/HttpService.js.map +1 -1
  6. package/lib/commonjs/core/index.js +16 -0
  7. package/lib/commonjs/core/index.js.map +1 -1
  8. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +38 -44
  9. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -1
  10. package/lib/commonjs/core/mixins/OxyServices.popup.js +9 -7
  11. package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -1
  12. package/lib/commonjs/crypto/keyManager.js +16 -21
  13. package/lib/commonjs/crypto/keyManager.js.map +1 -1
  14. package/lib/commonjs/index.js +386 -18
  15. package/lib/commonjs/index.js.map +1 -1
  16. package/lib/commonjs/lib/sonner.js +13 -17
  17. package/lib/commonjs/lib/sonner.js.map +1 -1
  18. package/lib/commonjs/lib/sonner.native.js +24 -0
  19. package/lib/commonjs/lib/sonner.native.js.map +1 -0
  20. package/lib/commonjs/lib/sonner.web.js +24 -0
  21. package/lib/commonjs/lib/sonner.web.js.map +1 -0
  22. package/lib/commonjs/shared/index.js +227 -0
  23. package/lib/commonjs/shared/index.js.map +1 -0
  24. package/lib/commonjs/shared/utils/colorUtils.js +161 -0
  25. package/lib/commonjs/shared/utils/colorUtils.js.map +1 -0
  26. package/lib/commonjs/shared/utils/debugUtils.js +84 -0
  27. package/lib/commonjs/shared/utils/debugUtils.js.map +1 -0
  28. package/lib/commonjs/shared/utils/errorUtils.js +190 -0
  29. package/lib/commonjs/shared/utils/errorUtils.js.map +1 -0
  30. package/lib/commonjs/shared/utils/index.js +196 -0
  31. package/lib/commonjs/shared/utils/index.js.map +1 -0
  32. package/lib/commonjs/shared/utils/networkUtils.js +213 -0
  33. package/lib/commonjs/shared/utils/networkUtils.js.map +1 -0
  34. package/lib/commonjs/shared/utils/themeUtils.js +118 -0
  35. package/lib/commonjs/shared/utils/themeUtils.js.map +1 -0
  36. package/lib/commonjs/ui/client.js +1 -1
  37. package/lib/commonjs/ui/components/BottomSheetRouter.js +1 -1
  38. package/lib/commonjs/ui/components/FollowButton.js +1 -1
  39. package/lib/commonjs/ui/components/FontLoader.js +1 -1
  40. package/lib/commonjs/ui/components/FontLoader.js.map +1 -1
  41. package/lib/commonjs/ui/components/GroupedItem.js +1 -1
  42. package/lib/commonjs/ui/components/Header.js +1 -1
  43. package/lib/commonjs/ui/components/OxyProvider.js +10 -2
  44. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  45. package/lib/commonjs/ui/components/OxySignInButton.js +19 -20
  46. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  47. package/lib/commonjs/ui/components/ProfileCard.js +1 -1
  48. package/lib/commonjs/ui/components/ProfileCard.js.map +1 -1
  49. package/lib/commonjs/ui/components/QuickActions.js +1 -1
  50. package/lib/commonjs/ui/components/QuickActions.js.map +1 -1
  51. package/lib/commonjs/ui/components/Section.js +1 -1
  52. package/lib/commonjs/ui/components/SectionTitle.js +1 -1
  53. package/lib/commonjs/ui/components/SignInModal.js +546 -0
  54. package/lib/commonjs/ui/components/SignInModal.js.map +1 -0
  55. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +1 -1
  56. package/lib/commonjs/ui/context/OxyContext.js +3 -2
  57. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  58. package/lib/commonjs/ui/hooks/mutations/mutationFactory.js +1 -1
  59. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +1 -1
  60. package/lib/commonjs/ui/hooks/mutations/useServicesMutations.js +1 -1
  61. package/lib/commonjs/ui/hooks/useAsyncAction.js +1 -1
  62. package/lib/commonjs/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
  63. package/lib/commonjs/ui/hooks/useColorScheme.js.map +1 -0
  64. package/lib/commonjs/ui/hooks/useSessionSocket.js +7 -13
  65. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  66. package/lib/commonjs/ui/hooks/useSettingToggle.js +1 -1
  67. package/lib/commonjs/ui/hooks/useThemeColors.js +1 -1
  68. package/lib/commonjs/ui/hooks/useThemeStyles.js +1 -1
  69. package/lib/commonjs/ui/navigation/bottomSheetManager.js +5 -2
  70. package/lib/commonjs/ui/navigation/bottomSheetManager.js.map +1 -1
  71. package/lib/commonjs/ui/navigation/routes.js +7 -8
  72. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  73. package/lib/commonjs/ui/screens/AccountCenterScreen.js +8 -8
  74. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  75. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +7 -7
  76. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  77. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +3 -3
  78. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +5 -5
  79. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  80. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +1 -1
  81. package/lib/commonjs/ui/screens/AppInfoScreen.js +2 -2
  82. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +2 -2
  83. package/lib/commonjs/ui/screens/FAQScreen.js +1 -1
  84. package/lib/commonjs/ui/screens/FeedbackScreen.js +1 -1
  85. package/lib/commonjs/ui/screens/FileManagementScreen.js +2 -2
  86. package/lib/commonjs/ui/screens/FollowersListScreen.js +18 -0
  87. package/lib/commonjs/ui/screens/FollowersListScreen.js.map +1 -0
  88. package/lib/commonjs/ui/screens/FollowingListScreen.js +18 -0
  89. package/lib/commonjs/ui/screens/FollowingListScreen.js.map +1 -0
  90. package/lib/commonjs/ui/screens/HelpSupportScreen.js +2 -2
  91. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  92. package/lib/commonjs/ui/screens/HistoryViewScreen.js +2 -2
  93. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +2 -2
  94. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +229 -0
  95. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
  96. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js +2 -2
  97. package/lib/commonjs/ui/screens/LegalDocumentsScreen.js.map +1 -1
  98. package/lib/commonjs/ui/screens/OxyAuthScreen.js +9 -21
  99. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  100. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +2 -2
  101. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +1 -1
  102. package/lib/commonjs/ui/screens/ProfileScreen.js +1 -1
  103. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  104. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +2 -2
  105. package/lib/commonjs/ui/screens/SessionManagementScreen.js +1 -1
  106. package/lib/commonjs/ui/screens/UserListScreen.js +411 -0
  107. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -0
  108. package/lib/commonjs/ui/screens/WelcomeNewUserScreen.js +1 -1
  109. package/lib/commonjs/ui/screens/karma/KarmaAboutScreen.js +1 -1
  110. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +1 -1
  111. package/lib/commonjs/ui/screens/karma/KarmaFAQScreen.js +1 -1
  112. package/lib/commonjs/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
  113. package/lib/commonjs/ui/screens/karma/KarmaRewardsScreen.js +1 -1
  114. package/lib/commonjs/ui/screens/karma/KarmaRulesScreen.js +1 -1
  115. package/lib/commonjs/ui/stores/authStore.js +4 -6
  116. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  117. package/lib/commonjs/ui/utils/colorUtils.js +43 -46
  118. package/lib/commonjs/ui/utils/colorUtils.js.map +1 -1
  119. package/lib/commonjs/ui/utils/fileManagement.js +1 -1
  120. package/lib/commonjs/ui/utils/themeUtils.js +29 -39
  121. package/lib/commonjs/ui/utils/themeUtils.js.map +1 -1
  122. package/lib/commonjs/ui/utils/{user-utils.js → userUtils.js} +1 -1
  123. package/lib/commonjs/ui/utils/userUtils.js.map +1 -0
  124. package/lib/commonjs/utils/errorUtils.js +0 -13
  125. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  126. package/lib/commonjs/utils/hookUtils.js +8 -8
  127. package/lib/commonjs/utils/hookUtils.js.map +1 -1
  128. package/lib/commonjs/utils/platform.js +129 -0
  129. package/lib/commonjs/utils/platform.js.map +1 -0
  130. package/lib/commonjs/web/WebOxyContext.js +273 -41
  131. package/lib/commonjs/web/WebOxyContext.js.map +1 -1
  132. package/lib/commonjs/web/index.js +177 -4
  133. package/lib/commonjs/web/index.js.map +1 -1
  134. package/lib/commonjs/web.js +12 -12
  135. package/lib/commonjs/web.js.map +1 -1
  136. package/lib/module/core/AuthManager.js +399 -0
  137. package/lib/module/core/AuthManager.js.map +1 -0
  138. package/lib/module/core/HttpService.js +39 -1
  139. package/lib/module/core/HttpService.js.map +1 -1
  140. package/lib/module/core/index.js +2 -0
  141. package/lib/module/core/index.js.map +1 -1
  142. package/lib/module/core/mixins/OxyServices.fedcm.js +38 -44
  143. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
  144. package/lib/module/core/mixins/OxyServices.popup.js +9 -7
  145. package/lib/module/core/mixins/OxyServices.popup.js.map +1 -1
  146. package/lib/module/crypto/keyManager.js +16 -21
  147. package/lib/module/crypto/keyManager.js.map +1 -1
  148. package/lib/module/index.js +34 -3
  149. package/lib/module/index.js.map +1 -1
  150. package/lib/module/lib/sonner.js +11 -16
  151. package/lib/module/lib/sonner.js.map +1 -1
  152. package/lib/module/lib/sonner.native.js +19 -0
  153. package/lib/module/lib/sonner.native.js.map +1 -0
  154. package/lib/module/lib/sonner.web.js +19 -0
  155. package/lib/module/lib/sonner.web.js.map +1 -0
  156. package/lib/module/shared/index.js +37 -0
  157. package/lib/module/shared/index.js.map +1 -0
  158. package/lib/module/shared/utils/colorUtils.js +150 -0
  159. package/lib/module/shared/utils/colorUtils.js.map +1 -0
  160. package/lib/module/shared/utils/debugUtils.js +75 -0
  161. package/lib/module/shared/utils/debugUtils.js.map +1 -0
  162. package/lib/module/shared/utils/errorUtils.js +176 -0
  163. package/lib/module/shared/utils/errorUtils.js.map +1 -0
  164. package/lib/module/shared/utils/index.js +21 -0
  165. package/lib/module/shared/utils/index.js.map +1 -0
  166. package/lib/module/shared/utils/networkUtils.js +202 -0
  167. package/lib/module/shared/utils/networkUtils.js.map +1 -0
  168. package/lib/module/shared/utils/themeUtils.js +109 -0
  169. package/lib/module/shared/utils/themeUtils.js.map +1 -0
  170. package/lib/module/ui/client.js +1 -1
  171. package/lib/module/ui/client.js.map +1 -1
  172. package/lib/module/ui/components/BottomSheetRouter.js +1 -1
  173. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  174. package/lib/module/ui/components/FollowButton.js +1 -1
  175. package/lib/module/ui/components/FollowButton.js.map +1 -1
  176. package/lib/module/ui/components/FontLoader.js +1 -1
  177. package/lib/module/ui/components/FontLoader.js.map +1 -1
  178. package/lib/module/ui/components/GroupedItem.js +1 -1
  179. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  180. package/lib/module/ui/components/Header.js +1 -1
  181. package/lib/module/ui/components/Header.js.map +1 -1
  182. package/lib/module/ui/components/OxyProvider.js +10 -2
  183. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  184. package/lib/module/ui/components/OxySignInButton.js +20 -21
  185. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  186. package/lib/module/ui/components/ProfileCard.js +1 -1
  187. package/lib/module/ui/components/ProfileCard.js.map +1 -1
  188. package/lib/module/ui/components/QuickActions.js +1 -1
  189. package/lib/module/ui/components/QuickActions.js.map +1 -1
  190. package/lib/module/ui/components/Section.js +1 -1
  191. package/lib/module/ui/components/Section.js.map +1 -1
  192. package/lib/module/ui/components/SectionTitle.js +1 -1
  193. package/lib/module/ui/components/SectionTitle.js.map +1 -1
  194. package/lib/module/ui/components/SignInModal.js +536 -0
  195. package/lib/module/ui/components/SignInModal.js.map +1 -0
  196. package/lib/module/ui/components/payment/PaymentDetailsStep.js +1 -1
  197. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -1
  198. package/lib/module/ui/context/OxyContext.js +2 -2
  199. package/lib/module/ui/context/OxyContext.js.map +1 -1
  200. package/lib/module/ui/hooks/mutations/mutationFactory.js +1 -1
  201. package/lib/module/ui/hooks/mutations/mutationFactory.js.map +1 -1
  202. package/lib/module/ui/hooks/mutations/useAccountMutations.js +1 -1
  203. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  204. package/lib/module/ui/hooks/mutations/useServicesMutations.js +1 -1
  205. package/lib/module/ui/hooks/mutations/useServicesMutations.js.map +1 -1
  206. package/lib/module/ui/hooks/useAsyncAction.js +1 -1
  207. package/lib/module/ui/hooks/useAsyncAction.js.map +1 -1
  208. package/lib/module/ui/hooks/{use-color-scheme.js → useColorScheme.js} +1 -1
  209. package/lib/module/ui/hooks/useColorScheme.js.map +1 -0
  210. package/lib/module/ui/hooks/useSessionSocket.js +7 -13
  211. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  212. package/lib/module/ui/hooks/useSettingToggle.js +1 -1
  213. package/lib/module/ui/hooks/useSettingToggle.js.map +1 -1
  214. package/lib/module/ui/hooks/useThemeColors.js +1 -1
  215. package/lib/module/ui/hooks/useThemeColors.js.map +1 -1
  216. package/lib/module/ui/hooks/useThemeStyles.js +1 -1
  217. package/lib/module/ui/hooks/useThemeStyles.js.map +1 -1
  218. package/lib/module/ui/navigation/bottomSheetManager.js +5 -2
  219. package/lib/module/ui/navigation/bottomSheetManager.js.map +1 -1
  220. package/lib/module/ui/navigation/routes.js +7 -8
  221. package/lib/module/ui/navigation/routes.js.map +1 -1
  222. package/lib/module/ui/screens/AccountCenterScreen.js +8 -8
  223. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  224. package/lib/module/ui/screens/AccountOverviewScreen.js +7 -7
  225. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  226. package/lib/module/ui/screens/AccountSettingsScreen.js +3 -3
  227. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  228. package/lib/module/ui/screens/AccountSwitcherScreen.js +5 -5
  229. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  230. package/lib/module/ui/screens/AccountVerificationScreen.js +1 -1
  231. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  232. package/lib/module/ui/screens/AppInfoScreen.js +2 -2
  233. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  234. package/lib/module/ui/screens/EditProfileFieldScreen.js +2 -2
  235. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  236. package/lib/module/ui/screens/FAQScreen.js +1 -1
  237. package/lib/module/ui/screens/FAQScreen.js.map +1 -1
  238. package/lib/module/ui/screens/FeedbackScreen.js +1 -1
  239. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  240. package/lib/module/ui/screens/FileManagementScreen.js +2 -2
  241. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  242. package/lib/module/ui/screens/FollowersListScreen.js +13 -0
  243. package/lib/module/ui/screens/FollowersListScreen.js.map +1 -0
  244. package/lib/module/ui/screens/FollowingListScreen.js +13 -0
  245. package/lib/module/ui/screens/FollowingListScreen.js.map +1 -0
  246. package/lib/module/ui/screens/HelpSupportScreen.js +2 -2
  247. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  248. package/lib/module/ui/screens/HistoryViewScreen.js +2 -2
  249. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  250. package/lib/module/ui/screens/LanguageSelectorScreen.js +2 -2
  251. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  252. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +224 -0
  253. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -0
  254. package/lib/module/ui/screens/LegalDocumentsScreen.js +2 -2
  255. package/lib/module/ui/screens/LegalDocumentsScreen.js.map +1 -1
  256. package/lib/module/ui/screens/OxyAuthScreen.js +9 -21
  257. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  258. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +2 -2
  259. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  260. package/lib/module/ui/screens/PrivacySettingsScreen.js +1 -1
  261. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  262. package/lib/module/ui/screens/ProfileScreen.js +1 -1
  263. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  264. package/lib/module/ui/screens/SavesCollectionsScreen.js +2 -2
  265. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  266. package/lib/module/ui/screens/SessionManagementScreen.js +1 -1
  267. package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
  268. package/lib/module/ui/screens/UserListScreen.js +405 -0
  269. package/lib/module/ui/screens/UserListScreen.js.map +1 -0
  270. package/lib/module/ui/screens/WelcomeNewUserScreen.js +1 -1
  271. package/lib/module/ui/screens/WelcomeNewUserScreen.js.map +1 -1
  272. package/lib/module/ui/screens/karma/KarmaAboutScreen.js +1 -1
  273. package/lib/module/ui/screens/karma/KarmaAboutScreen.js.map +1 -1
  274. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +1 -1
  275. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  276. package/lib/module/ui/screens/karma/KarmaFAQScreen.js +1 -1
  277. package/lib/module/ui/screens/karma/KarmaFAQScreen.js.map +1 -1
  278. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js +1 -1
  279. package/lib/module/ui/screens/karma/KarmaLeaderboardScreen.js.map +1 -1
  280. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js +1 -1
  281. package/lib/module/ui/screens/karma/KarmaRewardsScreen.js.map +1 -1
  282. package/lib/module/ui/screens/karma/KarmaRulesScreen.js +1 -1
  283. package/lib/module/ui/screens/karma/KarmaRulesScreen.js.map +1 -1
  284. package/lib/module/ui/stores/authStore.js +4 -6
  285. package/lib/module/ui/stores/authStore.js.map +1 -1
  286. package/lib/module/ui/utils/colorUtils.js +7 -40
  287. package/lib/module/ui/utils/colorUtils.js.map +1 -1
  288. package/lib/module/ui/utils/fileManagement.js +1 -1
  289. package/lib/module/ui/utils/fileManagement.js.map +1 -1
  290. package/lib/module/ui/utils/themeUtils.js +7 -35
  291. package/lib/module/ui/utils/themeUtils.js.map +1 -1
  292. package/lib/module/ui/utils/{user-utils.js → userUtils.js} +1 -1
  293. package/lib/module/ui/utils/userUtils.js.map +1 -0
  294. package/lib/module/utils/errorUtils.js +0 -7
  295. package/lib/module/utils/errorUtils.js.map +1 -1
  296. package/lib/module/utils/hookUtils.js +8 -8
  297. package/lib/module/utils/hookUtils.js.map +1 -1
  298. package/lib/module/utils/platform.js +118 -0
  299. package/lib/module/utils/platform.js.map +1 -0
  300. package/lib/module/web/WebOxyContext.js +272 -41
  301. package/lib/module/web/WebOxyContext.js.map +1 -1
  302. package/lib/module/web/index.js +26 -5
  303. package/lib/module/web/index.js.map +1 -1
  304. package/lib/module/web.js +2 -1
  305. package/lib/module/web.js.map +1 -1
  306. package/lib/typescript/commonjs/core/AuthManager.d.ts +144 -0
  307. package/lib/typescript/commonjs/core/AuthManager.d.ts.map +1 -0
  308. package/lib/typescript/commonjs/core/HttpService.d.ts.map +1 -1
  309. package/lib/typescript/commonjs/core/index.d.ts +2 -0
  310. package/lib/typescript/commonjs/core/index.d.ts.map +1 -1
  311. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  312. package/lib/typescript/commonjs/core/mixins/OxyServices.popup.d.ts.map +1 -1
  313. package/lib/typescript/commonjs/crypto/keyManager.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/index.d.ts +16 -2
  315. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  316. package/lib/typescript/commonjs/lib/sonner.d.ts +11 -14
  317. package/lib/typescript/commonjs/lib/sonner.d.ts.map +1 -1
  318. package/lib/typescript/commonjs/lib/sonner.native.d.ts +15 -0
  319. package/lib/typescript/commonjs/lib/sonner.native.d.ts.map +1 -0
  320. package/lib/typescript/commonjs/lib/sonner.web.d.ts +15 -0
  321. package/lib/typescript/commonjs/lib/sonner.web.d.ts.map +1 -0
  322. package/lib/typescript/commonjs/models/session.d.ts +4 -0
  323. package/lib/typescript/commonjs/models/session.d.ts.map +1 -1
  324. package/lib/typescript/commonjs/shared/index.d.ts +29 -0
  325. package/lib/typescript/commonjs/shared/index.d.ts.map +1 -0
  326. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts +105 -0
  327. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts.map +1 -0
  328. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts +49 -0
  329. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts.map +1 -0
  330. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts +98 -0
  331. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts.map +1 -0
  332. package/lib/typescript/commonjs/shared/utils/index.d.ts +14 -0
  333. package/lib/typescript/commonjs/shared/utils/index.d.ts.map +1 -0
  334. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts +140 -0
  335. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts.map +1 -0
  336. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts +91 -0
  337. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts.map +1 -0
  338. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts +1 -1
  339. package/lib/typescript/commonjs/ui/components/FontLoader.d.ts.map +1 -1
  340. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  341. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  342. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts +18 -0
  343. package/lib/typescript/commonjs/ui/components/SignInModal.d.ts.map +1 -0
  344. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +1 -2
  345. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  346. package/lib/typescript/commonjs/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
  347. package/lib/typescript/commonjs/ui/hooks/useColorScheme.d.ts.map +1 -0
  348. package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +1 -1
  349. package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts +2 -0
  350. package/lib/typescript/commonjs/ui/navigation/bottomSheetManager.d.ts.map +1 -1
  351. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
  352. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  353. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts +9 -0
  354. package/lib/typescript/commonjs/ui/screens/FollowersListScreen.d.ts.map +1 -0
  355. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts +9 -0
  356. package/lib/typescript/commonjs/ui/screens/FollowingListScreen.d.ts.map +1 -0
  357. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
  358. package/lib/typescript/commonjs/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
  359. package/lib/typescript/commonjs/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  360. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts +11 -0
  361. package/lib/typescript/commonjs/ui/screens/UserListScreen.d.ts.map +1 -0
  362. package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
  363. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts +7 -11
  364. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts.map +1 -1
  365. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts +6 -19
  366. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts.map +1 -1
  367. package/lib/typescript/commonjs/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
  368. package/lib/typescript/commonjs/ui/utils/userUtils.d.ts.map +1 -0
  369. package/lib/typescript/commonjs/utils/errorUtils.d.ts +0 -6
  370. package/lib/typescript/commonjs/utils/errorUtils.d.ts.map +1 -1
  371. package/lib/typescript/commonjs/utils/platform.d.ts +41 -0
  372. package/lib/typescript/commonjs/utils/platform.d.ts.map +1 -0
  373. package/lib/typescript/commonjs/web/WebOxyContext.d.ts +117 -9
  374. package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +1 -1
  375. package/lib/typescript/commonjs/web/index.d.ts +19 -8
  376. package/lib/typescript/commonjs/web/index.d.ts.map +1 -1
  377. package/lib/typescript/commonjs/web.d.ts +2 -1
  378. package/lib/typescript/commonjs/web.d.ts.map +1 -1
  379. package/lib/typescript/module/core/AuthManager.d.ts +144 -0
  380. package/lib/typescript/module/core/AuthManager.d.ts.map +1 -0
  381. package/lib/typescript/module/core/HttpService.d.ts.map +1 -1
  382. package/lib/typescript/module/core/index.d.ts +2 -0
  383. package/lib/typescript/module/core/index.d.ts.map +1 -1
  384. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  385. package/lib/typescript/module/core/mixins/OxyServices.popup.d.ts.map +1 -1
  386. package/lib/typescript/module/crypto/keyManager.d.ts.map +1 -1
  387. package/lib/typescript/module/index.d.ts +16 -2
  388. package/lib/typescript/module/index.d.ts.map +1 -1
  389. package/lib/typescript/module/lib/sonner.d.ts +11 -14
  390. package/lib/typescript/module/lib/sonner.d.ts.map +1 -1
  391. package/lib/typescript/module/lib/sonner.native.d.ts +15 -0
  392. package/lib/typescript/module/lib/sonner.native.d.ts.map +1 -0
  393. package/lib/typescript/module/lib/sonner.web.d.ts +15 -0
  394. package/lib/typescript/module/lib/sonner.web.d.ts.map +1 -0
  395. package/lib/typescript/module/models/session.d.ts +4 -0
  396. package/lib/typescript/module/models/session.d.ts.map +1 -1
  397. package/lib/typescript/module/shared/index.d.ts +29 -0
  398. package/lib/typescript/module/shared/index.d.ts.map +1 -0
  399. package/lib/typescript/module/shared/utils/colorUtils.d.ts +105 -0
  400. package/lib/typescript/module/shared/utils/colorUtils.d.ts.map +1 -0
  401. package/lib/typescript/module/shared/utils/debugUtils.d.ts +49 -0
  402. package/lib/typescript/module/shared/utils/debugUtils.d.ts.map +1 -0
  403. package/lib/typescript/module/shared/utils/errorUtils.d.ts +98 -0
  404. package/lib/typescript/module/shared/utils/errorUtils.d.ts.map +1 -0
  405. package/lib/typescript/module/shared/utils/index.d.ts +14 -0
  406. package/lib/typescript/module/shared/utils/index.d.ts.map +1 -0
  407. package/lib/typescript/module/shared/utils/networkUtils.d.ts +140 -0
  408. package/lib/typescript/module/shared/utils/networkUtils.d.ts.map +1 -0
  409. package/lib/typescript/module/shared/utils/themeUtils.d.ts +91 -0
  410. package/lib/typescript/module/shared/utils/themeUtils.d.ts.map +1 -0
  411. package/lib/typescript/module/ui/components/FontLoader.d.ts +1 -1
  412. package/lib/typescript/module/ui/components/FontLoader.d.ts.map +1 -1
  413. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  414. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  415. package/lib/typescript/module/ui/components/SignInModal.d.ts +18 -0
  416. package/lib/typescript/module/ui/components/SignInModal.d.ts.map +1 -0
  417. package/lib/typescript/module/ui/context/OxyContext.d.ts +1 -2
  418. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  419. package/lib/typescript/module/ui/hooks/{use-color-scheme.d.ts → useColorScheme.d.ts} +1 -1
  420. package/lib/typescript/module/ui/hooks/useColorScheme.d.ts.map +1 -0
  421. package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +1 -1
  422. package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts +2 -0
  423. package/lib/typescript/module/ui/navigation/bottomSheetManager.d.ts.map +1 -1
  424. package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
  425. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  426. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts +9 -0
  427. package/lib/typescript/module/ui/screens/FollowersListScreen.d.ts.map +1 -0
  428. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts +9 -0
  429. package/lib/typescript/module/ui/screens/FollowingListScreen.d.ts.map +1 -0
  430. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts +5 -0
  431. package/lib/typescript/module/ui/screens/LearnMoreUsernamesScreen.d.ts.map +1 -0
  432. package/lib/typescript/module/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  433. package/lib/typescript/module/ui/screens/UserListScreen.d.ts +11 -0
  434. package/lib/typescript/module/ui/screens/UserListScreen.d.ts.map +1 -0
  435. package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
  436. package/lib/typescript/module/ui/utils/colorUtils.d.ts +7 -11
  437. package/lib/typescript/module/ui/utils/colorUtils.d.ts.map +1 -1
  438. package/lib/typescript/module/ui/utils/themeUtils.d.ts +6 -19
  439. package/lib/typescript/module/ui/utils/themeUtils.d.ts.map +1 -1
  440. package/lib/typescript/module/ui/utils/{user-utils.d.ts → userUtils.d.ts} +1 -1
  441. package/lib/typescript/module/ui/utils/userUtils.d.ts.map +1 -0
  442. package/lib/typescript/module/utils/errorUtils.d.ts +0 -6
  443. package/lib/typescript/module/utils/errorUtils.d.ts.map +1 -1
  444. package/lib/typescript/module/utils/platform.d.ts +41 -0
  445. package/lib/typescript/module/utils/platform.d.ts.map +1 -0
  446. package/lib/typescript/module/web/WebOxyContext.d.ts +117 -9
  447. package/lib/typescript/module/web/WebOxyContext.d.ts.map +1 -1
  448. package/lib/typescript/module/web/index.d.ts +19 -8
  449. package/lib/typescript/module/web/index.d.ts.map +1 -1
  450. package/lib/typescript/module/web.d.ts +2 -1
  451. package/lib/typescript/module/web.d.ts.map +1 -1
  452. package/package.json +8 -2
  453. package/src/core/AuthManager.ts +436 -0
  454. package/src/core/HttpService.ts +43 -1
  455. package/src/core/index.ts +4 -0
  456. package/src/core/mixins/OxyServices.fedcm.ts +37 -42
  457. package/src/core/mixins/OxyServices.popup.ts +10 -7
  458. package/src/crypto/keyManager.ts +16 -21
  459. package/src/index.ts +83 -12
  460. package/src/lib/sonner.native.ts +28 -0
  461. package/src/lib/sonner.ts +11 -28
  462. package/src/lib/sonner.web.ts +28 -0
  463. package/src/models/session.ts +4 -0
  464. package/src/shared/index.ts +82 -0
  465. package/src/shared/utils/colorUtils.ts +155 -0
  466. package/src/shared/utils/debugUtils.ts +73 -0
  467. package/src/shared/utils/errorUtils.ts +181 -0
  468. package/src/shared/utils/index.ts +59 -0
  469. package/src/shared/utils/networkUtils.ts +248 -0
  470. package/src/shared/utils/themeUtils.ts +115 -0
  471. package/src/ui/components/BottomSheetRouter.tsx +1 -1
  472. package/src/ui/components/FontLoader.tsx +1 -2
  473. package/src/ui/components/GroupedItem.tsx +1 -1
  474. package/src/ui/components/Header.tsx +1 -1
  475. package/src/ui/components/OxyProvider.tsx +10 -0
  476. package/src/ui/components/OxySignInButton.tsx +20 -22
  477. package/src/ui/components/ProfileCard.tsx +1 -1
  478. package/src/ui/components/QuickActions.tsx +1 -1
  479. package/src/ui/components/Section.tsx +1 -1
  480. package/src/ui/components/SectionTitle.tsx +1 -1
  481. package/src/ui/components/SignInModal.tsx +534 -0
  482. package/src/ui/context/OxyContext.tsx +1 -2
  483. package/src/ui/hooks/queries/queryKeys.ts +2 -2
  484. package/src/ui/hooks/useSessionSocket.ts +12 -17
  485. package/src/ui/hooks/useThemeColors.ts +1 -1
  486. package/src/ui/hooks/useThemeStyles.ts +1 -1
  487. package/src/ui/navigation/bottomSheetManager.ts +5 -1
  488. package/src/ui/navigation/routes.ts +8 -9
  489. package/src/ui/screens/AccountCenterScreen.tsx +7 -7
  490. package/src/ui/screens/AccountOverviewScreen.tsx +6 -6
  491. package/src/ui/screens/AccountSettingsScreen.tsx +2 -2
  492. package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
  493. package/src/ui/screens/AppInfoScreen.tsx +1 -1
  494. package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
  495. package/src/ui/screens/FileManagementScreen.tsx +1 -1
  496. package/src/ui/screens/FollowersListScreen.tsx +14 -0
  497. package/src/ui/screens/FollowingListScreen.tsx +14 -0
  498. package/src/ui/screens/HelpSupportScreen.tsx +1 -1
  499. package/src/ui/screens/HistoryViewScreen.tsx +1 -1
  500. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  501. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +231 -0
  502. package/src/ui/screens/LegalDocumentsScreen.tsx +1 -1
  503. package/src/ui/screens/OxyAuthScreen.tsx +10 -21
  504. package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
  505. package/src/ui/screens/ProfileScreen.tsx +1 -1
  506. package/src/ui/screens/SavesCollectionsScreen.tsx +1 -1
  507. package/src/ui/screens/UserListScreen.tsx +416 -0
  508. package/src/ui/screens/karma/KarmaAboutScreen.tsx +1 -1
  509. package/src/ui/screens/karma/KarmaCenterScreen.tsx +1 -1
  510. package/src/ui/screens/karma/KarmaFAQScreen.tsx +1 -1
  511. package/src/ui/screens/karma/KarmaLeaderboardScreen.tsx +1 -1
  512. package/src/ui/screens/karma/KarmaRewardsScreen.tsx +1 -1
  513. package/src/ui/screens/karma/KarmaRulesScreen.tsx +1 -1
  514. package/src/ui/stores/authStore.ts +5 -6
  515. package/src/ui/utils/colorUtils.ts +15 -43
  516. package/src/ui/utils/themeUtils.ts +14 -39
  517. package/src/utils/errorUtils.ts +1 -6
  518. package/src/utils/hookUtils.ts +8 -8
  519. package/src/utils/platform.ts +117 -0
  520. package/src/web/WebOxyContext.tsx +331 -41
  521. package/src/web/index.ts +76 -6
  522. package/src/web.ts +1 -1
  523. package/lib/commonjs/ui/hooks/use-color-scheme.js.map +0 -1
  524. package/lib/commonjs/ui/utils/user-utils.js.map +0 -1
  525. package/lib/module/ui/hooks/use-color-scheme.js.map +0 -1
  526. package/lib/module/ui/utils/user-utils.js.map +0 -1
  527. package/lib/typescript/commonjs/ui/hooks/use-color-scheme.d.ts.map +0 -1
  528. package/lib/typescript/commonjs/ui/utils/user-utils.d.ts.map +0 -1
  529. package/lib/typescript/module/ui/hooks/use-color-scheme.d.ts.map +0 -1
  530. package/lib/typescript/module/ui/utils/user-utils.d.ts.map +0 -1
  531. /package/src/ui/hooks/{use-color-scheme.ts → useColorScheme.ts} +0 -0
  532. /package/src/ui/utils/{user-utils.ts → userUtils.ts} +0 -0
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Network Utility Functions
3
+ *
4
+ * Consolidated network utilities including circuit breaker pattern
5
+ * and exponential backoff for resilient API calls.
6
+ *
7
+ * @module shared/utils/networkUtils
8
+ */
9
+
10
+ /**
11
+ * State for circuit breaker pattern.
12
+ */
13
+ export interface CircuitBreakerState {
14
+ /** Number of consecutive failures */
15
+ consecutiveFailures: number;
16
+ /** Current interval between retries (ms) */
17
+ currentInterval: number;
18
+ /** Base interval for retries (ms) */
19
+ baseInterval: number;
20
+ /** Maximum interval cap (ms) */
21
+ maxInterval: number;
22
+ /** Number of failures before circuit opens */
23
+ maxFailures: number;
24
+ /** Whether the circuit is currently open (blocking requests) */
25
+ isOpen?: boolean;
26
+ /** Timestamp when circuit was opened */
27
+ openedAt?: number;
28
+ }
29
+
30
+ /**
31
+ * Configuration for circuit breaker.
32
+ */
33
+ export interface CircuitBreakerConfig {
34
+ /** Base interval between retries in milliseconds. Default: 10000 (10s) */
35
+ baseInterval?: number;
36
+ /** Maximum interval cap in milliseconds. Default: 60000 (60s) */
37
+ maxInterval?: number;
38
+ /** Number of consecutive failures before opening circuit. Default: 5 */
39
+ maxFailures?: number;
40
+ /** Time to wait before attempting recovery in milliseconds. Default: 30000 (30s) */
41
+ recoveryTimeout?: number;
42
+ }
43
+
44
+ /**
45
+ * Default circuit breaker configuration.
46
+ */
47
+ export const DEFAULT_CIRCUIT_BREAKER_CONFIG: Required<CircuitBreakerConfig> = {
48
+ baseInterval: 10000,
49
+ maxInterval: 60000,
50
+ maxFailures: 5,
51
+ recoveryTimeout: 30000,
52
+ };
53
+
54
+ /**
55
+ * Creates initial circuit breaker state.
56
+ *
57
+ * @param config - Optional custom configuration
58
+ * @returns Initial circuit breaker state
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * const state = createCircuitBreakerState({ maxFailures: 3 });
63
+ * ```
64
+ */
65
+ export const createCircuitBreakerState = (
66
+ config: CircuitBreakerConfig = {}
67
+ ): CircuitBreakerState => {
68
+ const { baseInterval, maxInterval, maxFailures } = {
69
+ ...DEFAULT_CIRCUIT_BREAKER_CONFIG,
70
+ ...config,
71
+ };
72
+
73
+ return {
74
+ consecutiveFailures: 0,
75
+ currentInterval: baseInterval,
76
+ baseInterval,
77
+ maxInterval,
78
+ maxFailures,
79
+ isOpen: false,
80
+ };
81
+ };
82
+
83
+ /**
84
+ * Calculates next interval using exponential backoff.
85
+ *
86
+ * @param state - Current circuit breaker state
87
+ * @returns Next interval in milliseconds
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * const nextInterval = calculateBackoffInterval(state);
92
+ * await delay(nextInterval);
93
+ * ```
94
+ */
95
+ export const calculateBackoffInterval = (state: CircuitBreakerState): number => {
96
+ const { consecutiveFailures, baseInterval, maxInterval } = state;
97
+
98
+ if (consecutiveFailures === 0) return baseInterval;
99
+
100
+ const backoffMultiplier = Math.min(
101
+ Math.pow(2, consecutiveFailures - 1),
102
+ maxInterval / baseInterval
103
+ );
104
+
105
+ return Math.min(baseInterval * backoffMultiplier, maxInterval);
106
+ };
107
+
108
+ /**
109
+ * Records a failure and updates circuit breaker state.
110
+ *
111
+ * @param state - Current circuit breaker state
112
+ * @returns Updated state after recording failure
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * try {
117
+ * await apiCall();
118
+ * state = recordSuccess(state);
119
+ * } catch (error) {
120
+ * state = recordFailure(state);
121
+ * }
122
+ * ```
123
+ */
124
+ export const recordFailure = (state: CircuitBreakerState): CircuitBreakerState => {
125
+ const newFailures = state.consecutiveFailures + 1;
126
+ const newInterval = calculateBackoffInterval({
127
+ ...state,
128
+ consecutiveFailures: newFailures,
129
+ });
130
+
131
+ const shouldOpenCircuit = newFailures >= state.maxFailures;
132
+ const finalInterval = shouldOpenCircuit ? state.maxInterval : newInterval;
133
+
134
+ return {
135
+ ...state,
136
+ consecutiveFailures: newFailures,
137
+ currentInterval: finalInterval,
138
+ isOpen: shouldOpenCircuit,
139
+ openedAt: shouldOpenCircuit ? Date.now() : state.openedAt,
140
+ };
141
+ };
142
+
143
+ /**
144
+ * Records a success and resets circuit breaker state.
145
+ *
146
+ * @param state - Current circuit breaker state
147
+ * @returns Reset state after successful request
148
+ */
149
+ export const recordSuccess = (state: CircuitBreakerState): CircuitBreakerState => {
150
+ return {
151
+ ...state,
152
+ consecutiveFailures: 0,
153
+ currentInterval: state.baseInterval,
154
+ isOpen: false,
155
+ openedAt: undefined,
156
+ };
157
+ };
158
+
159
+ /**
160
+ * Checks if the circuit breaker should allow a request.
161
+ *
162
+ * When the circuit is open, it will only allow requests after
163
+ * the recovery timeout has passed (half-open state).
164
+ *
165
+ * @param state - Current circuit breaker state
166
+ * @param recoveryTimeout - Time to wait before allowing recovery attempts
167
+ * @returns true if request should be allowed
168
+ */
169
+ export const shouldAllowRequest = (
170
+ state: CircuitBreakerState,
171
+ recoveryTimeout: number = DEFAULT_CIRCUIT_BREAKER_CONFIG.recoveryTimeout
172
+ ): boolean => {
173
+ if (!state.isOpen) return true;
174
+
175
+ if (!state.openedAt) return true;
176
+
177
+ const timeSinceOpen = Date.now() - state.openedAt;
178
+ return timeSinceOpen >= recoveryTimeout;
179
+ };
180
+
181
+ /**
182
+ * Delays execution for a specified duration.
183
+ *
184
+ * @param ms - Milliseconds to delay
185
+ * @returns Promise that resolves after the delay
186
+ *
187
+ * @example
188
+ * ```ts
189
+ * await delay(1000); // Wait 1 second
190
+ * ```
191
+ */
192
+ export const delay = (ms: number): Promise<void> =>
193
+ new Promise(resolve => setTimeout(resolve, ms));
194
+
195
+ /**
196
+ * Executes a function with exponential backoff retry.
197
+ *
198
+ * @param fn - Async function to execute
199
+ * @param options - Retry options
200
+ * @returns Result of the function
201
+ * @throws Last error if all retries fail
202
+ *
203
+ * @example
204
+ * ```ts
205
+ * const result = await withRetry(
206
+ * () => fetchData(),
207
+ * { maxRetries: 3, baseDelay: 1000 }
208
+ * );
209
+ * ```
210
+ */
211
+ export const withRetry = async <T>(
212
+ fn: () => Promise<T>,
213
+ options: {
214
+ maxRetries?: number;
215
+ baseDelay?: number;
216
+ maxDelay?: number;
217
+ shouldRetry?: (error: unknown) => boolean;
218
+ onRetry?: (error: unknown, attempt: number) => void;
219
+ } = {}
220
+ ): Promise<T> => {
221
+ const {
222
+ maxRetries = 3,
223
+ baseDelay = 1000,
224
+ maxDelay = 30000,
225
+ shouldRetry = () => true,
226
+ onRetry,
227
+ } = options;
228
+
229
+ let lastError: unknown;
230
+
231
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
232
+ try {
233
+ return await fn();
234
+ } catch (error) {
235
+ lastError = error;
236
+
237
+ if (attempt === maxRetries || !shouldRetry(error)) {
238
+ throw error;
239
+ }
240
+
241
+ const delayMs = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
242
+ onRetry?.(error, attempt + 1);
243
+ await delay(delayMs);
244
+ }
245
+ }
246
+
247
+ throw lastError;
248
+ };
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Theme Utility Functions
3
+ *
4
+ * Consolidated theme utilities for normalizing and handling color schemes
5
+ * across the OxyServices ecosystem.
6
+ *
7
+ * @module shared/utils/themeUtils
8
+ */
9
+
10
+ /**
11
+ * Valid theme values in the Oxy ecosystem.
12
+ */
13
+ export type ThemeValue = 'light' | 'dark';
14
+
15
+ /**
16
+ * Normalizes a theme value to ensure it's always 'light' or 'dark'.
17
+ *
18
+ * @param theme - Theme value (may be 'light' | 'dark' | string | undefined)
19
+ * @returns Normalized 'light' | 'dark' theme (defaults to 'light')
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * normalizeTheme('dark'); // 'dark'
24
+ * normalizeTheme('light'); // 'light'
25
+ * normalizeTheme('unknown'); // 'light'
26
+ * normalizeTheme(undefined); // 'light'
27
+ * normalizeTheme(null); // 'light'
28
+ * ```
29
+ */
30
+ export const normalizeTheme = (theme?: string | null): ThemeValue =>
31
+ theme === 'light' || theme === 'dark' ? theme : 'light';
32
+
33
+ /**
34
+ * Normalizes a color scheme value with optional fallback chain.
35
+ *
36
+ * Handles null/undefined cases from React Native's useColorScheme() hook
37
+ * with a proper fallback chain.
38
+ *
39
+ * @param colorScheme - The color scheme from useColorScheme() hook (may be null/undefined)
40
+ * @param theme - Optional theme prop as fallback
41
+ * @returns Normalized 'light' | 'dark' color scheme
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * // In a React Native component:
46
+ * const systemScheme = useColorScheme(); // might be null
47
+ * const colorScheme = normalizeColorScheme(systemScheme, props.theme);
48
+ *
49
+ * normalizeColorScheme('dark', 'light'); // 'dark'
50
+ * normalizeColorScheme(null, 'dark'); // 'dark'
51
+ * normalizeColorScheme(undefined, undefined); // 'light'
52
+ * ```
53
+ */
54
+ export const normalizeColorScheme = (
55
+ colorScheme?: string | null,
56
+ theme?: string
57
+ ): ThemeValue => {
58
+ if (colorScheme === 'light' || colorScheme === 'dark') {
59
+ return colorScheme;
60
+ }
61
+
62
+ if (theme === 'light' || theme === 'dark') {
63
+ return theme;
64
+ }
65
+
66
+ return 'light';
67
+ };
68
+
69
+ /**
70
+ * Gets the opposite theme value.
71
+ *
72
+ * @param theme - Current theme value
73
+ * @returns The opposite theme ('light' → 'dark', 'dark' → 'light')
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * getOppositeTheme('light'); // 'dark'
78
+ * getOppositeTheme('dark'); // 'light'
79
+ * ```
80
+ */
81
+ export const getOppositeTheme = (theme: ThemeValue): ThemeValue =>
82
+ theme === 'light' ? 'dark' : 'light';
83
+
84
+ /**
85
+ * Checks if the system prefers dark mode.
86
+ *
87
+ * This function only works in browser environments.
88
+ * Returns false in non-browser environments (Node.js, React Native).
89
+ *
90
+ * @returns true if system prefers dark mode, false otherwise
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * if (systemPrefersDarkMode()) {
95
+ * setTheme('dark');
96
+ * }
97
+ * ```
98
+ */
99
+ export const systemPrefersDarkMode = (): boolean => {
100
+ if (typeof window === 'undefined') return false;
101
+ return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;
102
+ };
103
+
104
+ /**
105
+ * Gets the system's preferred color scheme.
106
+ *
107
+ * @returns 'dark' if system prefers dark mode, 'light' otherwise
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * const theme = getSystemColorScheme();
112
+ * ```
113
+ */
114
+ export const getSystemColorScheme = (): ThemeValue =>
115
+ systemPrefersDarkMode() ? 'dark' : 'light';
@@ -4,7 +4,7 @@ import { useStore } from 'zustand';
4
4
  import type { RouteName } from '../navigation/routes';
5
5
  import { getScreenComponent, isValidRoute } from '../navigation/routes';
6
6
  import type { BaseScreenProps } from '../types/navigation';
7
- import { useColorScheme } from '../hooks/use-color-scheme';
7
+ import { useColorScheme } from '../hooks/useColorScheme';
8
8
  import { Colors } from '../constants/theme';
9
9
  import BottomSheet, { type BottomSheetRef } from './BottomSheet';
10
10
  import {
@@ -1,5 +1,4 @@
1
- import type React from 'react';
2
- import { useState, useEffect } from 'react';
1
+ import React, { useState, useEffect } from 'react';
3
2
  import { Platform } from 'react-native';
4
3
  import * as Font from 'expo-font';
5
4
 
@@ -3,7 +3,7 @@ import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
3
3
  import { Ionicons } from '@expo/vector-icons';
4
4
  // @ts-ignore - MaterialCommunityIcons is available at runtime
5
5
  import { MaterialCommunityIcons } from '@expo/vector-icons';
6
- import { useColorScheme } from '../hooks/use-color-scheme';
6
+ import { useColorScheme } from '../hooks/useColorScheme';
7
7
  import { darkenColor } from '../utils/colorUtils';
8
8
  import { normalizeColorScheme } from '../utils/themeUtils';
9
9
  import { Colors } from '../constants/theme';
@@ -14,7 +14,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
14
14
  import { Ionicons } from '@expo/vector-icons';
15
15
  import OxyIcon from './icon/OxyIcon';
16
16
  import { fontFamilies } from '../styles/fonts';
17
- import { useColorScheme } from '../hooks/use-color-scheme';
17
+ import { useColorScheme } from '../hooks/useColorScheme';
18
18
  import { normalizeColorScheme } from '../utils/themeUtils';
19
19
  import { Colors } from '../constants/theme';
20
20
 
@@ -19,6 +19,7 @@ const isWeb = Platform.OS === 'web';
19
19
  // Conditionally import components
20
20
  let KeyboardProvider: any = ({ children }: any) => children;
21
21
  let BottomSheetRouter: any = null;
22
+ let SignInModal: any = null;
22
23
 
23
24
  // KeyboardProvider only on native
24
25
  if (!isWeb) {
@@ -36,6 +37,13 @@ try {
36
37
  // BottomSheetRouter not available
37
38
  }
38
39
 
40
+ // SignInModal works on all platforms
41
+ try {
42
+ SignInModal = require('./SignInModal').default;
43
+ } catch {
44
+ // SignInModal not available
45
+ }
46
+
39
47
  /**
40
48
  * OxyProvider - Universal provider for Expo apps (native + web)
41
49
  *
@@ -206,6 +214,8 @@ const OxyProvider: FC<OxyProviderProps> = ({
206
214
  {children}
207
215
  {/* Only render bottom sheet router on native */}
208
216
  {BottomSheetRouter && <BottomSheetRouter />}
217
+ {/* Sign-in modal for all platforms */}
218
+ {SignInModal && <SignInModal />}
209
219
  <Toaster />
210
220
  </OxyContextProvider>
211
221
  </QueryClientProvider>
@@ -1,9 +1,10 @@
1
1
  import type React from 'react';
2
- import { useState } from 'react';
2
+ import { useCallback, useState, useEffect } from 'react';
3
3
  import { TouchableOpacity, Text, View, StyleSheet, type ViewStyle, type TextStyle, type StyleProp, Platform } from 'react-native';
4
4
  import { useAuth } from '../hooks/useAuth';
5
5
  import { fontFamilies } from '../styles/fonts';
6
6
  import OxyLogo from './OxyLogo';
7
+ import { showSignInModal, subscribeToSignInModal } from './SignInModal';
7
8
 
8
9
  export interface OxySignInButtonProps {
9
10
  /**
@@ -81,36 +82,33 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
81
82
  disabled = false,
82
83
  showWhenAuthenticated = false,
83
84
  }) => {
84
- const { isAuthenticated, signIn, isLoading } = useAuth();
85
- const [isSigningIn, setIsSigningIn] = useState(false);
85
+ const { isAuthenticated, isLoading } = useAuth();
86
+ const [isModalOpen, setIsModalOpen] = useState(false);
87
+
88
+ // Subscribe to modal close events
89
+ useEffect(() => {
90
+ return subscribeToSignInModal(setIsModalOpen);
91
+ }, []);
86
92
 
87
93
  // Don't show the button if already authenticated (unless explicitly overridden)
88
94
  if (isAuthenticated && !showWhenAuthenticated) return null;
89
95
 
90
- // Default handler that uses useAuth's signIn method
91
- // This works for both web (popup) and native (bottom sheet)
92
- const handlePress = async () => {
96
+ // Handle button press - opens full-screen sign-in modal with QR code and auth options
97
+ const handlePress = useCallback(() => {
93
98
  if (onPress) {
94
99
  onPress();
95
100
  return;
96
101
  }
97
102
 
98
- if (isSigningIn) return;
99
-
100
- setIsSigningIn(true);
101
- try {
102
- await signIn();
103
- } catch (error) {
104
- // Sign-in handled by the auth flow
105
- if (__DEV__) {
106
- console.log('OxySignInButton: Sign-in flow initiated', error);
107
- }
108
- } finally {
109
- setIsSigningIn(false);
110
- }
111
- };
103
+ // Set state immediately before showing modal
104
+ console.log('[OxySignInButton] Setting isModalOpen to true');
105
+ setIsModalOpen(true);
106
+ // Show the full-screen sign-in modal on all platforms
107
+ showSignInModal();
108
+ }, [onPress]);
112
109
 
113
- const isButtonDisabled = disabled || isLoading || isSigningIn;
110
+ console.log('[OxySignInButton] render - isModalOpen:', isModalOpen);
111
+ const isButtonDisabled = disabled || isLoading || isModalOpen;
114
112
 
115
113
  // Determine the button style based on the variant
116
114
  const getButtonStyle = () => {
@@ -151,7 +149,7 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
151
149
  style={isButtonDisabled ? { opacity: 0.6 } : undefined}
152
150
  />
153
151
  <Text style={[styles.text, getTextStyle(), isButtonDisabled && styles.textDisabled]}>
154
- {isSigningIn ? 'Signing in...' : text}
152
+ {isLoading || isModalOpen ? 'Signing in...' : text}
155
153
  </Text>
156
154
  </View>
157
155
  </TouchableOpacity>
@@ -7,7 +7,7 @@ import { useOxy } from '../context/OxyContext';
7
7
  import { useFileDownloadUrl } from '../hooks';
8
8
  import { fontFamilies } from '../styles/fonts';
9
9
  import { useThemeStyles } from '../hooks/useThemeStyles';
10
- import { useColorScheme } from '../hooks/use-color-scheme';
10
+ import { useColorScheme } from '../hooks/useColorScheme';
11
11
 
12
12
  interface ProfileCardProps {
13
13
  user: {
@@ -2,7 +2,7 @@ import type React from 'react';
2
2
  import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
3
3
  import { Ionicons } from '@expo/vector-icons';
4
4
  import { useThemeStyles } from '../hooks/useThemeStyles';
5
- import { useColorScheme } from '../hooks/use-color-scheme';
5
+ import { useColorScheme } from '../hooks/useColorScheme';
6
6
 
7
7
  interface QuickAction {
8
8
  id: string;
@@ -1,7 +1,7 @@
1
1
  import type React from 'react';
2
2
  import { View, StyleSheet, type StyleProp, type ViewStyle } from 'react-native';
3
3
  import SectionTitle from './SectionTitle';
4
- import { useColorScheme } from '../hooks/use-color-scheme';
4
+ import { useColorScheme } from '../hooks/useColorScheme';
5
5
  import { normalizeColorScheme } from '../utils/themeUtils';
6
6
 
7
7
  interface SectionProps {
@@ -1,7 +1,7 @@
1
1
  import type React from 'react';
2
2
  import { Text, StyleSheet, type StyleProp, type TextStyle } from 'react-native';
3
3
  import { fontFamilies } from '../styles/fonts';
4
- import { useColorScheme } from '../hooks/use-color-scheme';
4
+ import { useColorScheme } from '../hooks/useColorScheme';
5
5
  import { normalizeColorScheme } from '../utils/themeUtils';
6
6
  import { useThemeStyles } from '../hooks/useThemeStyles';
7
7