Skip to content

Commit 8472324

Browse files
committed
[fix] Linking listener.remove() API
Linking.removeEventListener() was deprecated in [email protected] Fix #2507
1 parent 526eac1 commit 8472324

File tree

5 files changed

+68
-49
lines changed

5 files changed

+68
-49
lines changed

packages/react-native-web-examples/next.config.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const pages = fs
77
.map((dirent) => dirent.name);
88

99
module.exports = {
10-
outDir: 'dist',
1110
env: { pages },
1211
webpack: (config, options) => {
1312
config.resolve.alias['react-native'] = 'react-native-web';

packages/react-native-web-examples/pages/checkbox/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default function CheckboxPage() {
2525
<Divider />
2626
<CheckBox disabled style={styles.item} value={true} />
2727
<Divider />
28-
<CheckBox accessibilityReadOnly style={styles.item} value={true} />
28+
<CheckBox aria-readonly style={styles.item} value={true} />
2929
</View>
3030
<View style={styles.row}>
3131
<CheckBox value={false} />

packages/react-native-web-examples/pages/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ const styles = StyleSheet.create({
7373
color: '#1977f2'
7474
},
7575
listitem: {
76-
marginVertical: '0.5rem',
77-
textAlign: 'center'
76+
marginVertical: '0.5rem'
7877
},
7978
pageLink: {
8079
fontSize: '1.25rem',
81-
fontWeight: 'bold'
80+
fontWeight: 'bold',
81+
textAlign: 'center'
8282
}
8383
});

packages/react-native-web-examples/pages/linking/index.js

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,48 @@
11
import { Linking, StyleSheet, Text } from 'react-native';
2-
import React, { PureComponent } from 'react';
2+
import React from 'react';
33
import Example from '../../shared/example';
44

55
const url = 'https://mathiasbynens.github.io/rel-noopener/malicious.html';
66

7-
export default class LinkingPage extends PureComponent {
8-
handlePress() {
7+
export default function LinkingPage(props) {
8+
const [, setCount] = React.useState(0);
9+
10+
React.useEffect(() => {
11+
console.log('adding listener');
12+
const listener = Linking.addEventListener('onOpen', () => {
13+
console.log('onOpen event');
14+
});
15+
return () => {
16+
console.log('removing listener');
17+
listener.remove();
18+
};
19+
});
20+
21+
function handlePress() {
922
Linking.canOpenURL(url).then((supported) => {
10-
return Linking.openURL(url);
23+
setCount((x) => x + 1);
24+
const v = Linking.openURL(url);
25+
return v;
1126
});
1227
}
1328

14-
render() {
15-
return (
16-
<Example title="Linking">
17-
<Text onPress={this.handlePress} style={styles.text}>
18-
Linking.openURL
19-
</Text>
20-
<Text
21-
href="https://mathiasbynens.github.io/rel-noopener/malicious.html"
22-
hrefAttrs={{
23-
target: '_blank'
24-
}}
25-
role="link"
26-
style={styles.text}
27-
>
28-
target="_blank"
29-
</Text>
30-
</Example>
31-
);
32-
}
29+
return (
30+
<Example title="Linking">
31+
<Text onPress={handlePress} style={styles.text}>
32+
Linking.openURL
33+
</Text>
34+
<Text
35+
href="https://mathiasbynens.github.io/rel-noopener/malicious.html"
36+
hrefAttrs={{
37+
target: '_blank'
38+
}}
39+
role="link"
40+
style={styles.text}
41+
>
42+
target="_blank"
43+
</Text>
44+
</Example>
45+
);
3346
}
3447

3548
const styles = StyleSheet.create({

packages/react-native-web/src/exports/Linking/index.js

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,6 @@ const initialURL = canUseDOM ? window.location.href : '';
1515

1616
type Callback = (...args: any) => void;
1717

18-
type OnOpenCallback = (
19-
event: 'onOpen',
20-
callback: (url: string) => void
21-
) => void;
22-
type GenericCallback = (event: string, callback: Callback) => void;
23-
2418
class Linking {
2519
/**
2620
* An object mapping of event name
@@ -41,31 +35,44 @@ class Linking {
4135
* Adds a event listener for the specified event. The callback will be called when the
4236
* said event is dispatched.
4337
*/
44-
addEventListener: OnOpenCallback | GenericCallback = (
45-
event: string,
38+
addEventListener(
39+
eventType: string,
4640
callback: Callback
47-
) => {
48-
if (!this._eventCallbacks[event]) {
49-
this._eventCallbacks[event] = [callback];
50-
return;
41+
): {| remove(): void |} {
42+
const _this = this;
43+
44+
if (!_this._eventCallbacks[eventType]) {
45+
_this._eventCallbacks[eventType] = [callback];
5146
}
52-
this._eventCallbacks[event].push(callback);
53-
};
47+
_this._eventCallbacks[eventType].push(callback);
48+
49+
return {
50+
remove() {
51+
const callbacks = _this._eventCallbacks[eventType];
52+
const filteredCallbacks = callbacks.filter(
53+
(c) => c.toString() !== callback.toString()
54+
);
55+
_this._eventCallbacks[eventType] = filteredCallbacks;
56+
}
57+
};
58+
}
5459

5560
/**
5661
* Removes a previously added event listener for the specified event. The callback must
5762
* be the same object as the one passed to `addEventListener`.
5863
*/
59-
removeEventListener: OnOpenCallback | GenericCallback = (
60-
event: string,
61-
callback: Callback
62-
) => {
63-
const callbacks = this._eventCallbacks[event];
64+
removeEventListener(eventType: string, callback: Callback): void {
65+
console.error(
66+
`Linking.removeEventListener('${eventType}', ...): Method has been ` +
67+
'deprecated. Please instead use `remove()` on the subscription ' +
68+
'returned by `Linking.addEventListener`.'
69+
);
70+
const callbacks = this._eventCallbacks[eventType];
6471
const filteredCallbacks = callbacks.filter(
6572
(c) => c.toString() !== callback.toString()
6673
);
67-
this._eventCallbacks[event] = filteredCallbacks;
68-
};
74+
this._eventCallbacks[eventType] = filteredCallbacks;
75+
}
6976

7077
canOpenURL(): Promise<boolean> {
7178
return Promise.resolve(true);

0 commit comments

Comments
 (0)