@oxyhq/services 6.9.43 → 6.9.44

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 (60) hide show
  1. package/lib/commonjs/index.js +9 -0
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/ui/components/ActingAsBanner.js +143 -0
  4. package/lib/commonjs/ui/components/ActingAsBanner.js.map +1 -0
  5. package/lib/commonjs/ui/context/OxyContext.js +78 -3
  6. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  7. package/lib/commonjs/ui/navigation/routes.js +3 -2
  8. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  9. package/lib/commonjs/ui/screens/AccountCenterScreen.js +21 -1
  10. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  11. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +235 -1
  12. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  13. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js +346 -0
  14. package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js.map +1 -0
  15. package/lib/module/index.js +3 -0
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/module/ui/components/ActingAsBanner.js +140 -0
  18. package/lib/module/ui/components/ActingAsBanner.js.map +1 -0
  19. package/lib/module/ui/context/OxyContext.js +78 -3
  20. package/lib/module/ui/context/OxyContext.js.map +1 -1
  21. package/lib/module/ui/navigation/routes.js +3 -2
  22. package/lib/module/ui/navigation/routes.js.map +1 -1
  23. package/lib/module/ui/screens/AccountCenterScreen.js +21 -1
  24. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  25. package/lib/module/ui/screens/AccountSwitcherScreen.js +235 -1
  26. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  27. package/lib/module/ui/screens/CreateManagedAccountScreen.js +342 -0
  28. package/lib/module/ui/screens/CreateManagedAccountScreen.js.map +1 -0
  29. package/lib/typescript/commonjs/index.d.ts +1 -0
  30. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  31. package/lib/typescript/commonjs/ui/components/ActingAsBanner.d.ts +4 -0
  32. package/lib/typescript/commonjs/ui/components/ActingAsBanner.d.ts.map +1 -0
  33. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +6 -0
  34. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
  36. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  37. package/lib/typescript/commonjs/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  38. package/lib/typescript/commonjs/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  39. package/lib/typescript/commonjs/ui/screens/CreateManagedAccountScreen.d.ts +5 -0
  40. package/lib/typescript/commonjs/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -0
  41. package/lib/typescript/module/index.d.ts +1 -0
  42. package/lib/typescript/module/index.d.ts.map +1 -1
  43. package/lib/typescript/module/ui/components/ActingAsBanner.d.ts +4 -0
  44. package/lib/typescript/module/ui/components/ActingAsBanner.d.ts.map +1 -0
  45. package/lib/typescript/module/ui/context/OxyContext.d.ts +6 -0
  46. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  47. package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
  48. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  49. package/lib/typescript/module/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  50. package/lib/typescript/module/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  51. package/lib/typescript/module/ui/screens/CreateManagedAccountScreen.d.ts +5 -0
  52. package/lib/typescript/module/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -0
  53. package/package.json +1 -1
  54. package/src/index.ts +3 -0
  55. package/src/ui/components/ActingAsBanner.tsx +135 -0
  56. package/src/ui/context/OxyContext.tsx +85 -0
  57. package/src/ui/navigation/routes.ts +3 -1
  58. package/src/ui/screens/AccountCenterScreen.tsx +21 -1
  59. package/src/ui/screens/AccountSwitcherScreen.tsx +209 -0
  60. package/src/ui/screens/CreateManagedAccountScreen.tsx +338 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGhF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,aAAa,EACb,SAAS,IAAI,cAAc,EAC3B,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EACL,cAAc,EAAE,eAAe,EAAE,cAAc,EAC/C,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAClD,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAC3C,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAClD,mBAAmB,EAAE,yBAAyB,GAC/C,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,gBAAgB,EAAE,eAAe,EAAE,wBAAwB,EAC3D,wBAAwB,EAAE,aAAa,EAAE,gBAAgB,EACzD,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,GACrE,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EAAE,qBAAqB,GAC7C,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,qBAAqB,EAAE,qBAAqB,GAC7C,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACL,eAAe,EAAE,qBAAqB,EACtC,uBAAuB,EAAE,mBAAmB,GAC7C,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG/E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACvF,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG/E,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGhF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,aAAa,EACb,SAAS,IAAI,cAAc,EAC3B,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EACL,cAAc,EAAE,eAAe,EAAE,cAAc,EAC/C,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAClD,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAC3C,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAClD,mBAAmB,EAAE,yBAAyB,GAC/C,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,gBAAgB,EAAE,eAAe,EAAE,wBAAwB,EAC3D,wBAAwB,EAAE,aAAa,EAAE,gBAAgB,EACzD,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,GACrE,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EAAE,qBAAqB,GAC7C,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,qBAAqB,EAAE,qBAAqB,GAC7C,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACL,eAAe,EAAE,qBAAqB,EACtC,uBAAuB,EAAE,mBAAmB,GAC7C,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG/E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAG7C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAG3E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACvF,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG/E,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ declare const _default: React.NamedExoticComponent<{}>;
3
+ export default _default;
4
+ //# sourceMappingURL=ActingAsBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActingAsBanner.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/ActingAsBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;;AAsIvC,wBAA0C"}
@@ -2,6 +2,7 @@ import type React from 'react';
2
2
  import { type ReactNode } from 'react';
3
3
  import { OxyServices } from '@oxyhq/core';
4
4
  import type { User, ApiError, SessionLoginResponse } from '@oxyhq/core';
5
+ import type { ManagedAccount, CreateManagedAccountInput } from '@oxyhq/core';
5
6
  import type { ClientSession } from '@oxyhq/core';
6
7
  import type { UseFollowHook } from '../hooks/useFollow.types';
7
8
  import { useLanguageManagement } from '../hooks/useLanguageManagement';
@@ -52,6 +53,11 @@ export interface OxyContextState {
52
53
  props?: Record<string, unknown>;
53
54
  }) => void;
54
55
  openAvatarPicker: () => void;
56
+ actingAs: string | null;
57
+ managedAccounts: ManagedAccount[];
58
+ setActingAs: (userId: string | null) => void;
59
+ refreshManagedAccounts: () => Promise<void>;
60
+ createManagedAccount: (data: CreateManagedAccountInput) => Promise<ManagedAccount>;
55
61
  }
56
62
  declare const OxyContext: React.Context<OxyContextState | null>;
57
63
  export interface OxyContextProviderProps {
@@ -1 +1 @@
1
- {"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAMvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAStD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC;IAGlC,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAG3C,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAElE;;;OAGG;IACH,kBAAkB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAGrE,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,iBAAiB,EAAE,MAAM,OAAO,CAC9B,KAAK,CAAC;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CACH,CAAC;IACF,uBAAuB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,GAAG;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/G,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,QAAA,MAAM,UAAU,uCAA8C,CAAC;AAE/D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CACrC;AAgCD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA0kBzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,mCAAc,CAAC;AAqC9C,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { ComponentType } from 'react';
2
2
  import type { BaseScreenProps } from '../types/navigation';
3
- export type RouteName = 'OxyAuth' | 'AccountOverview' | 'AccountSettings' | 'AccountCenter' | 'AccountSwitcher' | 'AccountVerification' | 'SessionManagement' | 'PaymentGateway' | 'Profile' | 'LanguageSelector' | 'PrivacySettings' | 'SearchSettings' | 'FileManagement' | 'HelpSupport' | 'FAQ' | 'Feedback' | 'LegalDocuments' | 'AppInfo' | 'PremiumSubscription' | 'WelcomeNewUser' | 'UserLinks' | 'HistoryView' | 'SavesCollections' | 'EditProfileField' | 'LearnMoreUsernames' | 'KarmaCenter' | 'KarmaLeaderboard' | 'KarmaRewards' | 'KarmaRules' | 'AboutKarma' | 'KarmaFAQ' | 'FollowersList' | 'FollowingList';
3
+ export type RouteName = 'OxyAuth' | 'AccountOverview' | 'AccountSettings' | 'AccountCenter' | 'AccountSwitcher' | 'AccountVerification' | 'SessionManagement' | 'PaymentGateway' | 'Profile' | 'LanguageSelector' | 'PrivacySettings' | 'SearchSettings' | 'FileManagement' | 'HelpSupport' | 'FAQ' | 'Feedback' | 'LegalDocuments' | 'AppInfo' | 'PremiumSubscription' | 'WelcomeNewUser' | 'UserLinks' | 'HistoryView' | 'SavesCollections' | 'EditProfileField' | 'LearnMoreUsernames' | 'KarmaCenter' | 'KarmaLeaderboard' | 'KarmaRewards' | 'KarmaRules' | 'AboutKarma' | 'KarmaFAQ' | 'FollowersList' | 'FollowingList' | 'CreateManagedAccount';
4
4
  export declare const getScreenComponent: (routeName: RouteName) => ComponentType<BaseScreenProps> | undefined;
5
5
  export declare const isValidRoute: (routeName: string) => routeName is RouteName;
6
6
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/navigation/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAO3D,MAAM,MAAM,SAAS,GACf,SAAS,GACT,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,qBAAqB,GACrB,mBAAmB,GACnB,gBAAgB,GAChB,SAAS,GACT,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,aAAa,GACb,KAAK,GACL,UAAU,GACV,gBAAgB,GAChB,SAAS,GACT,qBAAqB,GACrB,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,aAAa,GACb,kBAAkB,GAClB,cAAc,GACd,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,eAAe,GACf,eAAe,CAAC;AA+CtB,eAAO,MAAM,kBAAkB,GAAI,WAAW,SAAS,KAAG,aAAa,CAAC,eAAe,CAAC,GAAG,SAsB1F,CAAC;AAIF,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,KAAG,SAAS,IAAI,SAE7D,CAAC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/navigation/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAO3D,MAAM,MAAM,SAAS,GACf,SAAS,GACT,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,qBAAqB,GACrB,mBAAmB,GACnB,gBAAgB,GAChB,SAAS,GACT,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,aAAa,GACb,KAAK,GACL,UAAU,GACV,gBAAgB,GAChB,SAAS,GACT,qBAAqB,GACrB,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,aAAa,GACb,kBAAkB,GAClB,cAAc,GACd,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,eAAe,GACf,eAAe,GACf,sBAAsB,CAAC;AAgD7B,eAAO,MAAM,kBAAkB,GAAI,WAAW,SAAS,KAAG,aAAa,CAAC,eAAe,CAAC,GAAG,SAsB1F,CAAC;AAIF,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,KAAG,SAAS,IAAI,SAE7D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccountCenterScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/AccountCenterScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAkB3D,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAgNlD,CAAC;AA0BF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"AccountCenterScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/AccountCenterScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAkB3D,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAoOlD,CAAC;AA0BF,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccountSwitcherScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/AccountSwitcherScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA6B3D,QAAA,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA+gB1D,CAAC;AAmKF,eAAe,2BAA2B,CAAC"}
1
+ {"version":3,"file":"AccountSwitcherScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/AccountSwitcherScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA6B3D,QAAA,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA4rB1D,CAAC;AAuMF,eAAe,2BAA2B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type React from 'react';
2
+ import type { BaseScreenProps } from '../types/navigation';
3
+ declare const CreateManagedAccountScreen: React.FC<BaseScreenProps>;
4
+ export default CreateManagedAccountScreen;
5
+ //# sourceMappingURL=CreateManagedAccountScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateManagedAccountScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/CreateManagedAccountScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAc3D,QAAA,MAAM,0BAA0B,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAgOzD,CAAC;AAsFF,eAAe,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "6.9.43",
3
+ "version": "6.9.44",
4
4
  "description": "OxyHQ Expo/React Native SDK — UI components, screens, and native features",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
package/src/index.ts CHANGED
@@ -97,6 +97,9 @@ export type { AvatarProps } from './ui/components/Avatar';
97
97
  export { OxySignInButton } from './ui/components/OxySignInButton';
98
98
  export { OxyLogo, FollowButton } from './ui';
99
99
 
100
+ // Acting-as banner for managed accounts
101
+ export { default as ActingAsBanner } from './ui/components/ActingAsBanner';
102
+
100
103
  // Bottom sheet navigation
101
104
  export { showBottomSheet, closeBottomSheet } from './ui/navigation/bottomSheetManager';
102
105
  export type { RouteName } from './ui/navigation/routes';
@@ -0,0 +1,135 @@
1
+ import React, { useMemo } from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ TouchableOpacity,
6
+ StyleSheet,
7
+ Platform,
8
+ Image,
9
+ } from 'react-native';
10
+ import { fontFamilies } from '../styles/fonts';
11
+ import { useTheme } from '@oxyhq/bloom/theme';
12
+ import { useOxy } from '../context/OxyContext';
13
+
14
+ /**
15
+ * ActingAsBanner - Shows a subtle banner when the user is acting as a managed account.
16
+ *
17
+ * - Tap to open the AccountSwitcher screen.
18
+ * - Long-press to switch back to the primary account immediately.
19
+ *
20
+ * Place this component in your app's layout where you want the banner to appear
21
+ * (typically at the top of the screen or below the header).
22
+ */
23
+ const ActingAsBanner: React.FC = () => {
24
+ const bloomTheme = useTheme();
25
+ const { actingAs, managedAccounts, setActingAs, showBottomSheet, oxyServices } = useOxy();
26
+
27
+ const activeAccount = useMemo(() => {
28
+ if (!actingAs || !managedAccounts.length) return null;
29
+ const managed = managedAccounts.find((m) => m.accountId === actingAs);
30
+ return managed?.account ?? null;
31
+ }, [actingAs, managedAccounts]);
32
+
33
+ if (!actingAs || !activeAccount) {
34
+ return null;
35
+ }
36
+
37
+ const displayName =
38
+ typeof activeAccount.name === 'object'
39
+ ? activeAccount.name.full || activeAccount.name.first || activeAccount.username
40
+ : activeAccount.name || activeAccount.username;
41
+
42
+ const handlePress = () => {
43
+ showBottomSheet?.('AccountSwitcher');
44
+ };
45
+
46
+ const handleLongPress = () => {
47
+ setActingAs(null);
48
+ };
49
+
50
+ return (
51
+ <TouchableOpacity
52
+ style={[styles.container, { backgroundColor: bloomTheme.colors.primary + '14' }]}
53
+ onPress={handlePress}
54
+ onLongPress={handleLongPress}
55
+ activeOpacity={0.7}
56
+ accessibilityRole="button"
57
+ accessibilityLabel={`Acting as ${displayName}. Tap to switch accounts, long press to switch back.`}
58
+ >
59
+ <View style={styles.content}>
60
+ {activeAccount.avatar ? (
61
+ <Image
62
+ source={{ uri: oxyServices.getFileDownloadUrl(activeAccount.avatar, 'thumb') }}
63
+ style={styles.avatar}
64
+ />
65
+ ) : (
66
+ <View style={[styles.avatarFallback, { backgroundColor: bloomTheme.colors.primary + '30' }]}>
67
+ <Text style={[styles.avatarText, { color: bloomTheme.colors.primary }]}>
68
+ {displayName.charAt(0).toUpperCase()}
69
+ </Text>
70
+ </View>
71
+ )}
72
+ <View style={styles.textContainer}>
73
+ <Text style={[styles.label, { color: bloomTheme.colors.primary }]} numberOfLines={1}>
74
+ Acting as {displayName}
75
+ </Text>
76
+ </View>
77
+ <View style={[styles.switchBackHint, { borderColor: bloomTheme.colors.primary + '40' }]}>
78
+ <Text style={[styles.switchBackText, { color: bloomTheme.colors.primary }]}>
79
+ Switch back
80
+ </Text>
81
+ </View>
82
+ </View>
83
+ </TouchableOpacity>
84
+ );
85
+ };
86
+
87
+ const styles = StyleSheet.create({
88
+ container: {
89
+ paddingHorizontal: 16,
90
+ paddingVertical: 10,
91
+ },
92
+ content: {
93
+ flexDirection: 'row',
94
+ alignItems: 'center',
95
+ },
96
+ avatar: {
97
+ width: 24,
98
+ height: 24,
99
+ borderRadius: 12,
100
+ },
101
+ avatarFallback: {
102
+ width: 24,
103
+ height: 24,
104
+ borderRadius: 12,
105
+ alignItems: 'center',
106
+ justifyContent: 'center',
107
+ },
108
+ avatarText: {
109
+ fontSize: 12,
110
+ fontFamily: fontFamilies.interSemiBold,
111
+ fontWeight: Platform.OS === 'web' ? '600' : undefined,
112
+ },
113
+ textContainer: {
114
+ flex: 1,
115
+ marginLeft: 10,
116
+ },
117
+ label: {
118
+ fontSize: 14,
119
+ fontFamily: fontFamilies.interMedium,
120
+ fontWeight: Platform.OS === 'web' ? '500' : undefined,
121
+ },
122
+ switchBackHint: {
123
+ borderWidth: 1,
124
+ borderRadius: 12,
125
+ paddingHorizontal: 10,
126
+ paddingVertical: 4,
127
+ },
128
+ switchBackText: {
129
+ fontSize: 12,
130
+ fontFamily: fontFamilies.interMedium,
131
+ fontWeight: Platform.OS === 'web' ? '500' : undefined,
132
+ },
133
+ });
134
+
135
+ export default React.memo(ActingAsBanner);
@@ -11,6 +11,7 @@ import {
11
11
  } from 'react';
12
12
  import { OxyServices } from '@oxyhq/core';
13
13
  import type { User, ApiError, SessionLoginResponse } from '@oxyhq/core';
14
+ import type { ManagedAccount, CreateManagedAccountInput } from '@oxyhq/core';
14
15
  import { KeyManager } from '@oxyhq/core';
15
16
  import type { ClientSession } from '@oxyhq/core';
16
17
  import { toast } from '../../lib/sonner';
@@ -85,6 +86,13 @@ export interface OxyContextState {
85
86
  useFollow?: UseFollowHook;
86
87
  showBottomSheet?: (screenOrConfig: RouteName | { screen: RouteName; props?: Record<string, unknown> }) => void;
87
88
  openAvatarPicker: () => void;
89
+
90
+ // Managed accounts (sub-accounts / managed identities)
91
+ actingAs: string | null;
92
+ managedAccounts: ManagedAccount[];
93
+ setActingAs: (userId: string | null) => void;
94
+ refreshManagedAccounts: () => Promise<void>;
95
+ createManagedAccount: (data: CreateManagedAccountInput) => Promise<ManagedAccount>;
88
96
  }
89
97
 
90
98
  const OxyContext = createContext<OxyContextState | null>(null);
@@ -645,6 +653,68 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
645
653
  showBottomSheet: showBottomSheetForContext,
646
654
  });
647
655
 
656
+ // --- Managed accounts state ---
657
+ const [actingAs, setActingAsState] = useState<string | null>(null);
658
+ const [managedAccounts, setManagedAccounts] = useState<ManagedAccount[]>([]);
659
+
660
+ // Restore actingAs from storage on startup
661
+ useEffect(() => {
662
+ if (!storage || !initialized) return;
663
+ let mounted = true;
664
+ (async () => {
665
+ try {
666
+ const stored = await storage.getItem(`${storageKeyPrefix}_acting_as`);
667
+ if (mounted && stored) {
668
+ setActingAsState(stored);
669
+ oxyServices.setActingAs(stored);
670
+ }
671
+ } catch (err) {
672
+ if (__DEV__) {
673
+ loggerUtil.debug('Failed to restore actingAs from storage', { component: 'OxyContext' }, err as unknown);
674
+ }
675
+ }
676
+ })();
677
+ return () => { mounted = false; };
678
+ }, [storage, initialized, storageKeyPrefix, oxyServices]);
679
+
680
+ // Load managed accounts when authenticated
681
+ const refreshManagedAccounts = useCallback(async (): Promise<void> => {
682
+ if (!isAuthenticated) return;
683
+ try {
684
+ const accounts = await oxyServices.getManagedAccounts();
685
+ setManagedAccounts(accounts);
686
+ } catch (err) {
687
+ if (__DEV__) {
688
+ loggerUtil.debug('Failed to load managed accounts', { component: 'OxyContext' }, err as unknown);
689
+ }
690
+ }
691
+ }, [isAuthenticated, oxyServices]);
692
+
693
+ useEffect(() => {
694
+ if (isAuthenticated && initialized && tokenReady) {
695
+ refreshManagedAccounts();
696
+ }
697
+ }, [isAuthenticated, initialized, tokenReady, refreshManagedAccounts]);
698
+
699
+ const setActingAs = useCallback((userId: string | null) => {
700
+ oxyServices.setActingAs(userId);
701
+ setActingAsState(userId);
702
+ // Persist to storage
703
+ if (storage) {
704
+ if (userId) {
705
+ storage.setItem(`${storageKeyPrefix}_acting_as`, userId).catch(() => {});
706
+ } else {
707
+ storage.removeItem(`${storageKeyPrefix}_acting_as`).catch(() => {});
708
+ }
709
+ }
710
+ }, [oxyServices, storage, storageKeyPrefix]);
711
+
712
+ const createManagedAccountFn = useCallback(async (data: CreateManagedAccountInput): Promise<ManagedAccount> => {
713
+ const account = await oxyServices.createManagedAccount(data);
714
+ await refreshManagedAccounts();
715
+ return account;
716
+ }, [oxyServices, refreshManagedAccounts]);
717
+
648
718
  const contextValue: OxyContextState = useMemo(() => ({
649
719
  user,
650
720
  sessions,
@@ -678,6 +748,11 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
678
748
  useFollow: useFollowHook,
679
749
  showBottomSheet: showBottomSheetForContext,
680
750
  openAvatarPicker,
751
+ actingAs,
752
+ managedAccounts,
753
+ setActingAs,
754
+ refreshManagedAccounts,
755
+ createManagedAccount: createManagedAccountFn,
681
756
  }), [
682
757
  activeSessionId,
683
758
  signIn,
@@ -709,6 +784,11 @@ export const OxyProvider: React.FC<OxyContextProviderProps> = ({
709
784
  user,
710
785
  showBottomSheetForContext,
711
786
  openAvatarPicker,
787
+ actingAs,
788
+ managedAccounts,
789
+ setActingAs,
790
+ refreshManagedAccounts,
791
+ createManagedAccountFn,
712
792
  ]);
713
793
 
714
794
  return (
@@ -753,6 +833,11 @@ const LOADING_STATE: OxyContextState = {
753
833
  storageKeyPrefix: 'oxy_session',
754
834
  oxyServices: null as any,
755
835
  openAvatarPicker: () => {},
836
+ actingAs: null,
837
+ managedAccounts: [],
838
+ setActingAs: () => {},
839
+ refreshManagedAccounts: noop,
840
+ createManagedAccount: noop,
756
841
  };
757
842
 
758
843
  export const useOxy = (): OxyContextState => {
@@ -39,7 +39,8 @@ export type RouteName =
39
39
  | 'AboutKarma'
40
40
  | 'KarmaFAQ'
41
41
  | 'FollowersList' // List of user's followers
42
- | 'FollowingList'; // List of users being followed
42
+ | 'FollowingList' // List of users being followed
43
+ | 'CreateManagedAccount'; // Create a new managed sub-account
43
44
 
44
45
  // Lazy screen loaders - functions that return screen components on-demand
45
46
  // This breaks the require cycle by deferring imports until screens are actually needed
@@ -80,6 +81,7 @@ const screenLoaders: Record<RouteName, () => ComponentType<BaseScreenProps>> = {
80
81
  // User list screens (followers/following)
81
82
  FollowersList: () => require('../screens/FollowersListScreen').default,
82
83
  FollowingList: () => require('../screens/FollowingListScreen').default,
84
+ CreateManagedAccount: () => require('../screens/CreateManagedAccountScreen').default,
83
85
  };
84
86
 
85
87
  // Cache loaded components to avoid re-requiring
@@ -32,7 +32,7 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
32
32
  navigate,
33
33
  }) => {
34
34
  // Use useOxy() hook for OxyContext values
35
- const { user, logout, isLoading, sessions, isAuthenticated } = useOxy();
35
+ const { user, logout, isLoading, sessions, isAuthenticated, managedAccounts } = useOxy();
36
36
  const { t } = useI18n();
37
37
  const bloomTheme = useTheme();
38
38
  const colorScheme = useColorScheme();
@@ -181,6 +181,26 @@ const AccountCenterScreen: React.FC<BaseScreenProps> = ({
181
181
  </SettingsListGroup>
182
182
  )}
183
183
 
184
+ {/* Managed Accounts */}
185
+ {isAuthenticated && (
186
+ <SettingsListGroup title="Managed Accounts">
187
+ <SettingsListItem
188
+ icon={<SettingsIcon name="account-switch" color={colors.iconStorage} />}
189
+ title="Manage Identities"
190
+ description={managedAccounts.length > 0
191
+ ? `${managedAccounts.length} managed ${managedAccounts.length === 1 ? 'identity' : 'identities'}`
192
+ : 'Sub-accounts you control'}
193
+ onPress={() => navigate?.('AccountSwitcher')}
194
+ />
195
+ <SettingsListItem
196
+ icon={<SettingsIcon name="account-plus" color={colors.iconPersonalInfo} />}
197
+ title="Create New Identity"
198
+ description="Add a managed sub-account"
199
+ onPress={() => navigate?.('CreateManagedAccount')}
200
+ />
201
+ </SettingsListGroup>
202
+ )}
203
+
184
204
  {/* Additional Options */}
185
205
  <SettingsListGroup title={t('accountCenter.sections.moreOptions') || 'More Options'}>
186
206
  {Platform.OS !== 'web' ? (