@atlaskit/pragmatic-drag-and-drop 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/LICENSE.md +13 -0
  3. package/README.md +43 -0
  4. package/__perf__/add-example.todo +1 -0
  5. package/adapter/element/package.json +15 -0
  6. package/adapter/file/package.json +15 -0
  7. package/addon/cancel-unhandled/package.json +15 -0
  8. package/constellation/index/about.mdx +329 -0
  9. package/constellation/index/props.mdx +3 -0
  10. package/dist/cjs/adapter/element-adapter.js +151 -0
  11. package/dist/cjs/adapter/file-adapter.js +98 -0
  12. package/dist/cjs/addon/cancel-unhandled.js +50 -0
  13. package/dist/cjs/entry-point/adapter/element.js +24 -0
  14. package/dist/cjs/entry-point/adapter/file.js +18 -0
  15. package/dist/cjs/entry-point/addon/cancel-unhandled.js +12 -0
  16. package/dist/cjs/entry-point/experimental/cross-with-element-adapter.js +30 -0
  17. package/dist/cjs/entry-point/types.js +5 -0
  18. package/dist/cjs/entry-point/util/combine.js +12 -0
  19. package/dist/cjs/entry-point/util/disable-native-drag-preview.js +12 -0
  20. package/dist/cjs/entry-point/util/once.js +12 -0
  21. package/dist/cjs/entry-point/util/reorder.js +12 -0
  22. package/dist/cjs/entry-point/util/scroll-just-enough-into-view.js +12 -0
  23. package/dist/cjs/entry-point/util/set-custom-native-drag-preview.js +12 -0
  24. package/dist/cjs/experimental/cross-window-element-adapter.js +131 -0
  25. package/dist/cjs/index.js +12 -0
  26. package/dist/cjs/internal-types.js +5 -0
  27. package/dist/cjs/ledger/dispatch-consumer-event.js +132 -0
  28. package/dist/cjs/ledger/lifecycle-manager.js +335 -0
  29. package/dist/cjs/ledger/usage-ledger.js +37 -0
  30. package/dist/cjs/make-adapter/make-adapter.js +59 -0
  31. package/dist/cjs/make-adapter/make-drop-target.js +271 -0
  32. package/dist/cjs/make-adapter/make-monitor.js +100 -0
  33. package/dist/cjs/util/add-attribute.js +14 -0
  34. package/dist/cjs/util/combine.js +17 -0
  35. package/dist/cjs/util/disable-native-drag-preview.js +36 -0
  36. package/dist/cjs/util/entering-and-leaving-the-window.js +162 -0
  37. package/dist/cjs/util/fix-post-drag-pointer-bug.js +114 -0
  38. package/dist/cjs/util/get-input.js +20 -0
  39. package/dist/cjs/util/once.js +22 -0
  40. package/dist/cjs/util/reorder.js +26 -0
  41. package/dist/cjs/util/scroll-just-enough-into-view.js +17 -0
  42. package/dist/cjs/util/set-custom-native-drag-preview.js +109 -0
  43. package/dist/cjs/version.json +5 -0
  44. package/dist/es2019/adapter/element-adapter.js +143 -0
  45. package/dist/es2019/adapter/file-adapter.js +90 -0
  46. package/dist/es2019/addon/cancel-unhandled.js +43 -0
  47. package/dist/es2019/entry-point/adapter/element.js +1 -0
  48. package/dist/es2019/entry-point/adapter/file.js +1 -0
  49. package/dist/es2019/entry-point/addon/cancel-unhandled.js +1 -0
  50. package/dist/es2019/entry-point/experimental/cross-with-element-adapter.js +1 -0
  51. package/dist/es2019/entry-point/types.js +1 -0
  52. package/dist/es2019/entry-point/util/combine.js +1 -0
  53. package/dist/es2019/entry-point/util/disable-native-drag-preview.js +1 -0
  54. package/dist/es2019/entry-point/util/once.js +1 -0
  55. package/dist/es2019/entry-point/util/reorder.js +1 -0
  56. package/dist/es2019/entry-point/util/scroll-just-enough-into-view.js +1 -0
  57. package/dist/es2019/entry-point/util/set-custom-native-drag-preview.js +1 -0
  58. package/dist/es2019/experimental/cross-window-element-adapter.js +121 -0
  59. package/dist/es2019/index.js +7 -0
  60. package/dist/es2019/internal-types.js +1 -0
  61. package/dist/es2019/ledger/dispatch-consumer-event.js +128 -0
  62. package/dist/es2019/ledger/lifecycle-manager.js +333 -0
  63. package/dist/es2019/ledger/usage-ledger.js +32 -0
  64. package/dist/es2019/make-adapter/make-adapter.js +55 -0
  65. package/dist/es2019/make-adapter/make-drop-target.js +233 -0
  66. package/dist/es2019/make-adapter/make-monitor.js +80 -0
  67. package/dist/es2019/util/add-attribute.js +7 -0
  68. package/dist/es2019/util/combine.js +6 -0
  69. package/dist/es2019/util/disable-native-drag-preview.js +31 -0
  70. package/dist/es2019/util/entering-and-leaving-the-window.js +159 -0
  71. package/dist/es2019/util/fix-post-drag-pointer-bug.js +110 -0
  72. package/dist/es2019/util/get-input.js +14 -0
  73. package/dist/es2019/util/once.js +13 -0
  74. package/dist/es2019/util/reorder.js +17 -0
  75. package/dist/es2019/util/scroll-just-enough-into-view.js +12 -0
  76. package/dist/es2019/util/set-custom-native-drag-preview.js +106 -0
  77. package/dist/es2019/version.json +5 -0
  78. package/dist/esm/adapter/element-adapter.js +142 -0
  79. package/dist/esm/adapter/file-adapter.js +90 -0
  80. package/dist/esm/addon/cancel-unhandled.js +43 -0
  81. package/dist/esm/entry-point/adapter/element.js +1 -0
  82. package/dist/esm/entry-point/adapter/file.js +1 -0
  83. package/dist/esm/entry-point/addon/cancel-unhandled.js +1 -0
  84. package/dist/esm/entry-point/experimental/cross-with-element-adapter.js +1 -0
  85. package/dist/esm/entry-point/types.js +1 -0
  86. package/dist/esm/entry-point/util/combine.js +1 -0
  87. package/dist/esm/entry-point/util/disable-native-drag-preview.js +1 -0
  88. package/dist/esm/entry-point/util/once.js +1 -0
  89. package/dist/esm/entry-point/util/reorder.js +1 -0
  90. package/dist/esm/entry-point/util/scroll-just-enough-into-view.js +1 -0
  91. package/dist/esm/entry-point/util/set-custom-native-drag-preview.js +1 -0
  92. package/dist/esm/experimental/cross-window-element-adapter.js +120 -0
  93. package/dist/esm/index.js +7 -0
  94. package/dist/esm/internal-types.js +1 -0
  95. package/dist/esm/ledger/dispatch-consumer-event.js +125 -0
  96. package/dist/esm/ledger/lifecycle-manager.js +328 -0
  97. package/dist/esm/ledger/usage-ledger.js +31 -0
  98. package/dist/esm/make-adapter/make-adapter.js +53 -0
  99. package/dist/esm/make-adapter/make-drop-target.js +264 -0
  100. package/dist/esm/make-adapter/make-monitor.js +93 -0
  101. package/dist/esm/util/add-attribute.js +8 -0
  102. package/dist/esm/util/combine.js +11 -0
  103. package/dist/esm/util/disable-native-drag-preview.js +30 -0
  104. package/dist/esm/util/entering-and-leaving-the-window.js +156 -0
  105. package/dist/esm/util/fix-post-drag-pointer-bug.js +108 -0
  106. package/dist/esm/util/get-input.js +14 -0
  107. package/dist/esm/util/once.js +16 -0
  108. package/dist/esm/util/reorder.js +19 -0
  109. package/dist/esm/util/scroll-just-enough-into-view.js +11 -0
  110. package/dist/esm/util/set-custom-native-drag-preview.js +104 -0
  111. package/dist/esm/version.json +5 -0
  112. package/dist/types/adapter/element-adapter.d.ts +42 -0
  113. package/dist/types/adapter/file-adapter.d.ts +18 -0
  114. package/dist/types/addon/cancel-unhandled.d.ts +7 -0
  115. package/dist/types/entry-point/adapter/element.d.ts +2 -0
  116. package/dist/types/entry-point/adapter/file.d.ts +2 -0
  117. package/dist/types/entry-point/addon/cancel-unhandled.d.ts +1 -0
  118. package/dist/types/entry-point/experimental/cross-with-element-adapter.d.ts +1 -0
  119. package/dist/types/entry-point/types.d.ts +1 -0
  120. package/dist/types/entry-point/util/combine.d.ts +1 -0
  121. package/dist/types/entry-point/util/disable-native-drag-preview.d.ts +1 -0
  122. package/dist/types/entry-point/util/once.d.ts +1 -0
  123. package/dist/types/entry-point/util/reorder.d.ts +1 -0
  124. package/dist/types/entry-point/util/scroll-just-enough-into-view.d.ts +1 -0
  125. package/dist/types/entry-point/util/set-custom-native-drag-preview.d.ts +1 -0
  126. package/dist/types/experimental/cross-window-element-adapter.d.ts +17 -0
  127. package/dist/types/index.d.ts +2 -0
  128. package/dist/types/internal-types.d.ts +275 -0
  129. package/dist/types/ledger/dispatch-consumer-event.d.ts +26 -0
  130. package/dist/types/ledger/lifecycle-manager.d.ts +16 -0
  131. package/dist/types/ledger/usage-ledger.d.ts +5 -0
  132. package/dist/types/make-adapter/make-adapter.d.ts +14 -0
  133. package/dist/types/make-adapter/make-drop-target.d.ts +5 -0
  134. package/dist/types/make-adapter/make-monitor.d.ts +8 -0
  135. package/dist/types/util/add-attribute.d.ts +5 -0
  136. package/dist/types/util/combine.d.ts +3 -0
  137. package/dist/types/util/disable-native-drag-preview.d.ts +3 -0
  138. package/dist/types/util/entering-and-leaving-the-window.d.ts +6 -0
  139. package/dist/types/util/fix-post-drag-pointer-bug.d.ts +14 -0
  140. package/dist/types/util/get-input.d.ts +2 -0
  141. package/dist/types/util/once.d.ts +2 -0
  142. package/dist/types/util/reorder.d.ts +9 -0
  143. package/dist/types/util/scroll-just-enough-into-view.d.ts +7 -0
  144. package/dist/types/util/set-custom-native-drag-preview.d.ts +52 -0
  145. package/experimental/cross-window-element-adapter/package.json +15 -0
  146. package/package.json +87 -0
  147. package/report.api.md +35 -0
  148. package/tmp/api-report-tmp.d.ts +13 -0
  149. package/types/package.json +15 -0
  150. package/util/combine/package.json +15 -0
  151. package/util/disable-native-drag-preview/package.json +15 -0
  152. package/util/once/package.json +15 -0
  153. package/util/reorder/package.json +15 -0
  154. package/util/scroll-just-enough-into-view/package.json +15 -0
  155. package/util/set-custom-native-drag-preview/package.json +15 -0
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.makeDispatch = makeDispatch;
8
+ var _rafSchd = _interopRequireDefault(require("raf-schd"));
9
+ var scheduleOnDrag = (0, _rafSchd.default)(function (fn) {
10
+ return fn();
11
+ });
12
+ var dragStart = function () {
13
+ var scheduled = null;
14
+ function schedule(fn) {
15
+ var frameId = requestAnimationFrame(function () {
16
+ scheduled = null;
17
+ fn();
18
+ });
19
+ scheduled = {
20
+ frameId: frameId,
21
+ fn: fn
22
+ };
23
+ }
24
+ function flush() {
25
+ if (scheduled) {
26
+ cancelAnimationFrame(scheduled.frameId);
27
+ scheduled.fn();
28
+ scheduled = null;
29
+ }
30
+ }
31
+ return {
32
+ schedule: schedule,
33
+ flush: flush
34
+ };
35
+ }();
36
+ function makeDispatch(_ref) {
37
+ var source = _ref.source,
38
+ initial = _ref.initial,
39
+ dispatchEvent = _ref.dispatchEvent;
40
+ var previous = {
41
+ dropTargets: []
42
+ };
43
+ function safeDispatch(args) {
44
+ dispatchEvent(args);
45
+ previous = {
46
+ dropTargets: args.payload.location.current.dropTargets
47
+ };
48
+ }
49
+ var dispatch = {
50
+ start: function start(_ref2) {
51
+ var nativeSetDragImage = _ref2.nativeSetDragImage;
52
+ // Ensuring that both `onGenerateDragPreview` and `onDragStart` get the same location.
53
+ // We do this so that `previous` is`[]` in `onDragStart` (which is logical)
54
+ var location = {
55
+ current: initial,
56
+ previous: previous,
57
+ initial: initial
58
+ };
59
+ // a `onGenerateDragPreview` does _not_ add another entry for `previous`
60
+ // onDragPreview
61
+ safeDispatch({
62
+ eventName: 'onGenerateDragPreview',
63
+ payload: {
64
+ source: source,
65
+ location: location,
66
+ nativeSetDragImage: nativeSetDragImage
67
+ }
68
+ });
69
+ dragStart.schedule(function () {
70
+ safeDispatch({
71
+ eventName: 'onDragStart',
72
+ payload: {
73
+ source: source,
74
+ location: location
75
+ }
76
+ });
77
+ });
78
+ },
79
+ dragUpdate: function dragUpdate(_ref3) {
80
+ var current = _ref3.current;
81
+ dragStart.flush();
82
+ scheduleOnDrag.cancel();
83
+ safeDispatch({
84
+ eventName: 'onDropTargetChange',
85
+ payload: {
86
+ source: source,
87
+ location: {
88
+ initial: initial,
89
+ previous: previous,
90
+ current: current
91
+ }
92
+ }
93
+ });
94
+ },
95
+ drag: function drag(_ref4) {
96
+ var current = _ref4.current;
97
+ scheduleOnDrag(function () {
98
+ dragStart.flush();
99
+ var location = {
100
+ initial: initial,
101
+ previous: previous,
102
+ current: current
103
+ };
104
+ safeDispatch({
105
+ eventName: 'onDrag',
106
+ payload: {
107
+ source: source,
108
+ location: location
109
+ }
110
+ });
111
+ });
112
+ },
113
+ drop: function drop(_ref5) {
114
+ var current = _ref5.current,
115
+ updatedSourcePayload = _ref5.updatedExternalPayload;
116
+ dragStart.flush();
117
+ scheduleOnDrag.cancel();
118
+ safeDispatch({
119
+ eventName: 'onDrop',
120
+ payload: {
121
+ source: updatedSourcePayload !== null && updatedSourcePayload !== void 0 ? updatedSourcePayload : source,
122
+ location: {
123
+ current: current,
124
+ previous: previous,
125
+ initial: initial
126
+ }
127
+ }
128
+ });
129
+ }
130
+ };
131
+ return dispatch;
132
+ }
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.lifecycle = void 0;
7
+ var _bindEventListener = require("bind-event-listener");
8
+ var _enteringAndLeavingTheWindow = require("../util/entering-and-leaving-the-window");
9
+ var _fixPostDragPointerBug = require("../util/fix-post-drag-pointer-bug");
10
+ var _getInput = require("../util/get-input");
11
+ var _dispatchConsumerEvent = require("./dispatch-consumer-event");
12
+ var isActive = false;
13
+ function canStart() {
14
+ return !isActive;
15
+ }
16
+ function getNativeSetDragImage(event) {
17
+ if (event.dataTransfer) {
18
+ // need to use `.bind` as `setDragImage` is required
19
+ // to be run with `event.dataTransfer` as the "this" context
20
+ return event.dataTransfer.setDragImage.bind(event.dataTransfer);
21
+ }
22
+ return null;
23
+ }
24
+ function hasHierarchyChanged(_ref) {
25
+ var current = _ref.current,
26
+ next = _ref.next;
27
+ if (current.length !== next.length) {
28
+ return true;
29
+ }
30
+ // not checking stickiness, data or dropEffect,
31
+ // just whether the hierarchy has changed
32
+ for (var i = 0; i < current.length; i++) {
33
+ if (current[i].element !== next[i].element) {
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ }
39
+ function start(_ref2) {
40
+ var event = _ref2.event,
41
+ dragInterface = _ref2.dragInterface,
42
+ getDropTargetsOver = _ref2.getDropTargetsOver,
43
+ dispatchEvent = _ref2.dispatchEvent;
44
+ if (!canStart()) {
45
+ return;
46
+ }
47
+ isActive = true;
48
+ var initial = getStartLocation({
49
+ event: event,
50
+ dragInterface: dragInterface,
51
+ getDropTargetsOver: getDropTargetsOver
52
+ });
53
+ var current = initial;
54
+ // Setting initial drop effect for the drag
55
+ setDropEffect({
56
+ event: event,
57
+ current: initial.dropTargets
58
+ });
59
+ var dispatch = (0, _dispatchConsumerEvent.makeDispatch)({
60
+ source: dragInterface.payload,
61
+ dispatchEvent: dispatchEvent,
62
+ initial: initial
63
+ });
64
+ function updateDropTargets(next) {
65
+ // only looking at whether hierarchy has changed to determine whether something as 'changed'
66
+ var hasChanged = hasHierarchyChanged({
67
+ current: current.dropTargets,
68
+ next: next.dropTargets
69
+ });
70
+
71
+ // Always updating the state to include latest data, dropEffect and stickiness
72
+ // Only updating consumers if the hierarchy has changed in some way
73
+ // Consumers can get the latest data by using `onDrag`
74
+ current = next;
75
+ if (hasChanged) {
76
+ dispatch.dragUpdate({
77
+ current: current
78
+ });
79
+ }
80
+ }
81
+ function onUpdateEvent(event) {
82
+ var input = (0, _getInput.getInput)(event);
83
+ var nextDropTargets = getDropTargetsOver({
84
+ target: event.target,
85
+ input: input,
86
+ source: dragInterface.payload,
87
+ current: current.dropTargets
88
+ });
89
+ if (nextDropTargets.length) {
90
+ // 🩸 must call `event.preventDefault()` to allow a browser drop to occur
91
+ event.preventDefault();
92
+ setDropEffect({
93
+ event: event,
94
+ current: nextDropTargets
95
+ });
96
+ }
97
+ updateDropTargets({
98
+ dropTargets: nextDropTargets,
99
+ input: input
100
+ });
101
+ }
102
+ function onDrop(_ref3) {
103
+ var updatedExternalPayload = _ref3.updatedExternalPayload;
104
+ dispatch.drop({
105
+ current: current,
106
+ updatedExternalPayload: updatedExternalPayload
107
+ });
108
+ }
109
+ function cancel() {
110
+ // The spec behaviour is that when a drag is cancelled, or when dropping on no drop targets,
111
+ // a "dragleave" event is fired on the active drop target before a "dragend" event.
112
+ // We are replicating that behaviour in `cancel` if there are any active drop targets to
113
+ // ensure consistent behaviour.
114
+ //
115
+ // Note: When cancelling, or dropping on no drop targets, a "dragleave" event
116
+ // will have already cleared the dropTargets to `[]` (as that particular "dragleave" has a `relatedTarget` of `null`)
117
+
118
+ if (current.dropTargets.length) {
119
+ updateDropTargets({
120
+ dropTargets: [],
121
+ input: current.input
122
+ });
123
+ }
124
+ onDrop({
125
+ updatedExternalPayload: null
126
+ });
127
+ finish();
128
+ }
129
+ function finish() {
130
+ isActive = false;
131
+ unbindEvents();
132
+ }
133
+ var unbindEvents = (0, _bindEventListener.bindAll)(window, [{
134
+ // 👋 Note: we are repurposing the `dragover` event as our `drag` event
135
+ // this is because firefox does not publish pointer coordinates during
136
+ // a `drag` event, but does for every other type of drag event
137
+ // `dragover` fires on all elements that are being dragged over
138
+ // Because we are binding to `window` - our `dragover` is effectively the same as a `drag`
139
+ // 🦊😤
140
+ type: 'dragover',
141
+ listener: function listener(event) {
142
+ // We need to regularly calculate the drop targets in order to allow:
143
+ // - dynamic `canDrop()` checks
144
+ // - rapid updating `getData()` calls to attach data in response to user input (eg for edge detection)
145
+ // Sadly we cannot schedule inspecting changes resulting from this event
146
+ // we need to be able to conditionally cancel the event with `event.preventDefault()`
147
+ // to enable the correct native drop experience.
148
+
149
+ // 1. check to see if anything has changed
150
+ onUpdateEvent(event);
151
+
152
+ // 2. let consumers know a move has occurred
153
+ // This will include the latest 'input' values
154
+ dispatch.drag({
155
+ current: current
156
+ });
157
+ }
158
+ }, {
159
+ type: 'dragenter',
160
+ listener: onUpdateEvent
161
+ }, {
162
+ // This was the only reliable cross browser way I found to detect
163
+ // when the user is leaving the `window`.
164
+ // Internal drags: when we leave the `window` we want to clear any active drop targets,
165
+ // but the drag is not yet over. The user could drag back into the window.
166
+ // We only need to do this because of stickiness
167
+ // External drags: when we leave the `window` the drag operation is over,
168
+ // we will start another drag operation
169
+ type: 'dragleave',
170
+ listener: function listener(event) {
171
+ if (!(0, _enteringAndLeavingTheWindow.isLeavingWindow)({
172
+ dragLeave: event
173
+ })) {
174
+ return;
175
+ }
176
+ // When a drag is ending without a drop target (or when the drag is cancelled),
177
+ // All browsers fire:
178
+ // 1. "drag"
179
+ // 2. "dragleave"
180
+ // These events have `event.relatedTarget == null` so this code path is also hit in those cases.
181
+ // This is all good! We would be clearing the dropTargets in `cancel()` after the "dragend"
182
+
183
+ // 🐛 Bug workaround: intentionally not updating `input` in "dragleave"
184
+ // In Chrome, this final "dragleave" has default input values (eg clientX == 0)
185
+ // rather than the users current input values
186
+ //
187
+ // - [Conversation](https://twitter.com/alexandereardon/status/1642697633864241152)
188
+ // - [Bug](https://bugs.chromium.org/p/chromium/issues/detail?id=1429937)
189
+ updateDropTargets({
190
+ input: current.input,
191
+ dropTargets: []
192
+ });
193
+ if (dragInterface.startedFrom === 'external') {
194
+ cancel();
195
+ }
196
+ }
197
+ }, {
198
+ type: 'drop',
199
+ listener: function listener(event) {
200
+ var _dragInterface$getDro;
201
+ // A "drop" can only happen if the browser allowed the drop
202
+
203
+ // Opting out of standard browser drop behaviour for the drag
204
+ event.preventDefault();
205
+
206
+ // applying the latest drop effect to the event
207
+ setDropEffect({
208
+ event: event,
209
+ current: current.dropTargets
210
+ });
211
+ onDrop({
212
+ updatedExternalPayload: dragInterface.startedFrom === 'external' ? ((_dragInterface$getDro = dragInterface.getDropPayload) === null || _dragInterface$getDro === void 0 ? void 0 : _dragInterface$getDro.call(dragInterface, event)) || null : null
213
+ });
214
+ finish();
215
+
216
+ // Applying this fix after `dispatch.drop` so that frameworks have the opportunity
217
+ // to update UI in response to a "onDrop".
218
+ if (dragInterface.startedFrom === 'internal') {
219
+ (0, _fixPostDragPointerBug.fixPostDragPointerBug)({
220
+ current: current
221
+ });
222
+ }
223
+ }
224
+ }, {
225
+ // "dragend" fires when on the drag source (eg a draggable element)
226
+ // when the drag is finished.
227
+ // "dragend" will fire after "drop"(if there was a successful drop)
228
+ // "dragend" does not fire if the draggable source has been removed during the drag
229
+ // or for external drag sources (eg files)
230
+ type: 'dragend',
231
+ listener: function listener() {
232
+ cancel();
233
+
234
+ // Applying this fix after `dispatch.drop` so that frameworks have the opportunity
235
+ // to update UI in response to a "onDrop".
236
+ if (dragInterface.startedFrom === 'internal') {
237
+ (0, _fixPostDragPointerBug.fixPostDragPointerBug)({
238
+ current: current
239
+ });
240
+ }
241
+ }
242
+ },
243
+ // ## Detecting drag ending for removed draggables
244
+ //
245
+ // If a draggable element is removed during a drag and the user drops:
246
+ // 1. if over a valid drop target: we get a "drop" event to know the drag is finished
247
+ // 2. if not over a valid drop target (or cancelled): we get nothing
248
+ // The "dragend" event will not fire on the source draggable if it has been
249
+ // removed from the DOM.
250
+ // So we need to figure out if a drag operation has finished by looking at other events
251
+ // We can do this by looking at other events
252
+
253
+ // ### First detection: "pointermove" events
254
+
255
+ // 1. "pointermove" events cannot fire during a drag and drop operation
256
+ // according to the spec. So if we get a "pointermove" it means that
257
+ // the drag and drop operations has finished. So if we get a "pointermove"
258
+ // we know that the drag is over
259
+ // 2. 🦊😤 Drag and drop operations are _supposed_ to suppress
260
+ // other pointer events. However, firefox will allow a few
261
+ // pointer event to get through after a drag starts.
262
+ // The most I've seen is 3
263
+ {
264
+ type: 'pointermove',
265
+ listener: function () {
266
+ var callCount = 0;
267
+ return function listener() {
268
+ // Using 20 as it is far bigger than the most observed (3)
269
+ if (callCount < 20) {
270
+ callCount++;
271
+ return;
272
+ }
273
+ cancel();
274
+ };
275
+ }()
276
+ },
277
+ // ### Second detection: "pointerdown" events
278
+
279
+ // If we receive this event then we know that a drag operation has finished
280
+ // and potentially another one is about to start.
281
+ // Note: `pointerdown` fires on all browsers / platforms before "dragstart"
282
+ {
283
+ type: 'pointerdown',
284
+ listener: cancel
285
+ }],
286
+ // Once we have started a managed drag operation it is important that we see / own all drag events
287
+ // We got one adoption bug pop up where some code was stopping (`event.stopPropagation()`)
288
+ // all "drop" events in the bubble phase on the `document.body`.
289
+ // This meant that we never saw the "drop" event.
290
+ {
291
+ capture: true
292
+ });
293
+ dispatch.start({
294
+ nativeSetDragImage: getNativeSetDragImage(event)
295
+ });
296
+ }
297
+ function setDropEffect(_ref4) {
298
+ var _current$;
299
+ var event = _ref4.event,
300
+ current = _ref4.current;
301
+ // setting the `dropEffect` to be the innerMost drop targets dropEffect
302
+ var innerMost = (_current$ = current[0]) === null || _current$ === void 0 ? void 0 : _current$.dropEffect;
303
+ if (innerMost != null && event.dataTransfer) {
304
+ event.dataTransfer.dropEffect = innerMost;
305
+ }
306
+ }
307
+ function getStartLocation(_ref5) {
308
+ var event = _ref5.event,
309
+ dragInterface = _ref5.dragInterface,
310
+ getDropTargetsOver = _ref5.getDropTargetsOver;
311
+ var input = (0, _getInput.getInput)(event);
312
+
313
+ // When dragging from outside of the browser, we don't have any starting drop targets
314
+ if (dragInterface.startedFrom === 'external') {
315
+ return {
316
+ input: input,
317
+ dropTargets: []
318
+ };
319
+ }
320
+ var dropTargets = getDropTargetsOver({
321
+ input: input,
322
+ source: dragInterface.payload,
323
+ target: event.target,
324
+ current: []
325
+ });
326
+ return {
327
+ input: input,
328
+ dropTargets: dropTargets
329
+ };
330
+ }
331
+ var lifecycle = {
332
+ canStart: canStart,
333
+ start: start
334
+ };
335
+ exports.lifecycle = lifecycle;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.register = register;
7
+ // Extending `Map` to allow us to link Key and Values together
8
+
9
+ var ledger = new Map();
10
+ function registerUsage(_ref) {
11
+ var typeKey = _ref.typeKey,
12
+ mount = _ref.mount;
13
+ var entry = ledger.get(typeKey);
14
+ if (entry) {
15
+ entry.usageCount++;
16
+ return entry;
17
+ }
18
+ var initial = {
19
+ typeKey: typeKey,
20
+ unmount: mount(),
21
+ usageCount: 1
22
+ };
23
+ ledger.set(typeKey, initial);
24
+ return initial;
25
+ }
26
+ function register(args) {
27
+ var entry = registerUsage(args);
28
+ return function unregister() {
29
+ entry.usageCount--;
30
+ if (entry.usageCount > 0) {
31
+ return;
32
+ }
33
+ // Only a single usage left, remove it
34
+ entry.unmount();
35
+ ledger.delete(args.typeKey);
36
+ };
37
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeAdapter = makeAdapter;
7
+ var _lifecycleManager = require("../ledger/lifecycle-manager");
8
+ var _usageLedger = require("../ledger/usage-ledger");
9
+ var _makeDropTarget = require("./make-drop-target");
10
+ var _makeMonitor = require("./make-monitor");
11
+ function makeAdapter(_ref) {
12
+ var typeKey = _ref.typeKey,
13
+ mount = _ref.mount,
14
+ dispatchEventToSource = _ref.dispatchEventToSource,
15
+ defaultDropEffect = _ref.defaultDropEffect;
16
+ var monitorAPI = (0, _makeMonitor.makeMonitor)();
17
+ var dropTargetAPI = (0, _makeDropTarget.makeDropTarget)({
18
+ typeKey: typeKey,
19
+ defaultDropEffect: defaultDropEffect
20
+ });
21
+ function dispatchEvent(args) {
22
+ // 1. forward the event to source
23
+ dispatchEventToSource === null || dispatchEventToSource === void 0 ? void 0 : dispatchEventToSource(args);
24
+
25
+ // 2. forward the event to relevant dropTargets
26
+ dropTargetAPI.dispatchEvent(args);
27
+
28
+ // 3. forward event to monitors
29
+ monitorAPI.dispatchEvent(args);
30
+ }
31
+ function start(_ref2) {
32
+ var event = _ref2.event,
33
+ dragInterface = _ref2.dragInterface;
34
+ _lifecycleManager.lifecycle.start({
35
+ event: event,
36
+ dragInterface: dragInterface,
37
+ getDropTargetsOver: dropTargetAPI.getIsOver,
38
+ dispatchEvent: dispatchEvent
39
+ });
40
+ }
41
+ function registerUsage() {
42
+ function mountAdapter() {
43
+ var api = {
44
+ canStart: _lifecycleManager.lifecycle.canStart,
45
+ start: start
46
+ };
47
+ return mount(api);
48
+ }
49
+ return (0, _usageLedger.register)({
50
+ typeKey: typeKey,
51
+ mount: mountAdapter
52
+ });
53
+ }
54
+ return {
55
+ registerUsage: registerUsage,
56
+ dropTarget: dropTargetAPI.dropTargetForConsumers,
57
+ monitor: monitorAPI.monitorForConsumers
58
+ };
59
+ }