ensure proper navigation
This commit is contained in:
+48
-1
@@ -1,5 +1,10 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {GestureResponderEvent} from 'react-native'
|
import {
|
||||||
|
GestureResponderEvent,
|
||||||
|
Pressable,
|
||||||
|
StyleProp,
|
||||||
|
ViewStyle,
|
||||||
|
} from 'react-native'
|
||||||
import {sanitizeUrl} from '@braintree/sanitize-url'
|
import {sanitizeUrl} from '@braintree/sanitize-url'
|
||||||
import {StackActions, useLinkProps} from '@react-navigation/native'
|
import {StackActions, useLinkProps} from '@react-navigation/native'
|
||||||
|
|
||||||
@@ -323,3 +328,45 @@ export function InlineLinkText({
|
|||||||
</Text>
|
</Text>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Pressable that uses useLink to handle navigation. It is unstyled, so can be used in cases where the Button styles
|
||||||
|
* in Link are not desired.
|
||||||
|
* @param displayText
|
||||||
|
* @param style
|
||||||
|
* @param children
|
||||||
|
* @param rest
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
export function BaseLink({
|
||||||
|
displayText,
|
||||||
|
onPress: onPressOuter,
|
||||||
|
style,
|
||||||
|
children,
|
||||||
|
...rest
|
||||||
|
}: {
|
||||||
|
style?: StyleProp<ViewStyle>
|
||||||
|
children: React.ReactNode
|
||||||
|
to: string
|
||||||
|
action: 'push' | 'replace' | 'navigate'
|
||||||
|
onPress?: () => false | void
|
||||||
|
shareOnLongPress?: boolean
|
||||||
|
label: string
|
||||||
|
displayText?: string
|
||||||
|
}) {
|
||||||
|
const {onPress, ...btnProps} = useLink({
|
||||||
|
displayText: displayText ?? rest.to,
|
||||||
|
...rest,
|
||||||
|
})
|
||||||
|
return (
|
||||||
|
<Pressable
|
||||||
|
style={style}
|
||||||
|
onPress={e => {
|
||||||
|
onPressOuter?.()
|
||||||
|
onPress(e)
|
||||||
|
}}
|
||||||
|
{...btnProps}>
|
||||||
|
{children}
|
||||||
|
</Pressable>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import TLDs from 'tlds'
|
|||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
import {BSKY_SERVICE} from 'lib/constants'
|
import {BSKY_SERVICE} from 'lib/constants'
|
||||||
import {isInvalidHandle} from 'lib/strings/handles'
|
import {isInvalidHandle} from 'lib/strings/handles'
|
||||||
|
import {startUriToStarterPackUri} from 'lib/strings/starter-pack'
|
||||||
|
|
||||||
export const BSKY_APP_HOST = 'https://bsky.app'
|
export const BSKY_APP_HOST = 'https://bsky.app'
|
||||||
const BSKY_TRUSTED_HOSTS = [
|
const BSKY_TRUSTED_HOSTS = [
|
||||||
@@ -152,6 +153,30 @@ export function isBskyListUrl(url: string): boolean {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isBskyStartUrl(url: string): boolean {
|
||||||
|
if (isBskyAppUrl(url)) {
|
||||||
|
try {
|
||||||
|
const urlp = new URL(url)
|
||||||
|
return /start\/(?<name>[^/]+)\/(?<rkey>[^/]+)/i.test(urlp.pathname)
|
||||||
|
} catch {
|
||||||
|
console.error('Unexpected error in isBskyStartUrl()', url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isBskyStarterPackUrl(url: string): boolean {
|
||||||
|
if (isBskyAppUrl(url)) {
|
||||||
|
try {
|
||||||
|
const urlp = new URL(url)
|
||||||
|
return /starter-pack\/(?<name>[^/]+)\/(?<rkey>[^/]+)/i.test(urlp.pathname)
|
||||||
|
} catch {
|
||||||
|
console.error('Unexpected error in isBskyStartUrl()', url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
export function isBskyDownloadUrl(url: string): boolean {
|
export function isBskyDownloadUrl(url: string): boolean {
|
||||||
if (isExternalUrl(url)) {
|
if (isExternalUrl(url)) {
|
||||||
return false
|
return false
|
||||||
@@ -163,6 +188,11 @@ export function convertBskyAppUrlIfNeeded(url: string): string {
|
|||||||
if (isBskyAppUrl(url)) {
|
if (isBskyAppUrl(url)) {
|
||||||
try {
|
try {
|
||||||
const urlp = new URL(url)
|
const urlp = new URL(url)
|
||||||
|
|
||||||
|
if (isBskyStartUrl(url)) {
|
||||||
|
return startUriToStarterPackUri(urlp.pathname)
|
||||||
|
}
|
||||||
|
|
||||||
return urlp.pathname
|
return urlp.pathname
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Unexpected error in convertBskyAppUrlIfNeeded()', e)
|
console.error('Unexpected error in convertBskyAppUrlIfNeeded()', e)
|
||||||
|
|||||||
Reference in New Issue
Block a user