@snack-uikit/carousel 0.4.5 → 0.4.6-preview-a3b4b368.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.
- package/dist/cjs/components/ItemProvider/ItemProvider.js +75 -65
- package/dist/esm/components/ItemProvider/ItemProvider.js +64 -55
- package/package.json +4 -2
- package/src/components/ItemProvider/ItemProvider.tsx +64 -86
- package/dist/cjs/components/ItemProvider/helpers.d.ts +0 -2
- package/dist/cjs/components/ItemProvider/helpers.js +0 -14
- package/dist/esm/components/ItemProvider/helpers.d.ts +0 -2
- package/dist/esm/components/ItemProvider/helpers.js +0 -9
- package/src/components/ItemProvider/helpers.ts +0 -11
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var __rest = void 0 && (void 0).__rest || function (s, e) {
|
|
4
|
+
var t = {};
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
3
11
|
var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
|
|
4
12
|
return mod && mod.__esModule ? mod : {
|
|
5
13
|
"default": mod
|
|
@@ -11,9 +19,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
11
19
|
exports.ItemProvider = ItemProvider;
|
|
12
20
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
13
21
|
const lodash_debounce_1 = __importDefault(require("lodash.debounce"));
|
|
22
|
+
const merge_refs_1 = __importDefault(require("merge-refs"));
|
|
14
23
|
const react_1 = require("react");
|
|
24
|
+
const react_swipeable_1 = require("react-swipeable");
|
|
15
25
|
const testIds_1 = require("../../testIds");
|
|
16
|
-
const helpers_1 = require("./helpers");
|
|
17
26
|
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
18
27
|
function ItemProvider(_ref) {
|
|
19
28
|
let {
|
|
@@ -85,68 +94,6 @@ function ItemProvider(_ref) {
|
|
|
85
94
|
hideNonVisibleItems();
|
|
86
95
|
showVisibleItems(scrollBy, page, showItems);
|
|
87
96
|
}, [page, scrollBy, showItems]);
|
|
88
|
-
const [drag, setDrag] = (0, react_1.useState)({
|
|
89
|
-
initial: transform,
|
|
90
|
-
start: 0,
|
|
91
|
-
isDown: false,
|
|
92
|
-
drag: 0,
|
|
93
|
-
finished: true,
|
|
94
|
-
pointers: true
|
|
95
|
-
});
|
|
96
|
-
const handleDragStart = e => {
|
|
97
|
-
e.persist();
|
|
98
|
-
setDrag(Object.assign(Object.assign({}, drag), {
|
|
99
|
-
isDown: true,
|
|
100
|
-
start: (0, helpers_1.getPageX)(e),
|
|
101
|
-
initial: transform,
|
|
102
|
-
finished: false
|
|
103
|
-
}));
|
|
104
|
-
};
|
|
105
|
-
const handleDragFinish = e => {
|
|
106
|
-
e.persist();
|
|
107
|
-
if (drag.finished) {
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
if (Math.abs(drag.drag) < swipeActivateLength) {
|
|
111
|
-
return setDrag({
|
|
112
|
-
initial: transform,
|
|
113
|
-
start: 0,
|
|
114
|
-
isDown: false,
|
|
115
|
-
drag: 0,
|
|
116
|
-
finished: true,
|
|
117
|
-
pointers: true
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
slideCallback(drag.drag > 0 ? -1 : 1);
|
|
121
|
-
setDrag(Object.assign(Object.assign({}, drag), {
|
|
122
|
-
drag: 0,
|
|
123
|
-
isDown: false,
|
|
124
|
-
finished: true,
|
|
125
|
-
pointers: true
|
|
126
|
-
}));
|
|
127
|
-
return;
|
|
128
|
-
};
|
|
129
|
-
const handleDragMove = e => {
|
|
130
|
-
e.persist();
|
|
131
|
-
if (!drag.isDown) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const pos = (0, helpers_1.getPageX)(e);
|
|
135
|
-
setDrag(Object.assign(Object.assign({}, drag), {
|
|
136
|
-
drag: drag.start - pos,
|
|
137
|
-
pointers: Math.abs(drag.start - pos) < Number.MIN_SAFE_INTEGER
|
|
138
|
-
}));
|
|
139
|
-
};
|
|
140
|
-
const swipeProps = swipe ? {
|
|
141
|
-
onTouchCancel: handleDragFinish,
|
|
142
|
-
onTouchEnd: handleDragFinish,
|
|
143
|
-
onTouchMove: handleDragMove,
|
|
144
|
-
onTouchStart: handleDragStart,
|
|
145
|
-
onMouseDown: handleDragStart,
|
|
146
|
-
onMouseLeave: handleDragFinish,
|
|
147
|
-
onMouseUp: handleDragFinish,
|
|
148
|
-
onMouseMove: handleDragMove
|
|
149
|
-
} : {};
|
|
150
97
|
const handleSlideClick = (0, react_1.useCallback)(e => {
|
|
151
98
|
var _a, _b;
|
|
152
99
|
const slideRect = e.currentTarget.getBoundingClientRect();
|
|
@@ -165,6 +112,69 @@ function ItemProvider(_ref) {
|
|
|
165
112
|
const fallbackWidth = Math.floor(100 / showItems);
|
|
166
113
|
return `${fallbackWidth}%`;
|
|
167
114
|
}, [computedValues.itemWidth, showItems]);
|
|
115
|
+
const canSwipe = (0, react_1.useRef)(true);
|
|
116
|
+
const [drag, setDrag] = (0, react_1.useState)({
|
|
117
|
+
drag: 0,
|
|
118
|
+
pointers: true
|
|
119
|
+
});
|
|
120
|
+
const handleSwipeStart = eventData => {
|
|
121
|
+
if (!swipe) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (eventData.dir !== 'Right' && eventData.dir !== 'Left') {
|
|
125
|
+
canSwipe.current = false;
|
|
126
|
+
} else {
|
|
127
|
+
eventData.event.preventDefault();
|
|
128
|
+
eventData.event.stopPropagation();
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const handleSwiping = eventData => {
|
|
132
|
+
if (!swipe) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (!canSwipe.current) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
eventData.event.preventDefault();
|
|
139
|
+
eventData.event.stopPropagation();
|
|
140
|
+
setDrag({
|
|
141
|
+
drag: eventData.deltaX,
|
|
142
|
+
pointers: Math.abs(eventData.deltaX) < Number.MIN_SAFE_INTEGER
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
const handleSwiped = eventData => {
|
|
146
|
+
if (!swipe) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!canSwipe.current) {
|
|
150
|
+
canSwipe.current = true;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
eventData.event.preventDefault();
|
|
154
|
+
eventData.event.stopPropagation();
|
|
155
|
+
if (Math.abs(drag.drag) < swipeActivateLength) {
|
|
156
|
+
return setDrag({
|
|
157
|
+
drag: 0,
|
|
158
|
+
pointers: true
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
slideCallback(eventData.dir === 'Left' ? -1 : 1);
|
|
162
|
+
setDrag({
|
|
163
|
+
drag: 0,
|
|
164
|
+
pointers: true
|
|
165
|
+
});
|
|
166
|
+
return;
|
|
167
|
+
};
|
|
168
|
+
const _a = (0, react_swipeable_1.useSwipeable)({
|
|
169
|
+
onSwipeStart: handleSwipeStart,
|
|
170
|
+
onSwiping: handleSwiping,
|
|
171
|
+
onSwiped: handleSwiped,
|
|
172
|
+
trackMouse: true
|
|
173
|
+
}),
|
|
174
|
+
{
|
|
175
|
+
ref
|
|
176
|
+
} = _a,
|
|
177
|
+
swipeProps = __rest(_a, ["ref"]);
|
|
168
178
|
return (0, jsx_runtime_1.jsx)("div", {
|
|
169
179
|
ref: containerRef,
|
|
170
180
|
className: styles_module_scss_1.default.itemProvider,
|
|
@@ -178,10 +188,10 @@ function ItemProvider(_ref) {
|
|
|
178
188
|
className: styles_module_scss_1.default.itemTracker,
|
|
179
189
|
"data-test-id": testIds_1.TEST_IDS.trackLine,
|
|
180
190
|
style: {
|
|
181
|
-
transform: `translateX(${transform
|
|
191
|
+
transform: `translateX(${transform + drag.drag}px)`,
|
|
182
192
|
transition: `transform ${transition}s ease 0s`
|
|
183
193
|
},
|
|
184
|
-
ref: itemsTrackerRef,
|
|
194
|
+
ref: (0, merge_refs_1.default)(ref, itemsTrackerRef),
|
|
185
195
|
children: items.map((item, i) =>
|
|
186
196
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
|
|
187
197
|
(0, jsx_runtime_1.jsx)("div", {
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
1
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
13
|
import debounce from 'lodash.debounce';
|
|
3
|
-
import
|
|
14
|
+
import mergeRefs from 'merge-refs';
|
|
15
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
16
|
+
import { useSwipeable } from 'react-swipeable';
|
|
4
17
|
import { TEST_IDS } from '../../testIds';
|
|
5
|
-
import { getPageX } from './helpers';
|
|
6
18
|
import styles from './styles.module.css';
|
|
7
19
|
export function ItemProvider({ items, showItems, scrollBy, slideCallback, transition, swipe, swipeActivateLength, page, gap, }) {
|
|
8
20
|
const containerRef = useRef(null);
|
|
@@ -64,57 +76,6 @@ export function ItemProvider({ items, showItems, scrollBy, slideCallback, transi
|
|
|
64
76
|
hideNonVisibleItems();
|
|
65
77
|
showVisibleItems(scrollBy, page, showItems);
|
|
66
78
|
}, [page, scrollBy, showItems]);
|
|
67
|
-
const [drag, setDrag] = useState({
|
|
68
|
-
initial: transform,
|
|
69
|
-
start: 0,
|
|
70
|
-
isDown: false,
|
|
71
|
-
drag: 0,
|
|
72
|
-
finished: true,
|
|
73
|
-
pointers: true,
|
|
74
|
-
});
|
|
75
|
-
const handleDragStart = (e) => {
|
|
76
|
-
e.persist();
|
|
77
|
-
setDrag(Object.assign(Object.assign({}, drag), { isDown: true, start: getPageX(e), initial: transform, finished: false }));
|
|
78
|
-
};
|
|
79
|
-
const handleDragFinish = (e) => {
|
|
80
|
-
e.persist();
|
|
81
|
-
if (drag.finished) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
if (Math.abs(drag.drag) < swipeActivateLength) {
|
|
85
|
-
return setDrag({
|
|
86
|
-
initial: transform,
|
|
87
|
-
start: 0,
|
|
88
|
-
isDown: false,
|
|
89
|
-
drag: 0,
|
|
90
|
-
finished: true,
|
|
91
|
-
pointers: true,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
slideCallback(drag.drag > 0 ? -1 : 1);
|
|
95
|
-
setDrag(Object.assign(Object.assign({}, drag), { drag: 0, isDown: false, finished: true, pointers: true }));
|
|
96
|
-
return;
|
|
97
|
-
};
|
|
98
|
-
const handleDragMove = (e) => {
|
|
99
|
-
e.persist();
|
|
100
|
-
if (!drag.isDown) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const pos = getPageX(e);
|
|
104
|
-
setDrag(Object.assign(Object.assign({}, drag), { drag: drag.start - pos, pointers: Math.abs(drag.start - pos) < Number.MIN_SAFE_INTEGER }));
|
|
105
|
-
};
|
|
106
|
-
const swipeProps = swipe
|
|
107
|
-
? {
|
|
108
|
-
onTouchCancel: handleDragFinish,
|
|
109
|
-
onTouchEnd: handleDragFinish,
|
|
110
|
-
onTouchMove: handleDragMove,
|
|
111
|
-
onTouchStart: handleDragStart,
|
|
112
|
-
onMouseDown: handleDragStart,
|
|
113
|
-
onMouseLeave: handleDragFinish,
|
|
114
|
-
onMouseUp: handleDragFinish,
|
|
115
|
-
onMouseMove: handleDragMove,
|
|
116
|
-
}
|
|
117
|
-
: {};
|
|
118
79
|
const handleSlideClick = useCallback(e => {
|
|
119
80
|
var _a, _b;
|
|
120
81
|
const slideRect = e.currentTarget.getBoundingClientRect();
|
|
@@ -133,10 +94,58 @@ export function ItemProvider({ items, showItems, scrollBy, slideCallback, transi
|
|
|
133
94
|
const fallbackWidth = Math.floor(100 / showItems);
|
|
134
95
|
return `${fallbackWidth}%`;
|
|
135
96
|
}, [computedValues.itemWidth, showItems]);
|
|
97
|
+
const canSwipe = useRef(true);
|
|
98
|
+
const [drag, setDrag] = useState({ drag: 0, pointers: true });
|
|
99
|
+
const handleSwipeStart = eventData => {
|
|
100
|
+
if (!swipe) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (eventData.dir !== 'Right' && eventData.dir !== 'Left') {
|
|
104
|
+
canSwipe.current = false;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
eventData.event.preventDefault();
|
|
108
|
+
eventData.event.stopPropagation();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const handleSwiping = eventData => {
|
|
112
|
+
if (!swipe) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (!canSwipe.current) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
eventData.event.preventDefault();
|
|
119
|
+
eventData.event.stopPropagation();
|
|
120
|
+
setDrag({ drag: eventData.deltaX, pointers: Math.abs(eventData.deltaX) < Number.MIN_SAFE_INTEGER });
|
|
121
|
+
};
|
|
122
|
+
const handleSwiped = eventData => {
|
|
123
|
+
if (!swipe) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (!canSwipe.current) {
|
|
127
|
+
canSwipe.current = true;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
eventData.event.preventDefault();
|
|
131
|
+
eventData.event.stopPropagation();
|
|
132
|
+
if (Math.abs(drag.drag) < swipeActivateLength) {
|
|
133
|
+
return setDrag({ drag: 0, pointers: true });
|
|
134
|
+
}
|
|
135
|
+
slideCallback(eventData.dir === 'Left' ? -1 : 1);
|
|
136
|
+
setDrag({ drag: 0, pointers: true });
|
|
137
|
+
return;
|
|
138
|
+
};
|
|
139
|
+
const _a = useSwipeable({
|
|
140
|
+
onSwipeStart: handleSwipeStart,
|
|
141
|
+
onSwiping: handleSwiping,
|
|
142
|
+
onSwiped: handleSwiped,
|
|
143
|
+
trackMouse: true,
|
|
144
|
+
}), { ref } = _a, swipeProps = __rest(_a, ["ref"]);
|
|
136
145
|
return (_jsx("div", { ref: containerRef, className: styles.itemProvider, "data-pointers": !drag.pointers || undefined, "data-swipe": swipe || undefined, "data-gap": gap, style: Object.assign({}, (Boolean(gap) ? { '--gap': gap } : {})), children: _jsx("div", Object.assign({}, swipeProps, { className: styles.itemTracker, "data-test-id": TEST_IDS.trackLine, style: {
|
|
137
|
-
transform: `translateX(${transform
|
|
146
|
+
transform: `translateX(${transform + drag.drag}px)`,
|
|
138
147
|
transition: `transform ${transition}s ease 0s`,
|
|
139
|
-
}, ref: itemsTrackerRef, children: items.map((item, i) => (
|
|
148
|
+
}, ref: mergeRefs(ref, itemsTrackerRef), children: items.map((item, i) => (
|
|
140
149
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
|
|
141
150
|
_jsx("div", { style: { width: itemWidth }, className: styles.itemContainer, role: 'group', "data-test-id": TEST_IDS.trackItem, onClick: handleSlideClick, children: item }, i))) })) }));
|
|
142
151
|
}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.4.
|
|
7
|
+
"version": "0.4.6-preview-a3b4b368.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -41,7 +41,9 @@
|
|
|
41
41
|
"@snack-uikit/utils": "3.5.0",
|
|
42
42
|
"classnames": "2.5.1",
|
|
43
43
|
"lodash.debounce": "4.0.8",
|
|
44
|
+
"merge-refs": "1.3.0",
|
|
45
|
+
"react-swipeable": "7.0.2",
|
|
44
46
|
"uncontrollable": "8.0.4"
|
|
45
47
|
},
|
|
46
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "43c28d09e8213ef3f002c8458eee128eb42ee644"
|
|
47
49
|
}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import debounce from 'lodash.debounce';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
ReactElement,
|
|
6
|
-
TouchEvent,
|
|
7
|
-
useCallback,
|
|
8
|
-
useEffect,
|
|
9
|
-
useMemo,
|
|
10
|
-
useRef,
|
|
11
|
-
useState,
|
|
12
|
-
} from 'react';
|
|
2
|
+
import mergeRefs from 'merge-refs';
|
|
3
|
+
import { MouseEventHandler, ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { SwipeCallback, useSwipeable } from 'react-swipeable';
|
|
13
5
|
|
|
14
6
|
import { TEST_IDS } from '../../testIds';
|
|
15
|
-
import { getPageX } from './helpers';
|
|
16
7
|
import styles from './styles.module.scss';
|
|
17
8
|
|
|
18
9
|
export type ItemProviderProps = {
|
|
@@ -116,78 +107,6 @@ export function ItemProvider({
|
|
|
116
107
|
showVisibleItems(scrollBy, page, showItems);
|
|
117
108
|
}, [page, scrollBy, showItems]);
|
|
118
109
|
|
|
119
|
-
const [drag, setDrag] = useState({
|
|
120
|
-
initial: transform,
|
|
121
|
-
start: 0,
|
|
122
|
-
isDown: false,
|
|
123
|
-
drag: 0,
|
|
124
|
-
finished: true,
|
|
125
|
-
pointers: true,
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
const handleDragStart = (e: MouseEvent | TouchEvent) => {
|
|
129
|
-
e.persist();
|
|
130
|
-
setDrag({
|
|
131
|
-
...drag,
|
|
132
|
-
isDown: true,
|
|
133
|
-
start: getPageX(e),
|
|
134
|
-
initial: transform,
|
|
135
|
-
finished: false,
|
|
136
|
-
});
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
const handleDragFinish = (e: MouseEvent | TouchEvent) => {
|
|
140
|
-
e.persist();
|
|
141
|
-
|
|
142
|
-
if (drag.finished) {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (Math.abs(drag.drag) < swipeActivateLength) {
|
|
147
|
-
return setDrag({
|
|
148
|
-
initial: transform,
|
|
149
|
-
start: 0,
|
|
150
|
-
isDown: false,
|
|
151
|
-
drag: 0,
|
|
152
|
-
finished: true,
|
|
153
|
-
pointers: true,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
slideCallback(drag.drag > 0 ? -1 : 1);
|
|
158
|
-
setDrag({ ...drag, drag: 0, isDown: false, finished: true, pointers: true });
|
|
159
|
-
return;
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
const handleDragMove = (e: MouseEvent | TouchEvent) => {
|
|
163
|
-
e.persist();
|
|
164
|
-
|
|
165
|
-
if (!drag.isDown) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const pos = getPageX(e);
|
|
170
|
-
|
|
171
|
-
setDrag({
|
|
172
|
-
...drag,
|
|
173
|
-
drag: drag.start - pos,
|
|
174
|
-
pointers: Math.abs(drag.start - pos) < Number.MIN_SAFE_INTEGER,
|
|
175
|
-
});
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
const swipeProps = swipe
|
|
179
|
-
? {
|
|
180
|
-
onTouchCancel: handleDragFinish,
|
|
181
|
-
onTouchEnd: handleDragFinish,
|
|
182
|
-
onTouchMove: handleDragMove,
|
|
183
|
-
onTouchStart: handleDragStart,
|
|
184
|
-
onMouseDown: handleDragStart,
|
|
185
|
-
onMouseLeave: handleDragFinish,
|
|
186
|
-
onMouseUp: handleDragFinish,
|
|
187
|
-
onMouseMove: handleDragMove,
|
|
188
|
-
}
|
|
189
|
-
: {};
|
|
190
|
-
|
|
191
110
|
const handleSlideClick: MouseEventHandler = useCallback(
|
|
192
111
|
e => {
|
|
193
112
|
const slideRect = e.currentTarget.getBoundingClientRect();
|
|
@@ -212,6 +131,65 @@ export function ItemProvider({
|
|
|
212
131
|
return `${fallbackWidth}%`;
|
|
213
132
|
}, [computedValues.itemWidth, showItems]);
|
|
214
133
|
|
|
134
|
+
const canSwipe = useRef(true);
|
|
135
|
+
const [drag, setDrag] = useState({ drag: 0, pointers: true });
|
|
136
|
+
|
|
137
|
+
const handleSwipeStart: SwipeCallback = eventData => {
|
|
138
|
+
if (!swipe) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (eventData.dir !== 'Right' && eventData.dir !== 'Left') {
|
|
143
|
+
canSwipe.current = false;
|
|
144
|
+
} else {
|
|
145
|
+
eventData.event.preventDefault();
|
|
146
|
+
eventData.event.stopPropagation();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const handleSwiping: SwipeCallback = eventData => {
|
|
151
|
+
if (!swipe) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (!canSwipe.current) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
eventData.event.preventDefault();
|
|
160
|
+
eventData.event.stopPropagation();
|
|
161
|
+
setDrag({ drag: eventData.deltaX, pointers: Math.abs(eventData.deltaX) < Number.MIN_SAFE_INTEGER });
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const handleSwiped: SwipeCallback = eventData => {
|
|
165
|
+
if (!swipe) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (!canSwipe.current) {
|
|
170
|
+
canSwipe.current = true;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
eventData.event.preventDefault();
|
|
175
|
+
eventData.event.stopPropagation();
|
|
176
|
+
|
|
177
|
+
if (Math.abs(drag.drag) < swipeActivateLength) {
|
|
178
|
+
return setDrag({ drag: 0, pointers: true });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
slideCallback(eventData.dir === 'Left' ? -1 : 1);
|
|
182
|
+
setDrag({ drag: 0, pointers: true });
|
|
183
|
+
return;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const { ref, ...swipeProps } = useSwipeable({
|
|
187
|
+
onSwipeStart: handleSwipeStart,
|
|
188
|
+
onSwiping: handleSwiping,
|
|
189
|
+
onSwiped: handleSwiped,
|
|
190
|
+
trackMouse: true,
|
|
191
|
+
});
|
|
192
|
+
|
|
215
193
|
return (
|
|
216
194
|
<div
|
|
217
195
|
ref={containerRef}
|
|
@@ -228,10 +206,10 @@ export function ItemProvider({
|
|
|
228
206
|
className={styles.itemTracker}
|
|
229
207
|
data-test-id={TEST_IDS.trackLine}
|
|
230
208
|
style={{
|
|
231
|
-
transform: `translateX(${transform
|
|
209
|
+
transform: `translateX(${transform + drag.drag}px)`,
|
|
232
210
|
transition: `transform ${transition}s ease 0s`,
|
|
233
211
|
}}
|
|
234
|
-
ref={itemsTrackerRef}
|
|
212
|
+
ref={mergeRefs(ref as (element: HTMLDivElement) => void, itemsTrackerRef)}
|
|
235
213
|
>
|
|
236
214
|
{items.map((item, i) => (
|
|
237
215
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getPageX = getPageX;
|
|
7
|
-
function getPageX(e) {
|
|
8
|
-
if (e.nativeEvent instanceof globalThis.MouseEvent) {
|
|
9
|
-
return e.nativeEvent.pageX;
|
|
10
|
-
} else if (e.nativeEvent instanceof globalThis.TouchEvent) {
|
|
11
|
-
return e.nativeEvent.changedTouches[0].pageX;
|
|
12
|
-
}
|
|
13
|
-
return 0;
|
|
14
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { MouseEvent, TouchEvent } from 'react';
|
|
2
|
-
|
|
3
|
-
export function getPageX(e: TouchEvent | MouseEvent): number {
|
|
4
|
-
if (e.nativeEvent instanceof globalThis.MouseEvent) {
|
|
5
|
-
return e.nativeEvent.pageX;
|
|
6
|
-
} else if (e.nativeEvent instanceof globalThis.TouchEvent) {
|
|
7
|
-
return e.nativeEvent.changedTouches[0].pageX;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return 0;
|
|
11
|
-
}
|