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/dist/index.d.ts
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 };
|