diff --git a/lib/platforms/react-native.js b/lib/platforms/react-native.js index c643723..d69e0fb 100644 --- a/lib/platforms/react-native.js +++ b/lib/platforms/react-native.js @@ -1,21 +1,32 @@ import { Linking } from 'react-native'; // eslint-disable-line import/no-unresolved, max-len -export const dance = authUrl => Linking.openURL(authUrl) - .then(() => new Promise((resolve, reject) => { - const handleUrl = (url) => { - if (!url || url.indexOf('fail') > -1) { - reject(url); - } else { - resolve(url); - } - }; +let previousOnLinkChange; - const onLinkChange = ({ url }) => { - Linking.removeEventListener('url', onLinkChange); - handleUrl(url); - }; +export const dance = (authUrl) => { + if (previousOnLinkChange) { + Linking.removeEventListener('url', previousOnLinkChange); + } - Linking.addEventListener('url', onLinkChange); - })); + return Linking.openURL(authUrl) + .then(() => new Promise((resolve, reject) => { + const handleUrl = (url) => { + if (!url || url.indexOf('fail') > -1) { + reject(url); + } else { + resolve(url); + } + }; + + const onLinkChange = ({ url }) => { + Linking.removeEventListener('url', onLinkChange); + previousOnLinkChange = undefined; + handleUrl(url); + }; + + Linking.addEventListener('url', onLinkChange); + + previousOnLinkChange = onLinkChange; + })); +}; export const request = fetch;