Skip to content

Commit 766dbd6

Browse files
authored
fix: unify iOS API with Android (#42)
1 parent 2715b89 commit 766dbd6

File tree

3 files changed

+32
-113
lines changed

3 files changed

+32
-113
lines changed

ios/ReactViewPagerManager.m

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ @implementation ReactViewPagerManager
1515
RCT_EXPORT_VIEW_PROPERTY(onPageSelected, RCTBubblingEventBlock)
1616
RCT_EXPORT_VIEW_PROPERTY(onPageScroll, RCTBubblingEventBlock)
1717

18-
RCT_EXPORT_METHOD(goToPage
18+
- (void) goToPage
1919
: (nonnull NSNumber *)reactTag index
2020
: (nonnull NSNumber *)index animated
21-
: (BOOL)animated) {
21+
: (BOOL)animated {
2222
[self.bridge.uiManager addUIBlock:^(
2323
RCTUIManager *uiManager,
2424
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
@@ -31,6 +31,18 @@ @implementation ReactViewPagerManager
3131
}];
3232
}
3333

34+
RCT_EXPORT_METHOD(setPage
35+
: (nonnull NSNumber *)reactTag index
36+
: (nonnull NSNumber *)index) {
37+
[self goToPage:reactTag index:index animated:true];
38+
}
39+
40+
RCT_EXPORT_METHOD(setPageWithoutAnimation
41+
: (nonnull NSNumber *)reactTag index
42+
: (nonnull NSNumber *)index) {
43+
[self goToPage:reactTag index:index animated:false];
44+
}
45+
3446
RCT_CUSTOM_VIEW_PROPERTY(scrollEnabled, BOOL, ReactNativePageView) {
3547
[view shouldScroll:[RCTConvert BOOL:json]];
3648
}

js/ViewPagerAndroid.ios.js

Lines changed: 0 additions & 101 deletions
This file was deleted.

js/ViewPagerAndroid.android.js renamed to js/ViewPagerAndroid.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,17 @@ import type {
2020

2121
const React = require('react');
2222
const ReactNative = require('react-native');
23-
const {UIManager} = ReactNative;
23+
24+
const {Platform, UIManager} = ReactNative;
2425

2526
const dismissKeyboard = require('react-native/Libraries/Utilities/dismissKeyboard');
2627

2728
import {childrenWithOverriddenStyle} from "./utils";
2829

2930
const NativeAndroidViewPager = require('./AndroidViewPagerNativeComponent');
3031

31-
const VIEWPAGER_REF = 'viewPager';
32+
const VIEW_PAGER_REF = 'viewPager';
33+
const VIEW_MANAGER_NAME = Platform.OS === 'android' ? 'AndroidViewPager' : 'RNCViewPager';
3234

3335
function getViewManagerConfig(viewManagerName) {
3436
if (!UIManager.getViewManagerConfig) {
@@ -82,23 +84,29 @@ function getViewManagerConfig(viewManagerName) {
8284

8385
class ViewPagerAndroid extends React.Component<ViewPagerProps> {
8486
componentDidMount() {
85-
if (this.props.initialPage != null) {
86-
this.setPageWithoutAnimation(this.props.initialPage);
87+
// On iOS we do it directly on the native side
88+
if (Platform.OS === 'android') {
89+
if (this.props.initialPage != null) {
90+
this.setPageWithoutAnimation(this.props.initialPage);
91+
}
8792
}
8893
}
8994

9095
/* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found
9196
* when making Flow check .android.js files. */
9297
getInnerViewNode = (): ReactComponent => {
93-
return this.refs[VIEWPAGER_REF].getInnerViewNode();
98+
return this.refs[VIEW_PAGER_REF].getInnerViewNode();
9499
};
95100

96101
_onPageScroll = (e: PageScrollEvent) => {
97102
if (this.props.onPageScroll) {
98103
this.props.onPageScroll(e);
99104
}
100-
if (this.props.keyboardDismissMode === 'on-drag') {
101-
dismissKeyboard();
105+
// Not implemented on iOS yet
106+
if (Platform.OS === 'android') {
107+
if (this.props.keyboardDismissMode === 'on-drag') {
108+
dismissKeyboard();
109+
}
102110
}
103111
};
104112

@@ -121,7 +129,7 @@ class ViewPagerAndroid extends React.Component<ViewPagerProps> {
121129
setPage = (selectedPage: number) => {
122130
UIManager.dispatchViewManagerCommand(
123131
ReactNative.findNodeHandle(this),
124-
getViewManagerConfig('AndroidViewPager').Commands.setPage,
132+
getViewManagerConfig(VIEW_MANAGER_NAME).Commands.setPage,
125133
[selectedPage],
126134
);
127135
};
@@ -133,7 +141,7 @@ class ViewPagerAndroid extends React.Component<ViewPagerProps> {
133141
setPageWithoutAnimation = (selectedPage: number) => {
134142
UIManager.dispatchViewManagerCommand(
135143
ReactNative.findNodeHandle(this),
136-
getViewManagerConfig('AndroidViewPager').Commands
144+
getViewManagerConfig(VIEW_MANAGER_NAME).Commands
137145
.setPageWithoutAnimation,
138146
[selectedPage],
139147
);
@@ -143,7 +151,7 @@ class ViewPagerAndroid extends React.Component<ViewPagerProps> {
143151
return (
144152
<NativeAndroidViewPager
145153
{...this.props}
146-
ref={VIEWPAGER_REF}
154+
ref={VIEW_PAGER_REF}
147155
style={this.props.style}
148156
onPageScroll={this._onPageScroll}
149157
onPageScrollStateChanged={this._onPageScrollStateChanged}

0 commit comments

Comments
 (0)