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
zio/stable
Hailey 2024-03-01 16:03:53 -08:00 committed by GitHub
parent a7195ccbd6
commit 8bf40b46a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 11 additions and 9 deletions

View File

@ -15,15 +15,20 @@ export function useIntentHandler() {
React.useEffect(() => { React.useEffect(() => {
const handleIncomingURL = (url: string) => { 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 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 // 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 // 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 = intent === 'intent'
const isIntent = isNative
? urlp.hostname === 'intent'
: intentTypeNative === 'intent'
const params = urlp.searchParams const params = urlp.searchParams
if (!isIntent) return if (!isIntent) return
@ -69,10 +74,7 @@ function useComposeIntent() {
return false return false
} }
// We also should just filter out cases that don't have all the info we need // We also should just filter out cases that don't have all the info we need
if (!VALID_IMAGE_REGEX.test(part)) { return VALID_IMAGE_REGEX.test(part)
return false
}
return true
}) })
.map(part => { .map(part => {
const [uri, width, height] = part.split('|') const [uri, width, height] = part.split('|')