@dxos/react-client 0.8.4-main.b97322e → 0.8.4-main.bc674ce
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/.storybook/main.mts +11 -0
- package/.storybook/preview.mts +8 -0
- package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/dist/lib/browser/chunk-5UKA2BMA.mjs +179 -0
- package/dist/lib/browser/chunk-5UKA2BMA.mjs.map +7 -0
- package/dist/lib/browser/{chunk-O5SEVDJG.mjs → chunk-LO3TU5CK.mjs} +5 -5
- package/dist/lib/browser/chunk-LO3TU5CK.mjs.map +7 -0
- package/dist/lib/browser/chunk-PFF63FPR.mjs +16 -0
- package/dist/lib/browser/chunk-PFF63FPR.mjs.map +7 -0
- package/dist/lib/browser/chunk-TSF6Y5VB.mjs +8 -0
- package/dist/lib/browser/chunk-TSF6Y5VB.mjs.map +7 -0
- package/dist/lib/browser/devtools/index.mjs +3 -2
- package/dist/lib/browser/devtools/index.mjs.map +3 -3
- package/dist/lib/browser/echo/index.mjs +58 -108
- package/dist/lib/browser/echo/index.mjs.map +4 -4
- package/dist/lib/browser/halo/index.mjs +5 -3
- package/dist/lib/browser/halo/index.mjs.map +3 -3
- package/dist/lib/browser/index.mjs +114 -12
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invitations/index.mjs +1 -1
- package/dist/lib/browser/mesh/index.mjs +2 -1
- package/dist/lib/browser/mesh/index.mjs.map +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +120 -114
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/chunk-373DPHEQ.mjs +10 -0
- package/dist/lib/node-esm/chunk-373DPHEQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-TU2JJLZK.mjs → chunk-AQJH2UNZ.mjs} +5 -5
- package/dist/lib/node-esm/chunk-AQJH2UNZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NETTSER2.mjs +17 -0
- package/dist/lib/node-esm/chunk-NETTSER2.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-T3QTQHBD.mjs +180 -0
- package/dist/lib/node-esm/chunk-T3QTQHBD.mjs.map +7 -0
- package/dist/lib/node-esm/devtools/index.mjs +3 -2
- package/dist/lib/node-esm/devtools/index.mjs.map +3 -3
- package/dist/lib/node-esm/echo/index.mjs +58 -108
- package/dist/lib/node-esm/echo/index.mjs.map +4 -4
- package/dist/lib/node-esm/halo/index.mjs +5 -3
- package/dist/lib/node-esm/halo/index.mjs.map +3 -3
- package/dist/lib/node-esm/index.mjs +114 -12
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invitations/index.mjs +1 -1
- package/dist/lib/node-esm/mesh/index.mjs +2 -1
- package/dist/lib/node-esm/mesh/index.mjs.map +1 -1
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +120 -114
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/client/AgentHostingProvider.d.ts.map +1 -1
- package/dist/types/src/client/ClientProvider.d.ts +0 -10
- package/dist/types/src/client/ClientProvider.d.ts.map +1 -1
- package/dist/types/src/echo/index.d.ts +2 -2
- package/dist/types/src/echo/index.d.ts.map +1 -1
- package/dist/types/src/echo/useMembers.d.ts +2 -2
- package/dist/types/src/echo/useMembers.d.ts.map +1 -1
- package/dist/types/src/echo/useQueue.d.ts +2 -2
- package/dist/types/src/echo/useQueue.d.ts.map +1 -1
- package/dist/types/src/echo/useSpaceInvitations.d.ts +3 -2
- package/dist/types/src/echo/useSpaceInvitations.d.ts.map +1 -1
- package/dist/types/src/echo/useSpaceProperties.d.ts +13 -0
- package/dist/types/src/echo/useSpaceProperties.d.ts.map +1 -0
- package/dist/types/src/echo/useSpaces.d.ts +17 -8
- package/dist/types/src/echo/useSpaces.d.ts.map +1 -1
- package/dist/types/src/echo/useSubscription.d.ts +1 -1
- package/dist/types/src/echo/useSubscription.d.ts.map +1 -1
- package/dist/types/src/echo/useSyncState.d.ts +1 -1
- package/dist/types/src/echo/useSyncState.d.ts.map +1 -1
- package/dist/types/src/halo/Passkey.stories.d.ts +5 -5
- package/dist/types/src/halo/Passkey.stories.d.ts.map +1 -1
- package/dist/types/src/halo/useHaloInvitations.d.ts.map +1 -1
- package/dist/types/src/invitations/useInvitationStatus.d.ts +1 -1
- package/dist/types/src/invitations/useInvitationStatus.d.ts.map +1 -1
- package/dist/types/src/testing/ClientRepeater.d.ts +6 -5
- package/dist/types/src/testing/ClientRepeater.d.ts.map +1 -1
- package/dist/types/src/testing/ClientRepeater.stories.d.ts +6 -10
- package/dist/types/src/testing/ClientRepeater.stories.d.ts.map +1 -1
- package/dist/types/src/testing/context.d.ts +4 -2
- package/dist/types/src/testing/context.d.ts.map +1 -1
- package/dist/types/src/testing/withClientProvider.d.ts +6 -10
- package/dist/types/src/testing/withClientProvider.d.ts.map +1 -1
- package/dist/types/src/testing/withClientProvider.stories.d.ts +7 -9
- package/dist/types/src/testing/withClientProvider.stories.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +4 -0
- package/package.json +43 -32
- package/src/client/AgentHostingProvider.tsx +1 -1
- package/src/client/ClientProvider.test.tsx +3 -2
- package/src/client/ClientProvider.tsx +33 -50
- package/src/client/useConfig.test.tsx +2 -1
- package/src/devtools/useStream.ts +1 -1
- package/src/echo/index.ts +2 -2
- package/src/echo/useMembers.ts +5 -3
- package/src/echo/useQueue.ts +2 -2
- package/src/echo/useSpaceInvitations.ts +11 -5
- package/src/echo/useSpaceProperties.ts +28 -0
- package/src/echo/useSpaces.test.tsx +3 -2
- package/src/echo/useSpaces.ts +37 -20
- package/src/echo/useSubscription.ts +1 -1
- package/src/echo/useSyncState.ts +3 -3
- package/src/halo/Passkey.stories.tsx +16 -13
- package/src/halo/useDevices.test.tsx +2 -1
- package/src/halo/useHaloInvitations.ts +1 -1
- package/src/invitations/useInvitationStatus.ts +9 -8
- package/src/playwright/playwright.config.ts +1 -1
- package/src/testing/ClientRepeater.stories.tsx +20 -11
- package/src/testing/ClientRepeater.tsx +29 -36
- package/src/testing/context.tsx +4 -3
- package/src/testing/withClientProvider.stories.tsx +25 -16
- package/src/testing/withClientProvider.tsx +81 -64
- package/tsconfig.json +3 -6
- package/vitest.config.ts +12 -16
- package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
- package/dist/lib/browser/chunk-AAR7V3KL.mjs +0 -312
- package/dist/lib/browser/chunk-AAR7V3KL.mjs.map +0 -7
- package/dist/lib/browser/chunk-O5SEVDJG.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-TU2JJLZK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZTD6HPV2.mjs +0 -314
- package/dist/lib/node-esm/chunk-ZTD6HPV2.mjs.map +0 -7
- package/dist/types/src/echo/useQuery.d.ts +0 -11
- package/dist/types/src/echo/useQuery.d.ts.map +0 -1
- package/dist/types/src/echo/useQuery.test.d.ts +0 -2
- package/dist/types/src/echo/useQuery.test.d.ts.map +0 -1
- package/dist/types/src/echo/useSchema.d.ts +0 -8
- package/dist/types/src/echo/useSchema.d.ts.map +0 -1
- package/src/echo/useQuery.test.tsx +0 -128
- package/src/echo/useQuery.ts +0 -56
- package/src/echo/useSchema.ts +0 -54
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React, { useCallback } from 'react';
|
|
8
7
|
|
|
9
8
|
import { Config, PublicKey } from '@dxos/client';
|
|
10
9
|
import { invariant } from '@dxos/invariant';
|
|
11
10
|
import { log } from '@dxos/log';
|
|
12
11
|
import { Button } from '@dxos/react-ui';
|
|
12
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
13
13
|
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
14
|
-
import { withTheme } from '@dxos/storybook-utils';
|
|
15
14
|
|
|
16
|
-
import { useCredentials } from './useCredentials';
|
|
17
|
-
import { useIdentity } from './useIdentity';
|
|
18
15
|
import { useClient } from '../client';
|
|
19
16
|
import { withClientProvider } from '../testing';
|
|
20
17
|
|
|
18
|
+
import { useCredentials } from './useCredentials';
|
|
19
|
+
import { useIdentity } from './useIdentity';
|
|
20
|
+
|
|
21
21
|
const getNewChallenge = () => Math.random().toString(36).substring(2);
|
|
22
22
|
|
|
23
23
|
const Test = () => {
|
|
@@ -43,7 +43,7 @@ const Test = () => {
|
|
|
43
43
|
challenge: new TextEncoder().encode(challenge),
|
|
44
44
|
rp: { id: location.hostname, name: 'Test' },
|
|
45
45
|
user: {
|
|
46
|
-
id: lookupKey.asUint8Array()
|
|
46
|
+
id: lookupKey.asUint8Array() as Uint8Array<ArrayBuffer>,
|
|
47
47
|
name: identity.did,
|
|
48
48
|
displayName: identity.profile?.displayName ?? '',
|
|
49
49
|
},
|
|
@@ -125,11 +125,6 @@ const Test = () => {
|
|
|
125
125
|
);
|
|
126
126
|
};
|
|
127
127
|
|
|
128
|
-
export default {
|
|
129
|
-
title: 'sdk/react-client/Passkeys',
|
|
130
|
-
render: Test,
|
|
131
|
-
};
|
|
132
|
-
|
|
133
128
|
const config = new Config({
|
|
134
129
|
runtime: {
|
|
135
130
|
client: {
|
|
@@ -150,6 +145,14 @@ const config = new Config({
|
|
|
150
145
|
},
|
|
151
146
|
});
|
|
152
147
|
|
|
153
|
-
|
|
148
|
+
const meta = {
|
|
149
|
+
title: 'sdk/react-client/Passkeys',
|
|
150
|
+
render: Test,
|
|
154
151
|
decorators: [withClientProvider({ config }), withTheme],
|
|
155
|
-
};
|
|
152
|
+
} satisfies Meta;
|
|
153
|
+
|
|
154
|
+
export default meta;
|
|
155
|
+
|
|
156
|
+
type Story = StoryObj<typeof meta>;
|
|
157
|
+
|
|
158
|
+
export const Default: Story = {};
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
import { renderHook } from '@testing-library/react';
|
|
6
6
|
import { describe, expect, test } from 'vitest';
|
|
7
7
|
|
|
8
|
-
import { useDevices } from './useDevices';
|
|
9
8
|
import { createClient, createClientContextProvider } from '../testing/util';
|
|
10
9
|
|
|
10
|
+
import { useDevices } from './useDevices';
|
|
11
|
+
|
|
11
12
|
describe('useDevices', () => {
|
|
12
13
|
test('lists existing devices', async () => {
|
|
13
14
|
const { client } = await createClient({ createIdentity: true });
|
|
@@ -7,7 +7,7 @@ import { useMemo } from 'react';
|
|
|
7
7
|
import { useMulticastObservable } from '@dxos/react-hooks';
|
|
8
8
|
|
|
9
9
|
import { useClient } from '../client';
|
|
10
|
-
import {
|
|
10
|
+
import { type CancellableInvitationObservable, useInvitationStatus } from '../invitations';
|
|
11
11
|
|
|
12
12
|
export const useHaloInvitations = (): CancellableInvitationObservable[] => {
|
|
13
13
|
const client = useClient();
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { useCallback, useEffect, useMemo, useReducer } from 'react';
|
|
6
6
|
|
|
7
7
|
import { type PublicKey } from '@dxos/client';
|
|
8
8
|
import {
|
|
@@ -24,9 +24,10 @@ interface InvitationReducerState {
|
|
|
24
24
|
status: Invitation.State; // TODO(burdon): Rename state.
|
|
25
25
|
haltedAt?: Invitation.State;
|
|
26
26
|
result: InvitationResult;
|
|
27
|
-
error?:
|
|
27
|
+
error?: Error;
|
|
28
28
|
id?: string;
|
|
29
29
|
multiUse?: boolean;
|
|
30
|
+
shareable?: boolean;
|
|
30
31
|
invitationCode?: string;
|
|
31
32
|
authCode?: string;
|
|
32
33
|
authMethod?: Invitation.AuthMethod;
|
|
@@ -72,7 +73,7 @@ export type InvitationStatus = {
|
|
|
72
73
|
multiUse?: boolean;
|
|
73
74
|
shareable?: boolean;
|
|
74
75
|
result: InvitationResult;
|
|
75
|
-
error?:
|
|
76
|
+
error?: Error;
|
|
76
77
|
cancel(): void;
|
|
77
78
|
// TODO(wittjosiah): Remove?
|
|
78
79
|
connect(observable: CancellableInvitationObservable): void;
|
|
@@ -82,11 +83,11 @@ export type InvitationStatus = {
|
|
|
82
83
|
// Without private key, the invitation code cannot be created.
|
|
83
84
|
// These invitations are only available to be accepted but not shared.
|
|
84
85
|
const isShareableInvitation = (invitation: Invitation) =>
|
|
85
|
-
invitation.authMethod !== Invitation.AuthMethod.KNOWN_PUBLIC_KEY || invitation.guestKeypair?.privateKey;
|
|
86
|
+
invitation.authMethod !== Invitation.AuthMethod.KNOWN_PUBLIC_KEY || !!invitation.guestKeypair?.privateKey;
|
|
86
87
|
|
|
87
88
|
export const useInvitationStatus = (observable?: CancellableInvitationObservable): InvitationStatus => {
|
|
88
|
-
const [state, dispatch] = useReducer
|
|
89
|
-
(prev, action) => {
|
|
89
|
+
const [state, dispatch] = useReducer(
|
|
90
|
+
(prev: InvitationReducerState, action: InvitationAction): InvitationReducerState => {
|
|
90
91
|
log('useInvitationStatus', { action });
|
|
91
92
|
const invitationProps =
|
|
92
93
|
'invitation' in action
|
|
@@ -115,10 +116,10 @@ export const useInvitationStatus = (observable?: CancellableInvitationObservable
|
|
|
115
116
|
action.status === Invitation.State.TIMEOUT) && {
|
|
116
117
|
haltedAt: typeof prev.haltedAt === 'undefined' ? action.haltedAt : prev.haltedAt,
|
|
117
118
|
}),
|
|
118
|
-
}
|
|
119
|
+
};
|
|
119
120
|
},
|
|
120
121
|
null,
|
|
121
|
-
(_arg: null) => {
|
|
122
|
+
(_arg: null): InvitationReducerState => {
|
|
122
123
|
const invitation = observable?.get();
|
|
123
124
|
return {
|
|
124
125
|
status: Invitation.State.INIT,
|
|
@@ -10,7 +10,7 @@ export default defineConfig({
|
|
|
10
10
|
...e2ePreset(import.meta.dirname),
|
|
11
11
|
// TODO(wittjosiah): Avoid hard-coding ports.
|
|
12
12
|
webServer: {
|
|
13
|
-
command: 'moon run storybook:serve-e2e -- --port=9000',
|
|
13
|
+
command: 'moon run storybook-react:serve-e2e -- --port=9000',
|
|
14
14
|
port: 9000,
|
|
15
15
|
reuseExistingServer: false,
|
|
16
16
|
},
|
|
@@ -2,22 +2,27 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React from 'react';
|
|
8
7
|
|
|
8
|
+
import { Obj } from '@dxos/echo';
|
|
9
9
|
import { Input } from '@dxos/react-ui';
|
|
10
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
10
11
|
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
11
|
-
import { withTheme } from '@dxos/storybook-utils';
|
|
12
12
|
|
|
13
|
-
import { ClientRepeater, type ClientRepeatedComponentProps } from './ClientRepeater';
|
|
14
13
|
import { useClient } from '../client';
|
|
15
14
|
import { useSpace } from '../echo';
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
import { type ClientRepeatedComponentProps, ClientRepeater } from './ClientRepeater';
|
|
17
|
+
|
|
18
|
+
const meta = {
|
|
18
19
|
title: 'sdk/react-client/ClientRepeater',
|
|
19
20
|
decorators: [withTheme],
|
|
20
|
-
}
|
|
21
|
+
} satisfies Meta<typeof Input>;
|
|
22
|
+
|
|
23
|
+
export default meta;
|
|
24
|
+
|
|
25
|
+
type Story = StoryObj<typeof meta>;
|
|
21
26
|
|
|
22
27
|
const JsonPanel = ({ value }: { value: any }) => (
|
|
23
28
|
<SyntaxHighlighter language='json'>{JSON.stringify(value, undefined, 2)}</SyntaxHighlighter>
|
|
@@ -28,9 +33,9 @@ const ClientStory = () => {
|
|
|
28
33
|
return <JsonPanel value={client.toJSON()} />;
|
|
29
34
|
};
|
|
30
35
|
|
|
31
|
-
const ClientSpace = ({
|
|
36
|
+
const ClientSpace = ({ spaceId }: ClientRepeatedComponentProps) => {
|
|
32
37
|
const client = useClient();
|
|
33
|
-
const space = useSpace(
|
|
38
|
+
const space = useSpace(spaceId);
|
|
34
39
|
if (!space?.isOpen) {
|
|
35
40
|
return null;
|
|
36
41
|
}
|
|
@@ -41,7 +46,11 @@ const ClientSpace = ({ spaceKey }: ClientRepeatedComponentProps) => {
|
|
|
41
46
|
<Input.TextInput
|
|
42
47
|
placeholder='Name'
|
|
43
48
|
value={space.properties.name}
|
|
44
|
-
onChange={(event) =>
|
|
49
|
+
onChange={(event) =>
|
|
50
|
+
Obj.change(space.properties, (p) => {
|
|
51
|
+
p.name = event.target.value;
|
|
52
|
+
})
|
|
53
|
+
}
|
|
45
54
|
/>
|
|
46
55
|
</Input.Root>
|
|
47
56
|
<JsonPanel value={client.toJSON()} />
|
|
@@ -49,10 +58,10 @@ const ClientSpace = ({ spaceKey }: ClientRepeatedComponentProps) => {
|
|
|
49
58
|
);
|
|
50
59
|
};
|
|
51
60
|
|
|
52
|
-
export const Default = {
|
|
61
|
+
export const Default: Story = {
|
|
53
62
|
render: () => <ClientRepeater component={ClientStory} count={2} />,
|
|
54
63
|
};
|
|
55
64
|
|
|
56
|
-
export const Space = {
|
|
65
|
+
export const Space: Story = {
|
|
57
66
|
render: () => <ClientRepeater component={ClientSpace} count={2} createSpace />,
|
|
58
67
|
};
|
|
@@ -2,18 +2,20 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, {
|
|
5
|
+
import React, { type FC, useRef, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import { Client
|
|
7
|
+
import { Client } from '@dxos/client';
|
|
8
8
|
import { TestBuilder, performInvitation } from '@dxos/client/testing';
|
|
9
|
-
import { type
|
|
10
|
-
import { registerSignalsRuntime } from '@dxos/echo-signals/react';
|
|
9
|
+
import { type Type } from '@dxos/echo';
|
|
11
10
|
import { faker } from '@dxos/random';
|
|
11
|
+
import { useAsyncEffect } from '@dxos/react-hooks';
|
|
12
12
|
|
|
13
|
-
import { type WithClientProviderProps } from './withClientProvider';
|
|
14
13
|
import { ClientProvider } from '../client';
|
|
14
|
+
import { type SpaceId } from '../echo';
|
|
15
|
+
|
|
16
|
+
import { type WithClientProviderProps } from './withClientProvider';
|
|
15
17
|
|
|
16
|
-
export type ClientRepeatedComponentProps = { id: number; count: number;
|
|
18
|
+
export type ClientRepeatedComponentProps = { id: number; count: number; spaceId?: SpaceId };
|
|
17
19
|
|
|
18
20
|
export type ClientRepeaterControlsProps = { clients: Client[] };
|
|
19
21
|
|
|
@@ -24,9 +26,9 @@ export type ClientRepeaterProps<P extends ClientRepeatedComponentProps> = {
|
|
|
24
26
|
controls?: FC<ClientRepeaterControlsProps>;
|
|
25
27
|
count?: number;
|
|
26
28
|
clients?: Client[];
|
|
27
|
-
types?:
|
|
29
|
+
types?: Type.Obj.Any[];
|
|
28
30
|
args?: Omit<P, 'id' | 'count'>;
|
|
29
|
-
} & Pick<WithClientProviderProps, 'createIdentity' | 'createSpace' | '
|
|
31
|
+
} & Pick<WithClientProviderProps, 'createIdentity' | 'createSpace' | 'onCreateSpace'>;
|
|
30
32
|
|
|
31
33
|
/**
|
|
32
34
|
* Utility component for Storybook stories which sets up clients for n peers.
|
|
@@ -46,41 +48,32 @@ export const ClientRepeater = <P extends ClientRepeatedComponentProps>(props: Cl
|
|
|
46
48
|
types,
|
|
47
49
|
createIdentity,
|
|
48
50
|
createSpace,
|
|
49
|
-
|
|
51
|
+
onCreateSpace,
|
|
50
52
|
} = props;
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
registerSignalsRuntime();
|
|
53
|
-
}, []);
|
|
54
53
|
|
|
55
54
|
const [clients, setClients] = useState(props.clients ?? []);
|
|
56
|
-
const [
|
|
55
|
+
const [spaceId, setSpaceId] = useState<SpaceId>();
|
|
57
56
|
|
|
58
57
|
const testBuilder = useRef(new TestBuilder());
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
await Promise.all(clients.map((client) => client.initialize()));
|
|
66
|
-
if (createIdentity || createSpace) {
|
|
67
|
-
await Promise.all(clients.map((client) => client.halo.createIdentity()));
|
|
68
|
-
}
|
|
58
|
+
useAsyncEffect(async () => {
|
|
59
|
+
const clients = [...Array(count)].map(
|
|
60
|
+
(_) => new Client({ services: testBuilder.current.createLocalClientServices(), types }),
|
|
61
|
+
);
|
|
69
62
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
await onSpaceCreated?.({ client, space }, {});
|
|
75
|
-
await Promise.all(
|
|
76
|
-
clients.slice(1).flatMap((client) => performInvitation({ host: space, guest: client.spaces })),
|
|
77
|
-
);
|
|
78
|
-
}
|
|
63
|
+
await Promise.all(clients.map((client) => client.initialize()));
|
|
64
|
+
if (createIdentity || createSpace) {
|
|
65
|
+
await Promise.all(clients.map((client) => client.halo.createIdentity()));
|
|
66
|
+
}
|
|
79
67
|
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
if (createSpace) {
|
|
69
|
+
const client = clients[0];
|
|
70
|
+
const space = await client.spaces.create({ name: faker.commerce.productName() });
|
|
71
|
+
setSpaceId(space.id);
|
|
72
|
+
await onCreateSpace?.({ client, space }, {});
|
|
73
|
+
await Promise.all(clients.slice(1).flatMap((client) => performInvitation({ host: space, guest: client.spaces })));
|
|
74
|
+
}
|
|
82
75
|
|
|
83
|
-
|
|
76
|
+
setClients(clients);
|
|
84
77
|
}, []);
|
|
85
78
|
|
|
86
79
|
if (clients.length === 0) {
|
|
@@ -92,7 +85,7 @@ export const ClientRepeater = <P extends ClientRepeatedComponentProps>(props: Cl
|
|
|
92
85
|
{Controls && <Controls clients={clients} />}
|
|
93
86
|
{clients.map((client, index) => (
|
|
94
87
|
<ClientProvider key={index} client={client}>
|
|
95
|
-
<Component id={index} count={clients.length}
|
|
88
|
+
<Component id={index} count={clients.length} spaceId={spaceId} {...{ ...props.args }} />
|
|
96
89
|
</ClientProvider>
|
|
97
90
|
))}
|
|
98
91
|
</>
|
package/src/testing/context.tsx
CHANGED
|
@@ -4,16 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
import { createContext, useContext } from 'react';
|
|
6
6
|
|
|
7
|
-
import { type Space } from '@dxos/client/echo';
|
|
7
|
+
import { type Space, type SpaceId } from '@dxos/client/echo';
|
|
8
8
|
import { raise } from '@dxos/debug';
|
|
9
9
|
|
|
10
10
|
export type ClientStory = {
|
|
11
|
+
index?: number;
|
|
12
|
+
spaceId?: SpaceId;
|
|
11
13
|
space?: Space;
|
|
12
14
|
};
|
|
13
15
|
|
|
14
|
-
// TODO(wittjosiah): Add to multi-client as well.
|
|
15
16
|
export const ClientStory = createContext<ClientStory | undefined>(undefined);
|
|
16
17
|
|
|
17
|
-
export const
|
|
18
|
+
export const useClientStory = (): ClientStory => {
|
|
18
19
|
return useContext(ClientStory) ?? raise(new Error('Missing ClientStory'));
|
|
19
20
|
};
|
|
@@ -2,24 +2,25 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React from 'react';
|
|
8
7
|
|
|
9
8
|
import { log } from '@dxos/log';
|
|
9
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
10
10
|
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
11
|
-
import {
|
|
11
|
+
import { render } from '@dxos/storybook-utils';
|
|
12
12
|
|
|
13
|
-
import { withClientProvider, type WithClientProviderProps, withMultiClientProvider } from './withClientProvider';
|
|
14
13
|
import { useClient } from '../client';
|
|
15
14
|
import { type Space, useSpaces } from '../echo';
|
|
16
15
|
|
|
16
|
+
import { type WithClientProviderProps, withClientProvider, withMultiClientProvider } from './withClientProvider';
|
|
17
|
+
|
|
17
18
|
const SpaceInfo = ({ space }: { space: Space }) => {
|
|
18
19
|
const name = space.isOpen ? space.properties.name : '';
|
|
19
20
|
return <SyntaxHighlighter language='json'>{JSON.stringify({ id: space.id, name }, null, 2)}</SyntaxHighlighter>;
|
|
20
21
|
};
|
|
21
22
|
|
|
22
|
-
const
|
|
23
|
+
const DefaultStory = () => {
|
|
23
24
|
const client = useClient();
|
|
24
25
|
const spaces = useSpaces();
|
|
25
26
|
if (!client) {
|
|
@@ -27,7 +28,7 @@ const Test = () => {
|
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
return (
|
|
30
|
-
<div className='flex flex-col
|
|
31
|
+
<div className='flex flex-col divide-y divide-separator border border-separator'>
|
|
31
32
|
<SyntaxHighlighter language='json'>{JSON.stringify(client.toJSON(), null, 2)}</SyntaxHighlighter>
|
|
32
33
|
{spaces.map((space) => (
|
|
33
34
|
<SpaceInfo key={space.id} space={space} />
|
|
@@ -36,10 +37,15 @@ const Test = () => {
|
|
|
36
37
|
);
|
|
37
38
|
};
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
const meta = {
|
|
40
41
|
title: 'sdk/react-client/withClientProvider',
|
|
41
|
-
render:
|
|
42
|
-
|
|
42
|
+
render: render(DefaultStory),
|
|
43
|
+
decorators: [withTheme],
|
|
44
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
45
|
+
|
|
46
|
+
export default meta;
|
|
47
|
+
|
|
48
|
+
type Story = StoryObj<typeof meta>;
|
|
43
49
|
|
|
44
50
|
const clientProps: WithClientProviderProps = {
|
|
45
51
|
createIdentity: true,
|
|
@@ -47,19 +53,22 @@ const clientProps: WithClientProviderProps = {
|
|
|
47
53
|
onInitialized: async (client) => {
|
|
48
54
|
log.info('onInitialized', { client });
|
|
49
55
|
},
|
|
50
|
-
|
|
51
|
-
log.info('
|
|
56
|
+
onCreateSpace: async ({ client, space }) => {
|
|
57
|
+
log.info('onCreateSpace', { client, space });
|
|
52
58
|
},
|
|
53
59
|
};
|
|
54
60
|
|
|
55
|
-
export const Default = {
|
|
56
|
-
decorators: [withClientProvider(clientProps)
|
|
61
|
+
export const Default: Story = {
|
|
62
|
+
decorators: [withClientProvider(clientProps)],
|
|
63
|
+
parameters: {
|
|
64
|
+
layout: 'centered',
|
|
65
|
+
},
|
|
57
66
|
};
|
|
58
67
|
|
|
59
|
-
export const Multiple = {
|
|
68
|
+
export const Multiple: Story = {
|
|
60
69
|
decorators: [
|
|
61
|
-
withMultiClientProvider({ ...clientProps, numClients: 3 }),
|
|
62
70
|
withTheme,
|
|
63
|
-
withLayout({ classNames:
|
|
71
|
+
withLayout({ classNames: 'grid grid-cols-3' }),
|
|
72
|
+
withMultiClientProvider({ ...clientProps, numClients: 3 }),
|
|
64
73
|
],
|
|
65
74
|
};
|