@yorab/react-paint 0.2.2
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/Changelog.md +26 -0
- package/README.md +99 -0
- package/dist/components/App.d.ts +20 -0
- package/dist/components/App.js +533 -0
- package/dist/components/Canvas.d.ts +28 -0
- package/dist/components/Canvas.js +188 -0
- package/dist/components/common/Button.d.ts +14 -0
- package/dist/components/common/Button.js +97 -0
- package/dist/components/common/Loading.d.ts +6 -0
- package/dist/components/common/Loading.js +66 -0
- package/dist/components/common/Modal.d.ts +8 -0
- package/dist/components/common/Modal.js +41 -0
- package/dist/components/common/Panel.d.ts +10 -0
- package/dist/components/common/Panel.js +48 -0
- package/dist/components/common/Snackbar.d.ts +7 -0
- package/dist/components/common/Snackbar.js +75 -0
- package/dist/components/settings/ColorField.d.ts +12 -0
- package/dist/components/settings/ColorField.js +128 -0
- package/dist/components/settings/DeleteButton.d.ts +9 -0
- package/dist/components/settings/DeleteButton.js +36 -0
- package/dist/components/settings/FontFamilyField.d.ts +10 -0
- package/dist/components/settings/FontFamilyField.js +57 -0
- package/dist/components/settings/LayoutButton.d.ts +8 -0
- package/dist/components/settings/LayoutButton.js +37 -0
- package/dist/components/settings/Layouts.d.ts +18 -0
- package/dist/components/settings/Layouts.js +218 -0
- package/dist/components/settings/LineArrowField.d.ts +10 -0
- package/dist/components/settings/LineArrowField.js +59 -0
- package/dist/components/settings/LineTypeField.d.ts +14 -0
- package/dist/components/settings/LineTypeField.js +57 -0
- package/dist/components/settings/PointsNumberField.d.ts +11 -0
- package/dist/components/settings/PointsNumberField.js +51 -0
- package/dist/components/settings/RangeField.d.ts +16 -0
- package/dist/components/settings/RangeField.js +90 -0
- package/dist/components/settings/SelectField.d.ts +16 -0
- package/dist/components/settings/SelectField.js +82 -0
- package/dist/components/settings/SettingsBar.d.ts +16 -0
- package/dist/components/settings/SettingsBar.js +262 -0
- package/dist/components/toolbox/EditTextBox.d.ts +10 -0
- package/dist/components/toolbox/EditTextBox.js +89 -0
- package/dist/components/toolbox/LoadFileTool.d.ts +11 -0
- package/dist/components/toolbox/LoadFileTool.js +58 -0
- package/dist/components/toolbox/MenuGroup.d.ts +23 -0
- package/dist/components/toolbox/MenuGroup.js +173 -0
- package/dist/components/toolbox/PictureUrlInput.d.ts +7 -0
- package/dist/components/toolbox/PictureUrlInput.js +96 -0
- package/dist/components/toolbox/Tool.d.ts +13 -0
- package/dist/components/toolbox/Tool.js +41 -0
- package/dist/components/toolbox/Toolbar.d.ts +20 -0
- package/dist/components/toolbox/Toolbar.js +205 -0
- package/dist/components/toolbox/ToolbarGroup.d.ts +18 -0
- package/dist/components/toolbox/ToolbarGroup.js +139 -0
- package/dist/constants/draw.d.ts +2 -0
- package/dist/constants/draw.js +10 -0
- package/dist/constants/icons.d.ts +36 -0
- package/dist/constants/icons.js +80 -0
- package/dist/constants/shapes.d.ts +5 -0
- package/dist/constants/shapes.js +14 -0
- package/dist/constants/snackbar.d.ts +11 -0
- package/dist/constants/snackbar.js +23 -0
- package/dist/constants/style.d.ts +12 -0
- package/dist/constants/style.js +30 -0
- package/dist/hooks/useComponent.d.ts +9 -0
- package/dist/hooks/useComponent.js +48 -0
- package/dist/hooks/useDrag.d.ts +15 -0
- package/dist/hooks/useDrag.js +100 -0
- package/dist/hooks/useDrawableCanvas.d.ts +30 -0
- package/dist/hooks/useDrawableCanvas.js +250 -0
- package/dist/hooks/useKeyboard.d.ts +15 -0
- package/dist/hooks/useKeyboard.js +123 -0
- package/dist/hooks/useShapes.d.ts +22 -0
- package/dist/hooks/useShapes.js +229 -0
- package/dist/hooks/useSnackbar.d.ts +16 -0
- package/dist/hooks/useSnackbar.js +86 -0
- package/dist/schemas/drawableShape.json +1021 -0
- package/dist/styles.css +88 -0
- package/dist/types/Mode.d.ts +51 -0
- package/dist/types/Mode.js +17 -0
- package/dist/types/Shapes.d.ts +122 -0
- package/dist/types/Shapes.js +35 -0
- package/dist/types/keyboard.d.ts +15 -0
- package/dist/types/keyboard.js +28 -0
- package/dist/utils/data.d.ts +4 -0
- package/dist/utils/data.js +178 -0
- package/dist/utils/draw.d.ts +18 -0
- package/dist/utils/draw.js +422 -0
- package/dist/utils/file.d.ts +33 -0
- package/dist/utils/file.js +220 -0
- package/dist/utils/intersect.d.ts +8 -0
- package/dist/utils/intersect.js +194 -0
- package/dist/utils/selection.d.ts +7 -0
- package/dist/utils/selection.js +88 -0
- package/dist/utils/shapeData.d.ts +5 -0
- package/dist/utils/shapeData.js +178 -0
- package/dist/utils/string.d.ts +3 -0
- package/dist/utils/string.js +42 -0
- package/dist/utils/style.d.ts +2 -0
- package/dist/utils/style.js +46 -0
- package/dist/utils/toolbar.d.ts +12 -0
- package/dist/utils/toolbar.js +37 -0
- package/dist/utils/transform.d.ts +271 -0
- package/dist/utils/transform.js +371 -0
- package/package.json +79 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
|
|
12
|
+
var _react = require("react");
|
|
13
|
+
|
|
14
|
+
var useDrag = function useDrag(_ref) {
|
|
15
|
+
var _ref$disabled = _ref.disabled,
|
|
16
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
17
|
+
ref = _ref.ref,
|
|
18
|
+
shape = _ref.shape,
|
|
19
|
+
layoutDragging = _ref.layoutDragging,
|
|
20
|
+
setLayoutDragging = _ref.setLayoutDragging,
|
|
21
|
+
handleSelect = _ref.handleSelect,
|
|
22
|
+
onMoveShapes = _ref.onMoveShapes;
|
|
23
|
+
|
|
24
|
+
var _useState = (0, _react.useState)(false),
|
|
25
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
26
|
+
isOver = _useState2[0],
|
|
27
|
+
setIsOver = _useState2[1];
|
|
28
|
+
|
|
29
|
+
(0, _react.useEffect)(function () {
|
|
30
|
+
if (!layoutDragging) setIsOver(false);
|
|
31
|
+
}, [layoutDragging]);
|
|
32
|
+
(0, _react.useEffect)(function () {
|
|
33
|
+
var layoutRef = ref.current;
|
|
34
|
+
if (!layoutRef) return;
|
|
35
|
+
|
|
36
|
+
var handleDragEnd = function handleDragEnd() {
|
|
37
|
+
setLayoutDragging(undefined);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
var handleDragOver = function handleDragOver(e) {
|
|
41
|
+
if (e.preventDefault) {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return false;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
var handleDragStart = function handleDragStart(e) {
|
|
49
|
+
handleSelect(shape);
|
|
50
|
+
if (!e.dataTransfer) return;
|
|
51
|
+
e.dataTransfer.effectAllowed = 'move';
|
|
52
|
+
e.dataTransfer.setData('draggableShapeId', shape.id);
|
|
53
|
+
setLayoutDragging(shape.id);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
var handleDragEnter = function handleDragEnter() {
|
|
57
|
+
layoutDragging !== shape.id && setIsOver(true);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
var handleDragLeave = function handleDragLeave() {
|
|
61
|
+
setIsOver(false);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
var handleDrop = function handleDrop(e) {
|
|
65
|
+
e.stopPropagation(); // stops the browser from redirecting.
|
|
66
|
+
|
|
67
|
+
if (e.dataTransfer) {
|
|
68
|
+
onMoveShapes(e.dataTransfer.getData('draggableShapeId'), shape.id);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return false;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
if (!disabled) {
|
|
75
|
+
layoutRef.addEventListener('dragstart', handleDragStart);
|
|
76
|
+
layoutRef.addEventListener('dragend', handleDragEnd);
|
|
77
|
+
layoutRef.addEventListener('dragover', handleDragOver);
|
|
78
|
+
layoutRef.addEventListener('dragenter', handleDragEnter);
|
|
79
|
+
layoutRef.addEventListener('dragleave', handleDragLeave);
|
|
80
|
+
layoutRef.addEventListener('drop', handleDrop);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return function () {
|
|
84
|
+
if (!disabled) {
|
|
85
|
+
layoutRef.removeEventListener('dragstart', handleDragStart);
|
|
86
|
+
layoutRef.removeEventListener('dragend', handleDragEnd);
|
|
87
|
+
layoutRef.removeEventListener('dragover', handleDragOver);
|
|
88
|
+
layoutRef.removeEventListener('dragenter', handleDragEnter);
|
|
89
|
+
layoutRef.removeEventListener('dragleave', handleDragLeave);
|
|
90
|
+
layoutRef.removeEventListener('drop', handleDrop);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}, [disabled, ref, shape, setLayoutDragging, handleSelect, onMoveShapes, layoutDragging]);
|
|
94
|
+
return {
|
|
95
|
+
isOver: isOver
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
var _default = useDrag;
|
|
100
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DrawableShape, Point, StyledShape, ToolsType } from 'types/Shapes';
|
|
3
|
+
import { HoverModeData, SelectionModeData } from 'types/Mode';
|
|
4
|
+
declare type UseCanvasType = {
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
shapes: DrawableShape[];
|
|
9
|
+
saveShapes: () => void;
|
|
10
|
+
addShape: (newShape: DrawableShape) => void;
|
|
11
|
+
updateSingleShape: (updatedShape: DrawableShape) => void;
|
|
12
|
+
selectedShape: DrawableShape | undefined;
|
|
13
|
+
setSelectedShape: React.Dispatch<React.SetStateAction<DrawableShape | undefined>>;
|
|
14
|
+
activeTool: ToolsType;
|
|
15
|
+
setActiveTool: React.Dispatch<React.SetStateAction<ToolsType>>;
|
|
16
|
+
canvasOffsetStartPosition: Point | undefined;
|
|
17
|
+
setCanvasOffsetStartPosition: React.Dispatch<React.SetStateAction<Point | undefined>>;
|
|
18
|
+
canvasOffset: Point;
|
|
19
|
+
setCanvasOffset: React.Dispatch<React.SetStateAction<Point>>;
|
|
20
|
+
defaultConf: StyledShape;
|
|
21
|
+
isInsideComponent: boolean;
|
|
22
|
+
selectionMode: SelectionModeData<number | Point>;
|
|
23
|
+
setSelectionMode: React.Dispatch<React.SetStateAction<SelectionModeData<number | Point>>>;
|
|
24
|
+
drawCanvasRef: React.MutableRefObject<HTMLCanvasElement | null>;
|
|
25
|
+
selectionCanvasRef: React.MutableRefObject<HTMLCanvasElement | null>;
|
|
26
|
+
};
|
|
27
|
+
declare const useDrawableCanvas: ({ disabled, addShape, drawCanvasRef, setActiveTool, shapes, defaultConf, selectionMode, width, height, activeTool, isInsideComponent, setCanvasOffset, selectedShape, selectionCanvasRef, canvasOffsetStartPosition, setSelectedShape, setCanvasOffsetStartPosition, updateSingleShape, canvasOffset, saveShapes, setSelectionMode }: UseCanvasType) => {
|
|
28
|
+
hoverMode: HoverModeData;
|
|
29
|
+
};
|
|
30
|
+
export default useDrawableCanvas;
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
|
|
12
|
+
var _react = require("react");
|
|
13
|
+
|
|
14
|
+
var _fp = _interopRequireDefault(require("lodash/fp"));
|
|
15
|
+
|
|
16
|
+
var _selection = require("../utils/selection");
|
|
17
|
+
|
|
18
|
+
var _Shapes = require("../types/Shapes");
|
|
19
|
+
|
|
20
|
+
var _intersect = require("../utils/intersect");
|
|
21
|
+
|
|
22
|
+
var _Mode = require("../types/Mode");
|
|
23
|
+
|
|
24
|
+
var _transform = require("../utils/transform");
|
|
25
|
+
|
|
26
|
+
var _draw = require("../constants/draw");
|
|
27
|
+
|
|
28
|
+
var _data = require("../utils/data");
|
|
29
|
+
|
|
30
|
+
var handleMove = function handleMove(e, canvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape) {
|
|
31
|
+
if (activeTool === _Shapes.ToolEnum.move && canvasOffsetStartPosition !== undefined) {
|
|
32
|
+
var _cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height);
|
|
33
|
+
|
|
34
|
+
setCanvasOffset([_cursorPosition[0] - canvasOffsetStartPosition[0], _cursorPosition[1] - canvasOffsetStartPosition[1]]);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (selectedShape == undefined) return;
|
|
38
|
+
if (selectedShape.locked) return;
|
|
39
|
+
var cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height);
|
|
40
|
+
|
|
41
|
+
if (selectionMode.mode === _Mode.SelectionModeLib["default"]) {
|
|
42
|
+
var positionIntersection = (0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset, true) || {
|
|
43
|
+
mode: _Mode.SelectionModeLib["default"]
|
|
44
|
+
};
|
|
45
|
+
setHoverMode(positionIntersection);
|
|
46
|
+
} else {
|
|
47
|
+
var _canvasRef$current;
|
|
48
|
+
|
|
49
|
+
var ctx = (_canvasRef$current = canvasRef.current) === null || _canvasRef$current === void 0 ? void 0 : _canvasRef$current.getContext('2d');
|
|
50
|
+
if (!ctx) return;
|
|
51
|
+
|
|
52
|
+
var _newShape = (0, _transform.transformShape)(ctx, selectedShape, cursorPosition, canvasOffset, selectionMode);
|
|
53
|
+
|
|
54
|
+
updateSingleShape(_newShape);
|
|
55
|
+
setSelectedShape(_newShape);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
var useDrawableCanvas = function useDrawableCanvas(_ref) {
|
|
60
|
+
var _ref$disabled = _ref.disabled,
|
|
61
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
62
|
+
addShape = _ref.addShape,
|
|
63
|
+
drawCanvasRef = _ref.drawCanvasRef,
|
|
64
|
+
setActiveTool = _ref.setActiveTool,
|
|
65
|
+
shapes = _ref.shapes,
|
|
66
|
+
defaultConf = _ref.defaultConf,
|
|
67
|
+
selectionMode = _ref.selectionMode,
|
|
68
|
+
width = _ref.width,
|
|
69
|
+
height = _ref.height,
|
|
70
|
+
activeTool = _ref.activeTool,
|
|
71
|
+
isInsideComponent = _ref.isInsideComponent,
|
|
72
|
+
setCanvasOffset = _ref.setCanvasOffset,
|
|
73
|
+
selectedShape = _ref.selectedShape,
|
|
74
|
+
selectionCanvasRef = _ref.selectionCanvasRef,
|
|
75
|
+
canvasOffsetStartPosition = _ref.canvasOffsetStartPosition,
|
|
76
|
+
setSelectedShape = _ref.setSelectedShape,
|
|
77
|
+
setCanvasOffsetStartPosition = _ref.setCanvasOffsetStartPosition,
|
|
78
|
+
updateSingleShape = _ref.updateSingleShape,
|
|
79
|
+
canvasOffset = _ref.canvasOffset,
|
|
80
|
+
saveShapes = _ref.saveShapes,
|
|
81
|
+
setSelectionMode = _ref.setSelectionMode;
|
|
82
|
+
|
|
83
|
+
var _useState = (0, _react.useState)({
|
|
84
|
+
mode: _Mode.SelectionModeLib["default"]
|
|
85
|
+
}),
|
|
86
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
87
|
+
hoverMode = _useState2[0],
|
|
88
|
+
setHoverMode = _useState2[1];
|
|
89
|
+
|
|
90
|
+
(0, _react.useEffect)(function () {
|
|
91
|
+
var handleMouseMove = function handleMouseMove(e) {
|
|
92
|
+
return _fp["default"].throttle(_draw.FRAMERATE_SELECTION, handleMove)(e, selectionCanvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (isInsideComponent) {
|
|
96
|
+
document.addEventListener('mousemove', handleMouseMove);
|
|
97
|
+
document.addEventListener('touchmove', handleMouseMove);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return function () {
|
|
101
|
+
if (isInsideComponent) {
|
|
102
|
+
document.removeEventListener('mousemove', handleMouseMove);
|
|
103
|
+
document.removeEventListener('touchmove', handleMouseMove);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}, [isInsideComponent, selectionCanvasRef, selectedShape, selectionMode, setHoverMode, canvasOffset, canvasOffsetStartPosition, width, height, updateSingleShape, activeTool, setCanvasOffset, setSelectedShape]);
|
|
107
|
+
(0, _react.useEffect)(function () {
|
|
108
|
+
var handleMouseUp = function handleMouseUp(e) {
|
|
109
|
+
if (selectionMode.mode === _Mode.SelectionModeLib.textedition) return;
|
|
110
|
+
|
|
111
|
+
if (activeTool === _Shapes.ShapeEnum.text) {
|
|
112
|
+
var _drawCanvasRef$curren;
|
|
113
|
+
|
|
114
|
+
var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
|
|
115
|
+
var drawCtx = (_drawCanvasRef$curren = drawCanvasRef.current) === null || _drawCanvasRef$curren === void 0 ? void 0 : _drawCanvasRef$curren.getContext('2d');
|
|
116
|
+
if (!drawCtx) return;
|
|
117
|
+
|
|
118
|
+
var _newShape2 = (0, _data.createShape)(drawCtx, activeTool, cursorPosition, defaultConf);
|
|
119
|
+
|
|
120
|
+
addShape(_newShape2);
|
|
121
|
+
setActiveTool(_Shapes.ToolEnum.selection);
|
|
122
|
+
setSelectedShape(_newShape2);
|
|
123
|
+
setSelectionMode({
|
|
124
|
+
mode: _Mode.SelectionModeLib.textedition,
|
|
125
|
+
defaultValue: _newShape2.value
|
|
126
|
+
});
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (selectionMode.mode !== _Mode.SelectionModeLib["default"]) {
|
|
131
|
+
setSelectionMode({
|
|
132
|
+
mode: _Mode.SelectionModeLib["default"]
|
|
133
|
+
});
|
|
134
|
+
saveShapes();
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
if (isInsideComponent) {
|
|
139
|
+
document.addEventListener('mouseup', handleMouseUp);
|
|
140
|
+
document.addEventListener('touchend', handleMouseUp);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return function () {
|
|
144
|
+
if (isInsideComponent) {
|
|
145
|
+
document.removeEventListener('mouseup', handleMouseUp);
|
|
146
|
+
document.removeEventListener('touchend', handleMouseUp);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}, [isInsideComponent, selectionCanvasRef, drawCanvasRef, selectionMode, saveShapes, activeTool, addShape, defaultConf, width, height, setActiveTool, setSelectedShape, setSelectionMode]);
|
|
150
|
+
(0, _react.useEffect)(function () {
|
|
151
|
+
var ref = selectionCanvasRef.current;
|
|
152
|
+
if (!ref) return;
|
|
153
|
+
if (disabled) return;
|
|
154
|
+
|
|
155
|
+
var handleMouseDown = function handleMouseDown(e) {
|
|
156
|
+
e.preventDefault();
|
|
157
|
+
var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
|
|
158
|
+
|
|
159
|
+
if (activeTool === _Shapes.ToolEnum.selection) {
|
|
160
|
+
var _selectShape = (0, _selection.selectShape)(shapes, cursorPosition, canvasOffset, selectedShape),
|
|
161
|
+
shape = _selectShape.shape,
|
|
162
|
+
mode = _selectShape.mode;
|
|
163
|
+
|
|
164
|
+
setSelectedShape(shape);
|
|
165
|
+
setSelectionMode(mode);
|
|
166
|
+
} else if (activeTool === _Shapes.ToolEnum.move) {
|
|
167
|
+
setCanvasOffsetStartPosition(cursorPosition);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (_fp["default"].includes(activeTool, _Shapes.ShapeEnum)) {
|
|
171
|
+
var _drawCanvasRef$curren2;
|
|
172
|
+
|
|
173
|
+
var drawCtx = (_drawCanvasRef$curren2 = drawCanvasRef.current) === null || _drawCanvasRef$curren2 === void 0 ? void 0 : _drawCanvasRef$curren2.getContext('2d');
|
|
174
|
+
if (!drawCtx) return;
|
|
175
|
+
|
|
176
|
+
if (activeTool === _Shapes.ShapeEnum.brush) {
|
|
177
|
+
if (!!selectedShape) {
|
|
178
|
+
var _newShape3 = (0, _transform.createNewPointGroupToShape)(selectedShape, cursorPosition);
|
|
179
|
+
|
|
180
|
+
updateSingleShape(_newShape3);
|
|
181
|
+
setSelectedShape(_newShape3);
|
|
182
|
+
} else {
|
|
183
|
+
var _newShape4 = (0, _data.createShape)(drawCtx, activeTool, cursorPosition, defaultConf);
|
|
184
|
+
|
|
185
|
+
addShape(_newShape4);
|
|
186
|
+
setSelectedShape(_newShape4);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
setSelectionMode({
|
|
190
|
+
mode: _Mode.SelectionModeLib.brush
|
|
191
|
+
});
|
|
192
|
+
} else if (activeTool !== _Shapes.ShapeEnum.text) {
|
|
193
|
+
var _newShape5 = (0, _data.createShape)(drawCtx, activeTool, cursorPosition, defaultConf);
|
|
194
|
+
|
|
195
|
+
addShape(_newShape5);
|
|
196
|
+
setActiveTool(_Shapes.ToolEnum.selection);
|
|
197
|
+
setSelectedShape(_newShape5);
|
|
198
|
+
setSelectionMode({
|
|
199
|
+
mode: _Mode.SelectionModeLib.resize,
|
|
200
|
+
cursorStartPosition: cursorPosition,
|
|
201
|
+
originalShape: _newShape5,
|
|
202
|
+
anchor: activeTool === _Shapes.ShapeEnum.line || activeTool === _Shapes.ShapeEnum.polygon || activeTool === _Shapes.ShapeEnum.curve ? 0 : [1, 1]
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
ref.addEventListener('mousedown', handleMouseDown);
|
|
209
|
+
ref.addEventListener('touchstart', handleMouseDown);
|
|
210
|
+
return function () {
|
|
211
|
+
ref.removeEventListener('mousedown', handleMouseDown);
|
|
212
|
+
ref.removeEventListener('touchstart', handleMouseDown);
|
|
213
|
+
};
|
|
214
|
+
}, [disabled, selectionCanvasRef, drawCanvasRef, selectedShape, activeTool, canvasOffset, setCanvasOffsetStartPosition, shapes, defaultConf, width, height, updateSingleShape, addShape, setActiveTool, setSelectedShape, setSelectionMode]);
|
|
215
|
+
(0, _react.useEffect)(function () {
|
|
216
|
+
var ref = selectionCanvasRef.current;
|
|
217
|
+
if (!ref) return;
|
|
218
|
+
|
|
219
|
+
var handleDoubleClick = function handleDoubleClick(e) {
|
|
220
|
+
if (activeTool === _Shapes.ToolEnum.selection) {
|
|
221
|
+
if ((selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) === _Shapes.ShapeEnum.text) {
|
|
222
|
+
var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
|
|
223
|
+
|
|
224
|
+
if ((0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset)) {
|
|
225
|
+
setSelectionMode({
|
|
226
|
+
mode: _Mode.SelectionModeLib.textedition,
|
|
227
|
+
defaultValue: selectedShape.value
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
if (isInsideComponent) {
|
|
235
|
+
ref.addEventListener('dblclick', handleDoubleClick);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return function () {
|
|
239
|
+
if (isInsideComponent) {
|
|
240
|
+
ref.removeEventListener('dblclick', handleDoubleClick);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
}, [isInsideComponent, selectionCanvasRef, activeTool, selectedShape, width, height, canvasOffset, setSelectionMode]);
|
|
244
|
+
return {
|
|
245
|
+
hoverMode: hoverMode
|
|
246
|
+
};
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
var _default = useDrawableCanvas;
|
|
250
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { DrawableShape } from 'types/Shapes';
|
|
3
|
+
declare type UseKeyboardType = {
|
|
4
|
+
isInsideComponent: boolean;
|
|
5
|
+
selectedShape: DrawableShape | undefined;
|
|
6
|
+
pasteShape: (shape: DrawableShape) => void;
|
|
7
|
+
updateShape: (shape: DrawableShape) => void;
|
|
8
|
+
setSelectedShape: (value: React.SetStateAction<DrawableShape | undefined>) => void;
|
|
9
|
+
removeShape: (shape: DrawableShape) => void;
|
|
10
|
+
backwardShape: () => void;
|
|
11
|
+
forwardShape: () => void;
|
|
12
|
+
isEditingText: boolean;
|
|
13
|
+
};
|
|
14
|
+
declare const useKeyboard: ({ isInsideComponent, selectedShape, isEditingText, setSelectedShape, removeShape, pasteShape, updateShape, backwardShape, forwardShape }: UseKeyboardType) => {};
|
|
15
|
+
export default useKeyboard;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
|
|
14
|
+
var _react = require("react");
|
|
15
|
+
|
|
16
|
+
var _fp = _interopRequireDefault(require("lodash/fp"));
|
|
17
|
+
|
|
18
|
+
var _data = require("../utils/data");
|
|
19
|
+
|
|
20
|
+
var _keyboard = require("../types/keyboard");
|
|
21
|
+
|
|
22
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
23
|
+
|
|
24
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
25
|
+
|
|
26
|
+
var useKeyboard = function useKeyboard(_ref) {
|
|
27
|
+
var isInsideComponent = _ref.isInsideComponent,
|
|
28
|
+
selectedShape = _ref.selectedShape,
|
|
29
|
+
isEditingText = _ref.isEditingText,
|
|
30
|
+
setSelectedShape = _ref.setSelectedShape,
|
|
31
|
+
removeShape = _ref.removeShape,
|
|
32
|
+
pasteShape = _ref.pasteShape,
|
|
33
|
+
updateShape = _ref.updateShape,
|
|
34
|
+
backwardShape = _ref.backwardShape,
|
|
35
|
+
forwardShape = _ref.forwardShape;
|
|
36
|
+
|
|
37
|
+
var _useState = (0, _react.useState)(undefined),
|
|
38
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
39
|
+
copiedShape = _useState2[0],
|
|
40
|
+
setCopiedShape = _useState2[1];
|
|
41
|
+
|
|
42
|
+
(0, _react.useEffect)(function () {
|
|
43
|
+
var handleCopy = function handleCopy(e) {
|
|
44
|
+
if (!selectedShape) return;
|
|
45
|
+
if (isEditingText) return;
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
setCopiedShape(_objectSpread({}, selectedShape));
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
var handlePaste = function handlePaste(e) {
|
|
51
|
+
if (!copiedShape) return;
|
|
52
|
+
if (isEditingText) return;
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
pasteShape((0, _data.copyShape)(copiedShape));
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
var handleKeyDown = function handleKeyDown(e) {
|
|
58
|
+
if (e.metaKey || e.ctrlKey) {
|
|
59
|
+
if (e.key === _keyboard.KeyboardCode.Z) {
|
|
60
|
+
e.preventDefault();
|
|
61
|
+
e.stopPropagation();
|
|
62
|
+
backwardShape();
|
|
63
|
+
return;
|
|
64
|
+
} else if (e.key === _keyboard.KeyboardCode.Y) {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
e.stopPropagation();
|
|
67
|
+
forwardShape();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!selectedShape) return;
|
|
73
|
+
|
|
74
|
+
if (e.key === _keyboard.KeyboardCode.Escape) {
|
|
75
|
+
setSelectedShape(undefined);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (isEditingText) return;
|
|
80
|
+
|
|
81
|
+
switch (e.key) {
|
|
82
|
+
case _keyboard.KeyboardCode.ArrowLeft:
|
|
83
|
+
updateShape(_fp["default"].set('translation', [selectedShape.translation[0] - 1, selectedShape.translation[1]], selectedShape));
|
|
84
|
+
break;
|
|
85
|
+
|
|
86
|
+
case _keyboard.KeyboardCode.ArrowRight:
|
|
87
|
+
updateShape(_fp["default"].set('translation', [selectedShape.translation[0] + 1, selectedShape.translation[1]], selectedShape));
|
|
88
|
+
break;
|
|
89
|
+
|
|
90
|
+
case _keyboard.KeyboardCode.ArrowDown:
|
|
91
|
+
updateShape(_fp["default"].set('translation', [selectedShape.translation[0], selectedShape.translation[1] + 1], selectedShape));
|
|
92
|
+
break;
|
|
93
|
+
|
|
94
|
+
case _keyboard.KeyboardCode.ArrowUp:
|
|
95
|
+
updateShape(_fp["default"].set('translation', [selectedShape.translation[0], selectedShape.translation[1] - 1], selectedShape));
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
case _keyboard.KeyboardCode.Delete:
|
|
99
|
+
case _keyboard.KeyboardCode.Backspace:
|
|
100
|
+
removeShape(selectedShape);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
if (isInsideComponent) {
|
|
106
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
107
|
+
document.addEventListener(_keyboard.KeyboardCommand.Copy, handleCopy);
|
|
108
|
+
document.addEventListener(_keyboard.KeyboardCommand.Paste, handlePaste);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return function () {
|
|
112
|
+
if (isInsideComponent) {
|
|
113
|
+
document.removeEventListener('keydown', handleKeyDown);
|
|
114
|
+
document.removeEventListener(_keyboard.KeyboardCommand.Copy, handleCopy);
|
|
115
|
+
document.removeEventListener(_keyboard.KeyboardCommand.Paste, handlePaste);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}, [isInsideComponent, copiedShape, isEditingText, selectedShape, updateShape, removeShape, setSelectedShape, pasteShape, backwardShape, forwardShape]);
|
|
119
|
+
return {};
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
var _default = useKeyboard;
|
|
123
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { DrawableShape } from 'types/Shapes';
|
|
3
|
+
declare const useShapes: (onDataChanged?: () => void) => {
|
|
4
|
+
shapesRef: import("react").MutableRefObject<DrawableShape[]>;
|
|
5
|
+
selectedShape: DrawableShape | undefined;
|
|
6
|
+
addShape: (newShape: DrawableShape) => void;
|
|
7
|
+
addPictureShape: (fileOrUrl: File | string, maxSize?: number) => Promise<import("types/Shapes").DrawablePicture>;
|
|
8
|
+
moveShapes: (firstShapeId: string, lastShapeId: string) => void;
|
|
9
|
+
saveShapes: () => void;
|
|
10
|
+
setSelectedShape: import("react").Dispatch<import("react").SetStateAction<DrawableShape | undefined>>;
|
|
11
|
+
toggleShapeVisibility: (shape: DrawableShape) => void;
|
|
12
|
+
toggleShapeLock: (shape: DrawableShape) => void;
|
|
13
|
+
removeShape: (shape: DrawableShape) => void;
|
|
14
|
+
updateShape: (updatedShape: DrawableShape, withSave?: boolean) => void;
|
|
15
|
+
backwardShape: () => void;
|
|
16
|
+
forwardShape: () => void;
|
|
17
|
+
clearShapes: (shapesToInit?: DrawableShape[], clearHistory?: boolean) => void;
|
|
18
|
+
canGoBackward: boolean;
|
|
19
|
+
canGoForward: boolean;
|
|
20
|
+
canClear: boolean;
|
|
21
|
+
};
|
|
22
|
+
export default useShapes;
|