Intent handler (#2992)

* Handle URL params

* Add resources

* Add other params

* refactor for scope

* modify the pr to support intents rather than utm

remove linebreak

remove linebreak

handle web

adjust path check to work on web

add a short delay for opening the composer

setup compose intent, move to `intents` directory

fix intent logic

ignore incoming intents in the navigation router

* refactor

---------

Co-authored-by: Eric Bailey <git@esb.lol>
This commit is contained in:
Hailey 2024-02-27 10:35:38 -08:00 committed by GitHub
parent c8d02a791a
commit 2a04546c73
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 88 additions and 1 deletions

View file

@ -0,0 +1,64 @@
import React from 'react'
import * as Linking from 'expo-linking'
import {isNative} from 'platform/detection'
import {useComposerControls} from 'state/shell'
import {useSession} from 'state/session'
type IntentType = 'compose'
export function useIntentHandler() {
const incomingUrl = Linking.useURL()
const composeIntent = useComposeIntent()
React.useEffect(() => {
const handleIncomingURL = (url: string) => {
const urlp = new URL(url)
const [_, intentTypeNative, intentTypeWeb] = 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 params = urlp.searchParams
if (!isIntent) return
switch (intentType as IntentType) {
case 'compose': {
composeIntent({
text: params.get('text'),
imageUris: params.get('imageUris'),
})
}
}
}
if (incomingUrl) handleIncomingURL(incomingUrl)
}, [incomingUrl, composeIntent])
}
function useComposeIntent() {
const {openComposer} = useComposerControls()
const {hasSession} = useSession()
return React.useCallback(
({
// eslint-disable-next-line @typescript-eslint/no-unused-vars
text,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
imageUris,
}: {
text: string | null
imageUris: string | null // unused for right now, will be used later with intents
}) => {
if (!hasSession) return
setTimeout(() => {
openComposer({}) // will pass in values to the composer here in the share extension
}, 500)
},
[openComposer, hasSession],
)
}