@phreshos/react 0.1.25 → 0.1.27
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/dist/desktop-provider.d.ts +3 -1
- package/dist/desktop-provider.js +7 -0
- package/dist/main.d.ts +3 -1
- package/dist/main.js +3 -1
- package/dist/use-connection-state.d.ts +8 -0
- package/dist/use-connection-state.js +19 -0
- package/dist/use-program-state.js +2 -2
- package/dist/use-session-state.d.ts +8 -0
- package/dist/use-session-state.js +25 -0
- package/package.json +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
-
import type { Desktop, DesktopPreferences, DesktopViewportSnapshot } from "@phreshos/core";
|
|
2
|
+
import type { Connection, Desktop, DesktopPreferences, DesktopViewportSnapshot } from "@phreshos/core";
|
|
3
3
|
import LiveSnapshot from "./live-snapshot.js";
|
|
4
4
|
/** Provides one complete Client Desktop environment to a React tree. */
|
|
5
5
|
export default function DesktopProvider({ children, desktop, fallback }: DesktopProviderProperties): string | number | bigint | boolean | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react").FunctionComponentElement<import("react").ProviderProps<Readonly<{
|
|
@@ -13,6 +13,8 @@ export declare function useDesktop(): Desktop;
|
|
|
13
13
|
export declare function useDesktopViewport(): DesktopViewportSnapshot;
|
|
14
14
|
/** Resolves and follows the effective Desktop preferences. */
|
|
15
15
|
export declare function useDesktopPreferences(): DesktopPreferences;
|
|
16
|
+
/** Resolves the browser Connection carrying this Desktop when explicitly used. */
|
|
17
|
+
export declare function useDesktopConnection(): Connection | undefined;
|
|
16
18
|
export type DesktopProviderProperties = Readonly<{
|
|
17
19
|
children: ReactNode;
|
|
18
20
|
desktop: Desktop;
|
package/dist/desktop-provider.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createContext, createElement, useContext as useReactContext, useMemo, useSyncExternalStore } from "react";
|
|
2
2
|
import LiveSnapshot from "./live-snapshot.js";
|
|
3
|
+
import LiveState from "./live-state.js";
|
|
3
4
|
import useProviderResolution from "./provider-resolution.js";
|
|
4
5
|
const DesktopContext = createContext(null);
|
|
5
6
|
/** Provides one complete Client Desktop environment to a React tree. */
|
|
@@ -27,6 +28,12 @@ export function useDesktopPreferences() {
|
|
|
27
28
|
const store = useValue().preferences;
|
|
28
29
|
return useSyncExternalStore(store.subscribe, store.snapshot, store.snapshot);
|
|
29
30
|
}
|
|
31
|
+
/** Resolves the browser Connection carrying this Desktop when explicitly used. */
|
|
32
|
+
export function useDesktopConnection() {
|
|
33
|
+
const desktop = useDesktop();
|
|
34
|
+
const state = useMemo(() => new LiveState(() => desktop.connection(), () => () => undefined), [desktop]);
|
|
35
|
+
return useSyncExternalStore(state.subscribe, state.snapshot, state.snapshot);
|
|
36
|
+
}
|
|
30
37
|
function useValue() {
|
|
31
38
|
const value = useReactContext(DesktopContext);
|
|
32
39
|
if (!value)
|
package/dist/main.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export { default as ContextProvider, useContext, useParent, useProcess, useProgram, type ContextProviderProperties } from "./context-provider.js";
|
|
2
2
|
export { default as SystemProvider, useSystem, useSystemAppearance, type SystemProviderProperties } from "./system-provider.js";
|
|
3
|
-
export { default as DesktopProvider, useDesktop, useDesktopViewport, useDesktopPreferences, type DesktopProviderProperties } from "./desktop-provider.js";
|
|
3
|
+
export { default as DesktopProvider, useDesktop, useDesktopConnection, useDesktopViewport, useDesktopPreferences, type DesktopProviderProperties } from "./desktop-provider.js";
|
|
4
4
|
export { default as useSubscribe } from "./use-subscribe.js";
|
|
5
5
|
export { default as useProgramState, type ProgramState } from "./use-program-state.js";
|
|
6
6
|
export { default as useProcessState, type ProcessState } from "./use-process-state.js";
|
|
7
|
+
export { default as useConnectionState, type ConnectionState } from "./use-connection-state.js";
|
|
8
|
+
export { default as useSessionState, type SessionState } from "./use-session-state.js";
|
|
7
9
|
export { default as useEndpointState, type EndpointState } from "./use-endpoint-state.js";
|
|
8
10
|
export { default as useServiceState, type ServiceState } from "./use-service-state.js";
|
|
9
11
|
export { default as useWindowState } from "./use-window-state.js";
|
package/dist/main.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export { default as ContextProvider, useContext, useParent, useProcess, useProgram } from "./context-provider.js";
|
|
2
2
|
export { default as SystemProvider, useSystem, useSystemAppearance } from "./system-provider.js";
|
|
3
|
-
export { default as DesktopProvider, useDesktop, useDesktopViewport, useDesktopPreferences } from "./desktop-provider.js";
|
|
3
|
+
export { default as DesktopProvider, useDesktop, useDesktopConnection, useDesktopViewport, useDesktopPreferences } from "./desktop-provider.js";
|
|
4
4
|
export { default as useSubscribe } from "./use-subscribe.js";
|
|
5
5
|
export { default as useProgramState } from "./use-program-state.js";
|
|
6
6
|
export { default as useProcessState } from "./use-process-state.js";
|
|
7
|
+
export { default as useConnectionState } from "./use-connection-state.js";
|
|
8
|
+
export { default as useSessionState } from "./use-session-state.js";
|
|
7
9
|
export { default as useEndpointState } from "./use-endpoint-state.js";
|
|
8
10
|
export { default as useServiceState } from "./use-service-state.js";
|
|
9
11
|
export { default as useWindowState } from "./use-window-state.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Connection, Session } from "@phreshos/core";
|
|
2
|
+
/** Mutable authorization state of one browser Connection. */
|
|
3
|
+
export type ConnectionState = Readonly<{
|
|
4
|
+
connected: boolean;
|
|
5
|
+
session: Session | null;
|
|
6
|
+
}>;
|
|
7
|
+
/** Explicitly reads and follows one Connection while this hook is mounted. */
|
|
8
|
+
export default function useConnectionState(connection: Connection): ConnectionState | undefined;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useMemo, useSyncExternalStore } from "react";
|
|
2
|
+
import LiveState, { combineCleanups } from "./live-state.js";
|
|
3
|
+
/** Explicitly reads and follows one Connection while this hook is mounted. */
|
|
4
|
+
export default function useConnectionState(connection) {
|
|
5
|
+
const state = useMemo(() => new LiveState(async () => {
|
|
6
|
+
const [connected, session] = await Promise.all([
|
|
7
|
+
connection.connected(),
|
|
8
|
+
connection.session()
|
|
9
|
+
]);
|
|
10
|
+
return { connected, session };
|
|
11
|
+
}, reduce => combineCleanups(connection.subscribe("sessionChange", session => reduce(current => setSession(current, session))), connection.subscribe("disconnect", () => reduce(current => disconnect(current))))), [connection]);
|
|
12
|
+
return useSyncExternalStore(state.subscribe, state.snapshot, state.snapshot);
|
|
13
|
+
}
|
|
14
|
+
function setSession(state, session) {
|
|
15
|
+
return state.session === session ? state : { ...state, session };
|
|
16
|
+
}
|
|
17
|
+
function disconnect(state) {
|
|
18
|
+
return !state.connected && state.session === null ? state : { connected: false, session: null };
|
|
19
|
+
}
|
|
@@ -5,10 +5,10 @@ export default function useProgramState(program) {
|
|
|
5
5
|
const state = useMemo(() => new LiveState(async () => {
|
|
6
6
|
const [installed, processes] = await Promise.all([
|
|
7
7
|
program.installed(),
|
|
8
|
-
program.
|
|
8
|
+
program.processes()
|
|
9
9
|
]);
|
|
10
10
|
return { installed, processes };
|
|
11
|
-
}, reduce => combineCleanups(program.
|
|
11
|
+
}, reduce => combineCleanups(program.subscribe("processCreate", process => reduce(current => addProcess(current, process))), program.subscribe("processExit", ({ process }) => reduce(current => removeProcess(current, process))), program.subscribe("uninstall", () => reduce(current => current.installed ? { ...current, installed: false } : current)))), [program]);
|
|
12
12
|
return useSyncExternalStore(state.subscribe, state.snapshot, state.snapshot);
|
|
13
13
|
}
|
|
14
14
|
function addProcess(state, process) {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Connection, Session } from "@phreshos/core";
|
|
2
|
+
/** Mutable lifecycle state of one authentication Session. */
|
|
3
|
+
export type SessionState = Readonly<{
|
|
4
|
+
valid: boolean;
|
|
5
|
+
connections: readonly Connection[];
|
|
6
|
+
}>;
|
|
7
|
+
/** Explicitly reads and follows one Session while this hook is mounted. */
|
|
8
|
+
export default function useSessionState(session: Session): SessionState | undefined;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useMemo, useSyncExternalStore } from "react";
|
|
2
|
+
import LiveState, { combineCleanups } from "./live-state.js";
|
|
3
|
+
/** Explicitly reads and follows one Session while this hook is mounted. */
|
|
4
|
+
export default function useSessionState(session) {
|
|
5
|
+
const state = useMemo(() => new LiveState(async () => {
|
|
6
|
+
const [valid, connections] = await Promise.all([
|
|
7
|
+
session.valid(),
|
|
8
|
+
session.connections()
|
|
9
|
+
]);
|
|
10
|
+
return { valid, connections };
|
|
11
|
+
}, reduce => combineCleanups(session.subscribe("connectionAttach", connection => reduce(current => attach(current, connection))), session.subscribe("connectionDetach", connection => reduce(current => detach(current, connection))), session.subscribe("end", () => reduce(current => end(current))))), [session]);
|
|
12
|
+
return useSyncExternalStore(state.subscribe, state.snapshot, state.snapshot);
|
|
13
|
+
}
|
|
14
|
+
function attach(state, connection) {
|
|
15
|
+
if (state.connections.includes(connection))
|
|
16
|
+
return state;
|
|
17
|
+
return { ...state, connections: [...state.connections, connection] };
|
|
18
|
+
}
|
|
19
|
+
function detach(state, connection) {
|
|
20
|
+
const connections = state.connections.filter(candidate => candidate !== connection);
|
|
21
|
+
return connections.length === state.connections.length ? state : { ...state, connections };
|
|
22
|
+
}
|
|
23
|
+
function end(state) {
|
|
24
|
+
return !state.valid && state.connections.length === 0 ? state : { valid: false, connections: [] };
|
|
25
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phreshos/react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.27",
|
|
4
4
|
"description": "Runtime-neutral React adapters for PhreshOS contracts.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
"prepack": "node --run build"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"@phreshos/core": "^0.1.
|
|
49
|
+
"@phreshos/core": "^0.1.52",
|
|
50
50
|
"react": "^19.2.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@phreshos/core": "^0.1.
|
|
53
|
+
"@phreshos/core": "^0.1.52",
|
|
54
54
|
"@testing-library/dom": "^10.4.1",
|
|
55
55
|
"@testing-library/react": "^16.3.0",
|
|
56
56
|
"@types/react": "^19.2.18",
|