about summary refs log tree commit diff
path: root/src/screens/Signup/StepCaptcha/CaptchaWebView.web.tsx
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2024-03-20 17:25:08 -0500
committerEric Bailey <git@esb.lol>2024-03-20 17:25:08 -0500
commit19fab671a3b11daa73a169b99752a4d2ba9e0166 (patch)
treef173c36f32482bf2a0fd9f91f429d3eb40e79059 /src/screens/Signup/StepCaptcha/CaptchaWebView.web.tsx
parent58588efceadb030fa83367fb71dbecfce7b828d3 (diff)
downloadvoidsky-19fab671a3b11daa73a169b99752a4d2ba9e0166.tar.zst
Move some things around
Diffstat (limited to 'src/screens/Signup/StepCaptcha/CaptchaWebView.web.tsx')
-rw-r--r--src/screens/Signup/StepCaptcha/CaptchaWebView.web.tsx61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/screens/Signup/StepCaptcha/CaptchaWebView.web.tsx b/src/screens/Signup/StepCaptcha/CaptchaWebView.web.tsx
new file mode 100644
index 000000000..7791a58dd
--- /dev/null
+++ b/src/screens/Signup/StepCaptcha/CaptchaWebView.web.tsx
@@ -0,0 +1,61 @@
+import React from 'react'
+import {StyleSheet} from 'react-native'
+
+// @ts-ignore web only, we will always redirect to the app on web (CORS)
+const REDIRECT_HOST = new URL(window.location.href).host
+
+export function CaptchaWebView({
+  url,
+  stateParam,
+  onSuccess,
+  onError,
+}: {
+  url: string
+  stateParam: string
+  onSuccess: (code: string) => void
+  onError: () => void
+}) {
+  const onLoad = React.useCallback(() => {
+    // @ts-ignore web
+    const frame: HTMLIFrameElement = document.getElementById(
+      'captcha-iframe',
+    ) as HTMLIFrameElement
+
+    try {
+      // @ts-ignore web
+      const href = frame?.contentWindow?.location.href
+      if (!href) return
+      const urlp = new URL(href)
+
+      // This shouldn't happen with CORS protections, but for good measure
+      if (urlp.host !== REDIRECT_HOST) return
+
+      const code = urlp.searchParams.get('code')
+      if (urlp.searchParams.get('state') !== stateParam || !code) {
+        onError()
+        return
+      }
+      onSuccess(code)
+    } catch (e) {
+      // We don't need to handle this
+    }
+  }, [stateParam, onSuccess, onError])
+
+  return (
+    <iframe
+      src={url}
+      style={styles.iframe}
+      id="captcha-iframe"
+      onLoad={onLoad}
+    />
+  )
+}
+
+const styles = StyleSheet.create({
+  iframe: {
+    flex: 1,
+    borderWidth: 0,
+    borderRadius: 10,
+    backgroundColor: 'transparent',
+  },
+})