Create logged-out view for group chat invites (#10598)
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
This commit is contained in:
@@ -5,7 +5,11 @@ import * as WebBrowser from 'expo-web-browser'
|
||||
|
||||
import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
|
||||
import {parseLinkingUrl} from '#/lib/parseLinkingUrl'
|
||||
import {CHAT_INVITE_CODE_REGEX} from '#/lib/strings/url-helpers'
|
||||
import {usePrefetchJoinLinkPreviews} from '#/state/queries/join-links'
|
||||
import {useSession} from '#/state/session'
|
||||
import {useSetActiveLanding} from '#/state/shell/landing'
|
||||
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
|
||||
import {useCloseAllActiveElements} from '#/state/util'
|
||||
import {useIntentDialogs} from '#/components/intents/IntentDialogs'
|
||||
import {useAnalytics} from '#/analytics'
|
||||
@@ -25,6 +29,7 @@ export function useIntentHandler() {
|
||||
const ax = useAnalytics()
|
||||
const composeIntent = useComposeIntent()
|
||||
const verifyEmailIntent = useVerifyEmailIntent()
|
||||
const groupChatJoinIntent = useGroupChatJoinIntent()
|
||||
const {currentAccount} = useSession()
|
||||
const {tryApplyUpdate} = useApplyPullRequestOTAUpdate()
|
||||
|
||||
@@ -44,6 +49,11 @@ export function useIntentHandler() {
|
||||
})
|
||||
}
|
||||
const urlp = parseLinkingUrl(url)
|
||||
const chatInviteMatch = urlp.pathname.match(CHAT_INVITE_CODE_REGEX)
|
||||
if (chatInviteMatch) {
|
||||
groupChatJoinIntent(chatInviteMatch[1], url)
|
||||
return
|
||||
}
|
||||
const [, intent, intentType] = urlp.pathname.split('/')
|
||||
|
||||
// On native, our links look like bluesky://intent/SomeIntent, so we have to check the hostname for the
|
||||
@@ -99,6 +109,7 @@ export function useIntentHandler() {
|
||||
ax,
|
||||
composeIntent,
|
||||
verifyEmailIntent,
|
||||
groupChatJoinIntent,
|
||||
currentAccount,
|
||||
tryApplyUpdate,
|
||||
])
|
||||
@@ -162,6 +173,46 @@ export function useComposeIntent() {
|
||||
)
|
||||
}
|
||||
|
||||
export function useGroupChatJoinIntent() {
|
||||
const closeAllActiveElements = useCloseAllActiveElements()
|
||||
const {hasSession} = useSession()
|
||||
const {groupChatJoinDialogControl: control, setGroupChatJoinState: setState} =
|
||||
useIntentDialogs()
|
||||
const {requestSwitchToAccount} = useLoggedOutViewControls()
|
||||
const setActiveLanding = useSetActiveLanding()
|
||||
const prefetchJoinLinkPreviews = usePrefetchJoinLinkPreviews()
|
||||
return useCallback(
|
||||
(code: string, uri?: string) => {
|
||||
closeAllActiveElements()
|
||||
if (hasSession) {
|
||||
setState({code})
|
||||
const prefetch = prefetchJoinLinkPreviews({
|
||||
codes: [code],
|
||||
hasSession: true,
|
||||
})
|
||||
void Promise.race([
|
||||
prefetch,
|
||||
new Promise(res => setTimeout(res, 200)),
|
||||
]).finally(() => {
|
||||
control.open()
|
||||
})
|
||||
} else {
|
||||
setActiveLanding({type: 'groupchat', uri: uri ?? '', code})
|
||||
requestSwitchToAccount({requestedAccount: 'groupchat'})
|
||||
}
|
||||
},
|
||||
[
|
||||
closeAllActiveElements,
|
||||
hasSession,
|
||||
control,
|
||||
setState,
|
||||
prefetchJoinLinkPreviews,
|
||||
requestSwitchToAccount,
|
||||
setActiveLanding,
|
||||
],
|
||||
)
|
||||
}
|
||||
|
||||
function useVerifyEmailIntent() {
|
||||
const closeAllActiveElements = useCloseAllActiveElements()
|
||||
const {verifyEmailDialogControl: control, setVerifyEmailState: setState} =
|
||||
|
||||
Reference in New Issue
Block a user