@dxos/react-client 0.8.4-main.3f58842 → 0.8.4-main.3fbcb4aa9b
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 +9 -0
- package/.storybook/preview.mts +8 -0
- package/dist/lib/browser/chunk-3LVU7RNK.mjs +16 -0
- package/dist/lib/browser/chunk-3LVU7RNK.mjs.map +7 -0
- package/dist/lib/browser/chunk-CZMIVAGI.mjs +8 -0
- package/dist/lib/browser/chunk-CZMIVAGI.mjs.map +7 -0
- package/dist/lib/browser/chunk-XT352YI6.mjs +134 -0
- package/dist/lib/browser/chunk-XT352YI6.mjs.map +7 -0
- package/dist/lib/browser/{chunk-O5SEVDJG.mjs → chunk-YHE6WD44.mjs} +5 -15
- package/dist/lib/browser/chunk-YHE6WD44.mjs.map +7 -0
- package/dist/lib/browser/devtools/index.mjs +4 -8
- package/dist/lib/browser/devtools/index.mjs.map +3 -3
- package/dist/lib/browser/echo/index.mjs +58 -127
- 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 +99 -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 +112 -155
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/chunk-CUDKNAMV.mjs +17 -0
- package/dist/lib/node-esm/chunk-CUDKNAMV.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-TU2JJLZK.mjs → chunk-RQJPEHDY.mjs} +5 -15
- package/dist/lib/node-esm/chunk-RQJPEHDY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WL3Z5HOH.mjs +135 -0
- package/dist/lib/node-esm/chunk-WL3Z5HOH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WUTK2IJF.mjs +10 -0
- package/dist/lib/node-esm/chunk-WUTK2IJF.mjs.map +7 -0
- package/dist/lib/node-esm/devtools/index.mjs +4 -8
- package/dist/lib/node-esm/devtools/index.mjs.map +3 -3
- package/dist/lib/node-esm/echo/index.mjs +58 -127
- 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 +99 -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 +112 -155
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/banner.d.ts.map +1 -1
- package/dist/types/src/client/AgentHostingProvider.d.ts.map +1 -1
- package/dist/types/src/client/ClientProvider.d.ts +1 -11
- package/dist/types/src/client/ClientProvider.d.ts.map +1 -1
- package/dist/types/src/client/useClientStatus.d.ts.map +1 -1
- package/dist/types/src/devtools/useStream.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 +3 -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 +19 -9
- 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/halo/useKeyStore.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/util.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 +8 -9
- package/dist/types/src/testing/withClientProvider.stories.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/docs/README.md +38 -38
- package/moon.yml +3 -2
- package/package.json +43 -58
- package/src/client/AgentHostingProvider.tsx +1 -1
- package/src/client/ClientProvider.test.tsx +2 -2
- package/src/client/ClientProvider.tsx +32 -50
- package/src/client/useConfig.test.tsx +1 -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 +3 -4
- package/src/echo/useSpaceInvitations.ts +10 -5
- package/src/echo/useSpaceProperties.ts +28 -0
- package/src/echo/useSpaces.test.tsx +8 -14
- package/src/echo/useSpaces.ts +32 -30
- package/src/echo/useSubscription.ts +1 -1
- package/src/echo/useSyncState.ts +5 -4
- package/src/halo/Passkey.stories.tsx +20 -20
- package/src/halo/useDevices.test.tsx +1 -1
- package/src/halo/useHaloInvitations.ts +1 -1
- package/src/invitations/useInvitationStatus.ts +9 -8
- package/src/testing/ClientRepeater.stories.tsx +22 -16
- package/src/testing/ClientRepeater.tsx +29 -37
- package/src/testing/context.tsx +4 -3
- package/src/testing/util.tsx +0 -1
- package/src/testing/withClientProvider.stories.tsx +34 -20
- package/src/testing/withClientProvider.tsx +77 -94
- package/tsconfig.json +3 -6
- package/typedoc.json +1 -1
- package/vitest.config.ts +10 -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/dist/types/src/playwright/playwright.config.d.ts +0 -3
- package/dist/types/src/playwright/playwright.config.d.ts.map +0 -1
- package/dist/types/src/playwright/smoke.spec.d.ts +0 -2
- package/dist/types/src/playwright/smoke.spec.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
- package/src/playwright/playwright.config.ts +0 -17
- package/src/playwright/smoke.spec.ts +0 -24
|
@@ -2,33 +2,33 @@
|
|
|
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';
|
|
7
|
+
import { expect, within } from 'storybook/test';
|
|
8
8
|
|
|
9
9
|
import { log } from '@dxos/log';
|
|
10
|
-
import {
|
|
11
|
-
import { withLayout, withTheme } from '@dxos/
|
|
10
|
+
import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
11
|
+
import { withLayout, withTheme, Loading } from '@dxos/react-ui/testing';
|
|
12
12
|
|
|
13
|
-
import { withClientProvider, type WithClientProviderProps, withMultiClientProvider } from './withClientProvider';
|
|
14
13
|
import { useClient } from '../client';
|
|
15
14
|
import { type Space, useSpaces } from '../echo';
|
|
15
|
+
import { type WithClientProviderProps, withClientProvider, withMultiClientProvider } from './withClientProvider';
|
|
16
16
|
|
|
17
17
|
const SpaceInfo = ({ space }: { space: Space }) => {
|
|
18
18
|
const name = space.isOpen ? space.properties.name : '';
|
|
19
|
-
return <
|
|
19
|
+
return <JsonHighlighter data={{ id: space.id, name }} />;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
const
|
|
22
|
+
const DefaultStory = () => {
|
|
23
23
|
const client = useClient();
|
|
24
24
|
const spaces = useSpaces();
|
|
25
25
|
if (!client) {
|
|
26
|
-
return
|
|
26
|
+
return <Loading data={{ client: !!client }} />;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
return (
|
|
30
|
-
<div className='flex flex-col
|
|
31
|
-
<
|
|
30
|
+
<div className='flex flex-col divide-y divide-separator border border-separator'>
|
|
31
|
+
<JsonHighlighter data={client.toJSON()} />
|
|
32
32
|
{spaces.map((space) => (
|
|
33
33
|
<SpaceInfo key={space.id} space={space} />
|
|
34
34
|
))}
|
|
@@ -36,10 +36,16 @@ const Test = () => {
|
|
|
36
36
|
);
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
const meta = {
|
|
40
40
|
title: 'sdk/react-client/withClientProvider',
|
|
41
|
-
render:
|
|
42
|
-
|
|
41
|
+
render: DefaultStory,
|
|
42
|
+
decorators: [withTheme()],
|
|
43
|
+
tags: ['test'],
|
|
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,27 @@ 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
|
+
},
|
|
66
|
+
play: async ({ canvasElement }) => {
|
|
67
|
+
const canvas = within(canvasElement);
|
|
68
|
+
const initializedText = await canvas.findByText(/"initialized": true/i, {}, { timeout: 30_000 });
|
|
69
|
+
await expect(initializedText).toBeVisible();
|
|
70
|
+
},
|
|
57
71
|
};
|
|
58
72
|
|
|
59
|
-
export const Multiple = {
|
|
73
|
+
export const Multiple: Story = {
|
|
60
74
|
decorators: [
|
|
75
|
+
withTheme(),
|
|
76
|
+
withLayout({ classNames: 'grid grid-cols-3' }),
|
|
61
77
|
withMultiClientProvider({ ...clientProps, numClients: 3 }),
|
|
62
|
-
withTheme,
|
|
63
|
-
withLayout({ classNames: ['flex gap-2'] }),
|
|
64
78
|
],
|
|
65
79
|
};
|
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { type
|
|
6
|
-
import React, {
|
|
7
|
-
import { type FallbackProps, ErrorBoundary as NativeErrorBoundary } from 'react-error-boundary';
|
|
5
|
+
import { type Decorator, type StoryContext } from '@storybook/react';
|
|
6
|
+
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
8
7
|
|
|
9
8
|
import { Trigger } from '@dxos/async';
|
|
10
9
|
import { type Client } from '@dxos/client';
|
|
11
|
-
import { type Space } from '@dxos/client/echo';
|
|
12
|
-
import {
|
|
10
|
+
import { type Space, type SpaceId } from '@dxos/client/echo';
|
|
11
|
+
import { TestBuilder, performInvitation } from '@dxos/client/testing';
|
|
13
12
|
import { log } from '@dxos/log';
|
|
13
|
+
import { ErrorBoundary } from '@dxos/react-ui';
|
|
14
14
|
import { type MaybePromise } from '@dxos/util';
|
|
15
15
|
|
|
16
|
-
import { ClientStory } from './context';
|
|
17
16
|
import { ClientProvider, type ClientProviderProps } from '../client';
|
|
17
|
+
import { ClientStory } from './context';
|
|
18
18
|
|
|
19
19
|
type InitializeProps = {
|
|
20
20
|
createIdentity?: boolean;
|
|
21
21
|
createSpace?: boolean;
|
|
22
22
|
onInitialized?: (client: Client) => MaybePromise<void>;
|
|
23
|
-
|
|
23
|
+
onCreateIdentity?: (props: { client: Client }, context: StoryContext | any) => MaybePromise<void>;
|
|
24
24
|
// NOTE: context must be untyped until ClientRepeater is removed.
|
|
25
|
-
|
|
25
|
+
onCreateSpace?: (props: { client: Client; space: Space }, context: StoryContext | any) => MaybePromise<void>;
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -30,7 +30,7 @@ type InitializeProps = {
|
|
|
30
30
|
*/
|
|
31
31
|
const initializeClient = async (
|
|
32
32
|
client: Client,
|
|
33
|
-
{ createIdentity, createSpace,
|
|
33
|
+
{ createIdentity, createSpace, onCreateIdentity, onCreateSpace, onInitialized }: InitializeProps,
|
|
34
34
|
context: StoryContext,
|
|
35
35
|
): Promise<ClientStory> => {
|
|
36
36
|
await onInitialized?.(client);
|
|
@@ -38,17 +38,18 @@ const initializeClient = async (
|
|
|
38
38
|
if (createIdentity || createSpace) {
|
|
39
39
|
if (!client.halo.identity.get()) {
|
|
40
40
|
await client.halo.createIdentity();
|
|
41
|
-
await
|
|
41
|
+
await onCreateIdentity?.({ client }, context);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
let space: Space | undefined;
|
|
46
46
|
if (createSpace) {
|
|
47
47
|
space = await client.spaces.create({ name: 'Test Space' });
|
|
48
|
-
await
|
|
48
|
+
await space.waitUntilReady(); // Is this required?
|
|
49
|
+
await onCreateSpace?.({ client, space }, context);
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
return { space };
|
|
52
|
+
return { space, spaceId: space?.id };
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
export type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps, 'onInitialized'>;
|
|
@@ -59,8 +60,8 @@ export type WithClientProviderProps = InitializeProps & Omit<ClientProviderProps
|
|
|
59
60
|
export const withClientProvider = ({
|
|
60
61
|
createIdentity,
|
|
61
62
|
createSpace,
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
onCreateSpace,
|
|
64
|
+
onCreateIdentity,
|
|
64
65
|
onInitialized,
|
|
65
66
|
...props
|
|
66
67
|
}: WithClientProviderProps = {}): Decorator => {
|
|
@@ -72,8 +73,8 @@ export const withClientProvider = ({
|
|
|
72
73
|
{
|
|
73
74
|
createIdentity,
|
|
74
75
|
createSpace,
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
onCreateSpace,
|
|
77
|
+
onCreateIdentity,
|
|
77
78
|
onInitialized,
|
|
78
79
|
},
|
|
79
80
|
context,
|
|
@@ -83,7 +84,7 @@ export const withClientProvider = ({
|
|
|
83
84
|
};
|
|
84
85
|
|
|
85
86
|
return (
|
|
86
|
-
<ErrorBoundary>
|
|
87
|
+
<ErrorBoundary name='client-provider'>
|
|
87
88
|
<ClientProvider onInitialized={handleInitialized} {...props}>
|
|
88
89
|
<ClientStory.Provider value={data}>
|
|
89
90
|
<Story />
|
|
@@ -100,105 +101,87 @@ export const withClientProvider = ({
|
|
|
100
101
|
export type WithMultiClientProviderProps = InitializeProps &
|
|
101
102
|
Omit<ClientProviderProps, 'onInitialized'> & { numClients?: number };
|
|
102
103
|
|
|
103
|
-
const MultiClientContext = createContext<{ id: number }>({ id: 0 });
|
|
104
|
-
|
|
105
|
-
export const useMultiClient = () => useContext(MultiClientContext);
|
|
106
|
-
|
|
107
104
|
/**
|
|
108
105
|
* Decorator that creates a scaffold for multiple clients.
|
|
109
106
|
* Orchestrates invitations between a randomly selected host and the remaining clients.
|
|
110
|
-
* NOTE: Should come before withLayout.
|
|
111
107
|
*/
|
|
112
108
|
export const withMultiClientProvider = ({
|
|
113
109
|
numClients = 2,
|
|
114
110
|
createIdentity,
|
|
115
111
|
createSpace,
|
|
116
|
-
|
|
117
|
-
|
|
112
|
+
onCreateSpace,
|
|
113
|
+
onCreateIdentity,
|
|
118
114
|
onInitialized,
|
|
119
115
|
...props
|
|
120
116
|
}: WithMultiClientProviderProps): Decorator => {
|
|
121
117
|
return (Story, context) => {
|
|
122
|
-
const builder = useRef(new TestBuilder());
|
|
123
|
-
const hostRef = useRef<Client>();
|
|
124
118
|
const spaceReady = useRef(new Trigger<Space | undefined>());
|
|
119
|
+
const [spaceId, setSpaceId] = useState<SpaceId>();
|
|
120
|
+
|
|
121
|
+
const clients = useMemo(() => {
|
|
122
|
+
const buidler = new TestBuilder();
|
|
123
|
+
return Array.from({ length: numClients }).map(() => {
|
|
124
|
+
return {
|
|
125
|
+
services: buidler.createLocalClientServices(),
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
}, [numClients]);
|
|
125
129
|
|
|
126
130
|
// Handle invitations.
|
|
127
131
|
// NOTE: The zeroth client isn't necessarily the first to be initialized.
|
|
128
|
-
const handleInitialized = async (client: Client, index: number) => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
132
|
+
const handleInitialized = useCallback(async (client: Client, index: number) => {
|
|
133
|
+
if (index === 0) {
|
|
134
|
+
// Initialize host.
|
|
135
|
+
const { space } = await initializeClient(
|
|
136
|
+
client,
|
|
137
|
+
{
|
|
138
|
+
createIdentity,
|
|
139
|
+
createSpace,
|
|
140
|
+
onCreateSpace,
|
|
141
|
+
onCreateIdentity,
|
|
142
|
+
onInitialized,
|
|
143
|
+
},
|
|
144
|
+
context,
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
log.info('inviting', { index, spaceId: space?.id });
|
|
148
|
+
setSpaceId(space?.id);
|
|
149
|
+
spaceReady.current.wake(space);
|
|
150
|
+
} else {
|
|
151
|
+
// Initialize guest.
|
|
152
|
+
await initializeClient(client, { createIdentity, onInitialized }, context);
|
|
153
|
+
|
|
154
|
+
log.info('waiting', { index });
|
|
155
|
+
const space = await spaceReady.current.wait();
|
|
156
|
+
if (space) {
|
|
157
|
+
log.info('joining', { index, spaceId: space.id });
|
|
158
|
+
await Promise.all(
|
|
159
|
+
performInvitation({
|
|
160
|
+
host: space,
|
|
161
|
+
guest: client.spaces,
|
|
162
|
+
}),
|
|
143
163
|
);
|
|
144
|
-
|
|
145
|
-
spaceReady.current.wake(space);
|
|
146
|
-
log.info('inviting', { index });
|
|
147
|
-
} else {
|
|
148
|
-
await initializeClient(client, { createIdentity, onInitialized }, context);
|
|
149
|
-
const space = await spaceReady.current.wait();
|
|
150
|
-
if (space) {
|
|
151
|
-
log.info('joining', { index });
|
|
152
|
-
await Promise.all(performInvitation({ host: space, guest: client.spaces }));
|
|
153
|
-
}
|
|
154
164
|
}
|
|
155
165
|
}
|
|
156
|
-
};
|
|
166
|
+
}, []);
|
|
157
167
|
|
|
158
168
|
return (
|
|
159
|
-
<
|
|
160
|
-
{
|
|
161
|
-
<
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
169
|
+
<div className='absolute inset-0 grid grid-flow-col auto-cols-fr gap-4 overflow-hidden'>
|
|
170
|
+
{clients.map((client, index) => (
|
|
171
|
+
<ClientProvider
|
|
172
|
+
key={index}
|
|
173
|
+
services={client.services}
|
|
174
|
+
onInitialized={(client) => handleInitialized(client, index)}
|
|
175
|
+
{...props}
|
|
176
|
+
>
|
|
177
|
+
<ClientStory.Provider value={{ index, spaceId }}>
|
|
178
|
+
<ErrorBoundary name='client-provider'>
|
|
179
|
+
<Story />
|
|
180
|
+
</ErrorBoundary>
|
|
181
|
+
</ClientStory.Provider>
|
|
182
|
+
</ClientProvider>
|
|
170
183
|
))}
|
|
171
|
-
</
|
|
184
|
+
</div>
|
|
172
185
|
);
|
|
173
186
|
};
|
|
174
187
|
};
|
|
175
|
-
|
|
176
|
-
const ErrorBoundary = ({ children }: PropsWithChildren) => {
|
|
177
|
-
const [error, setError] = useState<Error>();
|
|
178
|
-
useEffect(() => {
|
|
179
|
-
const handleError = (event: PromiseRejectionEvent) => {
|
|
180
|
-
setError(event.reason);
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
window.addEventListener('unhandledrejection', handleError);
|
|
184
|
-
return () => window.removeEventListener('unhandledrejection', handleError);
|
|
185
|
-
}, []);
|
|
186
|
-
|
|
187
|
-
if (error) {
|
|
188
|
-
return <ErrorFallback error={error} resetErrorBoundary={() => setError(undefined)} />;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return <NativeErrorBoundary FallbackComponent={ErrorFallback}>{children}</NativeErrorBoundary>;
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
const ErrorFallback = ({ error }: FallbackProps) => {
|
|
195
|
-
const { name, message, stack } =
|
|
196
|
-
error instanceof Error ? error : { name: 'Error', message: String(error), stack: undefined };
|
|
197
|
-
return (
|
|
198
|
-
<div role='alert' className='flex flex-col p-4 gap-4 overflow-auto'>
|
|
199
|
-
<h1 className='text-xl text-red-500'>{name}</h1>
|
|
200
|
-
<div className='text-lg'>{message}</div>
|
|
201
|
-
{stack && <pre className='whitespace-pre-wrap text-sm text-subdued'>{stack}</pre>}
|
|
202
|
-
</div>
|
|
203
|
-
);
|
|
204
|
-
};
|
package/tsconfig.json
CHANGED
|
@@ -45,16 +45,13 @@
|
|
|
45
45
|
"path": "../../core/echo/echo"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
|
-
"path": "../../core/echo/echo-
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"path": "../../core/echo/echo-signals"
|
|
48
|
+
"path": "../../core/echo/echo-react"
|
|
52
49
|
},
|
|
53
50
|
{
|
|
54
51
|
"path": "../../core/protocols"
|
|
55
52
|
},
|
|
56
53
|
{
|
|
57
|
-
"path": "../../ui/primitives/react-hooks"
|
|
54
|
+
"path": "../../ui/react-primitives/react-hooks"
|
|
58
55
|
},
|
|
59
56
|
{
|
|
60
57
|
"path": "../../ui/react-ui"
|
|
@@ -63,7 +60,7 @@
|
|
|
63
60
|
"path": "../../ui/react-ui-syntax-highlighter"
|
|
64
61
|
},
|
|
65
62
|
{
|
|
66
|
-
"path": "../../ui/
|
|
63
|
+
"path": "../../ui/ui-theme"
|
|
67
64
|
},
|
|
68
65
|
{
|
|
69
66
|
"path": "../client"
|
package/typedoc.json
CHANGED
package/vitest.config.ts
CHANGED
|
@@ -2,21 +2,15 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
6
7
|
|
|
7
|
-
import {
|
|
8
|
+
import { createConfig } from '../../../vitest.base.config';
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
test: {
|
|
17
|
-
environment,
|
|
18
|
-
// TODO(dmaretskyi): Enabled because client tests were flaky. Remove when that's not the case.
|
|
19
|
-
retry: 2,
|
|
20
|
-
},
|
|
21
|
-
}),
|
|
22
|
-
);
|
|
10
|
+
export default createConfig({
|
|
11
|
+
dirname: typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)),
|
|
12
|
+
node: {
|
|
13
|
+
environment: 'happy-dom',
|
|
14
|
+
},
|
|
15
|
+
storybook: true,
|
|
16
|
+
});
|