@searpent/react-image-annotate 2.0.77 → 2.0.78

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 (224) hide show
  1. package/Annotator/exampleImages.js +41 -0
  2. package/Annotator/examplePhotos.js +6980 -0
  3. package/Annotator/index.js +417 -0
  4. package/Annotator/reducers/combine-reducers.js +14 -0
  5. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  6. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  7. package/Annotator/reducers/general-reducer.js +1430 -0
  8. package/Annotator/reducers/get-active-image.js +27 -0
  9. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  10. package/Annotator/reducers/history-handler.js +38 -0
  11. package/Annotator/reducers/image-reducer.js +20 -0
  12. package/Annotator/reducers/video-reducer.js +88 -0
  13. package/ClassSelectionMenu/index.js +140 -0
  14. package/Crosshairs/index.js +53 -0
  15. package/DebugSidebarBox/index.js +20 -0
  16. package/DemoSite/Editor.js +194 -0
  17. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  18. package/DemoSite/index.js +40 -0
  19. package/Editor/annotation-plugin/annotation.js +697 -0
  20. package/Editor/index.js +93 -0
  21. package/Editor/readOnly.js +123 -0
  22. package/{src/Editor → Editor}/tools.js +2 -3
  23. package/Errorer/index.js +11 -0
  24. package/FullImageSegmentationAnnotator/index.js +7 -0
  25. package/GroupSelectorSidebarBox/index.js +63 -0
  26. package/GroupsEditorSidebarBox/index.js +138 -0
  27. package/HelpSidebarBox/index.js +58 -0
  28. package/HighlightBox/index.js +102 -0
  29. package/HistorySidebarBox/index.js +71 -0
  30. package/ImageCanvas/index.js +441 -0
  31. package/ImageCanvas/region-tools.js +165 -0
  32. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  33. package/ImageCanvas/use-mouse.js +180 -0
  34. package/ImageCanvas/use-project-box.js +27 -0
  35. package/ImageCanvas/use-wasd-mode.js +62 -0
  36. package/ImageMask/index.js +133 -0
  37. package/ImageMask/load-image.js +25 -0
  38. package/ImageSelectorSidebarBox/index.js +60 -0
  39. package/KeyframeTimeline/get-time-string.js +27 -0
  40. package/KeyframeTimeline/index.js +233 -0
  41. package/KeyframesSelectorSidebarBox/index.js +93 -0
  42. package/LandingPage/index.js +159 -0
  43. package/Locker/index.js +11 -0
  44. package/MainLayout/RightSidebarItemsWrapper.js +19 -0
  45. package/MainLayout/icon-dictionary.js +104 -0
  46. package/MainLayout/index.js +526 -0
  47. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  48. package/MainLayout/types.js +0 -0
  49. package/MainLayout/use-implied-video-regions.js +13 -0
  50. package/MetadataEditorSidebarBox/index.js +231 -0
  51. package/PageSelector/index.js +180 -0
  52. package/PointDistances/index.js +73 -0
  53. package/PreventScrollToParents/index.js +51 -0
  54. package/RegionLabel/index.js +232 -0
  55. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  56. package/RegionSelectAndTransformBoxes/index.js +169 -0
  57. package/RegionSelectorSidebarBox/index.js +254 -0
  58. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  59. package/RegionShapes/index.js +294 -0
  60. package/RegionTags/index.js +144 -0
  61. package/SettingsDialog/index.js +52 -0
  62. package/SettingsProvider/index.js +60 -0
  63. package/Shortcuts/ShortcutField.js +46 -0
  64. package/Shortcuts/index.js +133 -0
  65. package/ShortcutsManager/index.js +155 -0
  66. package/Sidebar/index.js +69 -0
  67. package/SidebarBoxContainer/index.js +93 -0
  68. package/SmallToolButton/index.js +42 -0
  69. package/TagsSidebarBox/index.js +105 -0
  70. package/TaskDescriptionSidebarBox/index.js +58 -0
  71. package/Theme/index.js +30 -0
  72. package/VideoOrImageCanvasBackground/index.js +151 -0
  73. package/colors.js +14 -0
  74. package/hooks/use-colors.js +127 -0
  75. package/hooks/use-event-callback.js +10 -0
  76. package/hooks/use-exclude-pattern.js +24 -0
  77. package/hooks/use-load-image.js +26 -0
  78. package/hooks/use-window-size.js +46 -0
  79. package/{src/hooks → hooks}/xpattern.js +1 -1
  80. package/index.js +3 -0
  81. package/lib.js +3 -0
  82. package/package.json +1 -1
  83. package/stories.js +5 -0
  84. package/utils/blocks-to-article.js +60 -0
  85. package/{src/utils → utils}/blocks-to-article.test.js +5 -8
  86. package/{src/utils → utils}/default-locked-until.js +2 -1
  87. package/{src/utils → utils}/filter-only-unique.js +1 -1
  88. package/utils/get-from-local-storage.js +7 -0
  89. package/utils/get-hotkey-help-text.js +9 -0
  90. package/utils/get-landmarks-with-transform.js +40 -0
  91. package/utils/photosToImages.js +85 -0
  92. package/utils/regions-groups.js +28 -0
  93. package/utils/regions-to-blocks.js +18 -0
  94. package/utils/saveable-actions-enum.js +3 -0
  95. package/utils/set-in-local-storage.js +3 -0
  96. package/utils/sleep.js +7 -0
  97. package/utils/uuid-to-hash.js +5 -0
  98. package/.babelrc +0 -6
  99. package/.env +0 -1
  100. package/.flowconfig +0 -2
  101. package/.github/workflows/release-on-master.yml +0 -32
  102. package/.github/workflows/test.yml +0 -16
  103. package/.prettierrc +0 -3
  104. package/.releaserc.js +0 -18
  105. package/.storybook/addons.js +0 -2
  106. package/.storybook/config.js +0 -16
  107. package/LICENSE +0 -21
  108. package/public/favicon.ico +0 -0
  109. package/public/index.html +0 -38
  110. package/src/Annotator/bike-pic.png +0 -0
  111. package/src/Annotator/bike-pic2.png +0 -0
  112. package/src/Annotator/dab-keyframes.story.json +0 -1
  113. package/src/Annotator/exampleImages.js +0 -48
  114. package/src/Annotator/examplePhotos.js +0 -7603
  115. package/src/Annotator/index.js +0 -380
  116. package/src/Annotator/index.story.js +0 -899
  117. package/src/Annotator/poses.story.js +0 -150
  118. package/src/Annotator/reducers/combine-reducers.js +0 -7
  119. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  120. package/src/Annotator/reducers/general-reducer.js +0 -1228
  121. package/src/Annotator/reducers/get-active-image.js +0 -21
  122. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  123. package/src/Annotator/reducers/history-handler.js +0 -60
  124. package/src/Annotator/reducers/image-reducer.js +0 -23
  125. package/src/Annotator/reducers/video-reducer.js +0 -85
  126. package/src/Annotator/video.story.js +0 -51
  127. package/src/ClassSelectionMenu/index.js +0 -112
  128. package/src/Crosshairs/index.js +0 -64
  129. package/src/DebugSidebarBox/index.js +0 -36
  130. package/src/DemoSite/Editor.js +0 -235
  131. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  132. package/src/DemoSite/index.js +0 -41
  133. package/src/DemoSite/index.story.js +0 -10
  134. package/src/DemoSite/simple-segmentation-example.json +0 -572
  135. package/src/Editor/annotation-plugin/annotation.js +0 -546
  136. package/src/Editor/index.js +0 -50
  137. package/src/Editor/readOnly.js +0 -31
  138. package/src/Errorer/index.js +0 -13
  139. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  140. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  141. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  142. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  143. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  144. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  145. package/src/GroupSelectorSidebarBox/index.js +0 -48
  146. package/src/GroupsEditorSidebarBox/index.js +0 -108
  147. package/src/HelpSidebarBox/index.js +0 -43
  148. package/src/HighlightBox/index.js +0 -143
  149. package/src/HistorySidebarBox/index.js +0 -78
  150. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  151. package/src/ImageCanvas/index.js +0 -515
  152. package/src/ImageCanvas/index.story.js +0 -314
  153. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  154. package/src/ImageCanvas/region-tools.js +0 -171
  155. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  156. package/src/ImageCanvas/use-mouse.js +0 -168
  157. package/src/ImageCanvas/use-project-box.js +0 -23
  158. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  159. package/src/ImageMask/index.js +0 -127
  160. package/src/ImageMask/load-image.js +0 -32
  161. package/src/ImageSelectorSidebarBox/index.js +0 -54
  162. package/src/KeyframeTimeline/get-time-string.js +0 -25
  163. package/src/KeyframeTimeline/index.js +0 -223
  164. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  165. package/src/LandingPage/content.md +0 -57
  166. package/src/LandingPage/github-markdown.css +0 -964
  167. package/src/LandingPage/index.js +0 -147
  168. package/src/Locker/index.js +0 -13
  169. package/src/MainLayout/RightSidebarItemsWrapper.js +0 -21
  170. package/src/MainLayout/icon-dictionary.js +0 -79
  171. package/src/MainLayout/index.js +0 -564
  172. package/src/MainLayout/index.story.js +0 -240
  173. package/src/MainLayout/types.js +0 -171
  174. package/src/MainLayout/use-implied-video-regions.js +0 -17
  175. package/src/MetadataEditorSidebarBox/index.js +0 -160
  176. package/src/PageSelector/index.js +0 -159
  177. package/src/PointDistances/index.js +0 -90
  178. package/src/PreventScrollToParents/index.js +0 -48
  179. package/src/PreventScrollToParents/index.story.js +0 -23
  180. package/src/RegionLabel/index.js +0 -236
  181. package/src/RegionSelectAndTransformBoxes/index.js +0 -236
  182. package/src/RegionSelectorSidebarBox/index.js +0 -220
  183. package/src/RegionShapes/index.js +0 -254
  184. package/src/RegionTags/index.js +0 -136
  185. package/src/SettingsDialog/index.js +0 -58
  186. package/src/SettingsProvider/index.js +0 -57
  187. package/src/Shortcuts/ShortcutField.js +0 -44
  188. package/src/Shortcuts/index.js +0 -129
  189. package/src/ShortcutsManager/index.js +0 -162
  190. package/src/Sidebar/index.js +0 -117
  191. package/src/SidebarBoxContainer/index.js +0 -93
  192. package/src/SmallToolButton/index.js +0 -57
  193. package/src/TagsSidebarBox/index.js +0 -93
  194. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  195. package/src/Theme/index.js +0 -36
  196. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  197. package/src/colors.js +0 -32
  198. package/src/hooks/use-colors.js +0 -95
  199. package/src/hooks/use-event-callback.js +0 -11
  200. package/src/hooks/use-exclude-pattern.js +0 -27
  201. package/src/hooks/use-load-image.js +0 -21
  202. package/src/hooks/use-window-size.js +0 -46
  203. package/src/hooks/xpattern.png +0 -0
  204. package/src/index.js +0 -18
  205. package/src/lib.js +0 -7
  206. package/src/screenshot.png +0 -0
  207. package/src/site.css +0 -5
  208. package/src/stories.js +0 -2
  209. package/src/utils/blocks-to-article.js +0 -61
  210. package/src/utils/get-from-local-storage.js +0 -7
  211. package/src/utils/get-hotkey-help-text.js +0 -11
  212. package/src/utils/get-landmarks-with-transform.js +0 -23
  213. package/src/utils/photosToImages.js +0 -67
  214. package/src/utils/regions-groups.js +0 -19
  215. package/src/utils/regions-to-blocks.js +0 -16
  216. package/src/utils/saveable-actions-enum.js +0 -5
  217. package/src/utils/set-in-local-storage.js +0 -6
  218. package/src/utils/sleep.js +0 -3
  219. package/src/utils/uuid-to-hash.js +0 -5
  220. /package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  221. /package/{src/Errorer → Errorer}/errorer.css +0 -0
  222. /package/{src/Locker → Locker}/locker.css +0 -0
  223. /package/{src/PageSelector → PageSelector}/page-selector.css +0 -0
  224. /package/{src/utils → utils}/next-group-id.js +0 -0
@@ -0,0 +1,1430 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
4
+ import { moveRegion } from "../../ImageCanvas/region-tools.js";
5
+ import { getIn, setIn, updateIn } from "seamless-immutable";
6
+ import moment from "moment";
7
+ import isEqual from "lodash/isEqual";
8
+ import uniq from "lodash/uniq";
9
+ import getActiveImage from "./get-active-image";
10
+ import { saveToHistory } from "./history-handler.js";
11
+ import colors from "../../colors";
12
+ import fixTwisted from "./fix-twisted";
13
+ import convertExpandingLineToPolygon from "./convert-expanding-line-to-polygon";
14
+ import clamp from "clamp";
15
+ import getLandmarksWithTransform from "../../utils/get-landmarks-with-transform";
16
+ import setInLocalStorage from "../../utils/set-in-local-storage";
17
+ import onlyUnique from "../../utils/filter-only-unique";
18
+ import nextGroupId from "../../utils/next-group-id";
19
+ import defaultLockedUntil from "../../utils/default-locked-until";
20
+
21
+ var getRandomId = function getRandomId() {
22
+ return Math.random().toString().split(".")[1];
23
+ };
24
+
25
+ export default (function (state, action) {
26
+ if (state.allowedArea && state.selectedTool !== "modify-allowed-area" && ["MOUSE_DOWN", "MOUSE_UP", "MOUSE_MOVE"].includes(action.type)) {
27
+ var aa = state.allowedArea;
28
+ action.x = clamp(action.x, aa.x, aa.x + aa.w);
29
+ action.y = clamp(action.y, aa.y, aa.y + aa.h);
30
+ }
31
+
32
+ if (action.type === "ON_CLS_ADDED" && action.cls && action.cls !== "") {
33
+ var oldRegionClsList = state.regionClsList;
34
+
35
+ var newState = _objectSpread({}, state, {
36
+ regionClsList: oldRegionClsList.concat(action.cls)
37
+ });
38
+
39
+ return newState;
40
+ } // Throttle certain actions
41
+
42
+
43
+ if (action.type === "MOUSE_MOVE") {
44
+ if (Date.now() - (state.lastMouseMoveCall || 0) < 16) return state;
45
+ state = setIn(state, ["lastMouseMoveCall"], Date.now());
46
+ }
47
+
48
+ if (!action.type.includes("MOUSE")) {
49
+ state = setIn(state, ["lastAction"], action);
50
+ }
51
+
52
+ var _getActiveImage = getActiveImage(state),
53
+ currentImageIndex = _getActiveImage.currentImageIndex,
54
+ pathToActiveImage = _getActiveImage.pathToActiveImage,
55
+ activeImage = _getActiveImage.activeImage;
56
+
57
+ var getRegionIndex = function getRegionIndex(region) {
58
+ var regionId = typeof region === "string" || typeof region === "number" ? region : region.id;
59
+ if (!activeImage) return null;
60
+ var regionIndex = (activeImage.regions || []).findIndex(function (r) {
61
+ return r.id === regionId;
62
+ });
63
+ return regionIndex === -1 ? null : regionIndex;
64
+ };
65
+
66
+ var getRegion = function getRegion(regionId) {
67
+ if (!activeImage) return null;
68
+ var regionIndex = getRegionIndex(regionId);
69
+ if (regionIndex === null) return [null, null];
70
+ var region = activeImage.regions[regionIndex];
71
+ return [region, regionIndex];
72
+ };
73
+
74
+ var modifyRegion = function modifyRegion(regionId, obj) {
75
+ var _getRegion = getRegion(regionId),
76
+ _getRegion2 = _slicedToArray(_getRegion, 2),
77
+ region = _getRegion2[0],
78
+ regionIndex = _getRegion2[1];
79
+
80
+ if (!region) return state;
81
+
82
+ if (obj !== null) {
83
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", regionIndex]), _objectSpread({}, region, obj));
84
+ } else {
85
+ // delete region
86
+ var regions = activeImage.regions;
87
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (regions || []).filter(function (r) {
88
+ return r.id !== region.id;
89
+ }));
90
+ }
91
+ };
92
+
93
+ var unselectRegions = function unselectRegions(state) {
94
+ if (!activeImage) return state;
95
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).map(function (r) {
96
+ return _objectSpread({}, r, {
97
+ highlighted: false
98
+ });
99
+ }));
100
+ };
101
+
102
+ var closeEditors = function closeEditors(state) {
103
+ if (currentImageIndex === null) return state;
104
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).map(function (r) {
105
+ return _objectSpread({}, r, {
106
+ editingLabels: false
107
+ });
108
+ }));
109
+ };
110
+
111
+ var addSaveableAction = function addSaveableAction(state, action) {
112
+ if (currentImageIndex === null) return state;
113
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["saveableActions"]), [].concat(_toConsumableArray(activeImage.saveableActions || []), [action]));
114
+ };
115
+
116
+ var setNewImage = function setNewImage(img, index) {
117
+ var _ref = typeof img === "object" ? img : {
118
+ src: img
119
+ },
120
+ src = _ref.src,
121
+ frameTime = _ref.frameTime;
122
+
123
+ state = setIn(state, ["previouslySelectedImage"], state.selectedImage);
124
+ return setIn(setIn(state, ["selectedImage"], index), ["selectedImageFrameTime"], frameTime);
125
+ };
126
+
127
+ switch (action.type) {
128
+ case "@@INIT":
129
+ {
130
+ return state;
131
+ }
132
+
133
+ case "SELECT_IMAGE":
134
+ {
135
+ return setNewImage(action.image, action.imageIndex);
136
+ }
137
+
138
+ case "SELECT_CLASSIFICATION":
139
+ {
140
+ var _state$images$state$s;
141
+
142
+ // if there is selected region, set its cls
143
+ var selectedRegionId = (_state$images$state$s = state.images[state.selectedImage].regions.find(function (r) {
144
+ return r.highlighted === true;
145
+ })) === null || _state$images$state$s === void 0 ? void 0 : _state$images$state$s.id;
146
+
147
+ if (selectedRegionId) {
148
+ var newRegions = activeImage.regions.map(function (r) {
149
+ if (r.id === selectedRegionId) {
150
+ return _objectSpread({}, r, {
151
+ cls: action.cls
152
+ });
153
+ } else {
154
+ return r;
155
+ }
156
+ });
157
+ state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), newRegions);
158
+ }
159
+
160
+ state = addSaveableAction(state, "SELECT_CLASSIFICATION");
161
+ return setIn(state, ["selectedCls"], action.cls);
162
+ }
163
+
164
+ case "CHANGE_REGION":
165
+ {
166
+ var regionIndex = getRegionIndex(action.region);
167
+ if (regionIndex === null) return state;
168
+ var oldRegion = activeImage.regions[regionIndex];
169
+
170
+ if (oldRegion.cls !== action.region.cls) {
171
+ state = saveToHistory(state, "Change Region Classification");
172
+ var clsIndex = state.regionClsList.indexOf(action.region.cls);
173
+
174
+ if (clsIndex !== -1) {
175
+ state = setIn(state, ["selectedCls"], action.region.cls);
176
+ action.region.color = colors[clsIndex % colors.length];
177
+ }
178
+ }
179
+
180
+ if (!isEqual(oldRegion.tags, action.region.tags)) {
181
+ state = saveToHistory(state, "Change Region Tags");
182
+ }
183
+
184
+ if (!isEqual(oldRegion.comment, action.region.comment)) {
185
+ state = saveToHistory(state, "Change Region Comment");
186
+ }
187
+
188
+ state = addSaveableAction(state, "CHANGE_REGION");
189
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", regionIndex]), action.region);
190
+ }
191
+
192
+ case "CHANGE_IMAGE":
193
+ {
194
+ if (!activeImage) return state;
195
+ var delta = action.delta;
196
+
197
+ for (var _i = 0, _Object$keys = Object.keys(delta); _i < _Object$keys.length; _i++) {
198
+ var key = _Object$keys[_i];
199
+ if (key === "cls") saveToHistory(state, "Change Image Class");
200
+ if (key === "tags") saveToHistory(state, "Change Image Tags");
201
+ state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), [key]), delta[key]);
202
+ }
203
+
204
+ return state;
205
+ }
206
+
207
+ case "SELECT_REGION":
208
+ {
209
+ var region = action.region;
210
+
211
+ var _regionIndex = getRegionIndex(action.region);
212
+
213
+ if (_regionIndex === null) return state;
214
+
215
+ var regions = _toConsumableArray(activeImage.regions || []).map(function (r) {
216
+ return _objectSpread({}, r, {
217
+ highlighted: r.id === region.id,
218
+ groupHighlighted: r.groupId && r.groupId === region.groupId ? true : false,
219
+ editingLabels: region.ctrlKey ? r.id === region.id : false
220
+ });
221
+ });
222
+
223
+ var selectedGroupIds = regions.filter(function (i) {
224
+ return i.highlighted;
225
+ }).map(function (r) {
226
+ return r.groupId || '';
227
+ }).filter(onlyUnique);
228
+
229
+ if (selectedGroupIds.length === 1) {
230
+ state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["selectedGroupId"]), selectedGroupIds[0]);
231
+ }
232
+
233
+ if (selectedGroupIds.length === 0) {
234
+ state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["selectedGroupId"]), null);
235
+ }
236
+
237
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), regions);
238
+ }
239
+
240
+ case "BEGIN_MOVE_POINT":
241
+ {
242
+ state = closeEditors(state);
243
+ return setIn(state, ["mode"], {
244
+ mode: "MOVE_REGION",
245
+ regionId: action.point.id
246
+ });
247
+ }
248
+
249
+ case "BEGIN_BOX_TRANSFORM":
250
+ {
251
+ var box = action.box,
252
+ directions = action.directions;
253
+ state = closeEditors(state);
254
+
255
+ if (directions[0] === 0 && directions[1] === 0) {
256
+ return setIn(state, ["mode"], {
257
+ mode: "MOVE_REGION",
258
+ regionId: box.id
259
+ });
260
+ } else {
261
+ return setIn(state, ["mode"], {
262
+ mode: "RESIZE_BOX",
263
+ regionId: box.id,
264
+ freedom: directions,
265
+ original: {
266
+ x: box.x,
267
+ y: box.y,
268
+ w: box.w,
269
+ h: box.h
270
+ }
271
+ });
272
+ }
273
+ }
274
+
275
+ case "BEGIN_MOVE_POLYGON_POINT":
276
+ {
277
+ var polygon = action.polygon,
278
+ pointIndex = action.pointIndex;
279
+ state = closeEditors(state);
280
+
281
+ if (state.mode && state.mode.mode === "DRAW_POLYGON" && pointIndex === 0) {
282
+ return setIn(modifyRegion(polygon, {
283
+ points: polygon.points.slice(0, -1),
284
+ open: false
285
+ }), ["mode"], null);
286
+ } else {
287
+ state = saveToHistory(state, "Move Polygon Point");
288
+ }
289
+
290
+ return setIn(state, ["mode"], {
291
+ mode: "MOVE_POLYGON_POINT",
292
+ regionId: polygon.id,
293
+ pointIndex: pointIndex
294
+ });
295
+ }
296
+
297
+ case "BEGIN_MOVE_KEYPOINT":
298
+ {
299
+ var _region = action.region,
300
+ keypointId = action.keypointId;
301
+ state = closeEditors(state);
302
+ state = saveToHistory(state, "Move Keypoint");
303
+ return setIn(state, ["mode"], {
304
+ mode: "MOVE_KEYPOINT",
305
+ regionId: _region.id,
306
+ keypointId: keypointId
307
+ });
308
+ }
309
+
310
+ case "ADD_POLYGON_POINT":
311
+ {
312
+ var _polygon = action.polygon,
313
+ point = action.point,
314
+ _pointIndex = action.pointIndex;
315
+
316
+ var _regionIndex2 = getRegionIndex(_polygon);
317
+
318
+ if (_regionIndex2 === null) return state;
319
+
320
+ var points = _toConsumableArray(_polygon.points);
321
+
322
+ points.splice(_pointIndex, 0, point);
323
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex2]), _objectSpread({}, _polygon, {
324
+ points: points
325
+ }));
326
+ }
327
+
328
+ case "MOUSE_MOVE":
329
+ {
330
+ var x = action.x,
331
+ y = action.y;
332
+ if (!state.mode) return state;
333
+ if (!activeImage) return state;
334
+ var _state = state,
335
+ mouseDownAt = _state.mouseDownAt;
336
+
337
+ switch (state.mode.mode) {
338
+ case "MOVE_POLYGON_POINT":
339
+ {
340
+ var _state$mode = state.mode,
341
+ _pointIndex2 = _state$mode.pointIndex,
342
+ regionId = _state$mode.regionId;
343
+
344
+ var _regionIndex3 = getRegionIndex(regionId);
345
+
346
+ if (_regionIndex3 === null) return state;
347
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex3, "points", _pointIndex2]), [x, y]);
348
+ }
349
+
350
+ case "MOVE_KEYPOINT":
351
+ {
352
+ var _state$mode2 = state.mode,
353
+ _keypointId = _state$mode2.keypointId,
354
+ _regionId = _state$mode2.regionId;
355
+
356
+ var _getRegion3 = getRegion(_regionId),
357
+ _getRegion4 = _slicedToArray(_getRegion3, 2),
358
+ _region2 = _getRegion4[0],
359
+ _regionIndex4 = _getRegion4[1];
360
+
361
+ if (_regionIndex4 === null) return state;
362
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex4, "points", _keypointId]), _objectSpread({}, _region2.points[_keypointId], {
363
+ x: x,
364
+ y: y
365
+ }));
366
+ }
367
+
368
+ case "MOVE_REGION":
369
+ {
370
+ var _regionId2 = state.mode.regionId;
371
+
372
+ if (_regionId2 === "$$allowed_area") {
373
+ var _state2 = state,
374
+ _state2$allowedArea = _state2.allowedArea,
375
+ w = _state2$allowedArea.w,
376
+ h = _state2$allowedArea.h;
377
+ return setIn(state, ["allowedArea"], {
378
+ x: x - w / 2,
379
+ y: y - h / 2,
380
+ w: w,
381
+ h: h
382
+ });
383
+ }
384
+
385
+ var _regionIndex5 = getRegionIndex(_regionId2);
386
+
387
+ if (_regionIndex5 === null) return state;
388
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex5]), moveRegion(activeImage.regions[_regionIndex5], x, y));
389
+ }
390
+
391
+ case "RESIZE_BOX":
392
+ {
393
+ var _state$mode3 = state.mode,
394
+ _regionId3 = _state$mode3.regionId,
395
+ _state$mode3$freedom = _slicedToArray(_state$mode3.freedom, 2),
396
+ xFree = _state$mode3$freedom[0],
397
+ yFree = _state$mode3$freedom[1],
398
+ _state$mode3$original = _state$mode3.original,
399
+ ox = _state$mode3$original.x,
400
+ oy = _state$mode3$original.y,
401
+ ow = _state$mode3$original.w,
402
+ oh = _state$mode3$original.h;
403
+
404
+ var dx = xFree === 0 ? ox : xFree === -1 ? Math.min(ox + ow, x) : ox;
405
+ var dw = xFree === 0 ? ow : xFree === -1 ? ow + (ox - dx) : Math.max(0, ow + (x - ox - ow));
406
+ var dy = yFree === 0 ? oy : yFree === -1 ? Math.min(oy + oh, y) : oy;
407
+ var dh = yFree === 0 ? oh : yFree === -1 ? oh + (oy - dy) : Math.max(0, oh + (y - oy - oh)); // determine if we should switch the freedom
408
+
409
+ if (dw <= 0.001) {
410
+ state = setIn(state, ["mode", "freedom"], [xFree * -1, yFree]);
411
+ }
412
+
413
+ if (dh <= 0.001) {
414
+ state = setIn(state, ["mode", "freedom"], [xFree, yFree * -1]);
415
+ }
416
+
417
+ if (_regionId3 === "$$allowed_area") {
418
+ return setIn(state, ["allowedArea"], {
419
+ x: dx,
420
+ w: dw,
421
+ y: dy,
422
+ h: dh
423
+ });
424
+ }
425
+
426
+ var _regionIndex6 = getRegionIndex(_regionId3);
427
+
428
+ if (_regionIndex6 === null) return state;
429
+ var _box = activeImage.regions[_regionIndex6];
430
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex6]), _objectSpread({}, _box, {
431
+ x: dx,
432
+ w: dw,
433
+ y: dy,
434
+ h: dh
435
+ }));
436
+ }
437
+
438
+ case "RESIZE_KEYPOINTS":
439
+ {
440
+ var _state$mode4 = state.mode,
441
+ _regionId4 = _state$mode4.regionId,
442
+ landmarks = _state$mode4.landmarks,
443
+ centerX = _state$mode4.centerX,
444
+ centerY = _state$mode4.centerY;
445
+ var distFromCenter = Math.sqrt(Math.pow(centerX - x, 2) + Math.pow(centerY - y, 2));
446
+ var scale = distFromCenter / 0.15;
447
+ return modifyRegion(_regionId4, {
448
+ points: getLandmarksWithTransform({
449
+ landmarks: landmarks,
450
+ center: {
451
+ x: centerX,
452
+ y: centerY
453
+ },
454
+ scale: scale
455
+ })
456
+ });
457
+ }
458
+
459
+ case "DRAW_POLYGON":
460
+ {
461
+ var _regionId5 = state.mode.regionId;
462
+
463
+ var _getRegion5 = getRegion(_regionId5),
464
+ _getRegion6 = _slicedToArray(_getRegion5, 2),
465
+ _region3 = _getRegion6[0],
466
+ _regionIndex7 = _getRegion6[1];
467
+
468
+ if (!_region3) return setIn(state, ["mode"], null);
469
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex7, "points", _region3.points.length - 1]), [x, y]);
470
+ }
471
+
472
+ case "DRAW_LINE":
473
+ {
474
+ var _regionId6 = state.mode.regionId;
475
+
476
+ var _getRegion7 = getRegion(_regionId6),
477
+ _getRegion8 = _slicedToArray(_getRegion7, 2),
478
+ _region4 = _getRegion8[0],
479
+ _regionIndex8 = _getRegion8[1];
480
+
481
+ if (!_region4) return setIn(state, ["mode"], null);
482
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex8]), _objectSpread({}, _region4, {
483
+ x2: x,
484
+ y2: y
485
+ }));
486
+ }
487
+
488
+ case "DRAW_EXPANDING_LINE":
489
+ {
490
+ var _regionId7 = state.mode.regionId;
491
+
492
+ var _getRegion9 = getRegion(_regionId7),
493
+ _getRegion10 = _slicedToArray(_getRegion9, 2),
494
+ expandingLine = _getRegion10[0],
495
+ _regionIndex9 = _getRegion10[1];
496
+
497
+ if (!expandingLine) return state;
498
+ var isMouseDown = Boolean(state.mouseDownAt);
499
+
500
+ if (isMouseDown) {
501
+ // If the mouse is down, set width/angle
502
+ var lastPoint = expandingLine.points.slice(-1)[0];
503
+ var mouseDistFromLastPoint = Math.sqrt(Math.pow(lastPoint.x - x, 2) + Math.pow(lastPoint.y - y, 2));
504
+ if (mouseDistFromLastPoint < 0.002 && !lastPoint.width) return state;
505
+
506
+ var _newState = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex9, "points"]), expandingLine.points.slice(0, -1).concat([_objectSpread({}, lastPoint, {
507
+ width: mouseDistFromLastPoint * 2,
508
+ angle: Math.atan2(lastPoint.x - x, lastPoint.y - y)
509
+ })]));
510
+
511
+ return _newState;
512
+ } else {
513
+ // If mouse is up, move the next candidate point
514
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex9]), _objectSpread({}, expandingLine, {
515
+ candidatePoint: {
516
+ x: x,
517
+ y: y
518
+ }
519
+ }));
520
+ }
521
+
522
+ return state;
523
+ }
524
+
525
+ case "SET_EXPANDING_LINE_WIDTH":
526
+ {
527
+ var _regionId8 = state.mode.regionId;
528
+
529
+ var _getRegion11 = getRegion(_regionId8),
530
+ _getRegion12 = _slicedToArray(_getRegion11, 2),
531
+ _expandingLine = _getRegion12[0],
532
+ _regionIndex10 = _getRegion12[1];
533
+
534
+ if (!_expandingLine) return state;
535
+
536
+ var _lastPoint = _expandingLine.points.slice(-1)[0];
537
+
538
+ var _state3 = state,
539
+ _mouseDownAt = _state3.mouseDownAt;
540
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex10, "expandingWidth"]), Math.sqrt(Math.pow(_lastPoint.x - x, 2) + Math.pow(_lastPoint.y - y, 2)));
541
+ }
542
+
543
+ default:
544
+ return state;
545
+ }
546
+ }
547
+
548
+ case "MOUSE_DOWN":
549
+ {
550
+ var _state$regionClsList;
551
+
552
+ if (!activeImage) return state;
553
+ var _x = action.x,
554
+ _y = action.y;
555
+ state = setIn(state, ["mouseDownAt"], {
556
+ x: _x,
557
+ y: _y
558
+ });
559
+
560
+ if (state.mode) {
561
+ switch (state.mode.mode) {
562
+ case "DRAW_POLYGON":
563
+ {
564
+ var _getRegion13 = getRegion(state.mode.regionId),
565
+ _getRegion14 = _slicedToArray(_getRegion13, 2),
566
+ _polygon2 = _getRegion14[0],
567
+ _regionIndex11 = _getRegion14[1];
568
+
569
+ if (!_polygon2) break;
570
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex11]), _objectSpread({}, _polygon2, {
571
+ points: _polygon2.points.concat([[_x, _y]])
572
+ }));
573
+ }
574
+
575
+ case "DRAW_LINE":
576
+ {
577
+ var _getRegion15 = getRegion(state.mode.regionId),
578
+ _getRegion16 = _slicedToArray(_getRegion15, 2),
579
+ line = _getRegion16[0],
580
+ _regionIndex12 = _getRegion16[1];
581
+
582
+ if (!line) break;
583
+ setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex12]), _objectSpread({}, line, {
584
+ x2: _x,
585
+ y2: _y
586
+ }));
587
+ return setIn(state, ["mode"], null);
588
+ }
589
+
590
+ case "DRAW_EXPANDING_LINE":
591
+ {
592
+ var _getRegion17 = getRegion(state.mode.regionId),
593
+ _getRegion18 = _slicedToArray(_getRegion17, 2),
594
+ _expandingLine2 = _getRegion18[0],
595
+ _regionIndex13 = _getRegion18[1];
596
+
597
+ if (!_expandingLine2) break;
598
+
599
+ var _lastPoint2 = _expandingLine2.points.slice(-1)[0];
600
+
601
+ if (_expandingLine2.points.length > 1 && Math.sqrt(Math.pow(_lastPoint2.x - _x, 2) + Math.pow(_lastPoint2.y - _y, 2)) < 0.002) {
602
+ if (!_lastPoint2.width) {
603
+ return setIn(state, ["mode"], {
604
+ mode: "SET_EXPANDING_LINE_WIDTH",
605
+ regionId: state.mode.regionId
606
+ });
607
+ } else {
608
+ return state.setIn([].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex13]), convertExpandingLineToPolygon(_expandingLine2)).setIn(["mode"], null);
609
+ }
610
+ } // Create new point
611
+
612
+
613
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex13, "points"]), _expandingLine2.points.concat([{
614
+ x: _x,
615
+ y: _y,
616
+ angle: null,
617
+ width: null
618
+ }]));
619
+ }
620
+
621
+ case "SET_EXPANDING_LINE_WIDTH":
622
+ {
623
+ var _getRegion19 = getRegion(state.mode.regionId),
624
+ _getRegion20 = _slicedToArray(_getRegion19, 2),
625
+ _expandingLine3 = _getRegion20[0],
626
+ _regionIndex14 = _getRegion20[1];
627
+
628
+ if (!_expandingLine3) break;
629
+ var expandingWidth = _expandingLine3.expandingWidth;
630
+ return state.setIn([].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex14]), convertExpandingLineToPolygon(_objectSpread({}, _expandingLine3, {
631
+ points: _expandingLine3.points.map(function (p) {
632
+ return p.width ? p : _objectSpread({}, p, {
633
+ width: expandingWidth
634
+ });
635
+ }),
636
+ expandingWidth: undefined
637
+ }))).setIn(["mode"], null);
638
+ }
639
+
640
+ default:
641
+ break;
642
+ }
643
+ }
644
+
645
+ var newRegion;
646
+ var defaultRegionCls = state.selectedCls || ((_state$regionClsList = state.regionClsList) === null || _state$regionClsList === void 0 ? void 0 : _state$regionClsList[0]),
647
+ defaultRegionColor = "#ff0000";
648
+
649
+ var _clsIndex = (state.regionClsList || []).indexOf(defaultRegionCls);
650
+
651
+ if (_clsIndex !== -1) {
652
+ defaultRegionColor = colors[_clsIndex % colors.length];
653
+ }
654
+
655
+ switch (state.selectedTool) {
656
+ case "create-point":
657
+ {
658
+ state = saveToHistory(state, "Create Point");
659
+ newRegion = {
660
+ type: "point",
661
+ x: _x,
662
+ y: _y,
663
+ highlighted: true,
664
+ editingLabels: true,
665
+ color: defaultRegionColor,
666
+ id: getRandomId(),
667
+ cls: defaultRegionCls
668
+ };
669
+ break;
670
+ }
671
+
672
+ case "create-box":
673
+ {
674
+ var _state4, _state4$images$state$, _state4$images$state$2, _state4$images$state$3;
675
+
676
+ var groupId = (_state4 = state) === null || _state4 === void 0 ? void 0 : (_state4$images$state$ = _state4.images[state.selectedImage]) === null || _state4$images$state$ === void 0 ? void 0 : (_state4$images$state$2 = _state4$images$state$.regions) === null || _state4$images$state$2 === void 0 ? void 0 : (_state4$images$state$3 = _state4$images$state$2.find(function (r) {
677
+ return r.highlighted === true;
678
+ })) === null || _state4$images$state$3 === void 0 ? void 0 : _state4$images$state$3.groupId;
679
+ var groupSelected = true;
680
+
681
+ if (groupId === undefined) {
682
+ groupId = nextGroupId();
683
+ groupSelected = false;
684
+ }
685
+
686
+ state = saveToHistory(state, "Create Box");
687
+ newRegion = {
688
+ type: "box",
689
+ x: _x,
690
+ y: _y,
691
+ w: 0,
692
+ h: 0,
693
+ highlighted: true,
694
+ editingLabels: false,
695
+ color: defaultRegionColor,
696
+ cls: defaultRegionCls,
697
+ id: getRandomId(),
698
+ groupHighlighted: true,
699
+ groupId: groupId
700
+ };
701
+ state = setIn(state, ["mode"], {
702
+ mode: "RESIZE_BOX",
703
+ editLabelEditorAfter: !groupSelected,
704
+ regionId: newRegion.id,
705
+ freedom: [1, 1],
706
+ original: {
707
+ x: _x,
708
+ y: _y,
709
+ w: newRegion.w,
710
+ h: newRegion.h
711
+ },
712
+ isNew: true
713
+ });
714
+ break;
715
+ }
716
+
717
+ case "create-polygon":
718
+ {
719
+ if (state.mode && state.mode.mode === "DRAW_POLYGON") break;
720
+ state = saveToHistory(state, "Create Polygon");
721
+ newRegion = {
722
+ type: "polygon",
723
+ points: [[_x, _y], [_x, _y]],
724
+ open: true,
725
+ highlighted: true,
726
+ color: defaultRegionColor,
727
+ cls: defaultRegionCls,
728
+ id: getRandomId()
729
+ };
730
+ state = setIn(state, ["mode"], {
731
+ mode: "DRAW_POLYGON",
732
+ regionId: newRegion.id
733
+ });
734
+ break;
735
+ }
736
+
737
+ case "create-expanding-line":
738
+ {
739
+ state = saveToHistory(state, "Create Expanding Line");
740
+ newRegion = {
741
+ type: "expanding-line",
742
+ unfinished: true,
743
+ points: [{
744
+ x: _x,
745
+ y: _y,
746
+ angle: null,
747
+ width: null
748
+ }],
749
+ open: true,
750
+ highlighted: true,
751
+ color: defaultRegionColor,
752
+ cls: defaultRegionCls,
753
+ id: getRandomId()
754
+ };
755
+ state = setIn(state, ["mode"], {
756
+ mode: "DRAW_EXPANDING_LINE",
757
+ regionId: newRegion.id
758
+ });
759
+ break;
760
+ }
761
+
762
+ case "create-line":
763
+ {
764
+ if (state.mode && state.mode.mode === "DRAW_LINE") break;
765
+ state = saveToHistory(state, "Create Line");
766
+ newRegion = {
767
+ type: "line",
768
+ x1: _x,
769
+ y1: _y,
770
+ x2: _x,
771
+ y2: _y,
772
+ highlighted: true,
773
+ editingLabels: false,
774
+ color: defaultRegionColor,
775
+ cls: defaultRegionCls,
776
+ id: getRandomId()
777
+ };
778
+ state = setIn(state, ["mode"], {
779
+ mode: "DRAW_LINE",
780
+ regionId: newRegion.id
781
+ });
782
+ break;
783
+ }
784
+
785
+ case "create-keypoints":
786
+ {
787
+ state = saveToHistory(state, "Create Keypoints");
788
+
789
+ var _ref2 = Object.entries(state.keypointDefinitions),
790
+ _ref3 = _slicedToArray(_ref2, 1),
791
+ _ref3$ = _slicedToArray(_ref3[0], 2),
792
+ keypointsDefinitionId = _ref3$[0],
793
+ _ref3$$ = _ref3$[1],
794
+ _landmarks = _ref3$$.landmarks,
795
+ connections = _ref3$$.connections;
796
+
797
+ newRegion = {
798
+ type: "keypoints",
799
+ keypointsDefinitionId: keypointsDefinitionId,
800
+ points: getLandmarksWithTransform({
801
+ landmarks: _landmarks,
802
+ center: {
803
+ x: _x,
804
+ y: _y
805
+ },
806
+ scale: 1
807
+ }),
808
+ highlighted: true,
809
+ editingLabels: false,
810
+ id: getRandomId()
811
+ };
812
+ state = setIn(state, ["mode"], {
813
+ mode: "RESIZE_KEYPOINTS",
814
+ landmarks: _landmarks,
815
+ centerX: _x,
816
+ centerY: _y,
817
+ regionId: newRegion.id,
818
+ isNew: true
819
+ });
820
+ break;
821
+ }
822
+
823
+ default:
824
+ break;
825
+ }
826
+
827
+ var _regions = _toConsumableArray(getIn(state, pathToActiveImage).regions || []).map(function (r) {
828
+ return setIn(r, ["editingLabels"], false).setIn(["highlighted"], false).setIn([state.selectedTool === 'create-box' ? undefined : 'groupHighlighted'], false);
829
+ }).concat(newRegion ? [newRegion] : []);
830
+
831
+ state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["selectedGroupId"]), null);
832
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions);
833
+ }
834
+
835
+ case "MOUSE_UP":
836
+ {
837
+ var _x2 = action.x,
838
+ _y2 = action.y;
839
+
840
+ var _state5 = state,
841
+ _state5$mouseDownAt = _state5.mouseDownAt,
842
+ _mouseDownAt2 = _state5$mouseDownAt === void 0 ? {
843
+ x: _x2,
844
+ y: _y2
845
+ } : _state5$mouseDownAt;
846
+
847
+ if (!state.mode) return state;
848
+ state = setIn(state, ["mouseDownAt"], null);
849
+
850
+ switch (state.mode.mode) {
851
+ case "RESIZE_BOX":
852
+ {
853
+ state = setIn(state, ["selectedTool"], 'select');
854
+
855
+ if (state.mode.isNew) {
856
+ if (Math.abs(state.mode.original.x - _x2) < 0.002 || Math.abs(state.mode.original.y - _y2) < 0.002) {
857
+ state = addSaveableAction(state, "MOUSE_UP_RESIZE_BOX");
858
+ return setIn(modifyRegion(state.mode.regionId, null), ["mode"], null);
859
+ }
860
+ }
861
+
862
+ if (state.mode.editLabelEditorAfter) {
863
+ state = addSaveableAction(state, "MOUSE_UP_RESIZE_BOX");
864
+ return _objectSpread({}, modifyRegion(state.mode.regionId, {
865
+ editingLabels: true
866
+ }), {
867
+ mode: null
868
+ });
869
+ }
870
+ }
871
+
872
+ case "MOVE_REGION":
873
+ case "RESIZE_KEYPOINTS":
874
+ case "MOVE_POLYGON_POINT":
875
+ {
876
+ state = addSaveableAction(state, "MOUSE_UP_MOVE_REGION");
877
+ return _objectSpread({}, state, {
878
+ mode: null
879
+ });
880
+ }
881
+
882
+ case "MOVE_KEYPOINT":
883
+ {
884
+ return _objectSpread({}, state, {
885
+ mode: null
886
+ });
887
+ }
888
+
889
+ case "CREATE_POINT_LINE":
890
+ {
891
+ return state;
892
+ }
893
+
894
+ case "DRAW_EXPANDING_LINE":
895
+ {
896
+ var _getRegion21 = getRegion(state.mode.regionId),
897
+ _getRegion22 = _slicedToArray(_getRegion21, 2),
898
+ _expandingLine4 = _getRegion22[0],
899
+ _regionIndex15 = _getRegion22[1];
900
+
901
+ if (!_expandingLine4) return state;
902
+ var newExpandingLine = _expandingLine4;
903
+
904
+ var _lastPoint3 = _expandingLine4.points.length !== 0 ? _expandingLine4.points.slice(-1)[0] : _mouseDownAt2;
905
+
906
+ var jointStart;
907
+
908
+ if (_expandingLine4.points.length > 1) {
909
+ jointStart = _expandingLine4.points.slice(-2)[0];
910
+ } else {
911
+ jointStart = _lastPoint3;
912
+ }
913
+
914
+ var _mouseDistFromLastPoint = Math.sqrt(Math.pow(_lastPoint3.x - _x2, 2) + Math.pow(_lastPoint3.y - _y2, 2));
915
+
916
+ if (_mouseDistFromLastPoint > 0.002) {
917
+ // The user is drawing has drawn the width for the last point
918
+ var newPoints = _toConsumableArray(_expandingLine4.points);
919
+
920
+ for (var i = 0; i < newPoints.length - 1; i++) {
921
+ if (newPoints[i].width) continue;
922
+ newPoints[i] = _objectSpread({}, newPoints[i], {
923
+ width: _lastPoint3.width
924
+ });
925
+ }
926
+
927
+ newExpandingLine = setIn(_expandingLine4, ["points"], fixTwisted(newPoints));
928
+ } else {
929
+ return state;
930
+ }
931
+
932
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex15]), newExpandingLine);
933
+ }
934
+
935
+ default:
936
+ return state;
937
+ }
938
+ }
939
+
940
+ case "OPEN_REGION_EDITOR":
941
+ {
942
+ var _region5 = action.region;
943
+
944
+ var _regionIndex16 = getRegionIndex(action.region);
945
+
946
+ if (_regionIndex16 === null) return state;
947
+
948
+ var _newRegions = setIn(activeImage.regions.map(function (r) {
949
+ return _objectSpread({}, r, {
950
+ highlighted: false,
951
+ editingLabels: false
952
+ });
953
+ }), [_regionIndex16], _objectSpread({}, (activeImage.regions || [])[_regionIndex16], {
954
+ highlighted: true,
955
+ editingLabels: true
956
+ }));
957
+
958
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _newRegions);
959
+ }
960
+
961
+ case "CLOSE_REGION_EDITOR":
962
+ {
963
+ var _region6 = action.region;
964
+
965
+ var _regionIndex17 = getRegionIndex(action.region);
966
+
967
+ if (_regionIndex17 === null) return state;
968
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions", _regionIndex17]), _objectSpread({}, (activeImage.regions || [])[_regionIndex17], {
969
+ editingLabels: false
970
+ }));
971
+ }
972
+
973
+ case "DELETE_REGION":
974
+ {
975
+ var _regionIndex18 = getRegionIndex(action.region);
976
+
977
+ if (_regionIndex18 === null) return state;
978
+ state = saveToHistory(state, "Delete region");
979
+ state = addSaveableAction(state, "DELETE_REGION");
980
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).filter(function (r) {
981
+ return r.id !== action.region.id;
982
+ }));
983
+ }
984
+
985
+ case "DELETE_GROUP":
986
+ {
987
+ var _groupId = action.groupId;
988
+ if (_groupId === null || _groupId === undefined) return state;
989
+ state = saveToHistory(state, "Delete group");
990
+ state = addSaveableAction(state, "DELETE_GROUP");
991
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).filter(function (r) {
992
+ return r.groupId !== _groupId;
993
+ }));
994
+ }
995
+
996
+ case "DELETE_SELECTED_REGION":
997
+ {
998
+ state = saveToHistory(state, "Delete selected region");
999
+ state = addSaveableAction(state, "DELETE_SELECTED_REGION");
1000
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), (activeImage.regions || []).filter(function (r) {
1001
+ return !r.highlighted;
1002
+ }));
1003
+ }
1004
+
1005
+ case "HEADER_BUTTON_CLICKED":
1006
+ {
1007
+ var buttonName = action.buttonName.toLowerCase();
1008
+
1009
+ switch (buttonName) {
1010
+ case "prev":
1011
+ {
1012
+ if (currentImageIndex === null) return state;
1013
+ if (currentImageIndex === 0) return state;
1014
+ return setNewImage(state.images[currentImageIndex - 1], currentImageIndex - 1);
1015
+ }
1016
+
1017
+ case "next":
1018
+ {
1019
+ if (currentImageIndex === null) return state;
1020
+ if (currentImageIndex === state.images.length - 1) return state;
1021
+ return setNewImage(state.images[currentImageIndex + 1], currentImageIndex + 1);
1022
+ }
1023
+
1024
+ case "clone":
1025
+ {
1026
+ if (currentImageIndex === null) return state;
1027
+ if (currentImageIndex === state.images.length - 1) return state;
1028
+ return setIn(setNewImage(state.images[currentImageIndex + 1], currentImageIndex + 1), ["images", currentImageIndex + 1, "regions"], activeImage.regions);
1029
+ }
1030
+
1031
+ case "settings":
1032
+ {
1033
+ return setIn(state, ["settingsOpen"], !state.settingsOpen);
1034
+ }
1035
+
1036
+ case "help":
1037
+ {
1038
+ return state;
1039
+ }
1040
+
1041
+ case "fullscreen":
1042
+ {
1043
+ return setIn(state, ["fullScreen"], true);
1044
+ }
1045
+
1046
+ case "exit fullscreen":
1047
+ case "window":
1048
+ {
1049
+ return setIn(state, ["fullScreen"], false);
1050
+ }
1051
+
1052
+ case "hotkeys":
1053
+ {
1054
+ return state;
1055
+ }
1056
+
1057
+ case "exit":
1058
+ case "done":
1059
+ {
1060
+ return state;
1061
+ }
1062
+
1063
+ default:
1064
+ return state;
1065
+ }
1066
+ }
1067
+
1068
+ case "SELECT_TOOL":
1069
+ {
1070
+ if (action.selectedTool === "show-tags") {
1071
+ setInLocalStorage("showTags", !state.showTags);
1072
+ return setIn(state, ["showTags"], !state.showTags);
1073
+ } else if (action.selectedTool === "show-mask") {
1074
+ return setIn(state, ["showMask"], !state.showMask);
1075
+ }
1076
+
1077
+ if (action.selectedTool === "modify-allowed-area" && !state.allowedArea) {
1078
+ state = setIn(state, ["allowedArea"], {
1079
+ x: 0,
1080
+ y: 0,
1081
+ w: 1,
1082
+ h: 1
1083
+ });
1084
+ }
1085
+
1086
+ state = setIn(state, ["mode"], null);
1087
+ return setIn(state, ["selectedTool"], action.selectedTool);
1088
+ }
1089
+
1090
+ case "CANCEL":
1091
+ {
1092
+ var _state6 = state,
1093
+ mode = _state6.mode;
1094
+
1095
+ if (mode) {
1096
+ switch (mode.mode) {
1097
+ case "DRAW_EXPANDING_LINE":
1098
+ case "SET_EXPANDING_LINE_WIDTH":
1099
+ case "DRAW_POLYGON":
1100
+ {
1101
+ var _regionId9 = mode.regionId;
1102
+ return modifyRegion(_regionId9, null);
1103
+ }
1104
+
1105
+ case "MOVE_POLYGON_POINT":
1106
+ case "RESIZE_BOX":
1107
+ case "MOVE_REGION":
1108
+ {
1109
+ return setIn(state, ["mode"], null);
1110
+ }
1111
+
1112
+ default:
1113
+ return state;
1114
+ }
1115
+ } // Close any open boxes
1116
+
1117
+
1118
+ var _regions2 = activeImage.regions;
1119
+
1120
+ if (_regions2 && _regions2.some(function (r) {
1121
+ return r.editingLabels;
1122
+ })) {
1123
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions2.map(function (r) {
1124
+ return _objectSpread({}, r, {
1125
+ editingLabels: false
1126
+ });
1127
+ }));
1128
+ } else if (_regions2) {
1129
+ return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions2.map(function (r) {
1130
+ return _objectSpread({}, r, {
1131
+ highlighted: false
1132
+ });
1133
+ }));
1134
+ }
1135
+
1136
+ break;
1137
+ }
1138
+
1139
+ case "UPDATE_REGIONS":
1140
+ {
1141
+ var imageIndex = action.imageIndex,
1142
+ _newRegions2 = action.regions;
1143
+ var updatedRegions = state.images[imageIndex].regions.map(function (r) {
1144
+ var updatedRegion = _newRegions2.find(function (i) {
1145
+ return i.id === r.id;
1146
+ });
1147
+
1148
+ if (!updatedRegion) {
1149
+ return r;
1150
+ }
1151
+
1152
+ return _objectSpread({}, r, {
1153
+ cls: updatedRegion.cls,
1154
+ text: updatedRegion.text
1155
+ });
1156
+ }); // TODO: add mutation of order and deletion of regions - SI-1967
1157
+
1158
+ state = addSaveableAction(state, "UPDATE_REGIONS");
1159
+ return setIn(state, ["images", imageIndex, "regions"], updatedRegions);
1160
+ }
1161
+
1162
+ case "IMAGES_UPDATED":
1163
+ {
1164
+ var updatedAt = action.updatedAt;
1165
+ return setIn(state, ["imagesUpdatedAt"], updatedAt);
1166
+ }
1167
+
1168
+ case "IMAGES_SAVED":
1169
+ {
1170
+ var savedAt = action.savedAt;
1171
+ return setIn(state, ["imagesSavedAt"], savedAt);
1172
+ }
1173
+
1174
+ case "IMAGES_RECALCULATED":
1175
+ {
1176
+ var recalculatedAt = action.recalculatedAt;
1177
+ return setIn(state, ["imagesSavedAt"], recalculatedAt);
1178
+ }
1179
+
1180
+ case "UPDATE_METADATA":
1181
+ {
1182
+ var name = action.name,
1183
+ value = action.value,
1184
+ _imageIndex = action.imageIndex,
1185
+ _groupId2 = action.groupId,
1186
+ metadataId = action.metadataId;
1187
+
1188
+ if (isNaN(_imageIndex)) {
1189
+ var _state$albumMetadata;
1190
+
1191
+ // update global/album metadata
1192
+ var metadataIndex = (_state$albumMetadata = state.albumMetadata) === null || _state$albumMetadata === void 0 ? void 0 : _state$albumMetadata.findIndex(function (mt) {
1193
+ return mt.key === name;
1194
+ });
1195
+
1196
+ if (metadataIndex < 0) {
1197
+ console.error("can't find metadata by key \"".concat(name, "\""));
1198
+ return state;
1199
+ }
1200
+
1201
+ state = addSaveableAction(state, "UPDATE_ALBUM_METADATA");
1202
+ return setIn(state, ["albumMetadata", metadataIndex], {
1203
+ key: name,
1204
+ value: value
1205
+ });
1206
+ } else {
1207
+ var _state$images$_imageI3, _state$images$_imageI4;
1208
+
1209
+ // update metadata of article
1210
+ if (_groupId2) {
1211
+ var _state$images$_imageI, _state$images$_imageI2;
1212
+
1213
+ var articleMetadataRegionIdx = (_state$images$_imageI = state.images[_imageIndex]) === null || _state$images$_imageI === void 0 ? void 0 : _state$images$_imageI.regions.findIndex(function (r) {
1214
+ return r.cls === 'metadata' && r.groupId === _groupId2;
1215
+ });
1216
+
1217
+ if (articleMetadataRegionIdx < 0) {
1218
+ console.error("can't find article metadata for goupId \"".concat(_groupId2, "\""));
1219
+ return state;
1220
+ }
1221
+
1222
+ var articleRegionToUpdate = (_state$images$_imageI2 = state.images[_imageIndex]) === null || _state$images$_imageI2 === void 0 ? void 0 : _state$images$_imageI2.regions[articleMetadataRegionIdx];
1223
+ var articleMetadata = JSON.parse(articleRegionToUpdate.text);
1224
+ var toBeUpdatedMetadataIdx = articleMetadata.findIndex(function (i) {
1225
+ return i.metadataId === metadataId;
1226
+ });
1227
+
1228
+ if (toBeUpdatedMetadataIdx < 0) {
1229
+ console.error("can't find metadata field in article metadata for key \"".concat(name, "\""));
1230
+ return state;
1231
+ }
1232
+
1233
+ articleMetadata[toBeUpdatedMetadataIdx].value = value;
1234
+ state = addSaveableAction(state, "UPDATE_METADATA");
1235
+ return setIn(state, ["images", _imageIndex, "regions", articleMetadataRegionIdx], _objectSpread({}, articleRegionToUpdate, {
1236
+ text: JSON.stringify(articleMetadata)
1237
+ }));
1238
+ } // update metadata of image
1239
+
1240
+
1241
+ var _metadataIndex = (_state$images$_imageI3 = state.images[_imageIndex]) === null || _state$images$_imageI3 === void 0 ? void 0 : (_state$images$_imageI4 = _state$images$_imageI3.metadata) === null || _state$images$_imageI4 === void 0 ? void 0 : _state$images$_imageI4.findIndex(function (mt) {
1242
+ return mt.key === name;
1243
+ });
1244
+
1245
+ if (_metadataIndex < 0) {
1246
+ console.error("can't find photo metadata by key \"".concat(name, "\""));
1247
+ return state;
1248
+ }
1249
+
1250
+ state = addSaveableAction(state, "UPDATE_METADATA");
1251
+ return setIn(state, ["images", _imageIndex, "metadata", _metadataIndex], {
1252
+ key: name,
1253
+ value: value
1254
+ });
1255
+ }
1256
+ }
1257
+
1258
+ case "ADD_GROUP":
1259
+ {
1260
+ // FIXME: remove this branch
1261
+ return state; // const { group } = action;
1262
+ // const newAllowedGroups = []
1263
+ // return setIn(
1264
+ // state,
1265
+ // ["allowedGroups"],
1266
+ // newAllowedGroups
1267
+ // )
1268
+ }
1269
+
1270
+ case "SAVE_IMAGE":
1271
+ {
1272
+ var image = action.image,
1273
+ triggerRecalc = action.triggerRecalc,
1274
+ toSaveMetadata = action.toSaveMetadata;
1275
+ return setIn(state, ["toSaveImage"], {
1276
+ image: image,
1277
+ triggerRecalc: triggerRecalc,
1278
+ toSaveMetadata: toSaveMetadata
1279
+ });
1280
+ }
1281
+
1282
+ case "RECALC_CLICKED":
1283
+ {
1284
+ var imageId = action.imageId;
1285
+ var imageIdx = state.images.findIndex(function (i) {
1286
+ return i.id === imageId;
1287
+ });
1288
+
1289
+ if (imageIdx < 0) {
1290
+ throw new Error("failed to find index of image with id ".concat(imageId));
1291
+ }
1292
+
1293
+ var _image = _objectSpread({}, state.images[imageIdx]);
1294
+
1295
+ return setIn(state, ["toSaveImage"], {
1296
+ image: _image,
1297
+ triggerRecalc: true,
1298
+ toSaveMetadata: []
1299
+ });
1300
+ }
1301
+
1302
+ case "IMAGE_UPDATE_INIT":
1303
+ {
1304
+ var _imageId = action.imageId;
1305
+
1306
+ var _imageIdx = state.images.findIndex(function (i) {
1307
+ return i.id === _imageId;
1308
+ });
1309
+
1310
+ if (_imageIdx < 0) {
1311
+ throw new Error("failed to find index of image with id ".concat(_imageId));
1312
+ }
1313
+
1314
+ state = setIn(state, ["toSaveImage"], null);
1315
+ return setIn(state, ["images", _imageIdx], _objectSpread({}, state.images[_imageIdx], {
1316
+ lockedUntil: defaultLockedUntil(),
1317
+ syncError: null,
1318
+ saveableActions: []
1319
+ }));
1320
+ }
1321
+
1322
+ case "IMAGE_UPDATE_SUCCESS":
1323
+ {
1324
+ var _imageId2 = action.imageId,
1325
+ lockedUntil = action.lockedUntil;
1326
+
1327
+ var _imageIdx2 = state.images.findIndex(function (i) {
1328
+ return i.id === _imageId2;
1329
+ });
1330
+
1331
+ if (_imageIdx2 < 0) {
1332
+ throw new Error("failed to find index of image with id ".concat(_imageId2));
1333
+ } // if there is lockedUntil set, it means we need to poll for updated
1334
+
1335
+
1336
+ if (lockedUntil) {
1337
+ state = setIn(state, ["toPollImages"], uniq([].concat(_toConsumableArray(state.toPollImages), [_imageId2])));
1338
+ }
1339
+
1340
+ return setIn(state, ["images", _imageIdx2], _objectSpread({}, state.images[_imageIdx2], {
1341
+ lockedUntil: lockedUntil,
1342
+ syncError: null
1343
+ }));
1344
+ }
1345
+
1346
+ case "IMAGE_UPDATE_FAIL":
1347
+ {
1348
+ var _imageId3 = action.imageId,
1349
+ error = action.error;
1350
+
1351
+ var _imageIdx3 = state.images.findIndex(function (i) {
1352
+ return i.id === _imageId3;
1353
+ });
1354
+
1355
+ if (_imageIdx3 < 0) {
1356
+ throw new Error("failed to find index of image with id ".concat(_imageId3));
1357
+ }
1358
+
1359
+ return setIn(state, ["images", _imageIdx3], _objectSpread({}, state.images[_imageIdx3], {
1360
+ lockedUntil: null,
1361
+ syncError: error
1362
+ }));
1363
+ }
1364
+
1365
+ case "IMAGE_POLL_INIT":
1366
+ {
1367
+ var imageIds = action.imageIds;
1368
+ return setIn(state, ["toPollImages"], state.toPollImages.filter(function (i) {
1369
+ return !imageIds.includes(i);
1370
+ }));
1371
+ }
1372
+
1373
+ case "IMAGE_POLL_SUCCESS":
1374
+ {
1375
+ var _image2 = action.image;
1376
+
1377
+ var _imageIdx4 = state.images.findIndex(function (i) {
1378
+ return i.id === _image2.id;
1379
+ });
1380
+
1381
+ if (_imageIdx4 < 0) {
1382
+ throw new Error("failed to find index of image with id ".concat(_image2.id));
1383
+ }
1384
+
1385
+ return setIn(state, ["images", _imageIdx4], _objectSpread({}, state.images[_imageIdx4], {
1386
+ lockedUntil: null,
1387
+ syncError: null
1388
+ }, _image2));
1389
+ }
1390
+
1391
+ case "IMAGE_POLL_TIMEOUT":
1392
+ {
1393
+ var _imageId4 = action.imageId;
1394
+
1395
+ var _imageIdx5 = state.images.findIndex(function (i) {
1396
+ return i.id === _imageId4;
1397
+ });
1398
+
1399
+ if (_imageIdx5 < 0) {
1400
+ throw new Error("failed to find index of image with id ".concat(_imageId4));
1401
+ }
1402
+
1403
+ return setIn(state, ["images", _imageIdx5], _objectSpread({}, state.images[_imageIdx5], {
1404
+ lockedUntil: null,
1405
+ syncError: new Error("polling timeout")
1406
+ }));
1407
+ }
1408
+
1409
+ case "ZOOM_RESET":
1410
+ {
1411
+ if (state.selectedImage === undefined || state.selectedImage === null) {
1412
+ return state;
1413
+ }
1414
+
1415
+ var deselectedRegions = state.images[state.selectedImage].regions.map(function (i) {
1416
+ return _objectSpread({}, i, {
1417
+ highlighted: false,
1418
+ groupHighlighted: false
1419
+ });
1420
+ });
1421
+ state = setIn(state, ["selectedGroupId"], null);
1422
+ return setIn(state, ["images", state.selectedImage, "regions"], deselectedRegions);
1423
+ }
1424
+
1425
+ default:
1426
+ break;
1427
+ }
1428
+
1429
+ return state;
1430
+ });