react-native-drax 0.11.0-alpha.2 → 1.1.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 (246) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +390 -227
  3. package/lib/module/DebugOverlay.js +121 -0
  4. package/lib/module/DebugOverlay.js.map +1 -0
  5. package/lib/module/Drax.js +36 -0
  6. package/lib/module/Drax.js.map +1 -0
  7. package/lib/module/DraxContext.js +6 -0
  8. package/lib/module/DraxContext.js.map +1 -0
  9. package/lib/module/DraxHandle.js +47 -0
  10. package/lib/module/DraxHandle.js.map +1 -0
  11. package/lib/module/DraxHandleContext.js +11 -0
  12. package/lib/module/DraxHandleContext.js.map +1 -0
  13. package/lib/module/DraxList.js +108 -0
  14. package/lib/module/DraxList.js.map +1 -0
  15. package/lib/module/DraxProvider.js +203 -0
  16. package/lib/module/DraxProvider.js.map +1 -0
  17. package/lib/module/DraxScrollView.js +167 -0
  18. package/lib/module/DraxScrollView.js.map +1 -0
  19. package/lib/module/DraxSubprovider.js +21 -0
  20. package/lib/module/DraxSubprovider.js.map +1 -0
  21. package/lib/module/DraxView.js +348 -0
  22. package/lib/module/DraxView.js.map +1 -0
  23. package/lib/module/HoverLayer.js +152 -0
  24. package/lib/module/HoverLayer.js.map +1 -0
  25. package/lib/module/SortableBoardContainer.js +386 -0
  26. package/lib/module/SortableBoardContainer.js.map +1 -0
  27. package/lib/module/SortableBoardContext.js +6 -0
  28. package/lib/module/SortableBoardContext.js.map +1 -0
  29. package/lib/module/SortableContainer.js +571 -0
  30. package/lib/module/SortableContainer.js.map +1 -0
  31. package/lib/module/SortableItem.js +226 -0
  32. package/lib/module/SortableItem.js.map +1 -0
  33. package/lib/module/SortableItemContext.js +38 -0
  34. package/lib/module/SortableItemContext.js.map +1 -0
  35. package/lib/module/compat/detectVersion.js +19 -0
  36. package/lib/module/compat/detectVersion.js.map +1 -0
  37. package/lib/module/compat/index.js +5 -0
  38. package/lib/module/compat/index.js.map +1 -0
  39. package/lib/module/compat/types.js +4 -0
  40. package/lib/module/compat/types.js.map +1 -0
  41. package/lib/module/compat/useDraxPanGesture.js +94 -0
  42. package/lib/module/compat/useDraxPanGesture.js.map +1 -0
  43. package/lib/module/hooks/index.js +5 -0
  44. package/lib/module/hooks/index.js.map +1 -0
  45. package/lib/module/hooks/useCallbackDispatch.js +688 -0
  46. package/lib/module/hooks/useCallbackDispatch.js.map +1 -0
  47. package/lib/module/hooks/useDragGesture.js +240 -0
  48. package/lib/module/hooks/useDragGesture.js.map +1 -0
  49. package/lib/module/hooks/useDraxContext.js +12 -0
  50. package/lib/module/hooks/useDraxContext.js.map +1 -0
  51. package/lib/module/hooks/useDraxId.js +13 -0
  52. package/lib/module/hooks/useDraxId.js.map +1 -0
  53. package/lib/module/hooks/useDraxMethods.js +73 -0
  54. package/lib/module/hooks/useDraxMethods.js.map +1 -0
  55. package/lib/module/hooks/useDraxScrollHandler.js +97 -0
  56. package/lib/module/hooks/useDraxScrollHandler.js.map +1 -0
  57. package/lib/module/hooks/useSortableBoard.js +37 -0
  58. package/lib/module/hooks/useSortableBoard.js.map +1 -0
  59. package/lib/module/hooks/useSortableList.js +988 -0
  60. package/lib/module/hooks/useSortableList.js.map +1 -0
  61. package/lib/module/hooks/useSpatialIndex.js +283 -0
  62. package/lib/module/hooks/useSpatialIndex.js.map +1 -0
  63. package/lib/module/hooks/useViewStyles.js +158 -0
  64. package/lib/module/hooks/useViewStyles.js.map +1 -0
  65. package/lib/module/hooks/useWebScrollFreeze.js +52 -0
  66. package/lib/module/hooks/useWebScrollFreeze.js.map +1 -0
  67. package/lib/module/index.js +37 -0
  68. package/lib/module/index.js.map +1 -0
  69. package/lib/module/math.js +294 -0
  70. package/lib/module/math.js.map +1 -0
  71. package/lib/module/package.json +1 -0
  72. package/lib/module/params.js +88 -0
  73. package/lib/module/params.js.map +1 -0
  74. package/lib/module/types.js +215 -0
  75. package/lib/module/types.js.map +1 -0
  76. package/lib/typescript/package.json +1 -0
  77. package/lib/typescript/src/DebugOverlay.d.ts +17 -0
  78. package/lib/typescript/src/DebugOverlay.d.ts.map +1 -0
  79. package/lib/typescript/src/Drax.d.ts +28 -0
  80. package/lib/typescript/src/Drax.d.ts.map +1 -0
  81. package/lib/typescript/src/DraxContext.d.ts +3 -0
  82. package/lib/typescript/src/DraxContext.d.ts.map +1 -0
  83. package/lib/typescript/src/DraxHandle.d.ts +25 -0
  84. package/lib/typescript/src/DraxHandle.d.ts.map +1 -0
  85. package/lib/typescript/src/DraxHandleContext.d.ts +12 -0
  86. package/lib/typescript/src/DraxHandleContext.d.ts.map +1 -0
  87. package/lib/typescript/src/DraxList.d.ts +66 -0
  88. package/lib/typescript/src/DraxList.d.ts.map +1 -0
  89. package/lib/typescript/src/DraxProvider.d.ts +4 -0
  90. package/lib/typescript/src/DraxProvider.d.ts.map +1 -0
  91. package/lib/typescript/src/DraxScrollView.d.ts +7 -0
  92. package/lib/typescript/src/DraxScrollView.d.ts.map +1 -0
  93. package/lib/typescript/src/DraxSubprovider.d.ts +4 -0
  94. package/lib/typescript/src/DraxSubprovider.d.ts.map +1 -0
  95. package/lib/typescript/src/DraxView.d.ts +4 -0
  96. package/lib/typescript/src/DraxView.d.ts.map +1 -0
  97. package/lib/typescript/src/HoverLayer.d.ts +38 -0
  98. package/lib/typescript/src/HoverLayer.d.ts.map +1 -0
  99. package/lib/typescript/src/SortableBoardContainer.d.ts +11 -0
  100. package/lib/typescript/src/SortableBoardContainer.d.ts.map +1 -0
  101. package/lib/typescript/src/SortableBoardContext.d.ts +4 -0
  102. package/lib/typescript/src/SortableBoardContext.d.ts.map +1 -0
  103. package/lib/typescript/src/SortableContainer.d.ts +13 -0
  104. package/lib/typescript/src/SortableContainer.d.ts.map +1 -0
  105. package/lib/typescript/src/SortableItem.d.ts +14 -0
  106. package/lib/typescript/src/SortableItem.d.ts.map +1 -0
  107. package/lib/typescript/src/SortableItemContext.d.ts +37 -0
  108. package/lib/typescript/src/SortableItemContext.d.ts.map +1 -0
  109. package/lib/typescript/src/compat/detectVersion.d.ts +2 -0
  110. package/lib/typescript/src/compat/detectVersion.d.ts.map +1 -0
  111. package/lib/typescript/src/compat/index.d.ts +4 -0
  112. package/lib/typescript/src/compat/index.d.ts.map +1 -0
  113. package/lib/typescript/src/compat/types.d.ts +33 -0
  114. package/lib/typescript/src/compat/types.d.ts.map +1 -0
  115. package/lib/typescript/src/compat/useDraxPanGesture.d.ts +8 -0
  116. package/lib/typescript/src/compat/useDraxPanGesture.d.ts.map +1 -0
  117. package/lib/typescript/src/hooks/index.d.ts +3 -0
  118. package/lib/typescript/src/hooks/index.d.ts.map +1 -0
  119. package/lib/typescript/src/hooks/useCallbackDispatch.d.ts +40 -0
  120. package/lib/typescript/src/hooks/useCallbackDispatch.d.ts.map +1 -0
  121. package/lib/typescript/src/hooks/useDragGesture.d.ts +17 -0
  122. package/lib/typescript/src/hooks/useDragGesture.d.ts.map +1 -0
  123. package/lib/typescript/src/hooks/useDraxContext.d.ts +2 -0
  124. package/lib/typescript/src/hooks/useDraxContext.d.ts.map +1 -0
  125. package/{build → lib/typescript/src}/hooks/useDraxId.d.ts +1 -0
  126. package/lib/typescript/src/hooks/useDraxId.d.ts.map +1 -0
  127. package/lib/typescript/src/hooks/useDraxMethods.d.ts +13 -0
  128. package/lib/typescript/src/hooks/useDraxMethods.d.ts.map +1 -0
  129. package/lib/typescript/src/hooks/useDraxScrollHandler.d.ts +27 -0
  130. package/lib/typescript/src/hooks/useDraxScrollHandler.d.ts.map +1 -0
  131. package/lib/typescript/src/hooks/useSortableBoard.d.ts +10 -0
  132. package/lib/typescript/src/hooks/useSortableBoard.d.ts.map +1 -0
  133. package/lib/typescript/src/hooks/useSortableList.d.ts +11 -0
  134. package/lib/typescript/src/hooks/useSortableList.d.ts.map +1 -0
  135. package/lib/typescript/src/hooks/useSpatialIndex.d.ts +22 -0
  136. package/lib/typescript/src/hooks/useSpatialIndex.d.ts.map +1 -0
  137. package/lib/typescript/src/hooks/useViewStyles.d.ts +183 -0
  138. package/lib/typescript/src/hooks/useViewStyles.d.ts.map +1 -0
  139. package/lib/typescript/src/hooks/useWebScrollFreeze.d.ts +14 -0
  140. package/lib/typescript/src/hooks/useWebScrollFreeze.d.ts.map +1 -0
  141. package/lib/typescript/src/index.d.ts +25 -0
  142. package/lib/typescript/src/index.d.ts.map +1 -0
  143. package/lib/typescript/src/math.d.ts +76 -0
  144. package/lib/typescript/src/math.d.ts.map +1 -0
  145. package/{build → lib/typescript/src}/params.d.ts +13 -9
  146. package/lib/typescript/src/params.d.ts.map +1 -0
  147. package/lib/typescript/src/types.d.ts +756 -0
  148. package/lib/typescript/src/types.d.ts.map +1 -0
  149. package/package.json +164 -34
  150. package/src/DebugOverlay.tsx +140 -0
  151. package/src/Drax.ts +33 -0
  152. package/src/DraxContext.ts +8 -0
  153. package/src/DraxHandle.tsx +52 -0
  154. package/src/DraxHandleContext.ts +15 -0
  155. package/src/DraxList.tsx +181 -0
  156. package/src/DraxProvider.tsx +224 -0
  157. package/src/DraxScrollView.tsx +180 -0
  158. package/src/DraxSubprovider.tsx +22 -0
  159. package/src/DraxView.tsx +430 -0
  160. package/src/HoverLayer.tsx +167 -0
  161. package/src/SortableBoardContainer.tsx +439 -0
  162. package/src/SortableBoardContext.ts +6 -0
  163. package/src/SortableContainer.tsx +650 -0
  164. package/src/SortableItem.tsx +264 -0
  165. package/src/SortableItemContext.ts +46 -0
  166. package/src/compat/detectVersion.ts +17 -0
  167. package/src/compat/index.ts +7 -0
  168. package/src/compat/types.ts +35 -0
  169. package/src/compat/useDraxPanGesture.ts +112 -0
  170. package/src/hooks/index.ts +2 -0
  171. package/src/hooks/useCallbackDispatch.tsx +830 -0
  172. package/src/hooks/useDragGesture.ts +273 -0
  173. package/src/hooks/useDraxContext.ts +11 -0
  174. package/src/hooks/useDraxId.ts +11 -0
  175. package/src/hooks/useDraxMethods.ts +71 -0
  176. package/src/hooks/useDraxScrollHandler.ts +121 -0
  177. package/src/hooks/useSortableBoard.ts +44 -0
  178. package/src/hooks/useSortableList.ts +1063 -0
  179. package/src/hooks/useSpatialIndex.ts +336 -0
  180. package/src/hooks/useViewStyles.ts +180 -0
  181. package/src/hooks/useWebScrollFreeze.ts +60 -0
  182. package/src/index.ts +111 -0
  183. package/src/math.ts +333 -0
  184. package/src/params.ts +74 -0
  185. package/src/types.ts +933 -0
  186. package/.editorconfig +0 -15
  187. package/.eslintrc.js +0 -4
  188. package/.prettierrc +0 -16
  189. package/CHANGELOG.md +0 -270
  190. package/CODE-OF-CONDUCT.md +0 -85
  191. package/CONTRIBUTING.md +0 -15
  192. package/FUNDING.yml +0 -4
  193. package/build/AllHoverViews.d.ts +0 -0
  194. package/build/AllHoverViews.js +0 -30
  195. package/build/DraxContext.d.ts +0 -2
  196. package/build/DraxContext.js +0 -6
  197. package/build/DraxList.d.ts +0 -8
  198. package/build/DraxList.js +0 -512
  199. package/build/DraxListItem.d.ts +0 -7
  200. package/build/DraxListItem.js +0 -121
  201. package/build/DraxProvider.d.ts +0 -2
  202. package/build/DraxProvider.js +0 -704
  203. package/build/DraxScrollView.d.ts +0 -6
  204. package/build/DraxScrollView.js +0 -136
  205. package/build/DraxSubprovider.d.ts +0 -3
  206. package/build/DraxSubprovider.js +0 -18
  207. package/build/DraxView.d.ts +0 -8
  208. package/build/DraxView.js +0 -93
  209. package/build/HoverView.d.ts +0 -8
  210. package/build/HoverView.js +0 -40
  211. package/build/PanGestureDetector.d.ts +0 -3
  212. package/build/PanGestureDetector.js +0 -49
  213. package/build/hooks/index.d.ts +0 -4
  214. package/build/hooks/index.js +0 -11
  215. package/build/hooks/useContent.d.ts +0 -23
  216. package/build/hooks/useContent.js +0 -212
  217. package/build/hooks/useDraxContext.d.ts +0 -1
  218. package/build/hooks/useDraxContext.js +0 -13
  219. package/build/hooks/useDraxId.js +0 -13
  220. package/build/hooks/useDraxProtocol.d.ts +0 -5
  221. package/build/hooks/useDraxProtocol.js +0 -32
  222. package/build/hooks/useDraxRegistry.d.ts +0 -78
  223. package/build/hooks/useDraxRegistry.js +0 -714
  224. package/build/hooks/useDraxScrollHandler.d.ts +0 -25
  225. package/build/hooks/useDraxScrollHandler.js +0 -89
  226. package/build/hooks/useDraxState.d.ts +0 -10
  227. package/build/hooks/useDraxState.js +0 -132
  228. package/build/hooks/useMeasurements.d.ts +0 -9
  229. package/build/hooks/useMeasurements.js +0 -119
  230. package/build/hooks/useStatus.d.ts +0 -11
  231. package/build/hooks/useStatus.js +0 -96
  232. package/build/index.d.ts +0 -9
  233. package/build/index.js +0 -33
  234. package/build/math.d.ts +0 -22
  235. package/build/math.js +0 -68
  236. package/build/params.js +0 -27
  237. package/build/transform.d.ts +0 -11
  238. package/build/transform.js +0 -59
  239. package/build/types.d.ts +0 -807
  240. package/build/types.js +0 -46
  241. package/docs/concept.md +0 -79
  242. package/docs/images/color-drag-drop.gif +0 -0
  243. package/docs/images/deck-cards.gif +0 -0
  244. package/docs/images/drag-drop-events.jpg +0 -0
  245. package/docs/images/knight-moves.gif +0 -0
  246. package/docs/images/reorderable-list.gif +0 -0
package/build/DraxList.js DELETED
@@ -1,512 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.DraxList = void 0;
30
- const lodash_throttle_1 = __importDefault(require("lodash.throttle"));
31
- const react_1 = __importStar(require("react"));
32
- const react_native_1 = require("react-native");
33
- const react_native_reanimated_1 = __importStar(require("react-native-reanimated"));
34
- const DraxSubprovider_1 = require("./DraxSubprovider");
35
- const DraxView_1 = require("./DraxView");
36
- const useDraxScrollHandler_1 = require("./hooks/useDraxScrollHandler");
37
- const params_1 = require("./params");
38
- const types_1 = require("./types");
39
- const DraxListUnforwarded = (props, forwardedRef) => {
40
- const { data, style, onItemDragStart, onItemDragPositionChange, onItemDragEnd, onItemReorder, reorderable: reorderableProp, onScroll: onScrollProp, lockItemDragsToMainAxis = false, longPressDelay = params_1.defaultListItemLongPressDelay, parentDraxViewProps, monitoringExternalDragStyle, ...flatListProps } = props;
41
- // Copy the value of the horizontal property for internal use.
42
- const horizontal = flatListProps.horizontal ?? false;
43
- // Get the item count for internal use.
44
- const itemCount = data?.length ?? 0;
45
- // Set a sensible default for reorderable prop.
46
- const reorderable = reorderableProp ?? onItemReorder !== undefined;
47
- // Original index of the currently dragged list item, if any.
48
- const draggedItem = (0, react_native_reanimated_1.useSharedValue)(undefined);
49
- // Auto-scrolling state.
50
- const scrollStateRef = (0, react_1.useRef)(types_1.AutoScrollDirection.None);
51
- // List item measurements, for determining shift.
52
- const itemMeasurementsRef = (0, react_1.useRef)([]);
53
- const prevItemMeasurementsRef = (0, react_1.useRef)([]);
54
- // Drax view registrations, for remeasuring after reorder.
55
- const registrationsRef = (0, react_1.useRef)([]);
56
- // Shift offsets.
57
- const shiftsRef = (0, react_native_reanimated_1.useSharedValue)([]);
58
- const previousShiftsRef = (0, react_native_reanimated_1.useSharedValue)([]);
59
- // Maintain cache of reordered list indexes until data updates.
60
- const [originalIndexes, setOriginalIndexes] = (0, react_1.useState)([]);
61
- // Maintain the index the item is currently dragged to.
62
- const draggedToIndex = (0, react_1.useRef)(undefined);
63
- // Adjust measurements, registrations, and shift value arrays as item count changes.
64
- (0, react_1.useEffect)(() => {
65
- const itemMeasurements = itemMeasurementsRef.current;
66
- const registrations = registrationsRef.current;
67
- const shifts = shiftsRef.value;
68
- if (itemMeasurements.length > itemCount) {
69
- itemMeasurements.splice(itemCount - itemMeasurements.length);
70
- }
71
- else {
72
- while (itemMeasurements.length < itemCount) {
73
- itemMeasurements.push(undefined);
74
- }
75
- }
76
- if (registrations.length > itemCount) {
77
- registrations.splice(itemCount - registrations.length);
78
- }
79
- else {
80
- while (registrations.length < itemCount) {
81
- registrations.push(undefined);
82
- }
83
- }
84
- if (shifts.length > itemCount) {
85
- shifts.splice(itemCount - shifts.length);
86
- }
87
- else {
88
- while (shifts.length < itemCount) {
89
- shifts.push({ x: 0, y: 0 });
90
- }
91
- }
92
- shiftsRef.value = shifts;
93
- }, [itemCount]);
94
- // Clear reorders when data changes.
95
- (0, react_1.useLayoutEffect)(() => {
96
- // console.log('clear reorders');
97
- setOriginalIndexes(data ? [...Array(data.length).keys()] : []);
98
- }, [data]);
99
- // Handle auto-scrolling on interval.
100
- const doScroll = (0, react_1.useCallback)(() => {
101
- const containerMeasurements = containerMeasurementsRef.current;
102
- const contentSize = contentSizeRef.current;
103
- if (!flatListRef.current || !containerMeasurements || !contentSize) {
104
- return;
105
- }
106
- let containerLength;
107
- let contentLength;
108
- let prevOffset;
109
- if (horizontal) {
110
- containerLength = containerMeasurements.width;
111
- contentLength = contentSize.x;
112
- prevOffset = scrollPosition.value.x;
113
- }
114
- else {
115
- containerLength = containerMeasurements.height;
116
- contentLength = contentSize.y;
117
- prevOffset = scrollPosition.value.y;
118
- }
119
- const jumpLength = containerLength * 0.2;
120
- let offset;
121
- if (scrollStateRef.current === types_1.AutoScrollDirection.Forward) {
122
- const maxOffset = contentLength - containerLength;
123
- if (prevOffset < maxOffset) {
124
- offset = Math.min(prevOffset + jumpLength, maxOffset);
125
- }
126
- }
127
- else if (scrollStateRef.current === types_1.AutoScrollDirection.Back) {
128
- if (prevOffset > 0) {
129
- offset = Math.max(prevOffset - jumpLength, 0);
130
- }
131
- }
132
- if (offset !== undefined) {
133
- flatListRef.current.scrollToOffset({ offset });
134
- flatListRef.current.flashScrollIndicators();
135
- }
136
- }, [horizontal]);
137
- const { id, containerMeasurementsRef, contentSizeRef, onContentSizeChange, onMeasureContainer, onScroll, scrollRef: flatListRef, scrollPosition, setScrollRefs, startScroll, stopScroll, } = (0, useDraxScrollHandler_1.useDraxScrollHandler)({
138
- idProp: parentDraxViewProps?.id,
139
- onContentSizeChangeProp: props.onContentSizeChange,
140
- onScrollProp,
141
- forwardedRef,
142
- doScroll,
143
- });
144
- // Apply the reorder cache to the data.
145
- const reorderedData = (0, react_1.useMemo)(() => {
146
- // console.log('refresh sorted data');
147
- if (!id || !data) {
148
- return null;
149
- }
150
- if (data.length !== originalIndexes.length) {
151
- return data;
152
- }
153
- return originalIndexes.map(index => data[index]).filter(Boolean);
154
- }, [id, data, originalIndexes]);
155
- // Set the currently dragged list item.
156
- const setDraggedItem = (0, react_1.useCallback)((originalIndex) => {
157
- draggedItem.value = originalIndex;
158
- }, []);
159
- // Clear the currently dragged list item.
160
- const resetDraggedItem = (0, react_1.useCallback)(() => {
161
- draggedItem.value = undefined;
162
- }, []);
163
- // Drax view renderItem wrapper.
164
- const renderItem = (0, react_1.useCallback)((info) => {
165
- const { index, item } = info;
166
- const originalIndex = originalIndexes[index];
167
- const itemProps = {
168
- index,
169
- item,
170
- originalIndex,
171
- horizontal,
172
- longPressDelay,
173
- lockItemDragsToMainAxis,
174
- draggedItem,
175
- shiftsRef,
176
- itemMeasurementsRef,
177
- prevItemMeasurementsRef,
178
- resetDraggedItem,
179
- keyExtractor: props?.keyExtractor,
180
- previousShiftsRef,
181
- registrationsRef,
182
- info,
183
- data,
184
- };
185
- return props?.renderItem?.(info, itemProps);
186
- }, [
187
- originalIndexes,
188
- resetDraggedItem,
189
- longPressDelay,
190
- lockItemDragsToMainAxis,
191
- horizontal,
192
- draggedItem,
193
- shiftsRef,
194
- itemMeasurementsRef,
195
- prevItemMeasurementsRef,
196
- previousShiftsRef,
197
- registrationsRef,
198
- props?.keyExtractor,
199
- data,
200
- ]);
201
- // Reset all shift values.
202
- const resetShifts = (0, react_1.useCallback)(() => {
203
- previousShiftsRef.value = shiftsRef.value;
204
- prevItemMeasurementsRef.current = [...itemMeasurementsRef.current];
205
- shiftsRef.value = shiftsRef.value.map(() => ({ x: 0, y: 0 }));
206
- }, []);
207
- // Update shift values in response to a drag.
208
- const updateShifts = (0, react_1.useCallback)(({ index: fromIndex, originalIndex: fromOriginalIndex }, { index: toIndex }, dragged) => {
209
- const isForward = fromIndex < toIndex;
210
- shiftsRef.value = originalIndexes.map(index => {
211
- // Don't shift the dragged item
212
- if (index === fromIndex)
213
- return { x: 0, y: 0 };
214
- // Reset shift if item is no longer in the affected range
215
- const shouldShift = isForward
216
- ? index > fromIndex && index <= toIndex
217
- : index >= toIndex && index < fromIndex;
218
- if (!shouldShift)
219
- return { x: 0, y: 0 };
220
- // Get measurements for current item and the item we're shifting to
221
- const currentMeasurements = itemMeasurementsRef.current[index];
222
- const draggedMeasurements = itemMeasurementsRef.current[fromOriginalIndex] ||
223
- /** If no measurements, it must be an external dragged item */
224
- dragged.data.hoverMeasurements;
225
- const targetIndex = isForward ? index - 1 : index + 1;
226
- const targetMeasurements = itemMeasurementsRef.current[targetIndex] ||
227
- /** If no measurements, it must be last item. Fallback to list contentSize */
228
- contentSizeRef.current;
229
- if (!currentMeasurements || !draggedMeasurements || !targetMeasurements) {
230
- return { x: 0, y: 0 };
231
- }
232
- // Calculate gaps between items in both directions
233
- const xGap = isForward
234
- ? currentMeasurements.x - (targetMeasurements.x + targetMeasurements.width)
235
- : targetMeasurements.x - (currentMeasurements.x + currentMeasurements.width);
236
- const yGap = isForward
237
- ? currentMeasurements.y - (targetMeasurements.y + targetMeasurements.height)
238
- : targetMeasurements.y - (currentMeasurements.y + currentMeasurements.height);
239
- // Calculated new shifts
240
- const x = isForward ? -(draggedMeasurements.width + xGap) : draggedMeasurements.width + xGap;
241
- const y = isForward ? -(draggedMeasurements.height + yGap) : draggedMeasurements.height + yGap;
242
- if ((props?.numColumns || 1) > 1) {
243
- return { x, y };
244
- }
245
- if (horizontal) {
246
- return { x, y: 0 };
247
- }
248
- else {
249
- return { x: 0, y };
250
- }
251
- });
252
- }, [originalIndexes]);
253
- // Calculate absolute position of list item for snapback.
254
- const calculateSnapbackTarget = (0, react_1.useCallback)(({ index: fromIndex, originalIndex: fromOriginalIndex }, { index: toIndex, originalIndex: toOriginalIndex }) => {
255
- const containerMeasurements = containerMeasurementsRef.current;
256
- const itemMeasurements = itemMeasurementsRef.current;
257
- if (containerMeasurements) {
258
- let targetPos;
259
- if (fromIndex < toIndex) {
260
- // Target pos(toIndex + 1) - pos(fromIndex)
261
- const nextIndex = toIndex + 1;
262
- let nextPos;
263
- if (nextIndex < itemCount) {
264
- // toIndex + 1 is in the list. We can measure the position of the next item.
265
- const nextMeasurements = itemMeasurements[originalIndexes[nextIndex]];
266
- if (nextMeasurements) {
267
- nextPos = {
268
- x: nextMeasurements.x,
269
- y: nextMeasurements.y,
270
- };
271
- }
272
- }
273
- else {
274
- // toIndex is the last item of the list. We can use the list content size.
275
- const contentSize = contentSizeRef.current;
276
- if (contentSize) {
277
- nextPos = horizontal ? { x: contentSize.x, y: 0 } : { x: 0, y: contentSize.y };
278
- }
279
- }
280
- const fromMeasurements = itemMeasurements[fromOriginalIndex];
281
- if (nextPos && fromMeasurements) {
282
- const flattenedStyles = react_native_1.StyleSheet.flatten(flatListProps.contentContainerStyle) || {};
283
- //@ts-ignore
284
- const rowGap = flattenedStyles.rowGap ?? flattenedStyles.gap ?? 0;
285
- //@ts-ignore
286
- const columnGap = flattenedStyles.columnGap ?? flattenedStyles.gap ?? 0;
287
- targetPos = horizontal
288
- ? {
289
- x: nextPos.x - fromMeasurements.width - rowGap,
290
- y: nextPos.y,
291
- }
292
- : {
293
- x: nextPos.x,
294
- y: nextPos.y - fromMeasurements.height - columnGap,
295
- };
296
- }
297
- }
298
- else {
299
- // Target pos(toIndex)
300
- const toMeasurements = itemMeasurements[toOriginalIndex];
301
- if (toMeasurements) {
302
- targetPos = {
303
- x: toMeasurements.x,
304
- y: toMeasurements.y,
305
- };
306
- }
307
- }
308
- if (targetPos) {
309
- return {
310
- x: containerMeasurements.x - scrollPosition.value.x + targetPos.x,
311
- y: containerMeasurements.y - scrollPosition.value.y + targetPos.y,
312
- };
313
- }
314
- }
315
- return types_1.DraxSnapbackTargetPreset.None;
316
- }, [horizontal, itemCount, originalIndexes]);
317
- // Stop auto-scrolling, and potentially update shifts and reorder data.
318
- const handleInternalDragEnd = (0, react_1.useCallback)((eventData, totalDragEnd) => {
319
- // Always stop auto-scroll on drag end.
320
- scrollStateRef.current = types_1.AutoScrollDirection.None;
321
- stopScroll();
322
- const { dragged, receiver } = eventData;
323
- const isExternalDrag = dragged.parentId !== id || typeof dragged.payload.originalIndex !== 'number';
324
- // First, check if we need to shift items.
325
- if (reorderable) {
326
- const fromPayload = {
327
- /**
328
- * Indexing should start from zero and stop at `itemCount - 1`, but
329
- * we're also handling for external drag by adding a fake item index,
330
- * resulting to `itemCount`.
331
- */
332
- index: !isExternalDrag ? dragged.payload.index : itemCount,
333
- originalIndex: !isExternalDrag ? dragged.payload.originalIndex : itemCount,
334
- };
335
- const toPayload = receiver?.parentId === id ? receiver.payload : undefined;
336
- const { index: fromIndex, originalIndex: fromOriginalIndex } = fromPayload;
337
- const { index: toIndex, originalIndex: toOriginalIndex } = toPayload ?? {};
338
- const toItem = toOriginalIndex !== undefined ? data?.[toOriginalIndex] : undefined;
339
- const fromItem = data?.[fromOriginalIndex] || dragged.payload;
340
- throttledSetIsExternalDrag(false);
341
- // Reset all shifts and call callback, regardless of whether toPayload exists.
342
- resetShifts();
343
- if (totalDragEnd) {
344
- onItemDragEnd?.({
345
- ...eventData,
346
- toIndex,
347
- toItem,
348
- cancelled: (0, types_1.isWithCancelledFlag)(eventData) ? eventData.cancelled : false,
349
- index: fromIndex,
350
- item: fromItem,
351
- isExternalDrag,
352
- });
353
- }
354
- // Reset currently dragged over position index to undefined.
355
- if (draggedToIndex.current !== undefined) {
356
- if (!totalDragEnd) {
357
- onItemDragPositionChange?.({
358
- ...eventData,
359
- index: fromIndex,
360
- item: fromItem,
361
- toIndex: undefined,
362
- previousIndex: draggedToIndex.current,
363
- isExternalDrag,
364
- });
365
- }
366
- draggedToIndex.current = undefined;
367
- }
368
- if (toPayload !== undefined) {
369
- // If dragged item and received item were ours, reorder data.
370
- // console.log(`moving ${fromPayload.index} -> ${toPayload.index}`);
371
- const snapbackTarget = calculateSnapbackTarget(fromPayload, toPayload);
372
- if (data) {
373
- const newOriginalIndexes = originalIndexes.slice();
374
- newOriginalIndexes.splice(toIndex, 0, newOriginalIndexes.splice(fromIndex, 1)[0]);
375
- setOriginalIndexes(newOriginalIndexes);
376
- onItemReorder?.({
377
- fromIndex,
378
- fromItem,
379
- toIndex: toIndex,
380
- toItem,
381
- isExternalDrag,
382
- });
383
- }
384
- return snapbackTarget;
385
- }
386
- }
387
- return undefined;
388
- }, [
389
- id,
390
- data,
391
- stopScroll,
392
- reorderable,
393
- resetShifts,
394
- calculateSnapbackTarget,
395
- originalIndexes,
396
- onItemDragEnd,
397
- onItemDragPositionChange,
398
- onItemReorder,
399
- ]);
400
- // Monitor drag starts to handle callbacks.
401
- const onMonitorDragStart = (0, react_1.useCallback)((eventData) => {
402
- parentDraxViewProps?.onMonitorDragStart?.(eventData);
403
- const { dragged } = eventData;
404
- // First, check if we need to do anything.
405
- if (reorderable && dragged.parentId === id) {
406
- // One of our list items is starting to be dragged.
407
- const { index, originalIndex } = dragged.payload;
408
- setDraggedItem(originalIndex);
409
- onItemDragStart?.({
410
- ...eventData,
411
- index,
412
- item: data?.[originalIndex],
413
- isExternalDrag: false,
414
- });
415
- }
416
- }, [id, reorderable, data, setDraggedItem, onItemDragStart]);
417
- // Monitor drags to react with item shifts and auto-scrolling.
418
- const onMonitorDragOver = (0, react_1.useCallback)((eventData) => {
419
- parentDraxViewProps?.onMonitorDragOver?.(eventData);
420
- const { dragged, receiver, monitorOffsetRatio } = eventData;
421
- const isExternalDrag = dragged.parentId !== id || typeof dragged.payload.originalIndex !== 'number';
422
- // First, check if we need to shift items.
423
- if (reorderable) {
424
- const fromPayload = {
425
- /**
426
- * Indexing should start from zero and stop at `itemCount - 1`, but
427
- * we're also handling for external drag by adding a fake item index,
428
- * resulting to `itemCount`.
429
- */
430
- index: !isExternalDrag ? dragged.payload.index : itemCount,
431
- originalIndex: !isExternalDrag ? dragged.payload.originalIndex : itemCount,
432
- };
433
- if (typeof draggedItem.value !== 'number') {
434
- /** DraxList is receiving external drag */
435
- setDraggedItem(itemCount);
436
- }
437
- monitoringExternalDragStyle && draggedItem.value === itemCount && throttledSetIsExternalDrag(true);
438
- const fromItem = data?.[fromPayload.originalIndex] || dragged.payload;
439
- // Find its current position index in the list, if any.
440
- const toPayload = receiver?.parentId === id ? receiver.payload : undefined;
441
- // Check and update currently dragged over position index.
442
- const toIndex = toPayload?.index;
443
- if (toIndex !== draggedToIndex.current) {
444
- onItemDragPositionChange?.({
445
- ...eventData,
446
- toIndex,
447
- index: fromPayload.index,
448
- item: fromItem,
449
- previousIndex: draggedToIndex.current,
450
- isExternalDrag,
451
- });
452
- draggedToIndex.current = toIndex;
453
- }
454
- // Update shift transforms for items in the list.
455
- updateShifts(fromPayload, toPayload ?? fromPayload, dragged);
456
- }
457
- // Next, see if we need to auto-scroll.
458
- const ratio = horizontal ? monitorOffsetRatio.x : monitorOffsetRatio.y;
459
- if (ratio > 0.1 && ratio < 0.9) {
460
- scrollStateRef.current = types_1.AutoScrollDirection.None;
461
- stopScroll();
462
- }
463
- else {
464
- if (ratio >= 0.9) {
465
- scrollStateRef.current = types_1.AutoScrollDirection.Forward;
466
- }
467
- else if (ratio <= 0.1) {
468
- scrollStateRef.current = types_1.AutoScrollDirection.Back;
469
- }
470
- startScroll();
471
- }
472
- }, [id, reorderable, data, updateShifts, horizontal, stopScroll, startScroll, onItemDragPositionChange]);
473
- // Monitor drag exits to stop scrolling, update shifts, and update draggedToIndex.
474
- const onMonitorDragExit = (0, react_1.useCallback)((eventData) => {
475
- handleInternalDragEnd(eventData, false);
476
- parentDraxViewProps?.onMonitorDragExit?.(eventData);
477
- }, [handleInternalDragEnd]);
478
- /*
479
- * Monitor drag ends to stop scrolling, update shifts, and possibly reorder.
480
- * This addresses the Android case where if we drag a list item and auto-scroll
481
- * too far, the drag gets cancelled.
482
- */
483
- const onMonitorDragEnd = (0, react_1.useCallback)((eventData) => {
484
- const defaultSnapbackTarget = handleInternalDragEnd(eventData, true);
485
- const providedSnapTarget = parentDraxViewProps?.onMonitorDragEnd?.(eventData);
486
- resetDraggedItem();
487
- return providedSnapTarget ?? defaultSnapbackTarget;
488
- }, [handleInternalDragEnd]);
489
- // Monitor drag drops to stop scrolling, update shifts, and possibly reorder.
490
- const onMonitorDragDrop = (0, react_1.useCallback)((eventData) => {
491
- const defaultSnapbackTarget = handleInternalDragEnd(eventData, true);
492
- const providedSnapTarget = parentDraxViewProps?.onMonitorDragDrop?.(eventData);
493
- draggedItem.value === itemCount && resetDraggedItem();
494
- return providedSnapTarget ?? defaultSnapbackTarget;
495
- }, [handleInternalDragEnd]);
496
- const [isExternalDrag, setIsExternalDrag] = (0, react_1.useState)(false);
497
- const throttledSetIsExternalDrag = (0, react_1.useMemo)(() => (0, lodash_throttle_1.default)((position) => {
498
- setIsExternalDrag(position);
499
- }, 300), []);
500
- return (react_1.default.createElement(DraxView_1.DraxView, { ...parentDraxViewProps, style: [parentDraxViewProps?.style, isExternalDrag && monitoringExternalDragStyle], id: id, scrollPosition: scrollPosition, onMeasure: event => {
501
- parentDraxViewProps?.onMeasure?.(event);
502
- return onMeasureContainer(event);
503
- }, onMonitorDragStart: onMonitorDragStart, onMonitorDragOver: onMonitorDragOver, onMonitorDragExit: onMonitorDragExit, onMonitorDragEnd: onMonitorDragEnd, onMonitorDragDrop: onMonitorDragDrop },
504
- react_1.default.createElement(DraxSubprovider_1.DraxSubprovider, { parent: {
505
- id,
506
- viewRef: {
507
- current: flatListRef?.current?.getNativeScrollRef?.(),
508
- },
509
- } },
510
- react_1.default.createElement(react_native_reanimated_1.default.FlatList, { ...flatListProps, style: style, ref: setScrollRefs, renderItem: renderItem, onScroll: onScroll, onContentSizeChange: onContentSizeChange, data: reorderedData }))));
511
- };
512
- exports.DraxList = (0, react_1.forwardRef)(DraxListUnforwarded);
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import { DraxListItemProps, DraxViewProps } from './types';
3
- declare const RenderItemComponent: <T extends unknown>({ itemProps: { index, item, originalIndex, horizontal, lockItemDragsToMainAxis, draggedItem, shiftsRef, itemMeasurementsRef, prevItemMeasurementsRef, resetDraggedItem, keyExtractor, previousShiftsRef, registrationsRef, data, }, ...draxViewProps }: {
4
- itemProps: DraxListItemProps<T>;
5
- } & DraxViewProps) => React.JSX.Element;
6
- export declare const DraxListItem: typeof RenderItemComponent;
7
- export {};
@@ -1,121 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.DraxListItem = void 0;
27
- const react_1 = __importStar(require("react"));
28
- const react_native_reanimated_1 = require("react-native-reanimated");
29
- const DraxView_1 = require("./DraxView");
30
- // const defaultStyles = StyleSheet.create({
31
- // draggingStyle: { opacity: 0 },
32
- // dragReleasedStyle: { opacity: 0.5 },
33
- // });
34
- const RenderItemComponent = ({ itemProps: { index, item, originalIndex, horizontal, lockItemDragsToMainAxis, draggedItem, shiftsRef, itemMeasurementsRef, prevItemMeasurementsRef, resetDraggedItem, keyExtractor, previousShiftsRef, registrationsRef, data, }, ...draxViewProps }) => {
35
- const animatedValueX = (0, react_native_reanimated_1.useSharedValue)(0);
36
- const animatedValueY = (0, react_native_reanimated_1.useSharedValue)(0);
37
- const itemKey = (item && keyExtractor?.(item, index)) ?? item?.key ?? item?.id;
38
- const shiftTransformStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => {
39
- return {
40
- transform: [{ translateX: animatedValueX.value }, { translateY: animatedValueY.value }],
41
- };
42
- });
43
- (0, react_native_reanimated_1.useAnimatedReaction)(() => shiftsRef.value[originalIndex], shift => {
44
- const isDragged = typeof draggedItem.value === 'number';
45
- /** Apply reordering animations by shifting items between them */
46
- if (isDragged) {
47
- animatedValueX.value = (0, react_native_reanimated_1.withTiming)(shift.x, {
48
- duration: 200,
49
- });
50
- animatedValueY.value = (0, react_native_reanimated_1.withTiming)(shift.y, {
51
- duration: 200,
52
- });
53
- }
54
- });
55
- (0, react_1.useLayoutEffect)(() => {
56
- /** Reset the shift when the item moves to a new index. */
57
- animatedValueX.value = 0;
58
- animatedValueY.value = 0;
59
- }, [index]);
60
- (0, react_1.useLayoutEffect)(() => {
61
- const measurements = itemMeasurementsRef.current[originalIndex];
62
- const previousMeasurementsIndex = prevItemMeasurementsRef.current.findIndex(item => item?.key === itemKey);
63
- const previousMeasurements = prevItemMeasurementsRef.current[previousMeasurementsIndex];
64
- const isLayoutShifted = previousShiftsRef.value.some(item => item.x || item.y);
65
- /**
66
- * Animate as items are added/removed from the list.
67
- * For newly added items, if layout is shifted, it's most probably an external drag that was dropped in the list
68
- * and it skips list layout animation.
69
- *
70
- * @todo implement animations even for this described scenario
71
- * by applying the shift offset.
72
- */
73
- if (previousMeasurements && measurements && !isLayoutShifted) {
74
- const offsetX = previousMeasurements.x - measurements.x;
75
- const offsetY = previousMeasurements.y - measurements.y;
76
- /** Start from previous values before the items data (order) changed */
77
- animatedValueX.value = offsetX;
78
- animatedValueY.value = offsetY;
79
- animatedValueX.value = (0, react_native_reanimated_1.withTiming)(0, {
80
- duration: 200,
81
- });
82
- animatedValueY.value = (0, react_native_reanimated_1.withTiming)(0, {
83
- duration: 200,
84
- });
85
- }
86
- }, [itemKey, originalIndex, horizontal, itemMeasurementsRef, prevItemMeasurementsRef, previousShiftsRef]);
87
- return (react_1.default.createElement(DraxView_1.DraxView, { lockDragXPosition: lockItemDragsToMainAxis && !horizontal, lockDragYPosition: lockItemDragsToMainAxis && horizontal, ...draxViewProps, style: [shiftTransformStyle, draxViewProps.style], payload: { ...draxViewProps.payload, index, originalIndex, item: data?.[index] }, onDragEnd: event => {
88
- draxViewProps.onDragEnd?.(event);
89
- resetDraggedItem();
90
- }, onDragDrop: event => {
91
- draxViewProps.onDragDrop?.(event);
92
- resetDraggedItem();
93
- }, onMeasure: measurements => {
94
- draxViewProps.onMeasure?.(measurements);
95
- if (originalIndex !== undefined && measurements) {
96
- /**
97
- * @todo 🪲 BUG
98
- * @platform web
99
- * @summary Somehow the measurements for the same item are getting duplicated.
100
- */
101
- // Clear any duplicate measurements
102
- const duplicateIndex = itemMeasurementsRef.current.findIndex((item, idx) => idx !== originalIndex && item?.key === itemKey);
103
- if (duplicateIndex !== -1) {
104
- itemMeasurementsRef.current[duplicateIndex] = undefined;
105
- }
106
- // Store the new measurement
107
- itemMeasurementsRef.current[originalIndex] = {
108
- ...measurements,
109
- key: itemKey,
110
- };
111
- }
112
- }, registration: registration => {
113
- draxViewProps.registration?.(registration);
114
- if (registration && originalIndex !== undefined) {
115
- // console.log(`registering [${index}, ${originalIndex}], ${registration.id}`);
116
- registrationsRef.current[originalIndex] = registration;
117
- registration.measure();
118
- }
119
- } }));
120
- };
121
- exports.DraxListItem = (0, react_1.memo)(RenderItemComponent);
@@ -1,2 +0,0 @@
1
- import { DraxProviderProps } from './types';
2
- export declare const DraxProvider: ({ debug, style, children }: DraxProviderProps) => JSX.Element;