Special-case bsky.app/download to open share sheet or copy to clipboard (#3710)

* special-case bsky.app/download to share

* Address feedback

* Improve detection

---------

Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
zio/stable
Samuel Newman 2024-04-27 05:25:28 +01:00 committed by GitHub
parent b10c96f28d
commit 1af59ca8a7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 24 additions and 10 deletions

View File

@ -1,10 +1,10 @@
import {it, describe, expect} from '@jest/globals' import {describe, expect, it} from '@jest/globals'
import { import {
linkRequiresWarning,
isPossiblyAUrl, isPossiblyAUrl,
splitApexDomain,
isTrustedUrl, isTrustedUrl,
linkRequiresWarning,
splitApexDomain,
} from '../../../src/lib/strings/url-helpers' } from '../../../src/lib/strings/url-helpers'
describe('linkRequiresWarning', () => { describe('linkRequiresWarning', () => {
@ -170,6 +170,7 @@ describe('isTrustedUrl', () => {
['https://google.com', false], ['https://google.com', false],
['https://docs.google.com', false], ['https://docs.google.com', false],
['https://google.com/#', false], ['https://google.com/#', false],
['https://blueskywebxzendesk.com', false],
] ]
it.each(cases)('given input uri %p, returns %p', (str, expected) => { it.each(cases)('given input uri %p, returns %p', (str, expected) => {

View File

@ -3,10 +3,12 @@ import {GestureResponderEvent} 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'
import {BSKY_DOWNLOAD_URL} from '#/lib/constants'
import {AllNavigatorParams} from '#/lib/routes/types' import {AllNavigatorParams} from '#/lib/routes/types'
import {shareUrl} from '#/lib/sharing' import {shareUrl} from '#/lib/sharing'
import { import {
convertBskyAppUrlIfNeeded, convertBskyAppUrlIfNeeded,
isBskyDownloadUrl,
isExternalUrl, isExternalUrl,
linkRequiresWarning, linkRequiresWarning,
} from '#/lib/strings/url-helpers' } from '#/lib/strings/url-helpers'
@ -125,7 +127,9 @@ export function useLink({
(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) (event.metaKey || event.altKey || event.ctrlKey || event.shiftKey)
const shouldOpenInNewTab = isMetaKey || isMiddleClick const shouldOpenInNewTab = isMetaKey || isMiddleClick
if ( if (isBskyDownloadUrl(href)) {
shareUrl(BSKY_DOWNLOAD_URL)
} else if (
shouldOpenInNewTab || shouldOpenInNewTab ||
href.startsWith('http') || href.startsWith('http') ||
href.startsWith('mailto') href.startsWith('mailto')

View File

@ -10,6 +10,7 @@ const HELP_DESK_LANG = 'en-us'
export const HELP_DESK_URL = `https://blueskyweb.zendesk.com/hc/${HELP_DESK_LANG}` export const HELP_DESK_URL = `https://blueskyweb.zendesk.com/hc/${HELP_DESK_LANG}`
export const EMBED_SERVICE = 'https://embed.bsky.app' export const EMBED_SERVICE = 'https://embed.bsky.app'
export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js` export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js`
export const BSKY_DOWNLOAD_URL = 'https://bsky.app/download'
const BASE_FEEDBACK_FORM_URL = `${HELP_DESK_URL}/requests/new` const BASE_FEEDBACK_FORM_URL = `${HELP_DESK_URL}/requests/new`
export function FEEDBACK_FORM_URL({ export function FEEDBACK_FORM_URL({

View File

@ -1,14 +1,15 @@
import {AtUri} from '@atproto/api' import {AtUri} from '@atproto/api'
import {BSKY_SERVICE} from 'lib/constants'
import TLDs from 'tlds'
import psl from 'psl' import psl from 'psl'
import TLDs from 'tlds'
import {BSKY_SERVICE} from 'lib/constants'
export const BSKY_APP_HOST = 'https://bsky.app' export const BSKY_APP_HOST = 'https://bsky.app'
const BSKY_TRUSTED_HOSTS = [ const BSKY_TRUSTED_HOSTS = [
'bsky.app', 'bsky\\.app',
'bsky.social', 'bsky\\.social',
'blueskyweb.xyz', 'blueskyweb\\.xyz',
'blueskyweb.zendesk.com', 'blueskyweb\\.zendesk\\.com',
...(__DEV__ ? ['localhost:19006', 'localhost:8100'] : []), ...(__DEV__ ? ['localhost:19006', 'localhost:8100'] : []),
] ]
@ -145,6 +146,13 @@ export function isBskyListUrl(url: string): boolean {
return false return false
} }
export function isBskyDownloadUrl(url: string): boolean {
if (isExternalUrl(url)) {
return false
}
return url === '/download' || url.startsWith('/download?')
}
export function convertBskyAppUrlIfNeeded(url: string): string { export function convertBskyAppUrlIfNeeded(url: string): string {
if (isBskyAppUrl(url)) { if (isBskyAppUrl(url)) {
try { try {