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 startsWithzio/stable
parent
a7195ccbd6
commit
8bf40b46a0
|
@ -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('|')
|
||||||
|
|
Loading…
Reference in New Issue