Skip to content

Commit 8c631b1

Browse files
authored
✨ feat: Awareness support user config,remove large dependency & unnecessary components (#157)
* ♻️ refactor: DataPreviewer * ♻️ refactor: remove unnecessary large dependency * 📸 chore: update snapshot * ⚰️ chore: remove datafill * ✨ feat: Awareness support user config * 📸 chore: update snapshot * 🐛 fix: ts error * 🐛 fix: use state updater fix * 🐛 fix: DataPreviewer * ♻️ refactor: 删除暂时不需要的组件 * ♻️ refactor: 迁移 TipGuide * ➖ chore: remove prettier to dev dependencies * 📸 chore: update snapshot * 📝 docs: 调整文档 * ✏️ fix: ahooks version
1 parent 4125577 commit 8c631b1

84 files changed

Lines changed: 758 additions & 10673 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/pro-editor/demos/controlledPresence.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*/
44
import { demoAssets } from '@/ComponentAsset/demoAssets';
55
import { AwarenessEditor, ComponentAsset, ProBuilder } from '@/index';
6-
import { JsonViewer } from '@textea/json-viewer';
6+
import { Highlight } from '@ant-design/pro-editor';
77
import { useLocalStorageState } from 'ahooks';
88
import { Flexbox } from 'react-layout-kit';
99

@@ -22,7 +22,7 @@ export default () => {
2222
/>
2323
<Flexbox>
2424
当前视图状态:
25-
<JsonViewer value={presence} />
25+
<Highlight>{JSON.stringify(presence, null, 2)}</Highlight>
2626
</Flexbox>
2727
</Flexbox>
2828
);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { ColorPicker, Form, Input, Modal } from 'antd';
2+
import React from 'react';
3+
4+
interface Values {
5+
name: string;
6+
color: string;
7+
}
8+
9+
interface SessionFormProps {
10+
open: boolean;
11+
onCreate: (values: Values) => void;
12+
onCancel: () => void;
13+
}
14+
15+
export const SessionForm: React.FC<SessionFormProps> = ({ open, onCreate, onCancel }) => {
16+
const [form] = Form.useForm();
17+
return (
18+
<Modal
19+
open={open}
20+
title="Join Session"
21+
okText="Join"
22+
onCancel={onCancel}
23+
onOk={() => {
24+
form
25+
.validateFields()
26+
.then(({ color, name }) => {
27+
form.resetFields();
28+
const colorHex = typeof color === 'string' ? color : color?.toHexString();
29+
onCreate({ color: colorHex, name });
30+
})
31+
.catch((info) => {
32+
console.log('Validate Failed:', info);
33+
});
34+
}}
35+
>
36+
<Form form={form} layout="vertical" name="form_in_modal" initialValues={{ color: '#1677FF' }}>
37+
<Form.Item
38+
name="name"
39+
label="Name"
40+
rules={[{ required: true, message: 'Please input your name' }]}
41+
>
42+
<Input />
43+
</Form.Item>
44+
<Form.Item
45+
name="color"
46+
label="Color"
47+
rules={[{ required: true, message: 'Please select your color' }]}
48+
>
49+
<ColorPicker format="hex" />
50+
</Form.Item>
51+
</Form>
52+
</Modal>
53+
);
54+
};

docs/pro-editor/demos/realtimeCollaboration/demo.tsx

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
/**
2+
* title: 实时协同
3+
* description: 打开多个窗口,点击 "Join" 加入协作
4+
*/
15
import { Awareness } from '@ant-design/pro-editor';
26
import { Button, Divider, Input } from 'antd';
3-
import { memo } from 'react';
7+
import { memo, useState } from 'react';
48
import { WebrtcProvider } from 'y-webrtc';
5-
6-
import { createStore, doc, Provider, useStore } from './store';
9+
import { SessionForm } from './SessionForm';
10+
import { Provider, createStore, doc, useStore } from './store';
711

812
const App = memo(() => {
913
const store = useStore((state) => ({
@@ -30,11 +34,38 @@ const App = memo(() => {
3034
);
3135
});
3236

33-
const Container = () => (
34-
<Provider createStore={createStore}>
35-
<Awareness provider={new WebrtcProvider('test-room', doc)} />
36-
<App />
37-
</Provider>
38-
);
37+
const Container = () => {
38+
const [user, setUser] = useState(null);
39+
const [open, setOpen] = useState(false);
40+
41+
const onCreate = (values) => {
42+
setUser(values);
43+
setOpen(false);
44+
};
45+
46+
return (
47+
<Provider createStore={createStore}>
48+
{user ? null : (
49+
<Button
50+
type="primary"
51+
onClick={() => {
52+
setOpen(true);
53+
}}
54+
>
55+
Join
56+
</Button>
57+
)}
58+
<SessionForm
59+
open={open}
60+
onCreate={onCreate}
61+
onCancel={() => {
62+
setOpen(false);
63+
}}
64+
/>
65+
{user ? <Awareness provider={new WebrtcProvider('test-room', doc)} user={user} /> : null}
66+
<App />
67+
</Provider>
68+
);
69+
};
3970

4071
export default memo(Container);

package.json

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,15 @@
6060
},
6161
"dependencies": {
6262
"@ant-design/icons": "^5.2.6",
63-
"@antv/dw-random": "^1.1.7",
64-
"@babel/runtime": "^7.23.6",
63+
"@babel/runtime": "^7.23.8",
6564
"@dnd-kit/core": "^6.1.0",
6665
"@dnd-kit/modifiers": "^6.0.1",
6766
"@dnd-kit/sortable": "^7.0.2",
6867
"@dnd-kit/utilities": "^3.2.2",
6968
"@emotion/styled": "^11.11.0",
70-
"@faker-js/faker": "^7.6.0",
7169
"@floating-ui/react": "^0.24.8",
72-
"@mui/material": "^5.15.1",
73-
"@textea/json-viewer": "^3.2.3",
74-
"ahooks": "^3.7.8",
75-
"classnames": "^2.3.2",
70+
"ahooks": "3.7.8",
71+
"classnames": "^2.5.1",
7672
"color": "^4.2.3",
7773
"copy-to-clipboard": "^3.3.3",
7874
"diff": "^5.1.0",
@@ -91,54 +87,50 @@
9187
"lodash.union": "^4.6.0",
9288
"lodash.unionby": "^4.8.0",
9389
"lodash.uniq": "^4.5.0",
94-
"mockjs": "^1.1.0",
9590
"nanoid": "^5.0.4",
9691
"polished": "^4.2.2",
97-
"prettier": "^2.8.8",
9892
"rc-util": "^5.38.1",
9993
"re-resizable": "^6.9.11",
100-
"react-colorful": "^5.6.1",
10194
"react-copy-to-clipboard": "^5.1.0",
102-
"react-hotkeys-hook": "^4.4.1",
95+
"react-hotkeys-hook": "^4.4.4",
10396
"react-layout-kit": "^1.7.4",
10497
"react-markdown": "^8.0.7",
10598
"react-rnd": "^10.4.1",
106-
"react-virtualized-auto-sizer": "^1.0.20",
10799
"react-window": "^1.8.10",
108-
"reactflow": "^11.10.1",
100+
"reactflow": "^11.10.2",
109101
"rehype-katex": "^6.0.3",
110102
"remark-gfm": "^3.0.1",
111103
"remark-math": "^5.1.1",
112104
"rxjs": "^7.8.1",
113105
"shikiji": "^0.6.13",
114106
"type-fest": "^3.13.1",
115107
"use-merge-value": "^1.2.0",
116-
"yjs": "^13.6.10",
117-
"zustand": "^4.4.7",
108+
"yjs": "^13.6.11",
109+
"zustand": "^4.5.0",
118110
"zustand-middleware-yjs": "^1.3.1",
119-
"zustand-utils": "^1.3.1"
111+
"zustand-utils": "^1.3.2"
120112
},
121113
"devDependencies": {
122114
"@ant-design/leva-panel": "^1.0.0",
123115
"@emotion/jest": "^11.11.0",
124116
"@lobehub/i18n-cli": "^1.15.3",
125-
"@testing-library/jest-dom": "^6.1.5",
117+
"@testing-library/jest-dom": "^6.3.0",
126118
"@testing-library/react": "^13.4.0",
127-
"@testing-library/user-event": "^14.5.1",
119+
"@testing-library/user-event": "^14.5.2",
128120
"@types/color": "^3.0.6",
129121
"@types/json-schema": "^7.0.15",
130-
"@types/react": "^18.2.45",
122+
"@types/react": "^18.2.48",
131123
"@types/react-dom": "^18.2.18",
132124
"@types/react-window": "^1.8.8",
133-
"@umijs/lint": "^4.0.90",
125+
"@umijs/lint": "^4.1.1",
134126
"@vitest/coverage-v8": "latest",
135-
"antd": "^5.12.5",
127+
"antd": "~5.12.0",
136128
"antd-style": "^3.6.1",
137129
"babel-plugin-antd-style": "^1.0.4",
138130
"commitlint": "^17.8.1",
139131
"commitlint-config-gitmoji": "^2.3.1",
140132
"conventional-changelog-gitmoji-config": "^1.5.2",
141-
"dumi": "^2.2.16",
133+
"dumi": "^2.2.17",
142134
"dumi-theme-antd-style": "latest",
143135
"eslint": "^8.56.0",
144136
"father": "^4.3.8",
@@ -147,11 +139,12 @@
147139
"husky": "^8.0.3",
148140
"jsdom": "^22.1.0",
149141
"lint-staged": "^13.3.0",
142+
"prettier": "^2.8.8",
150143
"prettier-plugin-organize-imports": "^3.2.4",
151-
"prettier-plugin-packagejson": "^2.4.7",
144+
"prettier-plugin-packagejson": "^2.4.9",
152145
"react": "^18.2.0",
153146
"react-dom": "^18.2.0",
154-
"rehype-raw": "^6.0.0",
147+
"rehype-raw": "^6.1.1",
155148
"rxjs-spy": "^8.0.2",
156149
"semantic-release": "^21.1.2",
157150
"semantic-release-config-gitmoji": "^1.5.3",
@@ -160,8 +153,8 @@
160153
"vitest": "latest",
161154
"wait-on": "^6.0.1",
162155
"y-protocols": "^1.0.6",
163-
"y-webrtc": "^10.2.6",
164-
"y-websocket": "^1.5.1",
156+
"y-webrtc": "^10.3.0",
157+
"y-websocket": "^1.5.3",
165158
"zundo": "beta"
166159
},
167160
"peerDependencies": {

src/Awareness/Avatars/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Avatar as A } from 'antd';
22
import { memo } from 'react';
33
import { shallow } from 'zustand/shallow';
4-
54
import { useStore } from '../store';
65
import Avatar from './Avatar';
76

src/Awareness/Awareness.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { memo } from 'react';
22
import type { WebrtcProvider } from 'y-webrtc';
3-
43
import Avatars from './Avatars';
54
import Cursors from './Cursors';
6-
7-
import { createStore, Provider } from './store';
5+
import { createStore, Provider, User } from './store';
86

97
export interface AwarenessProps {
108
/**
@@ -19,10 +17,14 @@ export interface AwarenessProps {
1917
* 是否显示用户游标
2018
*/
2119
cursors?: boolean;
20+
/**
21+
* 用户名和颜色设置
22+
*/
23+
user: Pick<User, 'color' | 'name'>;
2224
}
2325

24-
const Awareness = memo<AwarenessProps>(({ provider, avatars = true, cursors = true }) => (
25-
<Provider createStore={() => createStore(provider)}>
26+
const Awareness = memo<AwarenessProps>(({ provider, avatars = true, cursors = true, user }) => (
27+
<Provider createStore={() => createStore(provider, user)}>
2628
{cursors && <Cursors />}
2729
{avatars && <Avatars />}
2830
</Provider>

src/Awareness/Cursors/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { useStore } from '../store';
88

99
const Cursors = memo(() => {
1010
const awarenessStates = useStore<AwarenessState[]>(
11-
(s) => s.awarenessStates?.filter((a) => a.active && a.user.name !== s.currentUser),
11+
(s) => s.awarenessStates?.filter((a) => a.active && a.user.id !== s.currentUser.id),
1212
isEqual,
1313
);
1414

src/Awareness/store.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
// FIXME:这里理论上不应该使用 faker 的,后续需要重构优化掉
2-
import { faker } from '@faker-js/faker';
32
import isEqual from 'fast-deep-equal';
3+
import { nanoid } from 'nanoid';
44
import { useEffect } from 'react';
55
import type { Position } from 'react-rnd';
66
import type { Awareness } from 'y-protocols/awareness';
77
import type { WebrtcProvider } from 'y-webrtc';
88
import type { StoreApi } from 'zustand';
99
import { createContext } from 'zustand-utils';
1010
import { createWithEqualityFn } from 'zustand/traditional';
11-
1211
import { useAwarenessEvent } from './event';
1312

1413
export interface User {
@@ -26,19 +25,22 @@ export interface AwarenessState {
2625
interface ProviderStore {
2726
provider: WebrtcProvider;
2827
awareness?: Awareness;
29-
currentUser: string;
28+
currentUser: User;
3029
awarenessStates: AwarenessState[];
3130
followUser?: string;
3231

3332
setFollowUser: (id: string) => void;
3433
}
3534

36-
export const createStore = (provider: WebrtcProvider) => {
35+
export const createStore = (provider: WebrtcProvider, user: Pick<User, 'color' | 'name'>) => {
3736
const useStore = createWithEqualityFn<ProviderStore>((set) => {
3837
return {
3938
provider,
4039
awareness: provider.awareness,
41-
currentUser: faker.name.fullName(),
40+
currentUser: {
41+
id: nanoid(),
42+
...user,
43+
},
4244
awarenessStates: [],
4345

4446
setFollowUser: (followUser) => {
@@ -68,11 +70,7 @@ export const createStore = (provider: WebrtcProvider) => {
6870
});
6971

7072
// 再初始化一轮用户
71-
awareness.setLocalStateField('user', {
72-
id: useStore.getState().currentUser,
73-
name: useStore.getState().currentUser,
74-
color: faker.color.rgb(),
75-
});
73+
awareness.setLocalStateField('user', useStore.getState().currentUser);
7674

7775
awareness.setLocalStateField('active', true);
7876
// eslint-disable-next-line react-hooks/exhaustive-deps

src/CollapseTitle/demos/basic.tsx

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/CollapseTitle/demos/defaultexpand.tsx

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)