@oxyhq/services 19.1.2 → 19.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +21 -0
- package/android/src/main/AndroidManifest.xml +10 -0
- package/android/src/main/java/so/oxy/identity/OxyIdentityModule.kt +84 -0
- package/android/src/main/java/so/oxy/identity/OxyIdentityProvider.kt +77 -0
- package/android/src/main/java/so/oxy/identity/OxyIdentityStore.kt +76 -0
- package/expo-module.config.json +9 -0
- package/ios/OxyIdentity.podspec +28 -0
- package/ios/OxyIdentityModule.swift +33 -0
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/ui/context/OxyContext.js +53 -50
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/context/commitSessionFlow.js +91 -0
- package/lib/commonjs/ui/context/commitSessionFlow.js.map +1 -0
- package/lib/commonjs/ui/hooks/useOxyEvent.js +28 -0
- package/lib/commonjs/ui/hooks/useOxyEvent.js.map +1 -0
- package/lib/commonjs/ui/screens/FileManagementScreen.js +3 -9
- package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/session/createSessionClient.js +12 -8
- package/lib/commonjs/ui/session/createSessionClient.js.map +1 -1
- package/lib/commonjs/ui/session/tokenTransport.js +22 -32
- package/lib/commonjs/ui/session/tokenTransport.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/ui/context/OxyContext.js +54 -51
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/context/commitSessionFlow.js +87 -0
- package/lib/module/ui/context/commitSessionFlow.js.map +1 -0
- package/lib/module/ui/hooks/useOxyEvent.js +25 -0
- package/lib/module/ui/hooks/useOxyEvent.js.map +1 -0
- package/lib/module/ui/screens/FileManagementScreen.js +3 -9
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/session/createSessionClient.js +12 -8
- package/lib/module/ui/session/createSessionClient.js.map +1 -1
- package/lib/module/ui/session/tokenTransport.js +23 -33
- package/lib/module/ui/session/tokenTransport.js.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +1 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts +39 -0
- package/lib/typescript/commonjs/ui/context/commitSessionFlow.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +3 -1
- package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useOxyEvent.d.ts +8 -0
- package/lib/typescript/commonjs/ui/hooks/useOxyEvent.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts +12 -8
- package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts +11 -9
- package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +1 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts +39 -0
- package/lib/typescript/module/ui/context/commitSessionFlow.d.ts.map +1 -0
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +3 -1
- package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useOxyEvent.d.ts +8 -0
- package/lib/typescript/module/ui/hooks/useOxyEvent.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/session/createSessionClient.d.ts +12 -8
- package/lib/typescript/module/ui/session/createSessionClient.d.ts.map +1 -1
- package/lib/typescript/module/ui/session/tokenTransport.d.ts +11 -9
- package/lib/typescript/module/ui/session/tokenTransport.d.ts.map +1 -1
- package/package.json +29 -17
- package/plugins/withSharedIdentityProvider.js +83 -0
- package/plugins/withSharedIdentityReader.js +46 -0
- package/src/index.ts +1 -0
- package/src/ui/context/OxyContext.tsx +51 -49
- package/src/ui/context/__tests__/commitSessionFlow.test.ts +192 -0
- package/src/ui/context/commitSessionFlow.ts +115 -0
- package/src/ui/context/oxyContextTypes.ts +3 -1
- package/src/ui/hooks/useOxyEvent.ts +22 -0
- package/src/ui/screens/FileManagementScreen.tsx +3 -9
- package/src/ui/session/__tests__/createSessionClient.test.ts +5 -5
- package/src/ui/session/__tests__/tokenTransport.test.ts +43 -60
- package/src/ui/session/createSessionClient.ts +13 -10
- package/src/ui/session/tokenTransport.ts +22 -41
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribe to a named server-pushed Socket.IO event (e.g. `civic:attested`)
|
|
3
|
+
* for the lifetime of the component. Payloads arrive as `unknown` — callers
|
|
4
|
+
* validate shape. Handler identity may change between renders; the latest one
|
|
5
|
+
* is always invoked.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useOxyEvent(event: string, handler: (payload: unknown) => void): void;
|
|
8
|
+
//# sourceMappingURL=useOxyEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOxyEvent.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useOxyEvent.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAWpF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileManagementScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/FileManagementScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAgBjF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAgFzE,QAAA,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,
|
|
1
|
+
{"version":3,"file":"FileManagementScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/FileManagementScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAgBjF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAgFzE,QAAA,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAk1D7D,CAAC;AAIF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SessionClient, createSessionClientHost, type
|
|
1
|
+
import { SessionClient, createSessionClientHost, type OxyServices, type SessionStateOrigin } from '@oxyhq/core';
|
|
2
2
|
/**
|
|
3
3
|
* Wire a `SessionClient` for `@oxyhq/services`.
|
|
4
4
|
*
|
|
@@ -11,18 +11,22 @@ import { SessionClient, createSessionClientHost, type AuthStateStore, type OxySe
|
|
|
11
11
|
* core's lazy dynamic import of a bare specifier — bundler-fragile in
|
|
12
12
|
* Metro/Expo-web against the published core dist.
|
|
13
13
|
* - the device-first {@link createTokenTransport}, which mints a fallback token
|
|
14
|
-
*
|
|
14
|
+
* through the ONE shared `httpService.refreshAccessToken` single-flight (it
|
|
15
|
+
* reads the persisted `deviceId` + `deviceSecret` via the installed handler,
|
|
16
|
+
* so it takes no `store` of its own).
|
|
15
17
|
*
|
|
16
|
-
* `onUnauthenticated` fires when an applied device state has zero accounts
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* `onUnauthenticated` fires when an applied device state has zero accounts. It
|
|
19
|
+
* receives the {@link SessionStateOrigin} so the provider can gate the
|
|
20
|
+
* destructive credential wipe: a `request`-origin verdict (a REST sign-out /
|
|
21
|
+
* revocation) clears the persisted store; a `push`-origin verdict (a possibly
|
|
22
|
+
* transient socket broadcast) clears only the local UI session and KEEPS the
|
|
23
|
+
* durable device credential. The host is returned alongside the client so the
|
|
24
|
+
* caller can call `host.setCurrentAccountId(...)` as the active account changes.
|
|
21
25
|
*
|
|
22
26
|
* The realtime socket uses bearer when authenticated, or deviceId+deviceSecret
|
|
23
27
|
* when signed out (after the one-shot join redirect).
|
|
24
28
|
*/
|
|
25
|
-
export declare function createSessionClient(oxyServices: OxyServices,
|
|
29
|
+
export declare function createSessionClient(oxyServices: OxyServices, onUnauthenticated?: (origin: SessionStateOrigin) => void): {
|
|
26
30
|
client: SessionClient;
|
|
27
31
|
host: ReturnType<typeof createSessionClientHost>;
|
|
28
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSessionClient.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/createSessionClient.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,KAAK,
|
|
1
|
+
{"version":3,"file":"createSessionClient.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/createSessionClient.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAGrB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,WAAW,EACxB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GACvD;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CAClD,CAKA"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type OxyServices, type TokenTransport } from '@oxyhq/core';
|
|
2
2
|
/**
|
|
3
3
|
* Platform `TokenTransport` for `SessionClient` (device-first model).
|
|
4
4
|
*
|
|
5
5
|
* `ensureActiveToken` is the fallback the client uses when a `session_state`
|
|
6
6
|
* push arrived WITHOUT an embedded `activeToken` and the app currently holds no
|
|
7
|
-
* bearer. It mints one through the ONE unified
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* bearer. It mints one through the ONE unified single-flight the scheduler, the
|
|
8
|
+
* request-time preflight, and the 401 retry all use —
|
|
9
|
+
* `oxyServices.httpService.refreshAccessToken(...)` — which runs the installed
|
|
10
|
+
* refresh handler (present the persisted zero-cookie `deviceId` + `deviceSecret`
|
|
11
|
+
* at `POST /session/device/token`). Routing through the SAME entry point means
|
|
12
|
+
* this lane can never double-rotate the device secret against the others: it has
|
|
13
|
+
* NO private single-flight of its own.
|
|
11
14
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* handler).
|
|
15
|
+
* A failure is logged and swallowed: this method must never throw out (it runs
|
|
16
|
+
* inside the socket state handler).
|
|
15
17
|
*/
|
|
16
|
-
export declare function createTokenTransport(oxyServices: OxyServices
|
|
18
|
+
export declare function createTokenTransport(oxyServices: OxyServices): TokenTransport;
|
|
17
19
|
//# sourceMappingURL=tokenTransport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenTransport.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/tokenTransport.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"tokenTransport.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/tokenTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,CA0B7E"}
|
|
@@ -48,6 +48,7 @@ export { queryKeys, invalidateAccountQueries, invalidateUserQueries, invalidateS
|
|
|
48
48
|
export { useMutationStatus } from './ui/hooks/useMutationStatus.js';
|
|
49
49
|
export type { MutationStatus } from './ui/hooks/useMutationStatus.js';
|
|
50
50
|
export { useOnlineStatus } from './ui/hooks/useOnlineStatus.js';
|
|
51
|
+
export { useOxyEvent } from './ui/hooks/useOxyEvent.js';
|
|
51
52
|
export { handleAuthError, isInvalidSessionError, isTimeoutOrNetworkError, extractErrorMessage, } from './ui/utils/errorHandlers.js';
|
|
52
53
|
export type { HandleAuthErrorOptions } from './ui/utils/errorHandlers.js';
|
|
53
54
|
export { useFileFiltering } from './ui/hooks/useFileFiltering.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA0D/B,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,uBAAuB,EAE7B,MAAM,sBAAmB,CAAC;AAK3B,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAIxG,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA63BzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,mCAAc,CAAC;AAgE9C,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { User } from '@oxyhq/core';
|
|
2
|
+
export interface CommitDeviceSetAndResolveDeps {
|
|
3
|
+
/**
|
|
4
|
+
* Whether this commit is a deliberate sign-in on THIS device (activates the
|
|
5
|
+
* account and BLOCKS on the device-set reconcile before resolving) vs. a
|
|
6
|
+
* cold-boot restore (resolves auth from the profile fetch FIRST, then
|
|
7
|
+
* reconciles the device set in the background).
|
|
8
|
+
*/
|
|
9
|
+
activate: boolean;
|
|
10
|
+
/** The committing account id (only used by `registerAndActivate`). */
|
|
11
|
+
userId?: string;
|
|
12
|
+
/** Minimal user carried by the commit input; used if the profile fetch fails. */
|
|
13
|
+
fallbackUser: User | null;
|
|
14
|
+
/** Deliberate sign-in: register + activate the account in the device set. */
|
|
15
|
+
registerAndActivate: (userId?: string) => Promise<void>;
|
|
16
|
+
/** Cold boot: ensure membership only; the server's `activeAccountId` wins. */
|
|
17
|
+
addCurrentAccount: () => Promise<void>;
|
|
18
|
+
/** Start the device-scoped socket. */
|
|
19
|
+
startSocket: () => Promise<void>;
|
|
20
|
+
/** Project the server-authoritative device state onto local sessions. */
|
|
21
|
+
syncFromClient: () => Promise<void>;
|
|
22
|
+
/** Hydrate the full profile (the commit input carries only minimal data). */
|
|
23
|
+
getCurrentUser: () => Promise<User | null>;
|
|
24
|
+
loginSuccess: (user: User) => void;
|
|
25
|
+
onAuthStateChange?: (user: User | null) => void;
|
|
26
|
+
markAuthResolved: () => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Device-set registration + full-user hydration + auth-resolution gate flip.
|
|
30
|
+
*
|
|
31
|
+
* On a deliberate sign-in (`activate: true`) the device-set reconcile is awaited
|
|
32
|
+
* BEFORE hydrating and resolving — unchanged legacy ordering. On a cold boot
|
|
33
|
+
* (`activate: false`) auth resolves from the profile fetch FIRST so the app can
|
|
34
|
+
* paint an authenticated shell without waiting on device-set registration, the
|
|
35
|
+
* socket connect, and the authoritative sessions projection — those reconcile in
|
|
36
|
+
* a DETACHED background task a moment later.
|
|
37
|
+
*/
|
|
38
|
+
export declare function commitDeviceSetAndResolve(deps: CommitDeviceSetAndResolveDeps): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=commitSessionFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commitSessionFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/commitSessionFlow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKxC,MAAM,WAAW,6BAA6B;IAC5C;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,6EAA6E;IAC7E,mBAAmB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,8EAA8E;IAC9E,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,sCAAsC;IACtC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,yEAAyE;IACzE,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,6EAA6E;IAC7E,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,IAAI,CAAC,CAsEf"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
-
import type { OxyServices, User, SessionLoginResponse, AccountNode, CreateAccountInput, ClientSession, AccountDialogController, AccountDialogView, ApiError } from '@oxyhq/core';
|
|
2
|
+
import type { OxyServices, User, SessionLoginResponse, AccountNode, CreateAccountInput, ClientSession, AccountDialogController, AccountDialogView, ApiError, SessionClient } from '@oxyhq/core';
|
|
3
3
|
import type { SecurityAlert } from '@oxyhq/contracts';
|
|
4
4
|
import type { UseFollowHook } from '../hooks/useFollow.types.js';
|
|
5
5
|
import type { useLanguageManagement } from '../hooks/useLanguageManagement.js';
|
|
@@ -68,6 +68,8 @@ export interface OxyContextState {
|
|
|
68
68
|
storageKeyPrefix: string;
|
|
69
69
|
clientId: string | null;
|
|
70
70
|
oxyServices: OxyServices;
|
|
71
|
+
/** Server-authoritative device session client. `null` before an `OxyProvider` is mounted. */
|
|
72
|
+
sessionClient: SessionClient | null;
|
|
71
73
|
useFollow?: UseFollowHook;
|
|
72
74
|
showBottomSheet?: (screenOrConfig: RouteName | {
|
|
73
75
|
screen: RouteName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribe to a named server-pushed Socket.IO event (e.g. `civic:attested`)
|
|
3
|
+
* for the lifetime of the component. Payloads arrive as `unknown` — callers
|
|
4
|
+
* validate shape. Handler identity may change between renders; the latest one
|
|
5
|
+
* is always invoked.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useOxyEvent(event: string, handler: (payload: unknown) => void): void;
|
|
8
|
+
//# sourceMappingURL=useOxyEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOxyEvent.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useOxyEvent.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAWpF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileManagementScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/FileManagementScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAgBjF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAAyB,CAAC;AAgFzE,QAAA,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,
|
|
1
|
+
{"version":3,"file":"FileManagementScreen.d.ts","sourceRoot":"","sources":["../../../../../src/ui/screens/FileManagementScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAgBjF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAAyB,CAAC;AAgFzE,QAAA,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAk1D7D,CAAC;AAIF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SessionClient, createSessionClientHost, type
|
|
1
|
+
import { SessionClient, createSessionClientHost, type OxyServices, type SessionStateOrigin } from '@oxyhq/core';
|
|
2
2
|
/**
|
|
3
3
|
* Wire a `SessionClient` for `@oxyhq/services`.
|
|
4
4
|
*
|
|
@@ -11,18 +11,22 @@ import { SessionClient, createSessionClientHost, type AuthStateStore, type OxySe
|
|
|
11
11
|
* core's lazy dynamic import of a bare specifier — bundler-fragile in
|
|
12
12
|
* Metro/Expo-web against the published core dist.
|
|
13
13
|
* - the device-first {@link createTokenTransport}, which mints a fallback token
|
|
14
|
-
*
|
|
14
|
+
* through the ONE shared `httpService.refreshAccessToken` single-flight (it
|
|
15
|
+
* reads the persisted `deviceId` + `deviceSecret` via the installed handler,
|
|
16
|
+
* so it takes no `store` of its own).
|
|
15
17
|
*
|
|
16
|
-
* `onUnauthenticated` fires when an applied device state has zero accounts
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* `onUnauthenticated` fires when an applied device state has zero accounts. It
|
|
19
|
+
* receives the {@link SessionStateOrigin} so the provider can gate the
|
|
20
|
+
* destructive credential wipe: a `request`-origin verdict (a REST sign-out /
|
|
21
|
+
* revocation) clears the persisted store; a `push`-origin verdict (a possibly
|
|
22
|
+
* transient socket broadcast) clears only the local UI session and KEEPS the
|
|
23
|
+
* durable device credential. The host is returned alongside the client so the
|
|
24
|
+
* caller can call `host.setCurrentAccountId(...)` as the active account changes.
|
|
21
25
|
*
|
|
22
26
|
* The realtime socket uses bearer when authenticated, or deviceId+deviceSecret
|
|
23
27
|
* when signed out (after the one-shot join redirect).
|
|
24
28
|
*/
|
|
25
|
-
export declare function createSessionClient(oxyServices: OxyServices,
|
|
29
|
+
export declare function createSessionClient(oxyServices: OxyServices, onUnauthenticated?: (origin: SessionStateOrigin) => void): {
|
|
26
30
|
client: SessionClient;
|
|
27
31
|
host: ReturnType<typeof createSessionClientHost>;
|
|
28
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSessionClient.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/createSessionClient.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,KAAK,
|
|
1
|
+
{"version":3,"file":"createSessionClient.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/createSessionClient.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAGrB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,WAAW,EACxB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GACvD;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CAClD,CAKA"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type OxyServices, type TokenTransport } from '@oxyhq/core';
|
|
2
2
|
/**
|
|
3
3
|
* Platform `TokenTransport` for `SessionClient` (device-first model).
|
|
4
4
|
*
|
|
5
5
|
* `ensureActiveToken` is the fallback the client uses when a `session_state`
|
|
6
6
|
* push arrived WITHOUT an embedded `activeToken` and the app currently holds no
|
|
7
|
-
* bearer. It mints one through the ONE unified
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* bearer. It mints one through the ONE unified single-flight the scheduler, the
|
|
8
|
+
* request-time preflight, and the 401 retry all use —
|
|
9
|
+
* `oxyServices.httpService.refreshAccessToken(...)` — which runs the installed
|
|
10
|
+
* refresh handler (present the persisted zero-cookie `deviceId` + `deviceSecret`
|
|
11
|
+
* at `POST /session/device/token`). Routing through the SAME entry point means
|
|
12
|
+
* this lane can never double-rotate the device secret against the others: it has
|
|
13
|
+
* NO private single-flight of its own.
|
|
11
14
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* handler).
|
|
15
|
+
* A failure is logged and swallowed: this method must never throw out (it runs
|
|
16
|
+
* inside the socket state handler).
|
|
15
17
|
*/
|
|
16
|
-
export declare function createTokenTransport(oxyServices: OxyServices
|
|
18
|
+
export declare function createTokenTransport(oxyServices: OxyServices): TokenTransport;
|
|
17
19
|
//# sourceMappingURL=tokenTransport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenTransport.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/tokenTransport.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"tokenTransport.d.ts","sourceRoot":"","sources":["../../../../../src/ui/session/tokenTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,cAAc,CA0B7E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxyhq/services",
|
|
3
|
-
"version": "19.
|
|
3
|
+
"version": "19.2.0",
|
|
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",
|
|
@@ -60,12 +60,20 @@
|
|
|
60
60
|
},
|
|
61
61
|
"default": "./lib/module/ui/server.js"
|
|
62
62
|
},
|
|
63
|
+
"./plugins/*": "./plugins/*.js",
|
|
64
|
+
"./expo-module.config.json": "./expo-module.config.json",
|
|
63
65
|
"./package.json": "./package.json"
|
|
64
66
|
},
|
|
65
67
|
"files": [
|
|
66
68
|
"src",
|
|
67
69
|
"lib",
|
|
68
|
-
"assets"
|
|
70
|
+
"assets",
|
|
71
|
+
"android/build.gradle",
|
|
72
|
+
"android/src",
|
|
73
|
+
"ios/OxyIdentityModule.swift",
|
|
74
|
+
"ios/OxyIdentity.podspec",
|
|
75
|
+
"plugins",
|
|
76
|
+
"expo-module.config.json"
|
|
69
77
|
],
|
|
70
78
|
"keywords": [
|
|
71
79
|
"react-native",
|
|
@@ -118,11 +126,11 @@
|
|
|
118
126
|
}
|
|
119
127
|
},
|
|
120
128
|
"dependencies": {
|
|
121
|
-
"@oxyhq/contracts": "0.13.
|
|
129
|
+
"@oxyhq/contracts": "0.13.2",
|
|
122
130
|
"color": "^4.2.3"
|
|
123
131
|
},
|
|
124
132
|
"devDependencies": {
|
|
125
|
-
"@oxyhq/core": "9.2.
|
|
133
|
+
"@oxyhq/core": "9.2.4",
|
|
126
134
|
"nativewind": "5.0.0-preview.3",
|
|
127
135
|
"react-native-css": "^3.0.0",
|
|
128
136
|
"@react-native-async-storage/async-storage": "^2.0.0",
|
|
@@ -147,16 +155,16 @@
|
|
|
147
155
|
"@types/color": "^4.2.1",
|
|
148
156
|
"@types/jest": "^29.5.14",
|
|
149
157
|
"@types/node": "^20.19.9",
|
|
150
|
-
"expo-file-system": "~
|
|
151
|
-
"expo-font": "~
|
|
152
|
-
"expo-haptics": "~
|
|
153
|
-
"expo-image": "~
|
|
154
|
-
"expo-linear-gradient": "~
|
|
158
|
+
"expo-file-system": "~57.0.0",
|
|
159
|
+
"expo-font": "~57.0.0",
|
|
160
|
+
"expo-haptics": "~57.0.0",
|
|
161
|
+
"expo-image": "~57.0.0",
|
|
162
|
+
"expo-linear-gradient": "~57.0.0",
|
|
155
163
|
"husky": "^4.3.8",
|
|
156
164
|
"jest": "~29.7.0",
|
|
157
165
|
"lint-staged": "^15.2.4",
|
|
158
166
|
"react-native-builder-bob": "^0.43.0",
|
|
159
|
-
"react-native-gesture-handler": "~2.
|
|
167
|
+
"react-native-gesture-handler": "~2.32.0",
|
|
160
168
|
"react-native-reanimated": "4.5.0",
|
|
161
169
|
"react-native-safe-area-context": "~5.8.0",
|
|
162
170
|
"react-native-svg": "15.15.5",
|
|
@@ -166,7 +174,7 @@
|
|
|
166
174
|
"peerDependencies": {
|
|
167
175
|
"@expo/vector-icons": "^15.0.3",
|
|
168
176
|
"@oxyhq/bloom": ">=0.16.0",
|
|
169
|
-
"@oxyhq/core": "^9.2.
|
|
177
|
+
"@oxyhq/core": "^9.2.3",
|
|
170
178
|
"@react-native-async-storage/async-storage": "^2.0.0",
|
|
171
179
|
"@react-native-community/netinfo": "^11.4.1",
|
|
172
180
|
"@tanstack/query-async-storage-persister": "^5.101",
|
|
@@ -176,16 +184,17 @@
|
|
|
176
184
|
"@types/react": "*",
|
|
177
185
|
"@types/react-native": "*",
|
|
178
186
|
"expo": ">=56.0.0",
|
|
179
|
-
"expo-
|
|
180
|
-
"expo-
|
|
187
|
+
"expo-modules-core": "*",
|
|
188
|
+
"expo-document-picker": ">=56.0.0",
|
|
189
|
+
"expo-file-system": ">=56.0.0",
|
|
181
190
|
"expo-font": ">=13.0.0",
|
|
182
|
-
"expo-haptics": "
|
|
191
|
+
"expo-haptics": ">=56.0.0",
|
|
183
192
|
"expo-image": ">=2.0.0",
|
|
184
|
-
"expo-image-manipulator": "
|
|
185
|
-
"expo-linear-gradient": "
|
|
193
|
+
"expo-image-manipulator": ">=56.0.0",
|
|
194
|
+
"expo-linear-gradient": ">=56.0.0",
|
|
186
195
|
"react": ">=18.0.0",
|
|
187
196
|
"react-native": ">=0.85.0",
|
|
188
|
-
"react-native-gesture-handler": "~2.
|
|
197
|
+
"react-native-gesture-handler": "~2.32.0",
|
|
189
198
|
"react-native-keyboard-controller": ">=1.21.0",
|
|
190
199
|
"react-native-qrcode-svg": "^6.3.0",
|
|
191
200
|
"react-native-reanimated": ">=4.3.0",
|
|
@@ -199,6 +208,9 @@
|
|
|
199
208
|
"nativewind": {
|
|
200
209
|
"optional": true
|
|
201
210
|
},
|
|
211
|
+
"expo-modules-core": {
|
|
212
|
+
"optional": true
|
|
213
|
+
},
|
|
202
214
|
"@expo/vector-icons": {
|
|
203
215
|
"optional": true
|
|
204
216
|
},
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config plugin: withSharedIdentityProvider (Commons only).
|
|
3
|
+
*
|
|
4
|
+
* Commons is the identity vault — the ONE app that HOSTS the cross-app shared
|
|
5
|
+
* identity. This plugin wires the Android side of `@oxyhq/services`:
|
|
6
|
+
*
|
|
7
|
+
* - Defines a `signature`-level permission `so.oxy.shared.permission.READ_IDENTITY`.
|
|
8
|
+
* `signature` means only apps signed with the SAME certificate (the shared
|
|
9
|
+
* Oxy release keystore) can hold it — the trust boundary is the signing key,
|
|
10
|
+
* not the deprecated `sharedUserId`.
|
|
11
|
+
* - Requests that same permission (`<uses-permission>`) so Commons can also
|
|
12
|
+
* read cross-authority (e.g. prod ⇆ dev variant) through the provider.
|
|
13
|
+
* - Declares the `OxyIdentityProvider` at authority `${applicationId}.identity`
|
|
14
|
+
* (AGP substitutes `${applicationId}` at build → `so.oxy.commons.identity`,
|
|
15
|
+
* or `so.oxy.commons.dev.identity` for the dev variant), guarded by that
|
|
16
|
+
* permission.
|
|
17
|
+
* - Adds a `<queries>` entry for the provider authorities so package-visibility
|
|
18
|
+
* filtering (Android 11+) never hides the sibling provider from the resolver.
|
|
19
|
+
*
|
|
20
|
+
* Reader apps (accounts, Mention, …) use the companion `withSharedIdentityReader`
|
|
21
|
+
* plugin, which only requests the permission + queries — they never host the
|
|
22
|
+
* provider.
|
|
23
|
+
*/
|
|
24
|
+
const { withAndroidManifest } = require('@expo/config-plugins');
|
|
25
|
+
|
|
26
|
+
const READ_IDENTITY_PERMISSION = 'so.oxy.shared.permission.READ_IDENTITY';
|
|
27
|
+
const PROVIDER_CLASS = 'so.oxy.identity.OxyIdentityProvider';
|
|
28
|
+
const PROVIDER_AUTHORITIES = ['so.oxy.commons.identity', 'so.oxy.commons.dev.identity'];
|
|
29
|
+
|
|
30
|
+
module.exports = function withSharedIdentityProvider(config) {
|
|
31
|
+
return withAndroidManifest(config, (modConfig) => {
|
|
32
|
+
const manifest = modConfig.modResults.manifest;
|
|
33
|
+
|
|
34
|
+
// 1. Define the signature-level permission.
|
|
35
|
+
manifest['permission'] = manifest['permission'] ?? [];
|
|
36
|
+
if (!manifest['permission'].some((p) => p.$['android:name'] === READ_IDENTITY_PERMISSION)) {
|
|
37
|
+
manifest['permission'].push({
|
|
38
|
+
$: {
|
|
39
|
+
'android:name': READ_IDENTITY_PERMISSION,
|
|
40
|
+
'android:protectionLevel': 'signature',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// 2. Request it (Commons reads cross-authority too).
|
|
46
|
+
manifest['uses-permission'] = manifest['uses-permission'] ?? [];
|
|
47
|
+
if (!manifest['uses-permission'].some((p) => p.$['android:name'] === READ_IDENTITY_PERMISSION)) {
|
|
48
|
+
manifest['uses-permission'].push({ $: { 'android:name': READ_IDENTITY_PERMISSION } });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 3. Make the sibling provider authorities visible under package filtering.
|
|
52
|
+
manifest['queries'] = manifest['queries'] ?? [];
|
|
53
|
+
if (manifest['queries'].length === 0) {
|
|
54
|
+
manifest['queries'].push({});
|
|
55
|
+
}
|
|
56
|
+
const queries = manifest['queries'][0];
|
|
57
|
+
queries.provider = queries.provider ?? [];
|
|
58
|
+
for (const authority of PROVIDER_AUTHORITIES) {
|
|
59
|
+
if (!queries.provider.some((p) => p.$['android:authorities'] === authority)) {
|
|
60
|
+
queries.provider.push({ $: { 'android:authorities': authority } });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 4. Host the provider.
|
|
65
|
+
const app = manifest.application?.[0];
|
|
66
|
+
if (!app) {
|
|
67
|
+
throw new Error('withSharedIdentityProvider: AndroidManifest has no <application>');
|
|
68
|
+
}
|
|
69
|
+
app.provider = app.provider ?? [];
|
|
70
|
+
if (!app.provider.some((p) => p.$['android:name'] === PROVIDER_CLASS)) {
|
|
71
|
+
app.provider.push({
|
|
72
|
+
$: {
|
|
73
|
+
'android:name': PROVIDER_CLASS,
|
|
74
|
+
'android:authorities': '${applicationId}.identity',
|
|
75
|
+
'android:exported': 'true',
|
|
76
|
+
'android:permission': READ_IDENTITY_PERMISSION,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return modConfig;
|
|
82
|
+
});
|
|
83
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config plugin: withSharedIdentityReader (reader RPs — accounts, etc.).
|
|
3
|
+
*
|
|
4
|
+
* Reader apps do NOT host the shared identity — they only READ it from the
|
|
5
|
+
* Commons-hosted `OxyIdentityProvider` to enable silent "Sign in with Oxy".
|
|
6
|
+
* This plugin wires the minimal Android side of `@oxyhq/services`:
|
|
7
|
+
*
|
|
8
|
+
* - Requests the `signature`-level permission `so.oxy.shared.permission.READ_IDENTITY`
|
|
9
|
+
* (defined by Commons). Because it is `signature`, it is only granted when
|
|
10
|
+
* this app is signed with the SAME certificate as Commons (the shared Oxy
|
|
11
|
+
* release keystore) — that is the entire trust boundary.
|
|
12
|
+
* - Adds a `<queries>` entry for the Commons provider authorities so
|
|
13
|
+
* package-visibility filtering (Android 11+) never hides the provider from
|
|
14
|
+
* `ContentResolver.call`.
|
|
15
|
+
*
|
|
16
|
+
* The provider itself is declared only in Commons (`withSharedIdentityProvider`).
|
|
17
|
+
*/
|
|
18
|
+
const { withAndroidManifest } = require('@expo/config-plugins');
|
|
19
|
+
|
|
20
|
+
const READ_IDENTITY_PERMISSION = 'so.oxy.shared.permission.READ_IDENTITY';
|
|
21
|
+
const PROVIDER_AUTHORITIES = ['so.oxy.commons.identity', 'so.oxy.commons.dev.identity'];
|
|
22
|
+
|
|
23
|
+
module.exports = function withSharedIdentityReader(config) {
|
|
24
|
+
return withAndroidManifest(config, (modConfig) => {
|
|
25
|
+
const manifest = modConfig.modResults.manifest;
|
|
26
|
+
|
|
27
|
+
manifest['uses-permission'] = manifest['uses-permission'] ?? [];
|
|
28
|
+
if (!manifest['uses-permission'].some((p) => p.$['android:name'] === READ_IDENTITY_PERMISSION)) {
|
|
29
|
+
manifest['uses-permission'].push({ $: { 'android:name': READ_IDENTITY_PERMISSION } });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
manifest['queries'] = manifest['queries'] ?? [];
|
|
33
|
+
if (manifest['queries'].length === 0) {
|
|
34
|
+
manifest['queries'].push({});
|
|
35
|
+
}
|
|
36
|
+
const queries = manifest['queries'][0];
|
|
37
|
+
queries.provider = queries.provider ?? [];
|
|
38
|
+
for (const authority of PROVIDER_AUTHORITIES) {
|
|
39
|
+
if (!queries.provider.some((p) => p.$['android:authorities'] === authority)) {
|
|
40
|
+
queries.provider.push({ $: { 'android:authorities': authority } });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return modConfig;
|
|
45
|
+
});
|
|
46
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -172,6 +172,7 @@ export {
|
|
|
172
172
|
export { useMutationStatus } from './ui/hooks/useMutationStatus';
|
|
173
173
|
export type { MutationStatus } from './ui/hooks/useMutationStatus';
|
|
174
174
|
export { useOnlineStatus } from './ui/hooks/useOnlineStatus';
|
|
175
|
+
export { useOxyEvent } from './ui/hooks/useOxyEvent';
|
|
175
176
|
|
|
176
177
|
// ---------------------------------------------------------------------------
|
|
177
178
|
// Error handlers
|