Skip to content

Commit 42a5389

Browse files
authored
Merge pull request #5 from software-mansion-labs/feat/support-for-android
Feat/support for android
2 parents 5004f39 + 56bc443 commit 42a5389

5 files changed

Lines changed: 81 additions & 17 deletions

File tree

example/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"@expo/metro-runtime": "~5.0.4",
1313
"@react-native-async-storage/async-storage": "^2.2.0",
1414
"expo": "~53.0.22",
15+
"expo-application": "^6.1.5",
1516
"expo-clipboard": "^7.1.5",
1617
"expo-dev-client": "~5.2.4",
1718
"expo-localization": "^16.1.6",

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@
4747
],
4848
"repository": {
4949
"type": "git",
50-
"url": "git+https://github.com/software-mansion-labs/detour-website.git"
50+
"url": "git+https://github.com/software-mansion-labs/detour-react-native.git"
5151
},
5252
"author": "swmansion <contact@godetour.com> (https://godetour.dev/)",
5353
"license": "MIT",
5454
"bugs": {
55-
"url": "https://github.com/detour-app/detour/issues"
55+
"url": "https://github.com/software-mansion-labs/detour-react-native/issues"
5656
},
57-
"homepage": "https://github.com/software-mansion-labs/detour-website#readme",
57+
"homepage": "https://github.com/software-mansion-labs/detour-react-native#readme",
5858
"publishConfig": {
5959
"registry": "https://registry.npmjs.org/"
6060
},
@@ -75,6 +75,7 @@
7575
"eslint": "^9.22.0",
7676
"eslint-config-prettier": "^10.1.1",
7777
"eslint-plugin-prettier": "^5.2.3",
78+
"expo-application": "^6.1.5",
7879
"expo-clipboard": "^7.1.5",
7980
"expo-localization": "^16.1.6",
8081
"jest": "^29.7.0",
@@ -88,6 +89,7 @@
8889
},
8990
"peerDependencies": {
9091
"@react-native-async-storage/async-storage": ">=2.0.0",
92+
"expo-application": ">=6.1.5",
9193
"expo-clipboard": ">=6.0.0",
9294
"expo-localization": ">=15.0.0",
9395
"react": ">=18",

src/api/getDeferredLink.ts

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,69 @@
11
import type { RequiredConfig } from '../types';
2-
import { getProbabilisticFingerprint } from '../utils/fingerprint';
2+
import {
3+
getDeterministicFingerprint,
4+
getProbabilisticFingerprint,
5+
type DeterministicFingerprint,
6+
type ProbabilisticFingerprint,
7+
} from '../utils/fingerprint';
8+
import * as Application from 'expo-application';
39

410
const API_URL = 'https://detour-poc.vercel.app/api/link/match-link';
511

12+
const sendFingerprint = async ({
13+
API_KEY,
14+
appID,
15+
requestBody,
16+
}: {
17+
API_KEY: string;
18+
appID: string;
19+
requestBody: ProbabilisticFingerprint | DeterministicFingerprint;
20+
}): Promise<Response> => {
21+
const response = await fetch(API_URL, {
22+
method: 'POST',
23+
headers: {
24+
'Content-Type': 'application/json',
25+
'Authorization': `Bearer ${API_KEY}`,
26+
'X-App-ID': appID,
27+
},
28+
body: JSON.stringify(requestBody),
29+
});
30+
31+
return response;
32+
};
33+
634
export const getDeferredLink = async ({
735
API_KEY,
836
appID,
937
shouldUseClipboard,
1038
}: RequiredConfig) => {
11-
const probabilisticFingerprint =
12-
await getProbabilisticFingerprint(shouldUseClipboard);
39+
const referrer = await Application.getInstallReferrerAsync();
40+
const matchClickId = referrer.match(/(?:^|&)click_id=([^&]+)/);
41+
const referrerClickId = matchClickId ? matchClickId[1] : null;
1342

14-
try {
15-
const response = await fetch(API_URL, {
16-
method: 'POST',
17-
headers: {
18-
'Content-Type': 'application/json',
19-
'Authorization': `Bearer ${API_KEY}`,
20-
'X-App-ID': appID,
21-
},
22-
body: JSON.stringify(probabilisticFingerprint),
43+
let response;
44+
if (referrerClickId?.length) {
45+
response = await sendFingerprint({
46+
API_KEY,
47+
appID,
48+
requestBody: getDeterministicFingerprint(referrerClickId),
2349
});
50+
} else {
51+
const probabilisticFingerprint =
52+
await getProbabilisticFingerprint(shouldUseClipboard);
2453

54+
response = await sendFingerprint({
55+
API_KEY,
56+
appID,
57+
requestBody: probabilisticFingerprint,
58+
});
59+
}
60+
61+
try {
2562
if (!response.ok) {
2663
throw new Error('Failed to fetch deferred link');
2764
}
2865

2966
const data = await response.json();
30-
3167
return data.link || null;
3268
} catch (error) {
3369
console.error('Error fetching deferred link:', error);

src/utils/fingerprint.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as Localization from 'expo-localization';
33
import { Dimensions, PixelRatio, Platform } from 'react-native';
44
import DeviceInfo from 'react-native-device-info';
55

6-
type ProbabilisticFingerprint = {
6+
export type ProbabilisticFingerprint = {
77
platform: string;
88
model: string;
99
manufacturer: string;
@@ -18,6 +18,19 @@ type ProbabilisticFingerprint = {
1818
pastedLink?: string;
1919
};
2020

21+
// used when install referrer on android is available
22+
export type DeterministicFingerprint = {
23+
clickId: string;
24+
};
25+
26+
export const getDeterministicFingerprint = (
27+
clickId: string
28+
): DeterministicFingerprint => {
29+
return {
30+
clickId,
31+
};
32+
};
33+
2134
export const getProbabilisticFingerprint = async (
2235
shouldUseClipboard: boolean
2336
): Promise<ProbabilisticFingerprint> => {

yarn.lock

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5577,6 +5577,7 @@ __metadata:
55775577
"@expo/metro-runtime": ~5.0.4
55785578
"@react-native-async-storage/async-storage": ^2.2.0
55795579
expo: ~53.0.22
5580+
expo-application: ^6.1.5
55805581
expo-clipboard: ^7.1.5
55815582
expo-dev-client: ~5.2.4
55825583
expo-localization: ^16.1.6
@@ -5611,6 +5612,7 @@ __metadata:
56115612
eslint: ^9.22.0
56125613
eslint-config-prettier: ^10.1.1
56135614
eslint-plugin-prettier: ^5.2.3
5615+
expo-application: ^6.1.5
56145616
expo-clipboard: ^7.1.5
56155617
expo-localization: ^16.1.6
56165618
jest: ^29.7.0
@@ -5623,6 +5625,7 @@ __metadata:
56235625
typescript: ^5.8.3
56245626
peerDependencies:
56255627
"@react-native-async-storage/async-storage": ">=2.0.0"
5628+
expo-application: ">=6.1.5"
56265629
expo-clipboard: ">=6.0.0"
56275630
expo-localization: ">=15.0.0"
56285631
react: ">=18"
@@ -6419,6 +6422,15 @@ __metadata:
64196422
languageName: node
64206423
linkType: hard
64216424

6425+
"expo-application@npm:^6.1.5":
6426+
version: 6.1.5
6427+
resolution: "expo-application@npm:6.1.5"
6428+
peerDependencies:
6429+
expo: "*"
6430+
checksum: d3a86e0841c3626dc7819bd3e35f313ad682f13705be2b640adc5aa96acab837e80cabf025768a082ed1cf2ad8190ce9c5e627cc9f5a3ed09886b42ea7443c3b
6431+
languageName: node
6432+
linkType: hard
6433+
64226434
"expo-asset@npm:~11.1.7":
64236435
version: 11.1.7
64246436
resolution: "expo-asset@npm:11.1.7"

0 commit comments

Comments
 (0)