@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.
@@ -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 - drag.drag}px)`,
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 { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
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 - drag.drag}px)`,
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.5",
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": "005de80f5ebffd265f443c2ce6cd063efd91866b"
48
+ "gitHead": "43c28d09e8213ef3f002c8458eee128eb42ee644"
47
49
  }
@@ -1,18 +1,9 @@
1
1
  import debounce from 'lodash.debounce';
2
- import {
3
- MouseEvent,
4
- MouseEventHandler,
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 - drag.drag}px)`,
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,2 +0,0 @@
1
- import { MouseEvent, TouchEvent } from 'react';
2
- export declare function getPageX(e: TouchEvent | MouseEvent): number;
@@ -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,2 +0,0 @@
1
- import { MouseEvent, TouchEvent } from 'react';
2
- export declare function getPageX(e: TouchEvent | MouseEvent): number;
@@ -1,9 +0,0 @@
1
- export function getPageX(e) {
2
- if (e.nativeEvent instanceof globalThis.MouseEvent) {
3
- return e.nativeEvent.pageX;
4
- }
5
- else if (e.nativeEvent instanceof globalThis.TouchEvent) {
6
- return e.nativeEvent.changedTouches[0].pageX;
7
- }
8
- return 0;
9
- }
@@ -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
- }