about summary refs log tree commit diff
path: root/src/lib/hooks
diff options
context:
space:
mode:
authorHailey <me@haileyok.com>2024-03-01 16:03:53 -0800
committerGitHub <noreply@github.com>2024-03-01 16:03:53 -0800
commit8bf40b46a00fd130a614b3446c98df1d421f970e (patch)
tree6348b7406cfd7c81511c22bf5d008d0dad795fdd /src/lib/hooks
parenta7195ccbd61939253499c50c2d76af1cd292da9b (diff)
downloadvoidsky-8bf40b46a00fd130a614b3446c98df1d421f970e.tar.zst
Simplify intent path logic, ensure all variations work for bluesky://, bluesky:///, and https://bsky.app/ (#3045)
* Simplify intent path logic, ensure all variations work

* use startsWith
Diffstat (limited to 'src/lib/hooks')
-rw-r--r--src/lib/hooks/useIntentHandler.ts20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/lib/hooks/useIntentHandler.ts b/src/lib/hooks/useIntentHandler.ts
index d1e2de31d..8741530b5 100644
--- a/src/lib/hooks/useIntentHandler.ts
+++ b/src/lib/hooks/useIntentHandler.ts
@@ -15,15 +15,20 @@ export function useIntentHandler() {
 
   React.useEffect(() => {
     const handleIncomingURL = (url: string) => {
+      // We want to be able to support bluesky:// deeplinks. It's unnatural for someone to use a deeplink with three
+      // slashes, like bluesky:///intent/follow. However, supporting just two slashes causes us to have to take care
+      // of two cases when parsing the url. If we ensure there is a third slash, we can always ensure the first
+      // path parameter is in pathname rather than in hostname.
+      if (url.startsWith('bluesky://') && !url.startsWith('bluesky:///')) {
+        url = url.replace('bluesky://', 'bluesky:///')
+      }
+
       const urlp = new URL(url)
-      const [_, intentTypeNative, intentTypeWeb] = urlp.pathname.split('/')
+      const [_, intent, intentType] = urlp.pathname.split('/')
 
       // On native, our links look like bluesky://intent/SomeIntent, so we have to check the hostname for the
       // intent check. On web, we have to check the first part of the path since we have an actual hostname
-      const intentType = isNative ? intentTypeNative : intentTypeWeb
-      const isIntent = isNative
-        ? urlp.hostname === 'intent'
-        : intentTypeNative === 'intent'
+      const isIntent = intent === 'intent'
       const params = urlp.searchParams
 
       if (!isIntent) return
@@ -69,10 +74,7 @@ function useComposeIntent() {
             return false
           }
           // We also should just filter out cases that don't have all the info we need
-          if (!VALID_IMAGE_REGEX.test(part)) {
-            return false
-          }
-          return true
+          return VALID_IMAGE_REGEX.test(part)
         })
         .map(part => {
           const [uri, width, height] = part.split('|')