@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.
Files changed (103) hide show
  1. package/Changelog.md +26 -0
  2. package/README.md +99 -0
  3. package/dist/components/App.d.ts +20 -0
  4. package/dist/components/App.js +533 -0
  5. package/dist/components/Canvas.d.ts +28 -0
  6. package/dist/components/Canvas.js +188 -0
  7. package/dist/components/common/Button.d.ts +14 -0
  8. package/dist/components/common/Button.js +97 -0
  9. package/dist/components/common/Loading.d.ts +6 -0
  10. package/dist/components/common/Loading.js +66 -0
  11. package/dist/components/common/Modal.d.ts +8 -0
  12. package/dist/components/common/Modal.js +41 -0
  13. package/dist/components/common/Panel.d.ts +10 -0
  14. package/dist/components/common/Panel.js +48 -0
  15. package/dist/components/common/Snackbar.d.ts +7 -0
  16. package/dist/components/common/Snackbar.js +75 -0
  17. package/dist/components/settings/ColorField.d.ts +12 -0
  18. package/dist/components/settings/ColorField.js +128 -0
  19. package/dist/components/settings/DeleteButton.d.ts +9 -0
  20. package/dist/components/settings/DeleteButton.js +36 -0
  21. package/dist/components/settings/FontFamilyField.d.ts +10 -0
  22. package/dist/components/settings/FontFamilyField.js +57 -0
  23. package/dist/components/settings/LayoutButton.d.ts +8 -0
  24. package/dist/components/settings/LayoutButton.js +37 -0
  25. package/dist/components/settings/Layouts.d.ts +18 -0
  26. package/dist/components/settings/Layouts.js +218 -0
  27. package/dist/components/settings/LineArrowField.d.ts +10 -0
  28. package/dist/components/settings/LineArrowField.js +59 -0
  29. package/dist/components/settings/LineTypeField.d.ts +14 -0
  30. package/dist/components/settings/LineTypeField.js +57 -0
  31. package/dist/components/settings/PointsNumberField.d.ts +11 -0
  32. package/dist/components/settings/PointsNumberField.js +51 -0
  33. package/dist/components/settings/RangeField.d.ts +16 -0
  34. package/dist/components/settings/RangeField.js +90 -0
  35. package/dist/components/settings/SelectField.d.ts +16 -0
  36. package/dist/components/settings/SelectField.js +82 -0
  37. package/dist/components/settings/SettingsBar.d.ts +16 -0
  38. package/dist/components/settings/SettingsBar.js +262 -0
  39. package/dist/components/toolbox/EditTextBox.d.ts +10 -0
  40. package/dist/components/toolbox/EditTextBox.js +89 -0
  41. package/dist/components/toolbox/LoadFileTool.d.ts +11 -0
  42. package/dist/components/toolbox/LoadFileTool.js +58 -0
  43. package/dist/components/toolbox/MenuGroup.d.ts +23 -0
  44. package/dist/components/toolbox/MenuGroup.js +173 -0
  45. package/dist/components/toolbox/PictureUrlInput.d.ts +7 -0
  46. package/dist/components/toolbox/PictureUrlInput.js +96 -0
  47. package/dist/components/toolbox/Tool.d.ts +13 -0
  48. package/dist/components/toolbox/Tool.js +41 -0
  49. package/dist/components/toolbox/Toolbar.d.ts +20 -0
  50. package/dist/components/toolbox/Toolbar.js +205 -0
  51. package/dist/components/toolbox/ToolbarGroup.d.ts +18 -0
  52. package/dist/components/toolbox/ToolbarGroup.js +139 -0
  53. package/dist/constants/draw.d.ts +2 -0
  54. package/dist/constants/draw.js +10 -0
  55. package/dist/constants/icons.d.ts +36 -0
  56. package/dist/constants/icons.js +80 -0
  57. package/dist/constants/shapes.d.ts +5 -0
  58. package/dist/constants/shapes.js +14 -0
  59. package/dist/constants/snackbar.d.ts +11 -0
  60. package/dist/constants/snackbar.js +23 -0
  61. package/dist/constants/style.d.ts +12 -0
  62. package/dist/constants/style.js +30 -0
  63. package/dist/hooks/useComponent.d.ts +9 -0
  64. package/dist/hooks/useComponent.js +48 -0
  65. package/dist/hooks/useDrag.d.ts +15 -0
  66. package/dist/hooks/useDrag.js +100 -0
  67. package/dist/hooks/useDrawableCanvas.d.ts +30 -0
  68. package/dist/hooks/useDrawableCanvas.js +250 -0
  69. package/dist/hooks/useKeyboard.d.ts +15 -0
  70. package/dist/hooks/useKeyboard.js +123 -0
  71. package/dist/hooks/useShapes.d.ts +22 -0
  72. package/dist/hooks/useShapes.js +229 -0
  73. package/dist/hooks/useSnackbar.d.ts +16 -0
  74. package/dist/hooks/useSnackbar.js +86 -0
  75. package/dist/schemas/drawableShape.json +1021 -0
  76. package/dist/styles.css +88 -0
  77. package/dist/types/Mode.d.ts +51 -0
  78. package/dist/types/Mode.js +17 -0
  79. package/dist/types/Shapes.d.ts +122 -0
  80. package/dist/types/Shapes.js +35 -0
  81. package/dist/types/keyboard.d.ts +15 -0
  82. package/dist/types/keyboard.js +28 -0
  83. package/dist/utils/data.d.ts +4 -0
  84. package/dist/utils/data.js +178 -0
  85. package/dist/utils/draw.d.ts +18 -0
  86. package/dist/utils/draw.js +422 -0
  87. package/dist/utils/file.d.ts +33 -0
  88. package/dist/utils/file.js +220 -0
  89. package/dist/utils/intersect.d.ts +8 -0
  90. package/dist/utils/intersect.js +194 -0
  91. package/dist/utils/selection.d.ts +7 -0
  92. package/dist/utils/selection.js +88 -0
  93. package/dist/utils/shapeData.d.ts +5 -0
  94. package/dist/utils/shapeData.js +178 -0
  95. package/dist/utils/string.d.ts +3 -0
  96. package/dist/utils/string.js +42 -0
  97. package/dist/utils/style.d.ts +2 -0
  98. package/dist/utils/style.js +46 -0
  99. package/dist/utils/toolbar.d.ts +12 -0
  100. package/dist/utils/toolbar.js +37 -0
  101. package/dist/utils/transform.d.ts +271 -0
  102. package/dist/utils/transform.js +371 -0
  103. package/package.json +79 -0
package/Changelog.md ADDED
@@ -0,0 +1,26 @@
1
+ # V.0.2.2 :
2
+
3
+ - Migrate to react 18
4
+ - fix Picture type
5
+ - change pen join and cap to round
6
+ - replace loading snackbar with proper loader
7
+ - support for canGrow and canShrink prop
8
+ - rename project
9
+ - release on npm
10
+
11
+ # V.0.2.1 :
12
+
13
+ - better ui for input modal
14
+ - lock functionnality
15
+ - toggle grid
16
+ - layouts panel UI
17
+
18
+ # V.0.2.0 :
19
+
20
+ - fix for scaling brush
21
+ - fix snackbar
22
+ - refonte UI toolbar
23
+ - update examples
24
+ - button with icons
25
+ - mini toolbar to fix
26
+ - provide tool for url only
package/README.md ADDED
@@ -0,0 +1,99 @@
1
+ ## To regenerate schema :
2
+
3
+ typescript-json-schema "src/types/Shapes.ts" DrawableShapeJson --out 'src/schemas/drawableShape.json'
4
+
5
+ # known issues :
6
+
7
+ ## mobile/touch
8
+
9
+ - dnd layout on mobile not working CRITIC (fix : use dnd lib, or add touch listener to fake dnd, or provide alt UI)
10
+ - double click not working with touch CRITIC (fix: fake it countinng delay between touch)
11
+
12
+ ## canvas resizing
13
+
14
+ - TextEdit position and size not working with canvas resized MINOR (fix : apply current canvas ratio to position and font size)
15
+ - anchors become too small MAJOR (possible fix : increase size with current canvas ratio )
16
+
17
+ ## other
18
+
19
+ - TextEdit cursor overflow MINOR (quick fix : edit on modale)
20
+ - circle resizing only goes one direction
21
+
22
+ # Remarques de thomas :
23
+
24
+ ## done
25
+
26
+ - les options (épaisseurs, style de trait...) ont une UI très peu utilisable (on sait pas quel option fait quoi et comment, on teste au pif)
27
+ l'option de changement de couleur :
28
+ ne s'applique qu'à la validation, c'est pas top pour savoir quelle couleur on veut parce qu'on est obligé de validé, voir que c'est pas beau, rouvrir... et ainsi de suite
29
+ - a un petit bug : j'ouvre la modale de sélection, je clique à côté (ça unselect la forme), je change la couleur et valide : il ne se passe rien. Je comprends la logique derrière, mais à l'usage ça n'a pas trop de sens
30
+ - pas de possibilité de setter l'opacité des objets, dommage je pense qu'il y a une vraie utilité à ça
31
+ - croix qui efface le canvas
32
+ il faut une confirmation ! :D
33
+
34
+ ## remaining
35
+
36
+ - pas de possibilité de sélectionner plusieurs objets avec un press/trace une zone avec la souris/relache (mécanique assez courante quand il y a de la manipulation d'objets)
37
+ - pas de possibilité de zoom/dezoom dans le canvas, et ça c'est super utile amha
38
+
39
+ ### pinceau
40
+
41
+ - certains outils lisse le trait une fois que tu valides le tracé, et ça donne un rendu plus naturel et propre que ce qu'on trace au pad/souris. Du nice to have loin d'être prioritaire
42
+ - avoir plusieurs style de pinceau (mode surligneur par exemple). ca serait utile sur des exo et techniquement c'est peut-être juste des preset de taille/couleur/opacité de l'outil actuel
43
+ - je ne sais pas pourquoi, mais il a l'air moins fluide/smooth au tracé que marker.js (peut-être une illusion)
44
+
45
+ ### trait
46
+
47
+ - j'ai été surpris que ça me trace la "forme" dans un rectangle plutôt que d'avoir juste les 2 points sélectionnés (sans le cadre autour quoi)
48
+
49
+ ### polygone
50
+
51
+ - démarrer avec un polygone à 2 côté, c'est pas possible ça :sourire:
52
+ quand on change le nombre de côté ça reste un truc plat et ensuite on tire des points :
53
+ c'est pas du tout évident
54
+ ça donne des formes qui ne sont pas des polygones (genre un noeuf papillon)
55
+ idéalement, il faudrait démarrer avec un pentagone parfait -5 côtés de même longueur- (en dessous se sont des polygones trop communs) et quand on change le nombre de côté ça reset la forme sur un polygone parfait de X côtés
56
+
57
+ ### Texte
58
+
59
+ - options trop limitée, il faudrait à minima pouvoir changer la taille de la police, choisir plus de police, et faire un peu de mise en forme (i, b, u)
60
+
61
+ ## bof
62
+
63
+ - avoir les options dans un tooltip-like, au dessus de la forme, serait merveilleux (comme sur Miro, ou comme sur nos manuels avec la barre de mise en forme de texte)
64
+ - rectangle: pas de carré avec maj, snif
65
+ une option de la forme pour bloqué le ratio en "carré" ?
66
+ - cercle/elipse
67
+ redondant, la diff des outils me parait too much et pas clair
68
+ bloqué en ratio cercle avec maj ou une option de forme (cf rectangle/carré) ?
69
+
70
+ # En prévision / Future MAJ
71
+
72
+ - fix text
73
+
74
+ - Migrer sous Vite +
75
+
76
+ - configurer npm publish
77
+
78
+ - possibility to have presets
79
+ - possibility to provide presets in props
80
+ - add presets
81
+
82
+ - add more settings
83
+ - settings ui
84
+ - add settings customization
85
+
86
+ # A prévoir
87
+
88
+ - ladle (wait for windows support https://github.com/tajo/ladle/issues/67)
89
+ - get rid of enum for better typescript
90
+ - add shortcuts (for tools) and show it in titles
91
+ - Menu contextuel au clic droit (changement de plan, supprimer, duplicate, copy, lock)
92
+ - bordure des traits à revoir
93
+ - améliorer perfs avec précalculs + usage de path
94
+ - lissage de traits
95
+ - Move + zoom functionnality
96
+ - UI customization
97
+ - Tests !
98
+ - fix remaining issues
99
+ - fullscreen mode ?
@@ -0,0 +1,20 @@
1
+ import { MutableRefObject } from 'react';
2
+ import { DrawableShapeJson, ShapeEnum } from 'types/Shapes';
3
+ declare type AppType = {
4
+ width?: number;
5
+ height?: number;
6
+ canGrow?: boolean;
7
+ canShrink?: boolean;
8
+ withLayouts?: 'always' | 'never' | 'visible' | 'hidden';
9
+ shapes?: DrawableShapeJson[];
10
+ className?: string;
11
+ disabled?: boolean;
12
+ onDataChanged?: () => void;
13
+ availableTools?: ShapeEnum[];
14
+ apiRef?: MutableRefObject<undefined | {
15
+ getCurrentImage: () => string | undefined;
16
+ getCurrentData: () => DrawableShapeJson[];
17
+ }>;
18
+ };
19
+ declare const App: ({ width, height, canGrow, canShrink, withLayouts, shapes: shapesFromProps, className: classNameFromProps, disabled, onDataChanged, availableTools: availableToolsFromProps, apiRef }: AppType) => JSX.Element;
20
+ export default App;
@@ -0,0 +1,533 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = void 0;
11
+
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _fp = _interopRequireDefault(require("lodash/fp"));
21
+
22
+ var _Shapes = require("../types/Shapes");
23
+
24
+ var _Canvas = _interopRequireDefault(require("./Canvas"));
25
+
26
+ var _Layouts = _interopRequireDefault(require("./settings/Layouts"));
27
+
28
+ var _Toolbar = _interopRequireDefault(require("./toolbox/Toolbar"));
29
+
30
+ var _react2 = require("@linaria/react");
31
+
32
+ var _SettingsBar = _interopRequireDefault(require("./settings/SettingsBar"));
33
+
34
+ var _style = require("../constants/style");
35
+
36
+ var _useKeyboard = _interopRequireDefault(require("../hooks/useKeyboard"));
37
+
38
+ var _file = require("../utils/file");
39
+
40
+ var _Mode = require("../types/Mode");
41
+
42
+ var _useComponent2 = _interopRequireDefault(require("../hooks/useComponent"));
43
+
44
+ var _useShapes2 = _interopRequireDefault(require("../hooks/useShapes"));
45
+
46
+ var _Snackbar = _interopRequireDefault(require("./common/Snackbar"));
47
+
48
+ var _useSnackbar2 = _interopRequireDefault(require("../hooks/useSnackbar"));
49
+
50
+ var _snackbar = require("../constants/snackbar");
51
+
52
+ var _Loading = _interopRequireDefault(require("./common/Loading"));
53
+
54
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
55
+
56
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
57
+
58
+ var StyledApp = /*#__PURE__*/(0, _react2.styled)("div")({
59
+ name: "StyledApp",
60
+ "class": "s1v9piyg",
61
+ vars: {
62
+ "s1v9piyg-0": [function (_ref) {
63
+ var width = _ref.width;
64
+ return "min(100%, ".concat(width, "px)");
65
+ }],
66
+ "s1v9piyg-1": [function (_ref2) {
67
+ var width = _ref2.width;
68
+ return width;
69
+ }, "px"]
70
+ }
71
+ });
72
+ var StyledRow = /*#__PURE__*/(0, _react2.styled)("div")({
73
+ name: "StyledRow",
74
+ "class": "s6o5tmu",
75
+ vars: {
76
+ "s6o5tmu-1": [function (_ref3) {
77
+ var width = _ref3.width;
78
+ return width;
79
+ }, "px"],
80
+ "s6o5tmu-2": [function (_ref4) {
81
+ var aspectRatio = _ref4.aspectRatio;
82
+ return aspectRatio;
83
+ }]
84
+ }
85
+ });
86
+ var DEFAULT_TOOLS = [_Shapes.ShapeEnum.brush, _Shapes.ShapeEnum.line, _Shapes.ShapeEnum.polygon, _Shapes.ShapeEnum.curve, _Shapes.ShapeEnum.rect, _Shapes.ShapeEnum.square, _Shapes.ShapeEnum.circle, _Shapes.ShapeEnum.ellipse, _Shapes.ShapeEnum.text, _Shapes.ShapeEnum.picture];
87
+
88
+ var App = function App(_ref5) {
89
+ var _ref5$width = _ref5.width,
90
+ width = _ref5$width === void 0 ? 1000 : _ref5$width,
91
+ _ref5$height = _ref5.height,
92
+ height = _ref5$height === void 0 ? 600 : _ref5$height,
93
+ _ref5$canGrow = _ref5.canGrow,
94
+ canGrow = _ref5$canGrow === void 0 ? false : _ref5$canGrow,
95
+ _ref5$canShrink = _ref5.canShrink,
96
+ canShrink = _ref5$canShrink === void 0 ? true : _ref5$canShrink,
97
+ _ref5$withLayouts = _ref5.withLayouts,
98
+ withLayouts = _ref5$withLayouts === void 0 ? 'hidden' : _ref5$withLayouts,
99
+ shapesFromProps = _ref5.shapes,
100
+ classNameFromProps = _ref5.className,
101
+ _ref5$disabled = _ref5.disabled,
102
+ disabled = _ref5$disabled === void 0 ? false : _ref5$disabled,
103
+ onDataChanged = _ref5.onDataChanged,
104
+ _ref5$availableTools = _ref5.availableTools,
105
+ availableToolsFromProps = _ref5$availableTools === void 0 ? DEFAULT_TOOLS : _ref5$availableTools,
106
+ apiRef = _ref5.apiRef;
107
+ var componentRef = (0, _react.useRef)(null);
108
+ var canvasRef = (0, _react.useRef)(null);
109
+
110
+ var availableTools = _fp["default"].intersection(DEFAULT_TOOLS, availableToolsFromProps);
111
+
112
+ var _useComponent = (0, _useComponent2["default"])({
113
+ disabled: disabled,
114
+ componentRef: componentRef
115
+ }),
116
+ isInsideComponent = _useComponent.isInsideComponent;
117
+
118
+ var _useState = (0, _react.useState)({
119
+ style: {
120
+ fillColor: 'transparent',
121
+ strokeColor: 'black',
122
+ globalAlpha: 100,
123
+ lineWidth: 1,
124
+ lineDash: 0,
125
+ lineArrow: 0,
126
+ pointsCount: 3,
127
+ fontFamily: _style.STYLE_FONT_DEFAULT
128
+ }
129
+ }),
130
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
131
+ defaultConf = _useState2[0],
132
+ setDefaultConf = _useState2[1];
133
+
134
+ var _useState3 = (0, _react.useState)(false),
135
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
136
+ isLoading = _useState4[0],
137
+ setIsLoading = _useState4[1];
138
+
139
+ var _useState5 = (0, _react.useState)(withLayouts === 'always' || withLayouts === 'visible'),
140
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
141
+ isLayoutPanelShown = _useState6[0],
142
+ setIsLayoutPanelShown = _useState6[1];
143
+
144
+ var _useState7 = (0, _react.useState)([0, 0]),
145
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
146
+ canvasOffset = _useState8[0],
147
+ setCanvasOffset = _useState8[1];
148
+
149
+ var _useState9 = (0, _react.useState)(undefined),
150
+ _useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
151
+ canvasOffsetStartPosition = _useState10[0],
152
+ setCanvasOffsetStartPosition = _useState10[1];
153
+
154
+ var _useState11 = (0, _react.useState)(_Shapes.ToolEnum.selection),
155
+ _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
156
+ activeTool = _useState12[0],
157
+ setActiveTool = _useState12[1];
158
+
159
+ var _useState13 = (0, _react.useState)({
160
+ mode: _Mode.SelectionModeLib["default"]
161
+ }),
162
+ _useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
163
+ selectionMode = _useState14[0],
164
+ setSelectionMode = _useState14[1];
165
+
166
+ var _useState15 = (0, _react.useState)(true),
167
+ _useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
168
+ withGrid = _useState16[0],
169
+ setWithGrid = _useState16[1];
170
+
171
+ var _useShapes = (0, _useShapes2["default"])(onDataChanged),
172
+ shapesRef = _useShapes.shapesRef,
173
+ selectedShape = _useShapes.selectedShape,
174
+ addShape = _useShapes.addShape,
175
+ addPictureShape = _useShapes.addPictureShape,
176
+ moveShapes = _useShapes.moveShapes,
177
+ setSelectedShape = _useShapes.setSelectedShape,
178
+ removeShape = _useShapes.removeShape,
179
+ updateShape = _useShapes.updateShape,
180
+ backwardShape = _useShapes.backwardShape,
181
+ forwardShape = _useShapes.forwardShape,
182
+ clearShapes = _useShapes.clearShapes,
183
+ saveShapes = _useShapes.saveShapes,
184
+ toggleShapeVisibility = _useShapes.toggleShapeVisibility,
185
+ toggleShapeLock = _useShapes.toggleShapeLock,
186
+ canGoBackward = _useShapes.canGoBackward,
187
+ canGoForward = _useShapes.canGoForward,
188
+ canClear = _useShapes.canClear;
189
+
190
+ var _useSnackbar = (0, _useSnackbar2["default"])(),
191
+ snackbarList = _useSnackbar.snackbarList,
192
+ addSnackbar = _useSnackbar.addSnackbar;
193
+
194
+ var selectTool = (0, _react.useCallback)(function (tool) {
195
+ setSelectedShape(undefined);
196
+ setActiveTool(tool);
197
+ }, [setSelectedShape]);
198
+ var undoAction = (0, _react.useCallback)(function () {
199
+ selectTool(_Shapes.ToolEnum.selection);
200
+ backwardShape();
201
+ }, [selectTool, backwardShape]);
202
+ var redoAction = (0, _react.useCallback)(function () {
203
+ selectTool(_Shapes.ToolEnum.selection);
204
+ forwardShape();
205
+ }, [selectTool, forwardShape]);
206
+ var clearCanvas = (0, _react.useCallback)(function () {
207
+ var shapesToInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
208
+ var clearHistory = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
209
+ clearShapes(shapesToInit, clearHistory);
210
+ selectTool(_Shapes.ToolEnum.selection);
211
+ setCanvasOffset([0, 0]);
212
+ }, [selectTool, clearShapes]);
213
+ var selectShape = (0, _react.useCallback)(function (shape) {
214
+ setActiveTool(_Shapes.ToolEnum.selection);
215
+ setSelectedShape(shape);
216
+ }, [setSelectedShape]);
217
+ var pasteShape = (0, _react.useCallback)(function (shape) {
218
+ addShape(shape);
219
+ selectShape(shape);
220
+ }, [addShape, selectShape]);
221
+ var exportCanvasInFile = (0, _react.useCallback)(function () {
222
+ setIsLoading(true);
223
+
224
+ try {
225
+ var dataURL = canvasRef.current && (0, _file.getCanvasImage)(canvasRef.current);
226
+
227
+ if (!dataURL) {
228
+ throw new Error();
229
+ }
230
+
231
+ (0, _file.downloadFile)(dataURL, 'drawing.png');
232
+ addSnackbar({
233
+ type: _snackbar.SnackbarTypeEnum.Success,
234
+ text: 'Export terminé !'
235
+ });
236
+ setIsLoading(false);
237
+ } catch (e) {
238
+ if (e instanceof Error) {
239
+ addSnackbar({
240
+ type: _snackbar.SnackbarTypeEnum.Error,
241
+ text: "L'export a échoué"
242
+ });
243
+ } else {
244
+ console.warn(e);
245
+ }
246
+ } finally {
247
+ setIsLoading(false);
248
+ }
249
+ }, [addSnackbar]);
250
+ var saveFile = (0, _react.useCallback)(function () {
251
+ setIsLoading(true);
252
+
253
+ try {
254
+ var content = (0, _file.encodeShapesInString)(shapesRef.current);
255
+
256
+ if (!content) {
257
+ throw new Error("L'enregistrement a échoué");
258
+ }
259
+
260
+ (0, _file.downloadFile)(content, 'drawing.json');
261
+ addSnackbar({
262
+ type: _snackbar.SnackbarTypeEnum.Success,
263
+ text: 'Fichier enregistré !'
264
+ });
265
+ setIsLoading(false);
266
+ } catch (e) {
267
+ if (e instanceof Error) {
268
+ addSnackbar({
269
+ type: _snackbar.SnackbarTypeEnum.Error,
270
+ text: e.message
271
+ });
272
+ } else {
273
+ console.warn(e);
274
+ }
275
+ } finally {
276
+ setIsLoading(false);
277
+ }
278
+ }, [shapesRef, addSnackbar]);
279
+ var loadJson = (0, _react.useCallback)( /*#__PURE__*/function () {
280
+ var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(json) {
281
+ var isValidated, shapes;
282
+ return _regenerator["default"].wrap(function _callee$(_context) {
283
+ while (1) {
284
+ switch (_context.prev = _context.next) {
285
+ case 0:
286
+ isValidated = (0, _file.validateJson)(json);
287
+
288
+ if (isValidated) {
289
+ _context.next = 3;
290
+ break;
291
+ }
292
+
293
+ throw new Error('Le fichier est corrompu');
294
+
295
+ case 3:
296
+ _context.next = 5;
297
+ return (0, _file.decodePicturesInShapes)(json);
298
+
299
+ case 5:
300
+ shapes = _context.sent;
301
+ clearCanvas(shapes, true);
302
+
303
+ case 7:
304
+ case "end":
305
+ return _context.stop();
306
+ }
307
+ }
308
+ }, _callee);
309
+ }));
310
+
311
+ return function (_x) {
312
+ return _ref6.apply(this, arguments);
313
+ };
314
+ }(), [clearCanvas]);
315
+ var loadFile = (0, _react.useCallback)( /*#__PURE__*/function () {
316
+ var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(file) {
317
+ var json;
318
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
319
+ while (1) {
320
+ switch (_context2.prev = _context2.next) {
321
+ case 0:
322
+ setIsLoading(true);
323
+ _context2.prev = 1;
324
+ _context2.next = 4;
325
+ return (0, _file.decodeJson)(file);
326
+
327
+ case 4:
328
+ json = _context2.sent;
329
+ _context2.next = 7;
330
+ return loadJson(json);
331
+
332
+ case 7:
333
+ addSnackbar({
334
+ type: _snackbar.SnackbarTypeEnum.Success,
335
+ text: 'Fichier chargé !'
336
+ });
337
+ _context2.next = 13;
338
+ break;
339
+
340
+ case 10:
341
+ _context2.prev = 10;
342
+ _context2.t0 = _context2["catch"](1);
343
+
344
+ if (_context2.t0 instanceof Error) {
345
+ addSnackbar({
346
+ type: _snackbar.SnackbarTypeEnum.Error,
347
+ text: _context2.t0.message
348
+ });
349
+ } else {
350
+ console.warn(_context2.t0);
351
+ }
352
+
353
+ case 13:
354
+ _context2.prev = 13;
355
+ setIsLoading(false);
356
+ return _context2.finish(13);
357
+
358
+ case 16:
359
+ case "end":
360
+ return _context2.stop();
361
+ }
362
+ }
363
+ }, _callee2, null, [[1, 10, 13, 16]]);
364
+ }));
365
+
366
+ return function (_x2) {
367
+ return _ref7.apply(this, arguments);
368
+ };
369
+ }(), [loadJson, addSnackbar]);
370
+ var addPicture = (0, _react.useCallback)( /*#__PURE__*/function () {
371
+ var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(fileOrUrl) {
372
+ var pictureShape;
373
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
374
+ while (1) {
375
+ switch (_context3.prev = _context3.next) {
376
+ case 0:
377
+ setIsLoading(true);
378
+ _context3.prev = 1;
379
+ _context3.next = 4;
380
+ return addPictureShape(fileOrUrl);
381
+
382
+ case 4:
383
+ pictureShape = _context3.sent;
384
+ selectShape(pictureShape);
385
+ _context3.next = 11;
386
+ break;
387
+
388
+ case 8:
389
+ _context3.prev = 8;
390
+ _context3.t0 = _context3["catch"](1);
391
+
392
+ if (_context3.t0 instanceof Error) {
393
+ addSnackbar({
394
+ type: _snackbar.SnackbarTypeEnum.Error,
395
+ text: _context3.t0.message
396
+ });
397
+ } else {
398
+ console.warn(_context3.t0);
399
+ }
400
+
401
+ case 11:
402
+ _context3.prev = 11;
403
+ setIsLoading(false);
404
+ return _context3.finish(11);
405
+
406
+ case 14:
407
+ case "end":
408
+ return _context3.stop();
409
+ }
410
+ }
411
+ }, _callee3, null, [[1, 8, 11, 14]]);
412
+ }));
413
+
414
+ return function (_x3) {
415
+ return _ref8.apply(this, arguments);
416
+ };
417
+ }(), [addPictureShape, selectShape, addSnackbar]);
418
+ (0, _useKeyboard["default"])({
419
+ isInsideComponent: isInsideComponent,
420
+ isEditingText: selectionMode.mode === _Mode.SelectionModeLib.textedition,
421
+ selectedShape: selectedShape,
422
+ setSelectedShape: setSelectedShape,
423
+ removeShape: removeShape,
424
+ pasteShape: pasteShape,
425
+ updateShape: updateShape,
426
+ backwardShape: backwardShape,
427
+ forwardShape: forwardShape
428
+ });
429
+ (0, _react.useEffect)(function () {
430
+ if (!isInsideComponent) setSelectedShape(undefined);
431
+ }, [isInsideComponent, setSelectedShape]);
432
+ (0, _react.useEffect)(function () {
433
+ if (shapesFromProps !== undefined) {
434
+ void loadJson(shapesFromProps);
435
+ }
436
+ }, [loadJson, shapesFromProps]);
437
+ (0, _react.useEffect)(function () {
438
+ if (!apiRef) return;
439
+ apiRef.current = {
440
+ getCurrentImage: function getCurrentImage() {
441
+ return canvasRef.current ? (0, _file.getCanvasImage)(canvasRef.current) : undefined;
442
+ },
443
+ getCurrentData: function getCurrentData() {
444
+ return (0, _file.encodePicturesInShapes)(shapesRef.current);
445
+ }
446
+ };
447
+ }, [apiRef, shapesRef]);
448
+ var className = "".concat(classNameFromProps !== null && classNameFromProps !== void 0 ? classNameFromProps : '', " ").concat(isLayoutPanelShown ? 'layoutPanelOpened' : '');
449
+ return /*#__PURE__*/_react["default"].createElement(StyledApp, {
450
+ ref: componentRef,
451
+ className: className,
452
+ width: width,
453
+ "data-grow": canGrow,
454
+ "data-shrink": canShrink
455
+ }, /*#__PURE__*/_react["default"].createElement(_Toolbar["default"], {
456
+ disabled: disabled,
457
+ activeTool: activeTool,
458
+ clearCanvas: clearCanvas,
459
+ setActiveTool: selectTool,
460
+ exportCanvasInFile: exportCanvasInFile,
461
+ saveFile: saveFile,
462
+ loadFile: loadFile,
463
+ addPicture: addPicture,
464
+ hasActionToUndo: canGoBackward,
465
+ hasActionToRedo: canGoForward,
466
+ hasActionToClear: canClear,
467
+ undoAction: undoAction,
468
+ redoAction: redoAction,
469
+ availableTools: availableTools
470
+ }), /*#__PURE__*/_react["default"].createElement(StyledRow, {
471
+ "data-grow": canGrow,
472
+ width: width,
473
+ aspectRatio: "calc(".concat(width, " / ").concat(height, ")")
474
+ }, /*#__PURE__*/_react["default"].createElement(_Canvas["default"], {
475
+ canGrow: canGrow,
476
+ withGrid: withGrid,
477
+ disabled: disabled,
478
+ isInsideComponent: isInsideComponent,
479
+ activeTool: activeTool,
480
+ setActiveTool: setActiveTool,
481
+ canvasOffsetStartPosition: canvasOffsetStartPosition,
482
+ setCanvasOffsetStartPosition: setCanvasOffsetStartPosition,
483
+ shapes: shapesRef.current,
484
+ addShape: addShape,
485
+ updateSingleShape: updateShape,
486
+ selectedShape: selectedShape,
487
+ setSelectedShape: setSelectedShape,
488
+ canvasOffset: canvasOffset,
489
+ setCanvasOffset: setCanvasOffset,
490
+ defaultConf: defaultConf,
491
+ saveShapes: saveShapes,
492
+ ref: canvasRef,
493
+ width: width,
494
+ height: height,
495
+ selectionMode: selectionMode,
496
+ setSelectionMode: setSelectionMode
497
+ }), /*#__PURE__*/_react["default"].createElement(_Layouts["default"], {
498
+ withGrid: withGrid,
499
+ setWithGrid: setWithGrid,
500
+ disabled: disabled,
501
+ shapes: shapesRef.current,
502
+ moveShapes: moveShapes,
503
+ selectedShape: selectedShape,
504
+ removeShape: removeShape,
505
+ selectShape: selectShape,
506
+ toggleShapeVisibility: toggleShapeVisibility,
507
+ toggleShapeLock: toggleShapeLock,
508
+ withLayouts: withLayouts,
509
+ isLayoutPanelShown: isLayoutPanelShown
510
+ })), /*#__PURE__*/_react["default"].createElement(_SettingsBar["default"], {
511
+ disabled: disabled,
512
+ activeTool: activeTool,
513
+ selectedShape: selectedShape,
514
+ removeShape: removeShape,
515
+ updateShape: updateShape,
516
+ defaultConf: defaultConf,
517
+ setDefaultConf: setDefaultConf,
518
+ canvas: canvasRef.current,
519
+ withLayouts: withLayouts,
520
+ toggleLayoutPanel: function toggleLayoutPanel() {
521
+ setIsLayoutPanelShown(function (prev) {
522
+ return !prev;
523
+ });
524
+ }
525
+ }), /*#__PURE__*/_react["default"].createElement(_Loading["default"], {
526
+ isLoading: isLoading
527
+ }), /*#__PURE__*/_react["default"].createElement(_Snackbar["default"], {
528
+ snackbarList: snackbarList
529
+ }));
530
+ };
531
+
532
+ var _default = App;
533
+ exports["default"] = _default;