Skip to content

Commit a330f3e

Browse files
committed
fix(web): only reverse scroll direction for one axis based on whether horizontal is set
1 parent febb588 commit a330f3e

File tree

3 files changed

+82
-60
lines changed

3 files changed

+82
-60
lines changed

src/FlashList.tsx

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ import {
3232
RenderTargetOptions,
3333
} from "./FlashListProps";
3434
import {
35+
addInvertedWheelHandler,
3536
getCellContainerPlatformStyles,
3637
getFooterContainer,
3738
getItemAnimator,
3839
PlatformConfig,
40+
removeInvertedWheelHandler,
3941
} from "./native/config/PlatformHelper";
4042
import {
4143
ContentStyleExplicit,
@@ -289,14 +291,15 @@ class FlashList<T> extends React.PureComponent<
289291
private updateWebScrollHandler() {
290292
if (Platform.OS !== "web" || !this.rlvRef) return;
291293

292-
if (this.props.inverted !== this.hasInvertedWheelHandler) {
293-
if (this.props.inverted) {
294-
PlatformConfig.addInvertedWheelHandler(this.rlvRef);
295-
this.hasInvertedWheelHandler = true;
296-
} else {
297-
PlatformConfig.removeInvertedWheelHandler(this.rlvRef);
298-
this.hasInvertedWheelHandler = false;
299-
}
294+
removeInvertedWheelHandler(this.rlvRef);
295+
this.hasInvertedWheelHandler = false;
296+
297+
if (this.props.inverted) {
298+
addInvertedWheelHandler(
299+
this.rlvRef,
300+
this.props.horizontal ? "horizontal" : "vertical"
301+
);
302+
this.hasInvertedWheelHandler = true;
300303
}
301304
}
302305

@@ -317,12 +320,17 @@ class FlashList<T> extends React.PureComponent<
317320
}
318321

319322
if (this.hasInvertedWheelHandler) {
320-
PlatformConfig.removeInvertedWheelHandler(this.rlvRef);
323+
removeInvertedWheelHandler(this.rlvRef);
321324
}
322325
}
323326

324-
componentDidUpdate() {
325-
this.updateWebScrollHandler();
327+
componentDidUpdate(prevProps: FlashListProps<T>) {
328+
if (
329+
prevProps.inverted !== this.props.inverted ||
330+
prevProps.horizontal !== this.props.horizontal
331+
) {
332+
this.updateWebScrollHandler();
333+
}
326334
}
327335

328336
render() {

src/native/config/PlatformHelper.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,6 @@ const PlatformConfig = {
99
defaultDrawDistance: 250,
1010
invertedTransformStyle: { transform: [{ scaleY: -1 }] },
1111
invertedTransformStyleHorizontal: { transform: [{ scaleX: -1 }] },
12-
addInvertedWheelHandler: (
13-
ref: RecyclerListView<RecyclerListViewProps, any> | undefined
14-
): (() => void) | undefined => {
15-
// (web-only)
16-
return undefined;
17-
},
18-
removeInvertedWheelHandler: (
19-
ref: RecyclerListView<RecyclerListViewProps, any> | undefined
20-
): (() => void) | undefined => {
21-
// (web-only)
22-
return undefined;
23-
},
2412
};
2513
const getCellContainerPlatformStyles = (
2614
inverted: boolean,
@@ -37,9 +25,24 @@ const getFooterContainer = (): React.ComponentClass | undefined => {
3725
return undefined;
3826
};
3927

28+
const addInvertedWheelHandler = (
29+
ref: RecyclerListView<RecyclerListViewProps, any> | undefined,
30+
type: "horizontal" | "vertical"
31+
): (() => void) | undefined => {
32+
return undefined;
33+
};
34+
35+
const removeInvertedWheelHandler = (
36+
ref: RecyclerListView<RecyclerListViewProps, any> | undefined
37+
): (() => void) | undefined => {
38+
return undefined;
39+
};
40+
4041
export {
4142
PlatformConfig,
4243
getCellContainerPlatformStyles,
4344
getItemAnimator,
4445
getFooterContainer,
46+
addInvertedWheelHandler,
47+
removeInvertedWheelHandler,
4548
};

src/native/config/PlatformHelper.web.ts

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,52 +7,32 @@ import {
77
} from "recyclerlistview";
88
import { DefaultJSItemAnimator } from "recyclerlistview/dist/reactnative/platform/reactnative/itemanimators/defaultjsanimator/DefaultJSItemAnimator";
99

10-
const invertedWheelEventHandler = (event: globalThis.WheelEvent) => {
11-
const node = event.currentTarget as HTMLElement;
10+
const createInvertedWheelEventHandler = (type: "horizontal" | "vertical") => {
11+
return (event: globalThis.WheelEvent) => {
12+
const node = event.currentTarget as HTMLElement;
1213

13-
// For inverted lists, we want to scroll in the opposite direction
14-
// So when deltaY is positive (scroll down), we want to scroll up
15-
const deltaY = -event.deltaY;
16-
const deltaX = -event.deltaX;
14+
const deltaX = type === "horizontal" ? -event.deltaX : event.deltaX;
15+
const deltaY = type === "vertical" ? -event.deltaY : event.deltaY;
1716

18-
// Scroll by the inverted delta
19-
node.scrollBy({
20-
top: deltaY,
21-
left: deltaX,
22-
behavior: "auto",
23-
});
17+
node.scrollBy({
18+
top: deltaY,
19+
left: deltaX,
20+
behavior: "auto",
21+
});
2422

25-
// Prevent the default scroll
26-
event.preventDefault();
23+
event.preventDefault();
24+
};
2725
};
2826

27+
const verticalInvertedWheelEventHandler =
28+
createInvertedWheelEventHandler("vertical");
29+
const horizontalInvertedWheelEventHandler =
30+
createInvertedWheelEventHandler("horizontal");
31+
2932
const PlatformConfig = {
3033
defaultDrawDistance: 2000,
3134
invertedTransformStyle: { transform: [{ scaleY: -1 }] },
3235
invertedTransformStyleHorizontal: { transform: [{ scaleX: -1 }] },
33-
addInvertedWheelHandler: (
34-
ref: RecyclerListView<RecyclerListViewProps, any> | undefined
35-
): ((event: globalThis.WheelEvent) => void) | undefined => {
36-
if (!ref) return undefined;
37-
const node = findNodeHandle(ref) as unknown as HTMLElement;
38-
if (node) {
39-
node.addEventListener("wheel", invertedWheelEventHandler, {
40-
passive: false,
41-
});
42-
return invertedWheelEventHandler;
43-
}
44-
return undefined;
45-
},
46-
removeInvertedWheelHandler: (
47-
ref: RecyclerListView<RecyclerListViewProps, any> | undefined
48-
): ((event: globalThis.WheelEvent) => void) | undefined => {
49-
if (!ref) return undefined;
50-
const node = findNodeHandle(ref) as unknown as HTMLElement;
51-
if (node) {
52-
node.removeEventListener("wheel", invertedWheelEventHandler);
53-
}
54-
return undefined;
55-
},
5636
};
5737
const getCellContainerPlatformStyles = (
5838
inverted: boolean,
@@ -71,10 +51,41 @@ const getItemAnimator = (): BaseItemAnimator | undefined => {
7151
const getFooterContainer = (): React.ComponentClass | undefined => {
7252
return View;
7353
};
54+
const addInvertedWheelHandler = (
55+
ref: RecyclerListView<RecyclerListViewProps, any> | undefined,
56+
type: "horizontal" | "vertical"
57+
): ((event: globalThis.WheelEvent) => void) | undefined => {
58+
if (!ref) return undefined;
59+
const node = findNodeHandle(ref) as unknown as HTMLElement;
60+
if (node) {
61+
const handler =
62+
type === "horizontal"
63+
? horizontalInvertedWheelEventHandler
64+
: verticalInvertedWheelEventHandler;
65+
node.addEventListener("wheel", handler, {
66+
passive: false,
67+
});
68+
return handler;
69+
}
70+
return undefined;
71+
};
72+
const removeInvertedWheelHandler = (
73+
ref: RecyclerListView<RecyclerListViewProps, any> | undefined
74+
): ((event: globalThis.WheelEvent) => void) | undefined => {
75+
if (!ref) return undefined;
76+
const node = findNodeHandle(ref) as unknown as HTMLElement;
77+
if (node) {
78+
node.removeEventListener("wheel", verticalInvertedWheelEventHandler);
79+
node.removeEventListener("wheel", horizontalInvertedWheelEventHandler);
80+
}
81+
return undefined;
82+
};
7483

7584
export {
7685
PlatformConfig,
7786
getCellContainerPlatformStyles,
7887
getItemAnimator,
7988
getFooterContainer,
89+
addInvertedWheelHandler,
90+
removeInvertedWheelHandler,
8091
};

0 commit comments

Comments
 (0)