@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.
- package/lib/commonjs/index.js +9 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/ui/components/ActingAsBanner.js +143 -0
- package/lib/commonjs/ui/components/ActingAsBanner.js.map +1 -0
- package/lib/commonjs/ui/context/OxyContext.js +78 -3
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/navigation/routes.js +3 -2
- package/lib/commonjs/ui/navigation/routes.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +21 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +235 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js +346 -0
- package/lib/commonjs/ui/screens/CreateManagedAccountScreen.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/ui/components/ActingAsBanner.js +140 -0
- package/lib/module/ui/components/ActingAsBanner.js.map +1 -0
- package/lib/module/ui/context/OxyContext.js +78 -3
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/navigation/routes.js +3 -2
- package/lib/module/ui/navigation/routes.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +21 -1
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +235 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/CreateManagedAccountScreen.js +342 -0
- package/lib/module/ui/screens/CreateManagedAccountScreen.js.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +1 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ActingAsBanner.d.ts +4 -0
- package/lib/typescript/commonjs/ui/components/ActingAsBanner.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +6 -0
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/AccountCenterScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/CreateManagedAccountScreen.d.ts +5 -0
- package/lib/typescript/commonjs/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +1 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ActingAsBanner.d.ts +4 -0
- package/lib/typescript/module/ui/components/ActingAsBanner.d.ts.map +1 -0
- package/lib/typescript/module/ui/context/OxyContext.d.ts +6 -0
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/AccountCenterScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/CreateManagedAccountScreen.d.ts +5 -0
- package/lib/typescript/module/ui/screens/CreateManagedAccountScreen.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +3 -0
- package/src/ui/components/ActingAsBanner.tsx +135 -0
- package/src/ui/context/OxyContext.tsx +85 -0
- package/src/ui/navigation/routes.ts +3 -1
- package/src/ui/screens/AccountCenterScreen.tsx +21 -1
- package/src/ui/screens/AccountSwitcherScreen.tsx +209 -0
- 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 @@
|
|
|
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;
|
|
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;
|
|
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,
|
|
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,
|
|
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 @@
|
|
|
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
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'
|
|
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' ? (
|