@snack-uikit/carousel 0.4.5 → 0.4.6-preview-20b0f520.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 utils_1 = require("@snack-uikit/utils");
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, utils_1.useSwipe)({
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 { useSwipe } from '@snack-uikit/utils';
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 = useSwipe({
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-20b0f520.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -36,12 +36,13 @@
36
36
  "license": "Apache-2.0",
37
37
  "scripts": {},
38
38
  "dependencies": {
39
- "@snack-uikit/icons": "0.24.0",
40
- "@snack-uikit/pagination": "0.9.3",
41
- "@snack-uikit/utils": "3.5.0",
39
+ "@snack-uikit/icons": "0.24.1-preview-20b0f520.0",
40
+ "@snack-uikit/pagination": "0.9.4-preview-20b0f520.0",
41
+ "@snack-uikit/utils": "3.5.1-preview-20b0f520.0",
42
42
  "classnames": "2.5.1",
43
43
  "lodash.debounce": "4.0.8",
44
+ "merge-refs": "1.3.0",
44
45
  "uncontrollable": "8.0.4"
45
46
  },
46
- "gitHead": "005de80f5ebffd265f443c2ce6cd063efd91866b"
47
+ "gitHead": "3d9f58d349ce6413d2242d7a42b8ba624815dcc0"
47
48
  }
@@ -1,18 +1,10 @@
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
+
5
+ import { SwipeCallback, useSwipe } from '@snack-uikit/utils';
13
6
 
14
7
  import { TEST_IDS } from '../../testIds';
15
- import { getPageX } from './helpers';
16
8
  import styles from './styles.module.scss';
17
9
 
18
10
  export type ItemProviderProps = {
@@ -116,78 +108,6 @@ export function ItemProvider({
116
108
  showVisibleItems(scrollBy, page, showItems);
117
109
  }, [page, scrollBy, showItems]);
118
110
 
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
111
  const handleSlideClick: MouseEventHandler = useCallback(
192
112
  e => {
193
113
  const slideRect = e.currentTarget.getBoundingClientRect();
@@ -212,6 +132,65 @@ export function ItemProvider({
212
132
  return `${fallbackWidth}%`;
213
133
  }, [computedValues.itemWidth, showItems]);
214
134
 
135
+ const canSwipe = useRef(true);
136
+ const [drag, setDrag] = useState({ drag: 0, pointers: true });
137
+
138
+ const handleSwipeStart: SwipeCallback = eventData => {
139
+ if (!swipe) {
140
+ return;
141
+ }
142
+
143
+ if (eventData.dir !== 'Right' && eventData.dir !== 'Left') {
144
+ canSwipe.current = false;
145
+ } else {
146
+ eventData.event.preventDefault();
147
+ eventData.event.stopPropagation();
148
+ }
149
+ };
150
+
151
+ const handleSwiping: SwipeCallback = eventData => {
152
+ if (!swipe) {
153
+ return;
154
+ }
155
+
156
+ if (!canSwipe.current) {
157
+ return;
158
+ }
159
+
160
+ eventData.event.preventDefault();
161
+ eventData.event.stopPropagation();
162
+ setDrag({ drag: eventData.deltaX, pointers: Math.abs(eventData.deltaX) < Number.MIN_SAFE_INTEGER });
163
+ };
164
+
165
+ const handleSwiped: SwipeCallback = eventData => {
166
+ if (!swipe) {
167
+ return;
168
+ }
169
+
170
+ if (!canSwipe.current) {
171
+ canSwipe.current = true;
172
+ return;
173
+ }
174
+
175
+ eventData.event.preventDefault();
176
+ eventData.event.stopPropagation();
177
+
178
+ if (Math.abs(drag.drag) < swipeActivateLength) {
179
+ return setDrag({ drag: 0, pointers: true });
180
+ }
181
+
182
+ slideCallback(eventData.dir === 'Left' ? -1 : 1);
183
+ setDrag({ drag: 0, pointers: true });
184
+ return;
185
+ };
186
+
187
+ const { ref, ...swipeProps } = useSwipe({
188
+ onSwipeStart: handleSwipeStart,
189
+ onSwiping: handleSwiping,
190
+ onSwiped: handleSwiped,
191
+ trackMouse: true,
192
+ });
193
+
215
194
  return (
216
195
  <div
217
196
  ref={containerRef}
@@ -228,10 +207,10 @@ export function ItemProvider({
228
207
  className={styles.itemTracker}
229
208
  data-test-id={TEST_IDS.trackLine}
230
209
  style={{
231
- transform: `translateX(${transform - drag.drag}px)`,
210
+ transform: `translateX(${transform + drag.drag}px)`,
232
211
  transition: `transform ${transition}s ease 0s`,
233
212
  }}
234
- ref={itemsTrackerRef}
213
+ ref={mergeRefs(ref as (element: HTMLDivElement) => void, itemsTrackerRef)}
235
214
  >
236
215
  {items.map((item, i) => (
237
216
  // 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
- }