diff options
author | Hailey <me@haileyok.com> | 2024-03-01 16:03:53 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-01 16:03:53 -0800 |
commit | 8bf40b46a00fd130a614b3446c98df1d421f970e (patch) | |
tree | 6348b7406cfd7c81511c22bf5d008d0dad795fdd | |
parent | a7195ccbd61939253499c50c2d76af1cd292da9b (diff) | |
download | voidsky-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
-rw-r--r-- | src/lib/hooks/useIntentHandler.ts | 20 |
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('|') |