about summary refs log tree commit diff
path: root/modules/expo-bluesky-swiss-army/src/Referrer
diff options
context:
space:
mode:
Diffstat (limited to 'modules/expo-bluesky-swiss-army/src/Referrer')
-rw-r--r--modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts8
-rw-r--r--modules/expo-bluesky-swiss-army/src/Referrer/index.ios.ts37
-rw-r--r--modules/expo-bluesky-swiss-army/src/Referrer/index.ts7
-rw-r--r--modules/expo-bluesky-swiss-army/src/Referrer/index.web.ts34
-rw-r--r--modules/expo-bluesky-swiss-army/src/Referrer/types.ts17
5 files changed, 92 insertions, 11 deletions
diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts
index 06dfd2d09..ec2bcb57d 100644
--- a/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts
+++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts
@@ -1,9 +1,13 @@
 import {requireNativeModule} from 'expo'
 
-import {GooglePlayReferrerInfo} from './types'
+import {GooglePlayReferrerInfo, ReferrerInfo} from './types'
 
 export const NativeModule = requireNativeModule('ExpoBlueskyReferrer')
 
-export function getGooglePlayReferrerInfoAsync(): Promise<GooglePlayReferrerInfo> {
+export function getGooglePlayReferrerInfoAsync(): Promise<GooglePlayReferrerInfo | null> {
   return NativeModule.getGooglePlayReferrerInfoAsync()
 }
+
+export function getReferrerInfoAsync(): Promise<ReferrerInfo | null> {
+  return NativeModule.getReferrerInfoAsync()
+}
diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.ios.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.ios.ts
new file mode 100644
index 000000000..2bf1497a0
--- /dev/null
+++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.ios.ts
@@ -0,0 +1,37 @@
+import {SharedPrefs} from '../../index'
+import {NotImplementedError} from '../NotImplemented'
+import {GooglePlayReferrerInfo, ReferrerInfo} from './types'
+
+export function getGooglePlayReferrerInfoAsync(): Promise<GooglePlayReferrerInfo> {
+  throw new NotImplementedError()
+}
+
+export function getReferrerInfoAsync(): Promise<ReferrerInfo | null> {
+  const referrer = SharedPrefs.getString('referrer')
+  if (referrer) {
+    SharedPrefs.removeValue('referrer')
+    try {
+      const url = new URL(referrer)
+      return {
+        referrer,
+        hostname: url.hostname,
+      }
+    } catch (e) {
+      return {
+        referrer,
+        hostname: undefined,
+      }
+    }
+  }
+
+  const referrerApp = SharedPrefs.getString('referrerApp')
+  if (referrerApp) {
+    SharedPrefs.removeValue('referrerApp')
+    return {
+      referrer: referrerApp,
+      hostname: referrerApp,
+    }
+  }
+
+  return null
+}
diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.ts
index 255398552..a60f7b6db 100644
--- a/modules/expo-bluesky-swiss-army/src/Referrer/index.ts
+++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.ts
@@ -1,7 +1,10 @@
 import {NotImplementedError} from '../NotImplemented'
-import {GooglePlayReferrerInfo} from './types'
+import {GooglePlayReferrerInfo, ReferrerInfo} from './types'
 
-// @ts-ignore throws
 export function getGooglePlayReferrerInfoAsync(): Promise<GooglePlayReferrerInfo> {
   throw new NotImplementedError()
 }
+
+export function getReferrerInfoAsync(): Promise<ReferrerInfo | null> {
+  throw new NotImplementedError()
+}
diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.web.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.web.ts
new file mode 100644
index 000000000..76f03e7c8
--- /dev/null
+++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.web.ts
@@ -0,0 +1,34 @@
+import {Platform} from 'react-native'
+
+import {NotImplementedError} from '../NotImplemented'
+import {GooglePlayReferrerInfo, ReferrerInfo} from './types'
+
+export function getGooglePlayReferrerInfoAsync(): Promise<GooglePlayReferrerInfo> {
+  throw new NotImplementedError()
+}
+
+export function getReferrerInfoAsync(): Promise<ReferrerInfo | null> {
+  if (
+    Platform.OS === 'web' &&
+    // for ssr
+    typeof document !== 'undefined' &&
+    document != null &&
+    document.referrer
+  ) {
+    try {
+      const url = new URL(document.referrer)
+      if (url.hostname !== 'bsky.app') {
+        return {
+          referrer: url.href,
+          hostname: url.hostname,
+        }
+      }
+    } catch {
+      // If something happens to the URL parsing, we don't want to actually cause any problems for the user. Just
+      // log the error so we might catch it
+      console.error('Failed to parse referrer URL')
+    }
+  }
+
+  return null
+}
diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/types.ts b/modules/expo-bluesky-swiss-army/src/Referrer/types.ts
index 55faaff4d..921e3a692 100644
--- a/modules/expo-bluesky-swiss-army/src/Referrer/types.ts
+++ b/modules/expo-bluesky-swiss-army/src/Referrer/types.ts
@@ -1,7 +1,10 @@
-export type GooglePlayReferrerInfo =
-  | {
-      installReferrer?: string
-      clickTimestamp?: number
-      installTimestamp?: number
-    }
-  | undefined
+export type GooglePlayReferrerInfo = {
+  installReferrer?: string
+  clickTimestamp?: number
+  installTimestamp?: number
+}
+
+export type ReferrerInfo = {
+  referrer: string
+  hostname: string
+}