fix: don't throw when using 'useLinking'. fixes #8171

This commit is contained in:
Satyajit Sahoo
2020-05-01 16:49:06 +02:00
parent b66e3436a7
commit 10eca8b92e
3 changed files with 38 additions and 14 deletions

View File

@@ -17,7 +17,7 @@ it('throws if multiple instances of useLinking are used', () => {
let element;
expect(() => (element = render(<Sample />))).toThrowError(
"Looks like you are using 'useLinking' in multiple components."
'Looks like you have configured linking in multiple places.'
);
// @ts-ignore
@@ -41,9 +41,7 @@ it('throws if multiple instances of useLinking are used', () => {
<B />
</>
))
).toThrowError(
"Looks like you are using 'useLinking' in multiple components."
);
).toThrowError('Looks like you have configured linking in multiple places.');
// @ts-ignore
element?.unmount();
@@ -57,5 +55,19 @@ it('throws if multiple instances of useLinking are used', () => {
render(wrapper2).unmount();
expect(() => render(wrapper2)).not.toThrow();
expect(() => (element = render(wrapper2))).not.toThrow();
// @ts-ignore
element?.unmount();
function Sample3() {
useLinking(ref, options);
useLinking(ref, { ...options, enabled: false });
return null;
}
expect(() => (element = render(<Sample3 />))).not.toThrowError();
// @ts-ignore
element?.unmount();
});

View File

@@ -19,15 +19,21 @@ export default function useLinking(
}: LinkingOptions
) {
React.useEffect(() => {
if (isUsingLinking) {
if (enabled !== false && isUsingLinking) {
throw new Error(
"Looks like you are using 'useLinking' in multiple components. This is likely an error since deep links should only be handled in one place to avoid conflicts." +
(Platform.OS === 'android'
? "\n\nIf you're not using it in multiple components, ensure that you have set 'android:launchMode=singleTask' in the '<activity />' section of the 'AndroidManifest.xml' file to avoid launching multiple activities which run multiple instances of the root component."
: '')
[
'Looks like you have configured linking in multiple places. This is likely an error since deep links should only be handled in one place to avoid conflicts. Make sure that:',
"- You are not using both 'linking' prop and 'useLinking'",
"- You don't have 'useLinking' in multiple components",
Platform.OS === 'android'
? "- You have set 'android:launchMode=singleTask' in the '<activity />' section of the 'AndroidManifest.xml' file to avoid launching multiple instances"
: '',
]
.join('\n')
.trim()
);
} else {
isUsingLinking = true;
isUsingLinking = enabled !== false;
}
return () => {

View File

@@ -50,12 +50,18 @@ export default function useLinking(
}: LinkingOptions
) {
React.useEffect(() => {
if (isUsingLinking) {
if (enabled !== false && isUsingLinking) {
throw new Error(
"Looks like you are using 'useLinking' in multiple components. This is likely an error since URL integration should only be handled in one place to avoid conflicts. Also ensure that you set your android activity launchMode to single task in your AndroiManifest.xml file."
[
'Looks like you have configured linking in multiple places. This is likely an error since URL integration should only be handled in one place to avoid conflicts. Make sure that:',
"- You are not using both 'linking' prop and 'useLinking'",
"- You don't have 'useLinking' in multiple components",
]
.join('\n')
.trim()
);
} else {
isUsingLinking = true;
isUsingLinking = enabled !== false;
}
return () => {