about summary refs log tree commit diff
path: root/src/platform/auth-flow.native.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/auth-flow.native.ts')
-rw-r--r--src/platform/auth-flow.native.ts53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/platform/auth-flow.native.ts b/src/platform/auth-flow.native.ts
new file mode 100644
index 000000000..596632f17
--- /dev/null
+++ b/src/platform/auth-flow.native.ts
@@ -0,0 +1,53 @@
+import {Linking} from 'react-native'
+import * as auth from '@adxp/auth'
+import * as ucan from 'ucans'
+import {InAppBrowser} from 'react-native-inappbrowser-reborn'
+import {isWeb} from '../platform/detection'
+import {extractHashFragment, makeAppUrl} from '../platform/urls'
+import {ReactNativeStore, parseUrlForUcan} from '../state/auth'
+import * as env from '../env'
+
+export async function requestAppUcan(
+  authStore: ReactNativeStore,
+  scope: ucan.Capability,
+) {
+  const did = await authStore.getDid()
+  const returnUrl = makeAppUrl()
+  const fragment = auth.requestAppUcanHashFragment(did, scope, returnUrl)
+  const url = `${env.AUTH_LOBBY}#${fragment}`
+
+  if (isWeb) {
+    // @ts-ignore window is defined -prf
+    window.location.href = url
+    return false
+  }
+
+  if (await InAppBrowser.isAvailable()) {
+    // use in-app browser
+    const res = await InAppBrowser.openAuth(url, returnUrl, {
+      // iOS Properties
+      ephemeralWebSession: false,
+      // Android Properties
+      showTitle: false,
+      enableUrlBarHiding: true,
+      enableDefaultShare: false,
+    })
+    if (res.type === 'success' && res.url) {
+      const fragment = extractHashFragment(res.url)
+      if (fragment) {
+        const ucan = await parseUrlForUcan(fragment)
+        if (ucan) {
+          await authStore.addUcan(ucan)
+          return true
+        }
+      }
+    } else {
+      console.log('Not completed', res)
+      return false
+    }
+  } else {
+    // use system browser
+    Linking.openURL(url)
+  }
+  return true
+}