react-board-drawing-hook 1.0.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/README.md +246 -0
- package/dist/index.d.mts +254 -0
- package/dist/index.d.ts +254 -0
- package/dist/index.js +1524 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1505 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +76 -0
package/README.md
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# π¨ React Board Drawing Hook
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/react-board-drawing-hook)
|
|
4
|
+
[](https://www.npmjs.com/package/react-board-drawing-hook)
|
|
5
|
+
[](https://github.com/yourusername/react-board-drawing-hook/blob/main/LICENSE)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
|
|
8
|
+
React Ρ
ΡΠΊ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΠ»Π»Π°Π±ΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΡΠΈΡΠΎΠ²Π°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΈ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ WebSocket.
|
|
9
|
+
ΠΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΎΠ½Π»Π°ΠΉΠ½-Π΄ΠΎΡΠΎΠΊ, ΡΠΈΡΠΎΠ²Π°Π»ΠΎΠΊ ΠΈ real-time ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ.
|
|
10
|
+
|
|
11
|
+
## β¨ ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
|
|
12
|
+
|
|
13
|
+
- π±οΈ **ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΌΡΡΠΈ** - ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°, Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅
|
|
14
|
+
- π¨ **Π Π°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ** - ΠΊΠΈΡΡΡ, Π»ΠΈΠ½ΠΈΠΈ, ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ, ΠΊΡΡΠ³ΠΈ, ΡΠ΅ΠΊΡΡ, ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
|
|
15
|
+
- π **ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²** - ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
|
|
16
|
+
- π **ΠΡΠ±ΠΎΠΉ WebSocket** - Socket.IO, Native WebSocket, ΠΈΠ»ΠΈ ΡΠ²ΠΎΠΉ Π°Π΄Π°ΠΏΡΠ΅Ρ
|
|
17
|
+
- π¦ **TypeScript** - ΠΏΠΎΠ»Π½Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ
|
|
18
|
+
- β‘ **ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ** - ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠΈ
|
|
19
|
+
- π― **ΠΠ΅Π³ΠΊΠΈΠΉ** - 0 Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ (ΠΊΡΠΎΠΌΠ΅ React)
|
|
20
|
+
|
|
21
|
+
## π¦ Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install react-board-drawing-hook
|
|
25
|
+
# ΠΈΠ»ΠΈ
|
|
26
|
+
yarn add react-board-drawing-hook
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## π ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
|
|
30
|
+
|
|
31
|
+
### 1. ΠΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π±Π΅Π· ΡΠ΅ΡΠ²Π΅ΡΠ°
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import {
|
|
35
|
+
useBoardDrawing,
|
|
36
|
+
NativeWebSocketAdapter,
|
|
37
|
+
} from 'react-board-drawing-hook';
|
|
38
|
+
|
|
39
|
+
function Whiteboard() {
|
|
40
|
+
const canvasRef = useRef(null);
|
|
41
|
+
const wsAdapter = new NativeWebSocketAdapter('ws://localhost:8080');
|
|
42
|
+
|
|
43
|
+
const {
|
|
44
|
+
tool,
|
|
45
|
+
setTool,
|
|
46
|
+
handleMouseDown,
|
|
47
|
+
handleMouseMove,
|
|
48
|
+
handleMouseUp,
|
|
49
|
+
objects,
|
|
50
|
+
} = useBoardDrawing({
|
|
51
|
+
boardId: 'room-123',
|
|
52
|
+
userId: 1,
|
|
53
|
+
userName: 'Alice',
|
|
54
|
+
canvasRef,
|
|
55
|
+
webSocketService: wsAdapter,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<div>
|
|
60
|
+
<div className='toolbar'>
|
|
61
|
+
<button onClick={() => setTool('pen')}>βοΈ Pen</button>
|
|
62
|
+
<button onClick={() => setTool('rectangle')}>β¬ Rectangle</button>
|
|
63
|
+
<button onClick={() => setTool('circle')}>βͺ Circle</button>
|
|
64
|
+
<button onClick={() => setTool('text')}>π Text</button>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<canvas
|
|
68
|
+
ref={canvasRef}
|
|
69
|
+
width={1920}
|
|
70
|
+
height={1080}
|
|
71
|
+
style={{ width: '100%', height: '600px', border: '1px solid #ccc' }}
|
|
72
|
+
onMouseDown={handleMouseDown}
|
|
73
|
+
onMouseMove={handleMouseMove}
|
|
74
|
+
onMouseUp={handleMouseUp}
|
|
75
|
+
onMouseLeave={handleMouseUp}
|
|
76
|
+
/>
|
|
77
|
+
</div>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 2. Π‘ Socket.IO
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
import {
|
|
86
|
+
useBoardDrawing,
|
|
87
|
+
SocketIOBoardAdapter,
|
|
88
|
+
} from 'react-board-drawing-hook';
|
|
89
|
+
|
|
90
|
+
const adapter = new SocketIOBoardAdapter({
|
|
91
|
+
url: 'https://your-server.com',
|
|
92
|
+
path: '/socket.io',
|
|
93
|
+
reconnection: true,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
function App() {
|
|
97
|
+
return <Whiteboard />; // Π’ΠΎΡ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## π API
|
|
102
|
+
|
|
103
|
+
### `useBoardDrawing(props)`
|
|
104
|
+
|
|
105
|
+
#### ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
|
|
106
|
+
|
|
107
|
+
| ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ | Π’ΠΈΠΏ | ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|
|
108
|
+
| ------------------ | ------------------------------ | ------------ | ----------------- |
|
|
109
|
+
| `boardId` | `string \| number` | β
| ID Π΄ΠΎΡΠΊΠΈ |
|
|
110
|
+
| `userId` | `number` | β
| ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ |
|
|
111
|
+
| `userName` | `string` | β
| ΠΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ |
|
|
112
|
+
| `canvasRef` | `RefObject<HTMLCanvasElement>` | β
| Π‘ΡΡΠ»ΠΊΠ° Π½Π° canvas |
|
|
113
|
+
| `webSocketService` | `BoardWebSocketService` | β
| WebSocket Π°Π΄Π°ΠΏΡΠ΅Ρ |
|
|
114
|
+
| `config` | `BoardDrawingConfig` | β | ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ |
|
|
115
|
+
|
|
116
|
+
#### ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
{
|
|
120
|
+
// Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ
|
|
121
|
+
tool: DrawingTool;
|
|
122
|
+
color: string;
|
|
123
|
+
fillColor: string;
|
|
124
|
+
lineWidth: number;
|
|
125
|
+
fontSize: number;
|
|
126
|
+
isDrawing: boolean;
|
|
127
|
+
selectedObjectId: string | null;
|
|
128
|
+
interactionMode: InteractionMode;
|
|
129
|
+
objects: BoardObject[];
|
|
130
|
+
usersOnline: Array<{ id: number; name: string }>;
|
|
131
|
+
isConnected: boolean;
|
|
132
|
+
editingTextId: string | null;
|
|
133
|
+
|
|
134
|
+
// Π‘Π΅ΡΡΠ΅ΡΡ
|
|
135
|
+
setTool: (tool: DrawingTool) => void;
|
|
136
|
+
setColor: (color: string) => void;
|
|
137
|
+
setFillColor: (color: string) => void;
|
|
138
|
+
setLineWidth: (width: number) => void;
|
|
139
|
+
setFontSize: (size: number) => void;
|
|
140
|
+
setSelectedObjectId: (id: string | null) => void;
|
|
141
|
+
setEditingTextId: (id: string | null) => void;
|
|
142
|
+
|
|
143
|
+
// ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ
|
|
144
|
+
handleMouseDown: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
145
|
+
handleMouseMove: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
146
|
+
handleMouseUp: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
147
|
+
handleDoubleClick: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
148
|
+
|
|
149
|
+
// ΠΠ΅ΡΠΎΠ΄Ρ
|
|
150
|
+
deleteSelectedObject: () => void;
|
|
151
|
+
addImage: (imageUrl: string) => void;
|
|
152
|
+
updateObjectContent: (objectId: string, content: string) => void;
|
|
153
|
+
clearCanvas: () => void;
|
|
154
|
+
exportAsJSON: () => string;
|
|
155
|
+
importFromJSON: (json: string) => void;
|
|
156
|
+
redrawCanvas: () => void;
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## π§ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ²ΠΎΠ΅Π³ΠΎ Π°Π΄Π°ΠΏΡΠ΅ΡΠ°
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
import { BaseWebSocketAdapter, BoardObject } from 'react-board-drawing-hook';
|
|
164
|
+
|
|
165
|
+
class MyCustomAdapter extends BaseWebSocketAdapter {
|
|
166
|
+
connect(boardId: string | number, userId: number, userName: string) {
|
|
167
|
+
// ΠΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
disconnect() {
|
|
171
|
+
// ΠΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
createObject(object: BoardObject) {
|
|
175
|
+
// ΠΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ... ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## π― ΠΡΠΈΠΌΠ΅ΡΡ
|
|
183
|
+
|
|
184
|
+
### ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° canvas
|
|
185
|
+
|
|
186
|
+
```tsx
|
|
187
|
+
const { handleMouseDown, handleMouseMove, handleMouseUp } = useBoardDrawing({
|
|
188
|
+
// ...
|
|
189
|
+
config: {
|
|
190
|
+
canvasSize: {
|
|
191
|
+
width: 3840,
|
|
192
|
+
height: 2160,
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ½ΡΡ
ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠΉ
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
const { ... } = useBoardDrawing({
|
|
202
|
+
// ...
|
|
203
|
+
config: {
|
|
204
|
+
enableKeyboardShortcuts: false,
|
|
205
|
+
enableGlobalListeners: false
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
const { addImage } = useBoardDrawing({ ... });
|
|
214
|
+
|
|
215
|
+
// ΠΠ· input file
|
|
216
|
+
<input
|
|
217
|
+
type="file"
|
|
218
|
+
accept="image/*"
|
|
219
|
+
onChange={(e) => {
|
|
220
|
+
const file = e.target.files?.[0];
|
|
221
|
+
if (file) {
|
|
222
|
+
const url = URL.createObjectURL(file);
|
|
223
|
+
addImage(url);
|
|
224
|
+
}
|
|
225
|
+
}}
|
|
226
|
+
/>
|
|
227
|
+
|
|
228
|
+
// ΠΠΎ URL
|
|
229
|
+
<button onClick={() => addImage('https://example.com/image.jpg')}>
|
|
230
|
+
Add Image
|
|
231
|
+
</button>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## π§ͺ Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
npm test
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## π ΠΠΈΡΠ΅Π½Π·ΠΈΡ
|
|
241
|
+
|
|
242
|
+
MIT
|
|
243
|
+
|
|
244
|
+
## π€ ΠΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠΈΡ
|
|
245
|
+
|
|
246
|
+
PRs ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ! Π§ΠΈΡΠ°ΠΉΡΠ΅ [CONTRIBUTING.md](CONTRIBUTING.md)
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ΠΠΠΠ‘Π’ΠΠΠ’Π« Π₯ΠΠΠ‘Π’Π
|
|
5
|
+
*/
|
|
6
|
+
declare const CANVAS_WIDTH = 1600;
|
|
7
|
+
declare const CANVAS_HEIGHT = 900;
|
|
8
|
+
/**
|
|
9
|
+
* Π’ΠΠΠ« ΠΠΠͺΠΠΠ’ΠΠ
|
|
10
|
+
*/
|
|
11
|
+
type ObjectType = 'text' | 'image' | 'rectangle' | 'circle' | 'line' | 'pencil';
|
|
12
|
+
/**
|
|
13
|
+
* ΠΠΠ‘Π’Π Π£ΠΠΠΠ’Π« Π ΠΠ‘ΠΠΠΠΠΠ―
|
|
14
|
+
*/
|
|
15
|
+
type DrawingTool = 'select' | 'pencil' | 'line' | 'rectangle' | 'circle' | 'text' | 'eraser';
|
|
16
|
+
/**
|
|
17
|
+
* Π ΠΠΠΠΠ« ΠΠΠΠΠΠΠΠΠΠ‘Π’ΠΠΠ―
|
|
18
|
+
*/
|
|
19
|
+
type InteractionMode = 'none' | 'move' | 'rotate' | 'resize' | 'draw';
|
|
20
|
+
/**
|
|
21
|
+
* ΠΠΠ ΠΠΠ Π« ΠΠΠΠΠΠΠΠΠ― Π ΠΠΠΠΠ Π
|
|
22
|
+
*/
|
|
23
|
+
type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se' | 'n' | 's' | 'e' | 'w' | 'rotate';
|
|
24
|
+
/**
|
|
25
|
+
* Π’ΠΠ§ΠΠ ΠΠ Π₯ΠΠΠ‘Π’Π
|
|
26
|
+
*/
|
|
27
|
+
interface Point {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* ΠΠΠͺΠΠΠ’ ΠΠ ΠΠΠ‘ΠΠ (BoardObject)
|
|
33
|
+
*/
|
|
34
|
+
interface BoardObject {
|
|
35
|
+
id: string;
|
|
36
|
+
type: ObjectType;
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
width: number;
|
|
40
|
+
height: number;
|
|
41
|
+
rotation: number;
|
|
42
|
+
locked_by: number | null;
|
|
43
|
+
locked_by_name: string | null;
|
|
44
|
+
content?: string;
|
|
45
|
+
fontSize?: number;
|
|
46
|
+
color?: string;
|
|
47
|
+
imageUrl?: string;
|
|
48
|
+
aspectRatio?: number;
|
|
49
|
+
fillColor?: string;
|
|
50
|
+
strokeColor?: string;
|
|
51
|
+
strokeWidth?: number;
|
|
52
|
+
x2?: number;
|
|
53
|
+
y2?: number;
|
|
54
|
+
points?: Point[];
|
|
55
|
+
userId?: number;
|
|
56
|
+
timestamp?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* ΠΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π³ΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ Ρ
ΠΎΠ»ΡΡΠ°.
|
|
60
|
+
*/
|
|
61
|
+
declare function clampObjectToCanvas(obj: BoardObject): BoardObject;
|
|
62
|
+
/**
|
|
63
|
+
* ΠΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ.
|
|
64
|
+
*/
|
|
65
|
+
declare function canEditObject(obj: BoardObject, userId: number): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ID Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
|
|
68
|
+
*/
|
|
69
|
+
declare function generateObjectId(): string;
|
|
70
|
+
/**
|
|
71
|
+
* ΠΡΠ°ΡΠ°Π΅Ρ ΡΠΎΡΠΊΡ Π²ΠΎΠΊΡΡΠ³ ΡΠ΅Π½ΡΡΠ° Π½Π° Π·Π°Π΄Π°Π½Π½ΡΠΉ ΡΠ³ΠΎΠ».
|
|
72
|
+
*/
|
|
73
|
+
declare function rotatePoint(x: number, y: number, cx: number, cy: number, angle: number): {
|
|
74
|
+
x: number;
|
|
75
|
+
y: number;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* ΠΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π‘ Π‘ΠΠ₯Π ΠΠΠΠΠΠΠ ΠΠ ΠΠΠΠ Π¦ΠΠ.
|
|
79
|
+
*/
|
|
80
|
+
declare function resizeImageWithAspectRatio(obj: BoardObject, handle: ResizeHandle, deltaX: number, deltaY: number, original: BoardObject): BoardObject;
|
|
81
|
+
/**
|
|
82
|
+
* Π‘ΠΠΠΠΠΠΠ«Π Π ΠΠ‘ΠΠΠ Π‘ ΠΠΠΠΠΠ ΠΠΠΠ ΠΠΠ ΠΠΠΠ ΠΠ’Π
|
|
83
|
+
*/
|
|
84
|
+
declare function resizeObjectFree(obj: BoardObject, handle: ResizeHandle, deltaX: number, deltaY: number, original: BoardObject): BoardObject;
|
|
85
|
+
/**
|
|
86
|
+
* Π ΠΠ‘ΠΠΠ ΠΠΠΠΠ
|
|
87
|
+
*/
|
|
88
|
+
declare function resizeLineObject(obj: BoardObject, handle: ResizeHandle, deltaX: number, deltaY: number, original: BoardObject): BoardObject;
|
|
89
|
+
/**
|
|
90
|
+
* ΠΡΡΠΈΡΠ»ΡΠ΅Ρ Π³ΡΠ°Π½ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (Bounding Box).
|
|
91
|
+
*/
|
|
92
|
+
declare function getObjectBoundingBox(obj: BoardObject): {
|
|
93
|
+
minX: number;
|
|
94
|
+
minY: number;
|
|
95
|
+
maxX: number;
|
|
96
|
+
maxY: number;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ ΡΠΎΡΠΊΠΈ Π² ΠΏΠΎΠ²Π΅ΡΠ½ΡΡΡΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ
|
|
100
|
+
*/
|
|
101
|
+
declare function isPointInRotatedRectangle(x: number, y: number, obj: BoardObject): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΡ ΡΠΎΡΠΊΠΈ Π΄ΠΎ ΠΎΡΡΠ΅Π·ΠΊΠ°
|
|
104
|
+
*/
|
|
105
|
+
declare function distanceToLine(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number;
|
|
106
|
+
/**
|
|
107
|
+
* ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ ΡΠΎΡΠΊΠΈ Π² ΠΎΠ±ΡΠ΅ΠΊΡ
|
|
108
|
+
*/
|
|
109
|
+
declare function isPointInObject(x: number, y: number, obj: BoardObject, userId: number): boolean;
|
|
110
|
+
|
|
111
|
+
interface BoardEventHandlers {
|
|
112
|
+
onConnectionChange?: (connected: boolean) => void;
|
|
113
|
+
onObjectLocked?: (objectId: string, userId: number, userName: string) => void;
|
|
114
|
+
onObjectUnlocked?: (objectId: string) => void;
|
|
115
|
+
onObjectCreated?: (object: BoardObject) => void;
|
|
116
|
+
onObjectUpdated?: (object: BoardObject) => void;
|
|
117
|
+
onObjectDeleted?: (objectId: string) => void;
|
|
118
|
+
onUserJoined?: (userId: number, userName: string) => void;
|
|
119
|
+
onUserLeft?: (userId: number, userName: string) => void;
|
|
120
|
+
onError?: (error: Error, context?: any) => void;
|
|
121
|
+
}
|
|
122
|
+
interface BoardWebSocketService {
|
|
123
|
+
connect(boardId: string | number, userId: number, userName: string): void;
|
|
124
|
+
disconnect(): void;
|
|
125
|
+
isConnected(): boolean;
|
|
126
|
+
createObject(object: BoardObject): void;
|
|
127
|
+
updateObject(object: BoardObject): void;
|
|
128
|
+
deleteObject(objectId: string): void;
|
|
129
|
+
lockObject(objectId: string): void;
|
|
130
|
+
unlockObject(objectId: string): void;
|
|
131
|
+
setEventHandlers(handlers: BoardEventHandlers): void;
|
|
132
|
+
}
|
|
133
|
+
declare abstract class BaseWebSocketAdapter implements BoardWebSocketService {
|
|
134
|
+
protected handlers: BoardEventHandlers;
|
|
135
|
+
protected connected: boolean;
|
|
136
|
+
abstract connect(boardId: string | number, userId: number, userName: string): void;
|
|
137
|
+
abstract disconnect(): void;
|
|
138
|
+
abstract createObject(object: BoardObject): void;
|
|
139
|
+
abstract updateObject(object: BoardObject): void;
|
|
140
|
+
abstract deleteObject(objectId: string): void;
|
|
141
|
+
abstract lockObject(objectId: string): void;
|
|
142
|
+
abstract unlockObject(objectId: string): void;
|
|
143
|
+
isConnected(): boolean;
|
|
144
|
+
setEventHandlers(handlers: BoardEventHandlers): void;
|
|
145
|
+
protected handleError(error: Error, context?: any): void;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
interface UseBoardDrawingProps {
|
|
149
|
+
boardId: string | number;
|
|
150
|
+
userId: number;
|
|
151
|
+
userName: string;
|
|
152
|
+
canvasRef: React.RefObject<HTMLCanvasElement | null>;
|
|
153
|
+
webSocketService: BoardWebSocketService;
|
|
154
|
+
onObjectsUpdated?: (objects: BoardObject[]) => void;
|
|
155
|
+
onObjectLocked?: (objectId: string, userId: number, userName: string) => void;
|
|
156
|
+
onObjectUnlocked?: (objectId: string) => void;
|
|
157
|
+
onUserJoined?: (userId: number, userName: string) => void;
|
|
158
|
+
onUserLeft?: (userId: number, userName: string) => void;
|
|
159
|
+
config?: {
|
|
160
|
+
enableKeyboardShortcuts?: boolean;
|
|
161
|
+
enableGlobalListeners?: boolean;
|
|
162
|
+
maxImageSize?: number;
|
|
163
|
+
defaultColors?: {
|
|
164
|
+
stroke?: string;
|
|
165
|
+
fill?: string;
|
|
166
|
+
lineWidth?: number;
|
|
167
|
+
fontSize?: number;
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
declare const useBoardDrawing: ({ boardId, userId, userName, canvasRef, webSocketService, onObjectLocked, onObjectUnlocked, onUserJoined, onUserLeft, config, }: UseBoardDrawingProps) => {
|
|
172
|
+
tool: DrawingTool;
|
|
173
|
+
color: string;
|
|
174
|
+
fillColor: string;
|
|
175
|
+
lineWidth: number;
|
|
176
|
+
fontSize: number;
|
|
177
|
+
isDrawing: boolean;
|
|
178
|
+
selectedObjectId: string | null;
|
|
179
|
+
interactionMode: InteractionMode;
|
|
180
|
+
objects: BoardObject[];
|
|
181
|
+
usersOnline: {
|
|
182
|
+
id: number;
|
|
183
|
+
name: string;
|
|
184
|
+
}[];
|
|
185
|
+
isConnected: boolean;
|
|
186
|
+
editingTextId: string | null;
|
|
187
|
+
setTool: react.Dispatch<react.SetStateAction<DrawingTool>>;
|
|
188
|
+
setColor: react.Dispatch<react.SetStateAction<string>>;
|
|
189
|
+
setFillColor: react.Dispatch<react.SetStateAction<string>>;
|
|
190
|
+
setLineWidth: react.Dispatch<react.SetStateAction<number>>;
|
|
191
|
+
setFontSize: react.Dispatch<react.SetStateAction<number>>;
|
|
192
|
+
setSelectedObjectId: react.Dispatch<react.SetStateAction<string | null>>;
|
|
193
|
+
setEditingTextId: react.Dispatch<react.SetStateAction<string | null>>;
|
|
194
|
+
handleMouseDown: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
195
|
+
handleMouseMove: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
196
|
+
handleMouseUp: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
197
|
+
handleDoubleClick: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
198
|
+
deleteSelectedObject: () => void;
|
|
199
|
+
addImage: (imageUrl: string) => void;
|
|
200
|
+
updateObjectContent: (objectId: string, content: string) => void;
|
|
201
|
+
clearCanvas: () => void;
|
|
202
|
+
exportAsJSON: () => string;
|
|
203
|
+
importFromJSON: (json: string) => void;
|
|
204
|
+
redrawCanvas: () => void;
|
|
205
|
+
};
|
|
206
|
+
declare global {
|
|
207
|
+
interface CanvasRenderingContext2D {
|
|
208
|
+
roundRect(x: number, y: number, w: number, h: number, r: number): CanvasRenderingContext2D;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
declare class NativeWebSocketAdapter extends BaseWebSocketAdapter {
|
|
213
|
+
private ws;
|
|
214
|
+
private url;
|
|
215
|
+
private reconnectAttempts;
|
|
216
|
+
private maxReconnectAttempts;
|
|
217
|
+
private reconnectTimeout;
|
|
218
|
+
constructor(url: string);
|
|
219
|
+
connect(boardId: string | number, userId: number, userName: string): void;
|
|
220
|
+
private attemptReconnect;
|
|
221
|
+
private handleMessage;
|
|
222
|
+
disconnect(): void;
|
|
223
|
+
private send;
|
|
224
|
+
createObject(object: BoardObject): void;
|
|
225
|
+
updateObject(object: BoardObject): void;
|
|
226
|
+
deleteObject(objectId: string): void;
|
|
227
|
+
lockObject(objectId: string): void;
|
|
228
|
+
unlockObject(objectId: string): void;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
interface SocketIOAdapterConfig {
|
|
232
|
+
url: string;
|
|
233
|
+
path?: string;
|
|
234
|
+
transports?: string[];
|
|
235
|
+
reconnection?: boolean;
|
|
236
|
+
reconnectionAttempts?: number;
|
|
237
|
+
reconnectionDelay?: number;
|
|
238
|
+
}
|
|
239
|
+
declare class SocketIOBoardAdapter extends BaseWebSocketAdapter {
|
|
240
|
+
private socket;
|
|
241
|
+
private config;
|
|
242
|
+
constructor(config: SocketIOAdapterConfig);
|
|
243
|
+
connect(boardId: string | number, userId: number, userName: string): void;
|
|
244
|
+
disconnect(): void;
|
|
245
|
+
createObject(object: BoardObject): void;
|
|
246
|
+
updateObject(object: BoardObject): void;
|
|
247
|
+
deleteObject(objectId: string): void;
|
|
248
|
+
lockObject(objectId: string): void;
|
|
249
|
+
unlockObject(objectId: string): void;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
declare const VERSION = "1.0.0";
|
|
253
|
+
|
|
254
|
+
export { BaseWebSocketAdapter, BoardEventHandlers, BoardObject, BoardWebSocketService, CANVAS_HEIGHT, CANVAS_WIDTH, DrawingTool, InteractionMode, NativeWebSocketAdapter, ObjectType, Point, ResizeHandle, SocketIOAdapterConfig, SocketIOBoardAdapter, UseBoardDrawingProps, VERSION, canEditObject, clampObjectToCanvas, distanceToLine, generateObjectId, getObjectBoundingBox, isPointInObject, isPointInRotatedRectangle, resizeImageWithAspectRatio, resizeLineObject, resizeObjectFree, rotatePoint, useBoardDrawing };
|